Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions cmd/specsync/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ var knownSubcommands = map[string]bool{
"sync": true, "audit": true, "audit-tasks": true, "validate": true,
"spinoff": true, "pr-body": true, "verify": true,
"agent-help": true, "doctor": true, "idea": true, "ideas": true, "archive": true,
"epic": true, "adopt": true,
"epic": true, "adopt": true, "topology": true,
}

// knownConfusions maps a word someone might reach for by habit (e.g. git's
Expand Down Expand Up @@ -94,7 +94,7 @@ func deprecatedSlugFlag(args []string) error {
func main() {
cmd, rest, err := resolveSubcommand(os.Args[1:])
if err != nil {
fmt.Fprintf(os.Stderr, "specsync: %v\n\nRun with no subcommand (optionally with flags) to sync, or use one of: pull, adopt, link, scan, trace, release-plan, changelog, install-skill, changes, set-stage, set-priority, note, audit, audit-tasks, validate, spinoff, pr-body, verify, idea, ideas, archive, epic\n", err)
fmt.Fprintf(os.Stderr, "specsync: %v\n\nRun with no subcommand (optionally with flags) to sync, or use one of: pull, adopt, link, scan, trace, release-plan, changelog, install-skill, changes, set-stage, set-priority, note, audit, audit-tasks, validate, spinoff, pr-body, verify, idea, ideas, archive, epic, topology\n", err)
os.Exit(2)
}

Expand Down Expand Up @@ -151,6 +151,8 @@ func main() {
runArchive(rest)
case "epic":
runEpic(rest)
case "topology":
runTopology(rest)
default:
runSync(rest)
}
Expand Down
26 changes: 26 additions & 0 deletions openspec/changes/restore-topology-dispatch/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Restore the topology command and fix stale "soon" badges on the site

## Why
PR #174 (store support) was rebased from a branch that predated two pieces of
already-shipped work: the `topology` subcommand's dispatch wiring in
`cmd/specsync/main.go`, and the "See who's already working what" feature card
on specsync.se. The flat-diff reapplication silently dropped the `topology`
case from `knownSubcommands` and the `main()` switch, so `specsync topology`
now fails with "unknown subcommand" even though `runTopology` and all its
tests are still present and working.

Separately, while reviewing the site after that merge: three feature cards
(design notes overflow #139, topology #168, adopt #160) still carry a "soon"
badge even though all three shipped weeks ago.

## What Changes
- Restore `"topology": true` in `knownSubcommands`, the `case "topology":
runTopology(rest)` dispatch arm, and `topology` in the subcommand list
printed on an unknown-subcommand error.
- Drop the stale `"status": "soon"` / `"issue"` fields from the three
already-shipped feature cards in `site/features.json`.

## Impact
- Affected code: `cmd/specsync/main.go`, `site/features.json`
- No spec delta: restores previously-specified, previously-tested behavior
that regressed in a merge; doesn't change any contract.
2 changes: 2 additions & 0 deletions openspec/changes/restore-topology-dispatch/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- [x] Restore topology to knownSubcommands and the dispatch switch
- [x] Drop stale soon/issue fields from the three shipped feature cards
25 changes: 25 additions & 0 deletions openspec/changes/trim-feature-card-sprawl/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Trim low-value feature cards from the landing page

## Why
site/features.json has grown to one card per shipped PR rather than curated
visitor-facing messaging. Several entries describe internal implementation
details or flag-behavior nuances that read as changelog entries rather than
reasons to try the tool:

- "Explicit repo resolution" and "Per-repository board" — resolution
precedence order (`-repo` flag → `gh repo set-default` → `origin`, etc.):
reference-doc material, and "Per-repository board" duplicated "Projects
board sync" right above it.
- "No label noise by default" — a specific PR's behavior change (labels
opt-in via `-labels`), not a feature a new visitor evaluates on.

## What Changes
- Remove "Explicit repo resolution", "Per-repository board", and "No label
noise by default".
- Retitle "Collapsed by default" → "A clean issue, not a wall of text" to
lead with the visible benefit instead of the implementation mechanism.
- Already-shipped features keep full documentation in README.md; this only
trims the landing page's card list.

## Impact
- Affected: site/features.json only. No code or behavior change.
1 change: 1 addition & 0 deletions openspec/changes/trim-feature-card-sprawl/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- [x] Remove the three low-value cards, retitle one for benefit-first framing
32 changes: 4 additions & 28 deletions site/features.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
"group": "plan",
"icon": "flow",
"title": "Design notes survive the worktree",
"body": "A <code>design.md</code> renders as <code>## Design notes</code> in the synced issue, so decisions made while planning aren't lost if the local worktree is force-removed. Oversized notes overflow to a linked issue comment instead of getting truncated.",
"status": "soon",
"issue": 139
"body": "A <code>design.md</code> renders as <code>## Design notes</code> in the synced issue, so decisions made while planning aren't lost if the local worktree is force-removed. Oversized notes overflow to a linked issue comment instead of getting truncated."
},
{
"group": "plan",
Expand All @@ -23,9 +21,7 @@
"group": "plan",
"icon": "flow",
"title": "See who's already working what",
"body": "<code>specsync topology</code> joins every change with its tracker issue, git branch, and worktree across coordinated stores — a read-only check before an agent starts, so it doesn't duplicate work already in flight.",
"status": "soon",
"issue": 168
"body": "<code>specsync topology</code> joins every change with its tracker issue, git branch, and worktree across coordinated stores — a read-only check before an agent starts, so it doesn't duplicate work already in flight."
},
{
"group": "plan",
Expand All @@ -49,9 +45,7 @@
"group": "collaborate",
"icon": "idempotent",
"title": "Adopt an existing issue",
"body": "<code>specsync adopt -issue 3691 -change my-change</code> binds a change and an issue that already exist independently, writing the ref cache before touching the issue body so the link holds immediately instead of racing search indexing.",
"status": "soon",
"issue": 160
"body": "<code>specsync adopt -issue 3691 -change my-change</code> binds a change and an issue that already exist independently, writing the ref cache before touching the issue body so the link holds immediately instead of racing search indexing."
},
{
"group": "collaborate",
Expand Down Expand Up @@ -89,18 +83,6 @@
"title": "Archive audit",
"body": "<code>specsync audit</code> cross-references archived changes against GitHub PRs to find archived-but-unmerged work. Add <code>-mark-shipped</code> to record the final lifecycle step."
},
{
"group": "collaborate",
"icon": "idempotent",
"title": "Explicit repo resolution",
"body": "specsync resolves the target repository deterministically: <code>-repo</code> flag → <code>gh repo set-default</code> → <code>origin</code>. Fork-parent writes are refused by default; use <code>-repo</code> to override."
},
{
"group": "collaborate",
"icon": "board",
"title": "Per-repository board",
"body": "Board resolution per-repository: <code>-project</code> flag → <code>openspec/specsync.yml</code> → no board. No global default; each repo syncs only to its own declared board."
},
{
"group": "collaborate",
"icon": "idempotent",
Expand Down Expand Up @@ -134,13 +116,7 @@
{
"group": "collaborate",
"icon": "state",
"title": "Collapsed by default",
"title": "A clean issue, not a wall of text",
"body": "A synced issue shows title and task checklist first — Proposal, Original ask, and Discoveries render inside collapsed <code>&lt;details&gt;</code> blocks, one click away, nothing removed."
},
{
"group": "collaborate",
"icon": "idempotent",
"title": "No label noise by default",
"body": "<code>specsync</code> and <code>stage:&lt;stage&gt;</code> labels are opt-in via <code>-labels</code> — neither is read back by specsync itself, so they aren't added unless you actually want native-label filtering."
}
]
Loading