Skip to content

Commit 8831185

Browse files
authored
Merge branch 'main' into feat/napp-support
2 parents 8ed7851 + 8104a88 commit 8831185

108 files changed

Lines changed: 13065 additions & 266 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/publish-packages.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,19 @@ jobs:
6464
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6565
TAG: ${{ steps.extract.outputs.tag }}
6666
VERSION: ${{ steps.extract.outputs.version }}
67+
REPO: ${{ github.repository }}
6768
run: |
6869
TAG="${TAG}"
6970
VERSION="${VERSION}"
71+
REPO="${REPO}"
7072
EXPECTED="nsyte-linux-${VERSION} nsyte-macos-arm64-${VERSION} nsyte-macos-x64-${VERSION} nsyte-windows-${VERSION}.exe"
7173
TIMEOUT=300
7274
INTERVAL=15
7375
ELAPSED=0
7476
ALL_PRESENT=false
7577
7678
while [ "$ELAPSED" -lt "$TIMEOUT" ]; do
77-
NAMES=$(gh release view "$TAG" --json assets --jq '.assets[].name' 2>/dev/null || echo "")
79+
NAMES=$(gh release view "$TAG" -R "$REPO" --json assets --jq '.assets[].name' 2>/dev/null || echo "")
7880
ALL_PRESENT=true
7981
for expected in $EXPECTED; do
8082
if ! echo "$NAMES" | grep -qF "$expected"; then

