@specship/specship-win32-arm64 0.11.8 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/dist/bin/specship.js +141 -66
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/commands/specship/check.md +5 -0
- package/lib/dist/commands/specship/spec.md +235 -15
- package/lib/dist/db/migrations.d.ts.map +1 -1
- package/lib/dist/db/migrations.js +1 -0
- package/lib/dist/db/migrations.js.map +1 -1
- package/lib/dist/enforce/enforce.d.ts +15 -0
- package/lib/dist/enforce/enforce.d.ts.map +1 -1
- package/lib/dist/enforce/enforce.js +43 -1
- package/lib/dist/enforce/enforce.js.map +1 -1
- package/lib/dist/extraction/index.d.ts +6 -0
- package/lib/dist/extraction/index.d.ts.map +1 -1
- package/lib/dist/extraction/index.js.map +1 -1
- package/lib/dist/index.d.ts +9 -1
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +53 -9
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +35 -0
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/installer/instructions-template.d.ts +2 -2
- package/lib/dist/installer/instructions-template.js +3 -3
- package/lib/dist/installer/targets/claude.d.ts +10 -0
- package/lib/dist/installer/targets/claude.d.ts.map +1 -1
- package/lib/dist/installer/targets/claude.js +33 -7
- package/lib/dist/installer/targets/claude.js.map +1 -1
- package/lib/dist/mcp/designer-tools.js +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +1 -1
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +1 -1
- package/lib/dist/mcp/spec-tools.d.ts +10 -0
- package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
- package/lib/dist/mcp/spec-tools.js +228 -2
- package/lib/dist/mcp/spec-tools.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts +12 -0
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +34 -1
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/reflect/index.d.ts +1 -1
- package/lib/dist/reflect/index.d.ts.map +1 -1
- package/lib/dist/reflect/index.js +2 -1
- package/lib/dist/reflect/index.js.map +1 -1
- package/lib/dist/reflect/miner.d.ts +8 -0
- package/lib/dist/reflect/miner.d.ts.map +1 -1
- package/lib/dist/reflect/miner.js +64 -36
- package/lib/dist/reflect/miner.js.map +1 -1
- package/lib/dist/resolution/brief-link-resolver.d.ts +20 -0
- package/lib/dist/resolution/brief-link-resolver.d.ts.map +1 -1
- package/lib/dist/resolution/brief-link-resolver.js +65 -1
- package/lib/dist/resolution/brief-link-resolver.js.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.d.ts +16 -2
- package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.js +19 -1
- package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
- package/lib/dist/server/cli.js +5 -49
- package/lib/dist/server/ingest/ingestor.js +17 -17
- package/lib/dist/server/ingest/pricing-backfill.js +55 -0
- package/lib/dist/server/ingest/pricing.js +3 -0
- package/lib/dist/server/ingest/project-paths.js +152 -0
- package/lib/dist/server/project-registry.js +15 -2
- package/lib/dist/server/routes/claude.js +47 -18
- package/lib/dist/server/routes/events.js +20 -1
- package/lib/dist/server/routes/projects.js +6 -3
- package/lib/dist/server/routes/spec.js +22 -2
- package/lib/dist/server/server.js +38 -4
- package/lib/dist/server/ssr/md.mjs +83 -0
- package/lib/dist/server/ssr/public/app.css +1 -0
- package/lib/dist/server/ssr/render.mjs +564 -0
- package/lib/dist/server/ssr/routes.js +73 -0
- package/lib/dist/server/static-handler.js +30 -0
- package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -3
- package/lib/dist/workflows/defaults/spec-implement.yaml +41 -9
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +3 -3
- package/package.json +1 -1
- package/lib/dist/commands/specship/design-implement.md +0 -84
- package/lib/dist/commands/specship/design-loop.md +0 -125
- package/lib/dist/commands/ss-behaviour.md +0 -116
- package/lib/dist/web/chunk-2AJCHB7P.js +0 -1
- package/lib/dist/web/chunk-2CPLUFCH.js +0 -2
- package/lib/dist/web/chunk-2I7L37NS.js +0 -1
- package/lib/dist/web/chunk-2IVSOVQZ.js +0 -1
- package/lib/dist/web/chunk-2NAWAJB5.js +0 -1
- package/lib/dist/web/chunk-2OJBIPE4.js +0 -1
- package/lib/dist/web/chunk-3E2WB6D5.js +0 -1
- package/lib/dist/web/chunk-3EBFYSCH.js +0 -2
- package/lib/dist/web/chunk-3QCQ4BXS.js +0 -1
- package/lib/dist/web/chunk-42XVAQ6I.js +0 -1
- package/lib/dist/web/chunk-4G7XU55L.js +0 -1
- package/lib/dist/web/chunk-4IMMPEYM.js +0 -1
- package/lib/dist/web/chunk-4TJQJPCZ.js +0 -1
- package/lib/dist/web/chunk-4WZIHTPC.js +0 -1
- package/lib/dist/web/chunk-4YVSYOSD.js +0 -1
- package/lib/dist/web/chunk-5BQIOYKW.js +0 -1
- package/lib/dist/web/chunk-5HGWHUJA.js +0 -1
- package/lib/dist/web/chunk-5NTGUSXJ.js +0 -1
- package/lib/dist/web/chunk-5Y244R4G.js +0 -1
- package/lib/dist/web/chunk-6RRDPT5Z.js +0 -1
- package/lib/dist/web/chunk-6VKB2ZWM.js +0 -1
- package/lib/dist/web/chunk-7656MA24.js +0 -1
- package/lib/dist/web/chunk-7DMFVTU4.js +0 -1
- package/lib/dist/web/chunk-7KWBINA7.js +0 -1
- package/lib/dist/web/chunk-7MUNFW56.js +0 -1
- package/lib/dist/web/chunk-7SMPKVEP.js +0 -1
- package/lib/dist/web/chunk-AZJVTPLU.js +0 -1
- package/lib/dist/web/chunk-AZUUBUEJ.js +0 -1
- package/lib/dist/web/chunk-BLBRMCN2.js +0 -1
- package/lib/dist/web/chunk-BMIAXD2V.js +0 -2
- package/lib/dist/web/chunk-BPCJLNBS.js +0 -47
- package/lib/dist/web/chunk-BUXWEHIY.js +0 -1
- package/lib/dist/web/chunk-CYXQILZI.js +0 -1
- package/lib/dist/web/chunk-DLQPZWSI.css +0 -1
- package/lib/dist/web/chunk-DOKZOFKM.js +0 -1
- package/lib/dist/web/chunk-DTWIJ3GJ.js +0 -1
- package/lib/dist/web/chunk-DYRFLPJA.js +0 -1
- package/lib/dist/web/chunk-E27QAKAB.js +0 -1
- package/lib/dist/web/chunk-E3J3CXR5.js +0 -1
- package/lib/dist/web/chunk-E73OX2P7.js +0 -1
- package/lib/dist/web/chunk-EAXRKDLV.js +0 -1
- package/lib/dist/web/chunk-EBKKDHYI.js +0 -1
- package/lib/dist/web/chunk-EE7V7Q5P.js +0 -1
- package/lib/dist/web/chunk-EKY2FUHU.js +0 -1
- package/lib/dist/web/chunk-EP6XOPXH.js +0 -1
- package/lib/dist/web/chunk-ESGDLJOJ.js +0 -1
- package/lib/dist/web/chunk-ETJG7NCY.js +0 -1
- package/lib/dist/web/chunk-EUUEFEDI.js +0 -1
- package/lib/dist/web/chunk-EXBUKHH2.js +0 -17
- package/lib/dist/web/chunk-F5TBUYDH.js +0 -1
- package/lib/dist/web/chunk-FC3R7YHR.js +0 -4
- package/lib/dist/web/chunk-FGNZDHTL.js +0 -11
- package/lib/dist/web/chunk-FIJW2UNJ.js +0 -1
- package/lib/dist/web/chunk-FMV5PXRC.js +0 -5
- package/lib/dist/web/chunk-G7RXFHYO.js +0 -1
- package/lib/dist/web/chunk-G7VZT5KB.js +0 -3
- package/lib/dist/web/chunk-GRZYXPSO.js +0 -7
- package/lib/dist/web/chunk-GYGPS3AN.js +0 -1
- package/lib/dist/web/chunk-H723TYYD.js +0 -2
- package/lib/dist/web/chunk-H7AF7YS4.js +0 -1
- package/lib/dist/web/chunk-HDZDQILN.js +0 -1
- package/lib/dist/web/chunk-HMK6UO6N.js +0 -1
- package/lib/dist/web/chunk-HSJNHNOH.js +0 -6
- package/lib/dist/web/chunk-IHEE5NYJ.js +0 -1
- package/lib/dist/web/chunk-IOB4JJT4.js +0 -1
- package/lib/dist/web/chunk-ISNEBICW.js +0 -1
- package/lib/dist/web/chunk-J2GZVLHH.js +0 -1
- package/lib/dist/web/chunk-JGDK6YKG.js +0 -1
- package/lib/dist/web/chunk-JLOJCDIY.js +0 -1
- package/lib/dist/web/chunk-JPSYO24K.js +0 -1
- package/lib/dist/web/chunk-JTFXTIPE.js +0 -903
- package/lib/dist/web/chunk-K7UD24Z4.js +0 -1
- package/lib/dist/web/chunk-KYSTCHAH.js +0 -1
- package/lib/dist/web/chunk-LB6JPLX2.js +0 -1
- package/lib/dist/web/chunk-LNSVDHCI.js +0 -1
- package/lib/dist/web/chunk-LVGIY3SO.js +0 -1
- package/lib/dist/web/chunk-LXLHIHEN.js +0 -1
- package/lib/dist/web/chunk-MNFTHCSJ.js +0 -1
- package/lib/dist/web/chunk-N6SS4G6S.js +0 -1
- package/lib/dist/web/chunk-NKPK3BR3.js +0 -1
- package/lib/dist/web/chunk-NTBJG6SJ.js +0 -1
- package/lib/dist/web/chunk-NUDB3Q2Y.js +0 -3
- package/lib/dist/web/chunk-OTQR5VFM.js +0 -1
- package/lib/dist/web/chunk-OXEF5E3E.js +0 -1
- package/lib/dist/web/chunk-P62EJGSF.js +0 -1
- package/lib/dist/web/chunk-PCW6R7OP.js +0 -1
- package/lib/dist/web/chunk-PGGJPDJG.js +0 -1
- package/lib/dist/web/chunk-POCVU4VK.js +0 -2
- package/lib/dist/web/chunk-PS6HRYQQ.js +0 -3
- package/lib/dist/web/chunk-PUYSJNJR.js +0 -1
- package/lib/dist/web/chunk-PZSU53SS.js +0 -1
- package/lib/dist/web/chunk-Q2RVFS45.js +0 -1
- package/lib/dist/web/chunk-Q7L6LLAK.js +0 -1
- package/lib/dist/web/chunk-QCMKJIWY.js +0 -1
- package/lib/dist/web/chunk-QH6CF3M3.js +0 -1
- package/lib/dist/web/chunk-QIZ65CGB.js +0 -1
- package/lib/dist/web/chunk-QPA2REUE.js +0 -1
- package/lib/dist/web/chunk-QQ5LD7PI.js +0 -1
- package/lib/dist/web/chunk-QR6L3KAC.js +0 -1
- package/lib/dist/web/chunk-R2DLK4HO.js +0 -1
- package/lib/dist/web/chunk-RD6TVPOT.js +0 -1
- package/lib/dist/web/chunk-RKY4EJYJ.js +0 -1
- package/lib/dist/web/chunk-RONYWVY7.js +0 -1
- package/lib/dist/web/chunk-RXKXYF2C.js +0 -1
- package/lib/dist/web/chunk-SQPYSOV6.js +0 -1
- package/lib/dist/web/chunk-SWKJRNYY.js +0 -1
- package/lib/dist/web/chunk-SYGIPC2P.js +0 -4
- package/lib/dist/web/chunk-T7AZ65JP.js +0 -1
- package/lib/dist/web/chunk-TCZDVOHD.js +0 -1
- package/lib/dist/web/chunk-TPTITA3V.js +0 -1
- package/lib/dist/web/chunk-TR335633.js +0 -1
- package/lib/dist/web/chunk-TWVVIWKO.js +0 -1
- package/lib/dist/web/chunk-U67LRNER.js +0 -1
- package/lib/dist/web/chunk-UR5KDXPX.js +0 -1
- package/lib/dist/web/chunk-UR6O2GEH.js +0 -1
- package/lib/dist/web/chunk-USVLLFVR.js +0 -1
- package/lib/dist/web/chunk-UTNMGWTP.js +0 -1
- package/lib/dist/web/chunk-V74ZPP4B.js +0 -1
- package/lib/dist/web/chunk-VECWMHJP.js +0 -1
- package/lib/dist/web/chunk-VUACT35R.js +0 -3
- package/lib/dist/web/chunk-VZI7H4SZ.js +0 -1
- package/lib/dist/web/chunk-WB6YHOD4.js +0 -1
- package/lib/dist/web/chunk-WBJ5VEB5.js +0 -1
- package/lib/dist/web/chunk-WBT64AWV.js +0 -1
- package/lib/dist/web/chunk-WFXJIXZE.js +0 -4
- package/lib/dist/web/chunk-WTGYRH3Z.js +0 -298
- package/lib/dist/web/chunk-WXTCVDTP.js +0 -1
- package/lib/dist/web/chunk-XAUQEKZX.js +0 -1
- package/lib/dist/web/chunk-XCDHWLVH.js +0 -1
- package/lib/dist/web/chunk-Y3H6FFUZ.js +0 -1
- package/lib/dist/web/chunk-Y4F5ULGJ.js +0 -1
- package/lib/dist/web/chunk-YEGKAAEE.js +0 -1
- package/lib/dist/web/chunk-YM2KU57F.js +0 -1
- package/lib/dist/web/chunk-YNYVOPWF.js +0 -1
- package/lib/dist/web/chunk-YRERBP6T.js +0 -1
- package/lib/dist/web/chunk-YV5LB22R.js +0 -1
- package/lib/dist/web/chunk-YWIRU745.js +0 -1
- package/lib/dist/web/chunk-YXYPTZ6E.js +0 -1
- package/lib/dist/web/chunk-ZLV4VCDG.js +0 -3
- package/lib/dist/web/chunk-ZTVI5KFF.js +0 -1
- package/lib/dist/web/favicon-16.png +0 -0
- package/lib/dist/web/favicon-180.png +0 -0
- package/lib/dist/web/favicon-32.png +0 -0
- package/lib/dist/web/favicon-512.png +0 -0
- package/lib/dist/web/favicon-small.svg +0 -15
- package/lib/dist/web/favicon.ico +0 -0
- package/lib/dist/web/favicon.svg +0 -20
- package/lib/dist/web/icon-192.png +0 -0
- package/lib/dist/web/icon-512.png +0 -0
- package/lib/dist/web/index.html +0 -146
- package/lib/dist/web/main-ESADRXN2.css +0 -1
- package/lib/dist/web/main-FY3HQ4PX.js +0 -1
- package/lib/dist/web/manifest.webmanifest +0 -15
- package/lib/dist/web/media/codicon-LN6W7LCM.ttf +0 -0
- package/lib/dist/web/styles-KSOPUVDA.css +0 -1
- package/lib/dist/web/sw.js +0 -69
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Intent door — view, author, fast-path, implement, review, or extend a spec. No arg = the spec funnel; a SPEC_ID = that spec's detail; `new`/`fast`/`implement`/`review`/`triage`/`behaviour`/`domain` run the matching flow.
|
|
3
|
-
argument-hint: "<SPEC_ID> | new <desc> | fast <desc> | implement <ID> | review <ID> | triage <prompt> | behaviour <ID> | domain"
|
|
4
|
-
allowed-tools: Read, Edit, Write, Bash, mcp__specship__specship_spec, mcp__specship__specship_node, mcp__specship__specship_explore, mcp__specship__specship_search, mcp__specship__specship_link_assert, mcp__specship__specship_link_verify
|
|
2
|
+
description: Intent door — view, list, capture or review ideas, author, fast-path, design, implement, review, or extend a spec. No arg = the spec funnel; a SPEC_ID = that spec's detail; `idea`/`ideas`/`list`/`new`/`fast`/`design`/`implement`/`review`/`triage`/`behaviour`/`domain` run the matching flow.
|
|
3
|
+
argument-hint: "<SPEC_ID> | idea <one-liner> | ideas | list | new <desc> | fast <desc> | design <URL | intent> | implement <ID> | review <ID> | triage <prompt> | behaviour <ID> | domain"
|
|
4
|
+
allowed-tools: Read, Edit, Write, Bash, mcp__specship__specship_spec, mcp__specship__specship_node, mcp__specship__specship_explore, mcp__specship__specship_search, mcp__specship__specship_link_assert, mcp__specship__specship_link_verify, mcp__specship__specship_drifted, mcp__specship__designer_session, mcp__specship__designer_prompt, mcp__specship__designer_ask, mcp__specship__designer_list, mcp__specship__designer_snapshot, mcp__specship__designer_handoff
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# SpecShip Spec: `$ARGUMENTS`
|
|
@@ -19,24 +19,151 @@ lost.
|
|
|
19
19
|
`spec_id`: the body, parent/siblings, and linked code with state. Use this
|
|
20
20
|
before Read-ing the spec file. Jump into linked code via `specship_node`; if
|
|
21
21
|
nothing is linked yet, `specship_explore` on terms from the spec's title.
|
|
22
|
+
- **`idea <one-liner>`** → park the thought as an idea brief and return to the
|
|
23
|
+
interrupted work, without breaking flow (see *Idea* below). Append-only: no
|
|
24
|
+
gap-fill questions, no review pass, one confirmation line.
|
|
25
|
+
- **`list`** → call `specship_spec` with `list: true`: the flat spec inventory —
|
|
26
|
+
idea briefs, then every document's requirements, each carrying exactly one
|
|
27
|
+
rolled-up status (`authored · in-progress · implemented · verified ·
|
|
28
|
+
needs-attention`), closing with per-status totals (REQ-DOORS-008). ONE call;
|
|
29
|
+
render what it returns — no per-spec follow-up calls, no file reading. For
|
|
30
|
+
pipeline-health rollups use the no-argument funnel instead.
|
|
31
|
+
- **`ideas`** → call `specship_spec` with `ideas: true`: the ideas review view —
|
|
32
|
+
exactly the idea-state briefs (parked, unpromoted brainstorms), each showing
|
|
33
|
+
id, title, age since capture, and labels, closing with the promotion hand-off
|
|
34
|
+
(`/specship:spec new <brief-id>`) (REQ-IDEAS-002). ONE call; render what it
|
|
35
|
+
returns as-is — no per-idea follow-up calls, no file reading. An empty lane is
|
|
36
|
+
reported cleanly, not as an error. Promote a listed idea with
|
|
37
|
+
`/specship:spec new <brief-id>`.
|
|
22
38
|
- **`new <description>`** → the full, gated authoring loop (see *Author* below).
|
|
23
|
-
Use when the design isn't settled.
|
|
39
|
+
Use when the design isn't settled. A first token shaped `brief:<slug>` (a
|
|
40
|
+
parked idea's id) instead opens the **brief-seeded** loop: the interview
|
|
41
|
+
starts pre-filled from that brief and asks only what it leaves open, and the
|
|
42
|
+
written spec points back at the brief. Plain text still opens a blank
|
|
43
|
+
interview — the seeded path is additive.
|
|
24
44
|
- **`fast <description>`** → the **fast-path** (see below).
|
|
45
|
+
- **`design <URL | intent>`** → author from visually-expressed intent: a
|
|
46
|
+
`claude.ai/design` URL, a `figma.com` URL, or no URL (taste loop first). See
|
|
47
|
+
*Design* below.
|
|
25
48
|
- **`implement <SPEC_ID>`** → run the bundled workflow:
|
|
26
49
|
`specship workflow run spec-implement --input SPEC_ID=<ID>` (plan → approve →
|
|
27
|
-
implement → verify → link, in an isolated worktree).
|
|
50
|
+
implement → verify → link, in an isolated worktree). **If the session is in
|
|
51
|
+
plan mode, exit it first** (present the spec + the workflow's own gates as
|
|
52
|
+
the plan) — the spec IS the plan, the workflow carries its own plan→approve
|
|
53
|
+
gate, and plan mode blocks the `specship workflow run` launch
|
|
54
|
+
(REQ-DOORS-007).
|
|
28
55
|
- **`review <SPEC_ID>`** → a read-only rubric pass (see *Review* below); no edits.
|
|
29
56
|
- **`triage <prompt>`** → the triage flow (route a bug / error / one-line
|
|
30
57
|
enhancement to the existing spec it belongs to and append to it): see below.
|
|
31
58
|
- **`behaviour <SPEC_ID>`** → author + run E2E tests from the requirement's
|
|
32
59
|
acceptance criteria; see below.
|
|
33
60
|
- **`domain`** → capture a human-confirmed domain fact; see below.
|
|
61
|
+
- **any other free text** (not empty, not a `SPEC_ID`, not a known sub-route
|
|
62
|
+
verb — the known verbs are `idea`, `ideas`, `list`, `new`, `fast`, `design`,
|
|
63
|
+
`implement`, `review`, `triage`, `behaviour`, `domain`, so `idea …` routes to
|
|
64
|
+
the capture flow above and `ideas` to the review view, never reaching this
|
|
65
|
+
disambiguation — REQ-IDEAS-001.A6, REQ-IDEAS-002.A5)
|
|
66
|
+
→ don't fall through to undefined behaviour. Ask **one** clarifying
|
|
67
|
+
question offering `new`, `fast`, and `triage`, **leading with an inferred
|
|
68
|
+
recommendation** from the input's shape: error-log-shaped input (a stack
|
|
69
|
+
trace, `file:line`, an exception/failure message) → recommend `triage`;
|
|
70
|
+
feature-shaped input (a capability the user wants) → recommend `new` (or
|
|
71
|
+
`fast` if it reads as a quick, settled change). Route to the chosen sub-route
|
|
72
|
+
once answered. The no-argument funnel and bare-`SPEC_ID` detail behaviours
|
|
73
|
+
above are unchanged.
|
|
34
74
|
|
|
35
|
-
##
|
|
75
|
+
## Idea (`idea <one-liner>`)
|
|
76
|
+
|
|
77
|
+
The **five-second capture verb** (REQ-IDEAS-001). An idea arrives mid-flow; park
|
|
78
|
+
it and get back to what you were doing. This path is deliberately dumb — **no
|
|
79
|
+
brainstorm, no gap-fill questions, no diverge, no Post-write review** (those are
|
|
80
|
+
for authoring; parking is not authoring). Enrichment is what promotion
|
|
81
|
+
(`new <brief-id>`) is for.
|
|
82
|
+
|
|
83
|
+
**This path SKIPS both authoring gates below.** It does *not* run the "Plan mode
|
|
84
|
+
at the write/hand-off boundary" exit dance and it does *not* run the "Post-write
|
|
85
|
+
review" pass — capture is append-only. (If the session happens to be in plan
|
|
86
|
+
mode, exit it only so the one `Write` can land, nothing more — there is no plan
|
|
87
|
+
to present; the whole point is not to interrupt.)
|
|
88
|
+
|
|
89
|
+
Steps:
|
|
90
|
+
|
|
91
|
+
1. **Empty guard (A5).** If the one-liner is empty (bare `idea`, or only
|
|
92
|
+
whitespace), **write nothing** — print the one-line usage hint
|
|
93
|
+
`Usage: /specship:spec idea <one-liner>` and return. No file, no sync.
|
|
94
|
+
2. **Label prefix (A3).** If the one-liner begins with a bare `word:` prefix
|
|
95
|
+
(a single leading word immediately followed by a colon, e.g.
|
|
96
|
+
`idea perf: cache the snapshots`), take that word as the **label** and the
|
|
97
|
+
remainder (trimmed) as the one-liner. Match only a single leading
|
|
98
|
+
`^(\w+):\s*` — `we should: cache X` has no label (its first word isn't
|
|
99
|
+
colon-terminated). If stripping the label leaves an empty remainder, fall
|
|
100
|
+
back to the empty guard (A5).
|
|
101
|
+
3. **Slug.** Kebab-case the one-liner (lowercase, non-alphanumeric → `-`,
|
|
102
|
+
collapse repeats, trim `-`), truncated to a sane length. If
|
|
103
|
+
`specs/<slug>/brief.md` already exists, append `-2`, `-3`, … until the path
|
|
104
|
+
is free — never overwrite an existing brief.
|
|
105
|
+
4. **Grounding (A4), opportunistic — never blocking.** If the current
|
|
106
|
+
conversation already makes the code under discussion obvious (files just
|
|
107
|
+
read/edited, symbols named in the exchange), record them as a `## Grounding`
|
|
108
|
+
body section of `file:symbol` / `file` bullets so future review can
|
|
109
|
+
re-ground. If nothing is clearly in scope, **skip it silently** — absence of
|
|
110
|
+
context never blocks or delays capture. Do **not** go search for grounding.
|
|
111
|
+
5. **Write the brief (A1).** `Write` `specs/<slug>/brief.md`:
|
|
112
|
+
```markdown
|
|
113
|
+
---
|
|
114
|
+
slug: <slug>
|
|
115
|
+
created: <YYYY-MM-DD> # today, from `date +%F`
|
|
116
|
+
label: <label> # only when a prefix label was parsed (A3)
|
|
117
|
+
---
|
|
118
|
+
# <one-liner>
|
|
119
|
+
|
|
120
|
+
<one-liner>
|
|
121
|
+
|
|
122
|
+
## Grounding # only when step 4 captured something (A4)
|
|
123
|
+
- <file>:<symbol>
|
|
124
|
+
```
|
|
125
|
+
There is **no `spec:` key** — a brief without one reconciles to the `idea`
|
|
126
|
+
state, so it indexes as an `idea`-state `brief:<slug>` on the next sync (A1).
|
|
127
|
+
6. **Sync + confirm (A2).** Run `specship sync`, then print exactly **one**
|
|
128
|
+
confirmation line naming the brief — e.g. `Parked as brief:<slug>.` — and
|
|
129
|
+
return to the interrupted work. Ask nothing.
|
|
130
|
+
|
|
131
|
+
## Plan mode at the write/hand-off boundary (every authoring path)
|
|
132
|
+
|
|
133
|
+
Plan mode is fine — even natural — for the authoring *conversation* (the
|
|
134
|
+
diverge phase is read-only exploration). But the moment the human confirms,
|
|
135
|
+
plan mode has served its purpose: **exit it before the confirmed `Write` of
|
|
136
|
+
`specs/<slug>.md`, and before launching `implement`** (REQ-DOORS-007). The
|
|
137
|
+
human's confirmation inside this flow is the approval plan mode was waiting
|
|
138
|
+
for; staying in plan mode past it just blocks the write and stalls the
|
|
139
|
+
hand-off. Don't re-plan the spec in the exit — the spec is the plan.
|
|
140
|
+
|
|
141
|
+
## Author (`new <description | brief:<slug>>`)
|
|
36
142
|
|
|
37
143
|
The gated authoring loop, run conversationally — diverge, then formalize. Write
|
|
38
144
|
NOTHING to disk until the human explicitly confirms.
|
|
39
145
|
|
|
146
|
+
**Seeded from a brief (`new brief:<slug>`).** A first token shaped `brief:<slug>`
|
|
147
|
+
means this is the promotion of a parked idea, not a blank author. This path is
|
|
148
|
+
purely additive — a plain description still falls straight to the loop below
|
|
149
|
+
(A4). When the argument is `brief:`-shaped:
|
|
150
|
+
|
|
151
|
+
- **Resolve** the brief first: call `specship_spec` with `spec_id:
|
|
152
|
+
"brief:<slug>"` (or `Read specs/<slug>/brief.md`).
|
|
153
|
+
- **Not found (A3):** if `specship_spec` reports no such brief, **stop** — print
|
|
154
|
+
a one-line not-found notice pointing at `/specship:spec ideas` to browse the
|
|
155
|
+
parked ideas (and offer plain `new <description>`). Never fall through to a
|
|
156
|
+
blank interview.
|
|
157
|
+
- **Found (A1):** treat the brief's problem statement, evidence, and code
|
|
158
|
+
grounding as **already-answered** interview inputs. Pre-fill step 1's
|
|
159
|
+
scope/ground and step 2's diverge from the brief, and interview **only** on
|
|
160
|
+
what the brief leaves open (UX, edge cases, non-goals). Still run
|
|
161
|
+
`specship_explore` on the brief's terms in step 1 — the brief's captured
|
|
162
|
+
grounding may be stale.
|
|
163
|
+
|
|
164
|
+
Then run the loop below, skipping every question the brief already answers; on
|
|
165
|
+
the write (step 3) the spec points back at the brief so the funnel promotes it.
|
|
166
|
+
|
|
40
167
|
1. **Scope + ground.** Confirm it's one feature area (refuse "spec the whole
|
|
41
168
|
app"). Call `specship_explore` on terms from the description to find where
|
|
42
169
|
similar features live and which files the work will touch.
|
|
@@ -48,8 +175,14 @@ NOTHING to disk until the human explicitly confirms.
|
|
|
48
175
|
`spec-author` format: frontmatter (id/title/owner/priority), `<!-- id: -->`
|
|
49
176
|
markers above every heading, an RFC-2119 keyword per requirement title, one
|
|
50
177
|
concern per requirement, `## Acceptance` with `.A<N>` bullets (happy +
|
|
51
|
-
failure). Mark genuinely-unknowable points `[needs review]`.
|
|
52
|
-
|
|
178
|
+
failure). Mark genuinely-unknowable points `[needs review]`. **Seeded from a
|
|
179
|
+
brief:** the frontmatter MUST also carry `brief: <brief-slug>/brief.md` — the
|
|
180
|
+
value is relative to the spec file's own directory, so a spec at
|
|
181
|
+
`specs/<slug>.md` names `<brief-slug>/brief.md` (A2). After the step-4 sync,
|
|
182
|
+
the funnel's brief↔spec reconciliation flips that brief to `specified` and it
|
|
183
|
+
drops out of the `ideas` view automatically — no extra bookkeeping.
|
|
184
|
+
4. **Sync + review:** `specship sync`, then run the shared **Post-write review**
|
|
185
|
+
(see below) — it is automatic, not optional. Then hand off with
|
|
53
186
|
`/specship:spec implement <ID>`.
|
|
54
187
|
|
|
55
188
|
(If a richer authoring skill — e.g. `spec-author` — is available in this
|
|
@@ -65,6 +198,27 @@ ids, unique ids, valid frontmatter, valid `implementations:`), **QUALITY**
|
|
|
65
198
|
one concern per REQ, failure-path coverage), **HYGIENE** (owner/priority set, no
|
|
66
199
|
stale `[needs review]`/TODO). End with a one-line verdict.
|
|
67
200
|
|
|
201
|
+
## Post-write review (automatic, every authoring path)
|
|
202
|
+
|
|
203
|
+
The uniform review backstop — **no spec reaches disk unreviewed**. After **any**
|
|
204
|
+
authoring path (`new`, `fast`, `design`) has written and `specship sync`-ed a
|
|
205
|
+
spec, run the same rubric pass automatically. This is not a separate interview
|
|
206
|
+
and not the opt-in `review <SPEC_ID>` route; it always runs, once, on the
|
|
207
|
+
just-written spec:
|
|
208
|
+
|
|
209
|
+
1. Walk the **STRUCTURAL / QUALITY / HYGIENE** rubric defined in *Review* above
|
|
210
|
+
against the new spec.
|
|
211
|
+
2. **Fix STRUCTURAL findings automatically** — missing/stranded/duplicate id
|
|
212
|
+
markers, invalid frontmatter, broken `implementations:` paths — then re-`sync`.
|
|
213
|
+
3. For **QUALITY findings that would change implementation behaviour** (a vague
|
|
214
|
+
or untestable acceptance criterion, a leaked implementation detail, a missing
|
|
215
|
+
failure path), surface them as **one** proceed/adjust prompt — apply the
|
|
216
|
+
adjustments or proceed as-is on the user's call. No extra gap-fill interview.
|
|
217
|
+
4. HYGIENE nits are noted in passing; they don't block the hand-off.
|
|
218
|
+
|
|
219
|
+
This is what enforces REQ-DOORS-002.A3 ("speed does not sacrifice correctness")
|
|
220
|
+
for the fast-path rather than leaving it aspirational.
|
|
221
|
+
|
|
68
222
|
## Fast-path (`fast <description>`)
|
|
69
223
|
|
|
70
224
|
For a solo dev who wants to record intent and move, **without** the brainstorm /
|
|
@@ -77,22 +231,88 @@ gap-question interview (REQ-DOORS-002):
|
|
|
77
231
|
failure). Pick sensible defaults instead of asking; mark only genuinely
|
|
78
232
|
unknowable points `[needs review]`.
|
|
79
233
|
3. `Write` it to `specs/<slug>.md` and tell the user the path.
|
|
80
|
-
4.
|
|
234
|
+
4. `specship sync`, then run the shared **Post-write review** (below) — it is
|
|
235
|
+
part of the single guided step, so speed doesn't skip the backstop. Then hand
|
|
236
|
+
off with `/specship:spec implement <ID>` when ready.
|
|
81
237
|
|
|
82
238
|
The fast-path still produces a well-formed spec that indexes cleanly and is ready
|
|
83
239
|
for implementation + linking — it trades the interview for speed, not correctness.
|
|
84
240
|
|
|
241
|
+
## Design (`design <URL | intent>`)
|
|
242
|
+
|
|
243
|
+
Author from **visually-expressed intent** — a third authoring modality alongside
|
|
244
|
+
`new` and `fast`. Route on the argument's shape; each path ends by feeding the
|
|
245
|
+
bundled `claude-design-implement` workflow, which snapshots the design byte-for-byte,
|
|
246
|
+
extracts tokens, drafts a spec (contract only — no hex/pixels), and pauses at a
|
|
247
|
+
gap-fill approval gate before writing. Keep this entry thin: delegate to the
|
|
248
|
+
workflow and the `designer-loop` skill rather than re-explaining either.
|
|
249
|
+
|
|
250
|
+
- **`claude.ai/design` URL** → the import path. The URL is of the form
|
|
251
|
+
`https://claude.ai/design/p/<project-id>/?file=<File+Name>.html`; derive `SLUG`
|
|
252
|
+
from the `file=` query param (`Data+Flow.html` → `data-flow`) unless a second
|
|
253
|
+
token overrides it. Run:
|
|
254
|
+
```bash
|
|
255
|
+
specship workflow run claude-design-implement \
|
|
256
|
+
--input CONNECTOR_URL="<URL>" \
|
|
257
|
+
--input FILE_LABEL="<File Name>" \
|
|
258
|
+
--input SLUG="<slug>"
|
|
259
|
+
```
|
|
260
|
+
Add `--input OWNER="<team>"` / `--input PRIORITY="high|medium|low"` to populate
|
|
261
|
+
frontmatter; otherwise they surface as `[needs review]` at the gap-fill gate.
|
|
262
|
+
- **`figma.com` URL** → the Figma import path via the remote Figma MCP. **Probe
|
|
263
|
+
for the Figma MCP first.** If it is **not** installed, tell the user to run
|
|
264
|
+
`claude mcp add --transport http figma https://mcp.figma.com/mcp` and **stop** —
|
|
265
|
+
never blind-`fetch` the URL. If it **is** present, snapshot/import the Figma
|
|
266
|
+
design through it, then feed the same `claude-design-implement` workflow with
|
|
267
|
+
the imported bundle (`--input HANDOFF_DIR=…`).
|
|
268
|
+
- **no URL (bare intent, or empty)** → run the **taste loop first**, then import.
|
|
269
|
+
Follow the **`designer-loop` skill** (`~/.claude/skills/designer-loop/SKILL.md`)
|
|
270
|
+
— it is the authority. In brief: probe the designer runtime with
|
|
271
|
+
`designer_session({ action: "status" })` (if it errors "CDP not up"/"Not signed
|
|
272
|
+
in", tell the user to run `designer setup` and stop — the loop needs the live
|
|
273
|
+
browser, never a blind fetch); survey the repo's capabilities with
|
|
274
|
+
`specship_explore`/`specship_search` and relay them verbatim into the prompt;
|
|
275
|
+
drive `claude.ai/design` through `designer_prompt`/`designer_ask` while the
|
|
276
|
+
**human tastes** the variants (you relay, you don't propose your own); iterate
|
|
277
|
+
until the human says **"that's it"** (Gate 1). Then `designer_handoff` the
|
|
278
|
+
chosen variant and feed its bundle into the same workflow via its `HANDOFF_DIR`
|
|
279
|
+
input:
|
|
280
|
+
```bash
|
|
281
|
+
specship workflow run claude-design-implement \
|
|
282
|
+
--input HANDOFF_DIR="<absolute path to handoff-<ts>/>" \
|
|
283
|
+
--input CHOSEN_FILE="<chosen variant>.html" \
|
|
284
|
+
--input FILE_LABEL="<File Label>" \
|
|
285
|
+
--input SLUG="<slug>"
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
When the workflow finishes it hands off with `/specship:spec implement <first REQ ID>`;
|
|
289
|
+
the implementer reads `specs/<slug>/snapshot.html` for visual fidelity. After the
|
|
290
|
+
spec is written and synced, the shared **Post-write review** (above) runs like any
|
|
291
|
+
other authoring path.
|
|
292
|
+
|
|
85
293
|
## Triage (`triage <prompt>`)
|
|
86
294
|
|
|
295
|
+
Triage is the **single intake for anything broken** — the user can't be expected
|
|
296
|
+
to know whether their failing behaviour is a "bug" (append a criterion) or "drift"
|
|
297
|
+
(a stale spec↔code link); triage decides.
|
|
298
|
+
|
|
87
299
|
Classify the input (bug / error log / enhancement). Retrieve candidates: prose →
|
|
88
300
|
`specship_spec` with a `query`; an error log → parse the `file:line`/symbol →
|
|
89
301
|
`specship_explore`/`specship_node` → the owning requirement. Present the ranked
|
|
90
|
-
match + recommended target.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
302
|
+
match + recommended target.
|
|
303
|
+
|
|
304
|
+
**Before proposing an append, consult the drift queue** (`specship_drifted`): if
|
|
305
|
+
the matched spec has links in the `drifted` or `broken` state, its real problem is
|
|
306
|
+
a stale link, not a missing criterion — recommend the gate door's fix flow,
|
|
307
|
+
`/specship:check fix <SPEC_ID>`, instead of appending. When the matched spec's
|
|
308
|
+
links are healthy, proceed with the append:
|
|
309
|
+
|
|
310
|
+
**Preview the exact diff → confirm** (offer edit / new-spec / cancel), then append
|
|
311
|
+
a new requirement (new concern) or a new `.A<N>` acceptance criterion (a regression
|
|
312
|
+
an existing requirement should have covered), auto-deriving the next
|
|
313
|
+
collision-checked id, and `specship_link_assert` it. When nothing clears the match
|
|
314
|
+
floor, say so and offer `/specship:spec new` instead — never auto-create. Write
|
|
315
|
+
nothing until confirmed.
|
|
96
316
|
|
|
97
317
|
## Behaviour tests (`behaviour <SPEC_ID>`)
|
|
98
318
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAC;CAClC;AA4aD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAU5D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAiB3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAG1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,EAAE,CAKpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,GACjB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAU3E"}
|
|
@@ -343,6 +343,7 @@ const migrations = [
|
|
|
343
343
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
344
344
|
`);
|
|
345
345
|
const rates = [
|
|
346
|
+
['claude-fable-5', 10.0, 50.0, 12.5, 1.0],
|
|
346
347
|
['claude-opus-4-7', 15.0, 75.0, 18.75, 1.5],
|
|
347
348
|
['claude-opus-4', 15.0, 75.0, 18.75, 1.5],
|
|
348
349
|
['claude-sonnet-4-6', 3.0, 15.0, 3.75, 0.3],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,4 +67,19 @@ export declare const ENFORCE_CONFIG_FILE = "specship.config.json";
|
|
|
67
67
|
* or unparseable → `{}` (all checks advisory — the opt-in default).
|
|
68
68
|
*/
|
|
69
69
|
export declare function loadEnforceConfig(projectRoot: string): EnforceConfig;
|
|
70
|
+
/** All check names, for `--strict` / `--enable-gate` validation. */
|
|
71
|
+
export declare const ALL_CHECKS: CheckName[];
|
|
72
|
+
/**
|
|
73
|
+
* The `--strict` override (REQ-ENFORCE-004.A2): every check gates for this
|
|
74
|
+
* run only. Nothing is read from or written to the project config.
|
|
75
|
+
*/
|
|
76
|
+
export declare function strictEnforceConfig(): EnforceConfig;
|
|
77
|
+
/**
|
|
78
|
+
* Persist gating for the named checks into `specship.config.json`
|
|
79
|
+
* (REQ-ENFORCE-004.A1 — the command writes the config; the user is never
|
|
80
|
+
* told to hand-edit JSON). Merges into an existing file, preserving every
|
|
81
|
+
* other key (including other `enforce` settings like `behaviour.exclude`).
|
|
82
|
+
* Returns the checks newly enabled (already-gating checks are skipped).
|
|
83
|
+
*/
|
|
84
|
+
export declare function enableGateChecks(projectRoot: string, checks: CheckName[]): CheckName[];
|
|
70
85
|
//# sourceMappingURL=enforce.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE9E,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qFAAqF;IACrF,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACpC;AAED,oFAAoF;AACpF,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,UAAU,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,qBAAqB,CAAC;IACvC,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,0CAA0C;IAC1C,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,GAAE,aAAkB,GAAG,aAAa,CAoDhG;AAED,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CASpE"}
|
|
1
|
+
{"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE9E,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qFAAqF;IACrF,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACpC;AAED,oFAAoF;AACpF,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,UAAU,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,qBAAqB,CAAC;IACvC,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,0CAA0C;IAC1C,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,GAAE,aAAkB,GAAG,aAAa,CAoDhG;AAED,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CASpE;AAED,oEAAoE;AACpE,eAAO,MAAM,UAAU,EAAE,SAAS,EAAyD,CAAC;AAE5F;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAmBtF"}
|
|
@@ -49,9 +49,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
49
49
|
};
|
|
50
50
|
})();
|
|
51
51
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
-
exports.ENFORCE_CONFIG_FILE = void 0;
|
|
52
|
+
exports.ALL_CHECKS = exports.ENFORCE_CONFIG_FILE = void 0;
|
|
53
53
|
exports.evaluateEnforcement = evaluateEnforcement;
|
|
54
54
|
exports.loadEnforceConfig = loadEnforceConfig;
|
|
55
|
+
exports.strictEnforceConfig = strictEnforceConfig;
|
|
56
|
+
exports.enableGateChecks = enableGateChecks;
|
|
55
57
|
const fs = __importStar(require("fs"));
|
|
56
58
|
const path = __importStar(require("path"));
|
|
57
59
|
function evaluateEnforcement(deps, config = {}) {
|
|
@@ -122,4 +124,44 @@ function loadEnforceConfig(projectRoot) {
|
|
|
122
124
|
}
|
|
123
125
|
return {};
|
|
124
126
|
}
|
|
127
|
+
/** All check names, for `--strict` / `--enable-gate` validation. */
|
|
128
|
+
exports.ALL_CHECKS = ['drift', 'fitness', 'maintainability', 'behaviour'];
|
|
129
|
+
/**
|
|
130
|
+
* The `--strict` override (REQ-ENFORCE-004.A2): every check gates for this
|
|
131
|
+
* run only. Nothing is read from or written to the project config.
|
|
132
|
+
*/
|
|
133
|
+
function strictEnforceConfig() {
|
|
134
|
+
return { gate: { drift: true, fitness: true, maintainability: true, behaviour: true } };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Persist gating for the named checks into `specship.config.json`
|
|
138
|
+
* (REQ-ENFORCE-004.A1 — the command writes the config; the user is never
|
|
139
|
+
* told to hand-edit JSON). Merges into an existing file, preserving every
|
|
140
|
+
* other key (including other `enforce` settings like `behaviour.exclude`).
|
|
141
|
+
* Returns the checks newly enabled (already-gating checks are skipped).
|
|
142
|
+
*/
|
|
143
|
+
function enableGateChecks(projectRoot, checks) {
|
|
144
|
+
const file = path.join(projectRoot, exports.ENFORCE_CONFIG_FILE);
|
|
145
|
+
let cfg = {};
|
|
146
|
+
try {
|
|
147
|
+
cfg = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// missing / unparseable → start fresh
|
|
151
|
+
}
|
|
152
|
+
if (!cfg.enforce || typeof cfg.enforce !== 'object')
|
|
153
|
+
cfg.enforce = {};
|
|
154
|
+
if (!cfg.enforce.gate || typeof cfg.enforce.gate !== 'object')
|
|
155
|
+
cfg.enforce.gate = {};
|
|
156
|
+
const enabled = [];
|
|
157
|
+
for (const check of checks) {
|
|
158
|
+
if (cfg.enforce.gate[check] !== true) {
|
|
159
|
+
cfg.enforce.gate[check] = true;
|
|
160
|
+
enabled.push(check);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (enabled.length > 0)
|
|
164
|
+
fs.writeFileSync(file, JSON.stringify(cfg, null, 2) + '\n', 'utf-8');
|
|
165
|
+
return enabled;
|
|
166
|
+
}
|
|
125
167
|
//# sourceMappingURL=enforce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDH,kDAoDC;AASD,8CASC;
|
|
1
|
+
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,12 @@ export interface SyncResult {
|
|
|
40
40
|
nodesUpdated: number;
|
|
41
41
|
durationMs: number;
|
|
42
42
|
changedFilePaths?: string[];
|
|
43
|
+
/**
|
|
44
|
+
* Spec links that transitioned into `drifted` during this sync's spec
|
|
45
|
+
* pass (DRIFT-PUSH-DOC). Populated by SpecShip.sync(); absent when no
|
|
46
|
+
* files changed or the spec pass didn't run.
|
|
47
|
+
*/
|
|
48
|
+
driftedTransitions?: import('../resolution/spec-link-resolver').DriftTransition[];
|
|
43
49
|
}
|
|
44
50
|
/**
|
|
45
51
|
* Calculate SHA256 hash of file contents
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,OAAO,EAGL,gBAAgB,EAChB,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,OAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA4BxC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"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"}
|