.nsite/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"bunkerPubkey": "9c08bc9679ca77197f3e6a28876b77c5cc4b7a9dd268d9a3cffd7f1eab667cfb",
2+
"bunkerPubkey": "e771af0b05c8e95fcdf6feb3500544d2fb1ccd384788e9f490bb3ee28e8ed66f",
33
"fallback": "/index.html",
44
"relays": [
55
"wss://relay.nsite.lol",

.nsite/named.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
{
2-
"bunkerPubkey": "9c08bc9679ca77197f3e6a28876b77c5cc4b7a9dd268d9a3cffd7f1eab667cfb",
2+
"bunkerPubkey": "e771af0b05c8e95fcdf6feb3500544d2fb1ccd384788e9f490bb3ee28e8ed66f",
33
"relays": [
44
"wss://nsite.run",
55
"wss://nos.lol",
6-
"wss://relay.damus.io"
6+
"wss://relay.damus.io",
7+
"wss://relay.nosto.re"
78
],
89
"servers": [
910
"https://blssm.us",
10-
"https://cdn.hzrd149.com"
11+
"https://cdn.hzrd149.com",
12+
"https://nsite.run",
13+
"https://nosto.re"
1114
],
12-
"id": "namednsyte",
13-
"title": "nsyte (testing)",
15+
"id": "nsyte",
16+
"title": "nsyte.run",
1417
"description": "nsyte, but testing nsyte deploy to named site"
1518
}

.planning/MILESTONES.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Milestones
2+
3+
## v1.6 OS Package Manager/Distributors (Shipped: 2026-05-07)
4+
5+
**Phases completed:** 7 phases, 12 plans, 8 tasks
6+
7+
**Key accomplishments:**
8+
9+
- Migrated package-manager sources into `packages/`, using placeholder-driven release asset templates for AUR, Homebrew, Scoop, Winget, and Nix while preserving Chocolatey, Debian, Flatpak, and Snap templates for future live-publication work.
10+
- Swapped release creation to `RELEASE_TOKEN` so GitHub `release: published` events can trigger downstream package publication workflows.
11+
- Shipped `publish-packages.yml` with asset readiness polling, centralized checksum computation, independent manager jobs, and manual per-manager `workflow_dispatch` reruns.
12+
- Implemented AUR, Homebrew, Scoop, Winget, and Nix publication/update jobs with fail-fast placeholder checks, idempotency guards, and runbook-backed verification.
13+
- Documented setup and troubleshooting for release tokens, AUR SSH, Homebrew tap PAT, Scoop bucket PAT, Winget bootstrap/update flow, and Nix flake hash updates in `docs/RELEASING.md`.
14+
15+
**Known deferred items at close:** 6 external runtime UAT gates accepted as deferred (see `STATE.md` Deferred Items).
16+
17+
---
18+
19+
## Completed
20+
21+
### v1.4: Documentation Pass
22+
23+
**Shipped:** 2026-05-03
24+
**Phases:** 12-15 (12 plans, 26 tasks)
25+
**Goal:** Eliminate documentation drift methodically. Re-align all docs with the actual CLI surface (commands, flags, arguments, behavior). Remove "optimistic" claims for features that no longer exist or never did. Build a drift gate so this never silently regresses.
26+
27+
**Key accomplishments:**
28+
29+
- Rebuilt nsyte 0.26.0, captured `--help` for all 21 top-level commands + 7 bunker subcommands (29 files), and produced AUDIT-MATRIX.md joining 21 source commands × 17 doc pages × 28 help captures with severity-ordered drift classification
30+
- Created 5 missing command pages (get, put, scan, snapshot, status), rewrote upload.md as alias stub for deploy, re-anchored ls.md on canonical `list`, created _global-options.md as canonical globals reference
31+
- Aligned 7 command pages (announce, bunker, debug, download, init, serve, validate) flag-by-flag with source `.option(...)` declarations; updated commands.md index; ZERO drift across all 21 commands
32+
- Reconciled 8 guide pages: replaced phantom `appHandler.enabled` with `publishAppHandler`, removed phantom env vars (`NSYTE_BUNKER_KEY`, `NSYTE_LOG_LEVEL`), fixed Linux/Windows storage-path drift, deleted 227-line commented Package Managers block, updated stale `@0.10.1` pin
33+
- Updated 5 cross-reference pages (docs/index, README, mkdocs.yml, docs/usage/index, docs/usage/configuration); mkdocs strict build clean
34+
- Shipped `scripts/check-doc-drift.ts` (3 checks: coverage, flag alignment, env-var) and `.github/workflows/doc-drift.yml` CI gate
35+
- `v1.4-PHANTOM-LOG.md` accumulates 34 entries documenting every removed/rewritten claim with verbatim quotes — backlog for future feature work
36+
37+
### v1.3: Redesign Homepage
38+
39+
**Shipped:** 2026-05-03
40+
**Phases:** 10-11 (6 plans, 18 tasks)
41+
**Goal:** Compress the marketing page into a tight, above-the-fold landing with darker chrome and the existing green accent, while keeping deeper docs reachable via links.
42+
43+
**Key accomplishments:**
44+
45+
- Locked near-black palette (`--cyber-bg #06070d`) and tightened density scale (15px body / 1.5 line-height / 2rem section padding / ~15% reduced heading clamps) on `website/src/index.html`
46+
- Removed four below-the-fold sections (features, what's-nsite, CI/CD, demo walkthrough), animated grid, animated gradient, and asciinema demo player — file shrank from 1,775 → 653 lines (-63%)
47+
- Built top-link nav (Docs · GitHub · Install · Releases) and rebuilt hero around wordmark + tagline + particles only
48+
- Compact install component with underlined tabs (script default), single canonical command per tab, copy-to-clipboard + 1.5s feedback, "More install options →" link to docs
49+
- Folded all Phase 10 UI-audit color findings into Phase 11 rebuild (no purple/blue gradients on UI surfaces; legacy neon green replaced; Phase 11 audit scored 24/24)
50+
- User-approved cycle-2 layout: content flex-centered both axes (`min-height: 100vh` restored), nav moved to last child of `.hero-content`, `history.pushState` keeps URL hash in sync on `#install` clicks
51+
- A11y: `:focus-visible` rings, `prefers-reduced-motion` block, full ARIA tablist semantics
52+
53+
### v1.2: Custom Event Timestamps
54+
55+
**Shipped:** 2026-04-14
56+
**Phases:** 7-9
57+
**Goal:** Add CLI argument to override `created_at` timestamp on nostr events, with tests across all code paths.
58+
59+
### v1.1: Address Open Issues
60+
61+
**Shipped:** 2026-04-04
62+
**Phases:** 3-6
63+
**Goal:** Fix manifest title/description bug, add dry-run mode, config schema hosting, and secrets scanner (#100-#103).
64+
65+
### v1.0: Test Coverage Low-Hanging Fruit
66+
67+
**Shipped:** 2026-03-27
68+
**Phases:** 1-2
69+
**Goal:** Increase line coverage from 35.3% by testing pure-function and utility modules.

.planning/PROJECT.md

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# nsyte
2+
3+
## What This Is
4+
5+
A CLI tool for publishing static sites to nostr relays and blossom servers. Users can deploy, manage, and serve websites using the nostr protocol, with support for multiple named sites, snapshots, NIP-89 app handlers, and bunker-based signing. The marketing site at `nsyte.run` introduces the project with a compact above-the-fold landing that links to the full documentation site.
6+
7+
## Core Value
8+
9+
Reliable site deployment to the nostr + blossom ecosystem with a simple CLI workflow.
10+
11+
## Current State
12+
13+
**Shipped:** v1.6 OS Package Manager/Distributors on 2026-05-07.
14+
15+
**Current package-management state:** Package templates live under `packages/`, release-triggered package jobs are wired in `.github/workflows/publish-packages.yml`, and maintainer runbooks live in `docs/RELEASING.md`. Live package-manager publication UAT remains deferred until external repos, secrets, package-manager runtimes, and release runs are available.
16+
17+
## Requirements
18+
19+
### Validated
20+
21+
<!-- Shipped and confirmed valuable. -->
22+
23+
- Site deployment to blossom servers and nostr relays (deploy, undeploy) — v1.0
24+
- Named site management (sites command) — v1.0
25+
- File operations (put, get, delete, list, download) — v1.0
26+
- Manifest snapshots for versioning — v1.0
27+
- Configuration management with bunker-based signing — v1.0
28+
- NIP-89 app handler announcements — v1.0
29+
- CI/CD integration mode — v1.0
30+
- Debug and validation tooling — v1.0
31+
- Manifest title/description event metadata fix — v1.1
32+
- Dry-run mode for deploy — v1.1
33+
- Config schema hosting — v1.1
34+
- Secrets scanning pre-deploy check — v1.1
35+
- Custom `--created-at` global CLI option for overriding event timestamps — v1.2
36+
- Above-the-fold homepage layout (heading, links, compact install box) — v1.3
37+
- Darker dark-theme palette (`#06070d` base) preserving the green accent — v1.3
38+
- Tighter typography, spacing, and component density on the homepage — v1.3
39+
- Persistent links from homepage to the existing docs site — v1.3
40+
- Documentation aligned 1:1 with the actual CLI surface (commands, flags, behavior) — v1.4
41+
- Drift gate (`scripts/check-doc-drift.ts` + GitHub Actions workflow) catches future drift in CI — v1.4
42+
- VitePress docs/site migration with homepage-matched theme and local search — v1.5
43+
- Package source-of-truth under `packages/` with AUR, Homebrew, Scoop, Winget, and Nix templates — v1.6
44+
- Release-triggered package publication workflow with independent manager jobs and shared asset/checksum setup — v1.6
45+
- Package-manager maintainer runbooks for tokens, repo bootstrap, local verification, and troubleshooting — v1.6
46+
47+
### Active
48+
49+
<!-- Current scope. Building toward these. -->
50+
51+
Next milestone not selected yet. Start with `$gsd-new-milestone`.
52+
53+
Backlog still standing from v1.4 phantom log: env-var override support, `nsyte config show`/`set` subcommands, `validate` redundant `-f` flag fix, `deploy` duplicate `-c` short-flag fix.
54+
55+
### Out of Scope
56+
57+
<!-- Explicit boundaries. Includes reasoning to prevent re-adding. -->
58+
59+
- Light theme — dark-only by design (cypherpunk aesthetic)
60+
- Mobile-first homepage redesign — desktop above-the-fold fit is the priority; mobile gets graceful degradation only
61+
- Asciinema/demo content on the homepage — demo lives in docs
62+
- Marketing content on homepage (features, CI/CD, "what's nsite") — migrated to docs to enforce no-scroll constraint
63+
- CLI source changes during the v1.4 docs pass — if a doc audit reveals a real source bug or missing feature, it's flagged for a future milestone, not fixed in this one
64+
- CLI source changes during v1.5 — same rule: docs migration only; phantom-log backlog stays deferred
65+
- Live Chocolatey, Debian, Flatpak, and Snap publication — templates are preserved under `packages/`, but v1.6 intentionally did not add live jobs for those managers
66+
67+
## Context
68+
69+
- **Runtime:** Deno (TypeScript)
70+
- **Nostr libraries:** applesauce-core, applesauce-signers, applesauce-relay
71+
- **CLI framework:** Cliffy (Command, Prompt, Ansi)
72+
- **Event signing:** ISigner interface from applesauce-signers (supports bunker, nsec)
73+
- **Event timestamps:** `--created-at` global option overrides timestamp on most event kinds; delete (kind 5) and blossom auth (kind 24242) events always use current time
74+
- **Commands:** init, deploy, list, status, snapshot, sites, browse, download, get, ci, put, run, serve, delete, undeploy, validate, debug, announce, config, bunker, scan
75+
- **Marketing site:** Single-page HTML at `website/src/index.html` (~653 lines after v1.3 redesign, down from ~1890). Cypherpunk theme, `--cyber-bg #06070d`, `--cyber-accent #34d399`. Single `<section class="hero">` with flex-centered content (wordmark + tagline + compact install component + top-link nav). UI-audit score 24/24 at v1.3 close.
76+
- **Docs site:** VitePress build under `docs/`, with palette/typography matched to the homepage. Homepage links to preserve: `/docs/installation/`, `/docs/`.
77+
- **Package managers:** `packages/` is the package source-of-truth. AUR, Homebrew, Scoop, Winget, and Nix have v1.6 publication/update automation; Chocolatey, Debian, Flatpak, and Snap templates are preserved without live jobs.
78+
79+
## Constraints
80+
81+
- **Deno:** Must compile to single binary for Linux, macOS, Windows
82+
- **Nostr protocol:** Events must conform to NIP specifications
83+
- **Blossom protocol:** Auth events (kind 24242) have expiration requirements
84+
- **Brand color:** Existing green accent (`--cyber-accent #34d399`) is fixed — only darks deepen
85+
- **Marketing site:** Single-file inline CSS+HTML+JS (`website/src/index.html`); no build step
86+
87+
## Key Decisions
88+
89+
| Decision | Rationale | Outcome |
90+
|----------|-----------|---------|
91+
| Use applesauce libraries | Modern nostr library ecosystem with good Deno support | -- Pending |
92+
| Cliffy for CLI | Mature Deno CLI framework | -- Pending |
93+
| `--created-at` excluded from delete & blossom auth events | Deletion timestamp must reflect actual time; blossom expiration math depends on current time | ✓ Good (v1.2) |
94+
| Homepage flex-centered + `min-height: 100vh` (v1.3 cycle-2) | First attempt dropped 100vh and left content top-anchored — user feedback restored centering as the more pleasant layout | ✓ Good (v1.3) |
95+
| Nav placed AT END of `.hero-content` (v1.3 cycle-2) | User checkpoint feedback: links sit better below the wordmark/tagline/install | ✓ Good (v1.3) |
96+
| Underlined text tabs over button-pill style (v1.3) | Denser, fits the "tighter" mandate; cleaner with the compact install card | ✓ Good (v1.3) |
97+
| Phase 10 audit findings folded into Phase 11 rebuild | The flagged surfaces (install/code/copy components) were already being rebuilt; one-pass fix preferred over separate cleanup phase | ✓ Good (v1.3) — clean 24/24 audit |
98+
| `history.pushState` on in-page anchor click (v1.3) | Plan must_haves required `window.location.hash === '#install'`; default `e.preventDefault()` + `scrollIntoView` doesn't update the URL | ✓ Good (v1.3) |
99+
100+
## Evolution
101+
102+
This document evolves at phase transitions and milestone boundaries.
103+
104+
**After each phase transition** (via `/gsd:transition`):
105+
1. Requirements invalidated? -> Move to Out of Scope with reason
106+
2. Requirements validated? -> Move to Validated with phase reference
107+
3. New requirements emerged? -> Add to Active
108+
4. Decisions to log? -> Add to Key Decisions
109+
5. "What This Is" still accurate? -> Update if drifted
110+
111+
**After each milestone** (via `/gsd:complete-milestone`):
112+
1. Full review of all sections
113+
2. Core Value check -- still the right priority?
114+
3. Audit Out of Scope -- reasons still valid?
115+
4. Update Context with current state
116+
117+
## Key Decisions
118+
119+
(continuing from above table)
120+
121+
| Decision | Rationale | Outcome |
122+
|----------|-----------|---------|
123+
| Phantom log as living artifact | Records every removed doc claim with verbatim quotes — future feature backlog source | ✓ Good (v1.4) — 34 entries surface concrete source-side work |
124+
| `upload.md` kept as alias stub (not deleted) | UX: a user searching "upload" should find a doc that points them to deploy | ✓ Good (v1.4) |
125+
| `ls.md` filename retained, content re-anchored on `list` | Avoid breaking external links to `/docs/usage/commands/ls/` | ✓ Good (v1.4) |
126+
| `_global-options.md` canonical reference | Don't duplicate `--config`/`--created-at` across 22 pages | ✓ Good (v1.4) |
127+
| Drift gate: 3 checks (coverage, flag, env-var) | Maps directly to the top-3 phantom patterns from the audit | ✓ Good (v1.4) |
128+
| Phase 14 audit folded color findings from Phase 11 audit (UI carry-over) — n/a in v1.4 (docs-only) |||
129+
| `packages/` as package source-of-truth | Keeps manager templates versioned with the release workflow and avoids hidden `.packaging` drift | ✓ Good (v1.6) |
130+
| Independent package manager jobs instead of a matrix | One package-manager failure should not cancel unrelated publication targets | ✓ Good (v1.6) |
131+
| External package UAT deferred at close | Live pushes require repos, secrets, package-manager runtimes, and package index workflows outside local static verification | ⚠ Revisit before public package announcement |
132+
133+
---
134+
*Last updated: 2026-05-07 — after v1.6 milestone close*

.planning/RETROSPECTIVE.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Project Retrospective
2+
3+
*A living document updated after each milestone. Lessons feed forward into future planning.*
4+
5+
## Milestone: v1.6 - OS Package Manager/Distributors
6+
7+
**Shipped:** 2026-05-07
8+
**Phases:** 7 | **Plans:** 12
9+
10+
### What Was Built
11+
12+
- Package-manager source templates moved into `packages/` for AUR, Homebrew, Scoop, Winget, Nix, Chocolatey, Debian, Flatpak, and Snap.
13+
- `publish-packages.yml` wires release-triggered package publication with shared asset polling/checksum setup and independent manager jobs.
14+
- AUR, Homebrew, Scoop, Winget, and Nix publication/update paths now have CI implementations and `docs/RELEASING.md` runbooks.
15+
16+
### What Worked
17+
18+
- Preserving `.packaging` analogs before applying the pipeline branch patterns avoided losing Chocolatey, Debian, Flatpak, and Snap coverage.
19+
- Independent package-manager jobs matched the failure-isolation goal and kept each manager's validation readable.
20+
- The final open-artifact audit caught stale debug sessions and an already-consumed seed before archive.
21+
22+
### What Was Inefficient
23+
24+
- External package-manager UAT could not close locally because the required GitHub repos, secrets, package-manager runtimes, and live release workflows were not available.
25+
- Some generated milestone accomplishments needed manual cleanup before they were useful as a durable summary.
26+
27+
### Patterns Established
28+
29+
- `packages/` is the package source-of-truth.
30+
- Placeholder replacement must be named, fail-fast, and idempotent for package templates.
31+
- Runtime distribution proof should be split from static pipeline proof when external registries and secrets are the real gate.
32+
33+
### Key Lessons
34+
35+
1. Check external repo and secret existence early in package-manager milestones; missing infrastructure should be recorded as a live-UAT boundary before close.
36+
2. Treat dormant seeds as close blockers only if their trigger remains unimplemented; otherwise mark them implemented with phase evidence.
37+
3. Archive package-manager milestones with explicit external-UAT deferrals so future release work has a precise checklist rather than a vague "human needed" state.
38+
39+
### Cost Observations
40+
41+
- Sessions: multiple interrupted/resumed GSD passes.
42+
- Notable: targeted Deno gates plus `audit-open` were more useful than repo-wide lint for closeout confidence.
43+
44+
---
45+
46+
## Cross-Milestone Trends
47+
48+
### Process Evolution
49+
50+
| Milestone | Phases | Key Change |
51+
|-----------|--------|------------|
52+
| v1.6 | 7 | Package-manager work needs static implementation gates plus separate external runtime gates. |
53+
54+
### Top Lessons
55+
56+
1. Keep durable planning artifacts, but close or archive stale open-state records before milestone completion.
57+
2. Prefer repo-local validation for implementation proof and make external live-UAT prerequisites concrete.

0 commit comments

Comments
 (0)