@magic-spells/constellation 0.3.0 → 0.4.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/constellation/decision/DECISION-FEATURE-RELEASE-TYPES.md +50 -0
- package/constellation/decision/DECISION-NATIVE-DECISION-TYPE.md +58 -0
- package/constellation/doc/DOC-CARD-TYPES.md +6 -3
- package/constellation/doc/DOC-FILE-FORMAT.md +1 -1
- package/constellation/doc/DOC-LINT-CODES.md +1 -1
- package/constellation/doc/DOC-MCP-UPGRADES.md +4 -3
- package/constellation/file/FILE-HANDLES.md +1 -1
- package/constellation/file/FILE-TYPES.md +1 -1
- package/constellation/file/FILE-VALIDATE.md +1 -1
- package/dist/core/handles.d.ts +1 -1
- package/dist/core/handles.js +4 -1
- package/dist/core/handles.js.map +1 -1
- package/dist/core/indexer.js +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/types.js +3 -2
- package/dist/core/types.js.map +1 -1
- package/dist/mcp/server.js +12 -3
- package/dist/mcp/server.js.map +1 -1
- package/examples/constellation/decision/DECISION-NO-HARD-DELETE.md +31 -0
- package/examples/constellation/feature/FEATURE-AUTO-ASSIGNMENT.md +24 -0
- package/examples/constellation/release/RELEASE-V1-1-0.md +14 -0
- package/package.json +1 -1
- package/schemas/decision.json +14 -0
- package/schemas/doc.json +1 -1
- package/schemas/feature.json +19 -0
- package/schemas/plan.json +1 -1
- package/schemas/release.json +14 -0
- package/skill/SKILL.md +28 -2
- package/skill/methodology.md +4 -1
- package/skill/types/decision.md +59 -0
- package/skill/types/doc.md +2 -2
- package/skill/types/feature.md +53 -0
- package/skill/types/plan.md +1 -1
- package/skill/types/release.md +37 -0
- package/viewer/dist/assets/{arc-ByV7p1fN.js → arc-DcXsmPgw.js} +1 -1
- package/viewer/dist/assets/architecture-7EHR7CIX-CXZxmtF5.js +1 -0
- package/viewer/dist/assets/{architectureDiagram-3BPJPVTR-CMawC2nt.js → architectureDiagram-3BPJPVTR-Cfq3OC2M.js} +1 -1
- package/viewer/dist/assets/{blockDiagram-GPEHLZMM-Bp0MKYXV.js → blockDiagram-GPEHLZMM-CPuRJqEW.js} +1 -1
- package/viewer/dist/assets/{c4Diagram-AAUBKEIU-BLCX9gmN.js → c4Diagram-AAUBKEIU-CcVcItWo.js} +1 -1
- package/viewer/dist/assets/channel-DjvAjJNc.js +1 -0
- package/viewer/dist/assets/{chunk-2J33WTMH-C6iOidst.js → chunk-2J33WTMH-C_N821rH.js} +1 -1
- package/viewer/dist/assets/{chunk-3OPIFGDE-B9xItVw4.js → chunk-3OPIFGDE-C5c2MY1i.js} +1 -1
- package/viewer/dist/assets/{chunk-4BX2VUAB-Bl0HWb9B.js → chunk-4BX2VUAB-BjYatXZ-.js} +1 -1
- package/viewer/dist/assets/{chunk-55IACEB6-BYilo1WJ.js → chunk-55IACEB6-A3JXj2W_.js} +1 -1
- package/viewer/dist/assets/{chunk-5ZQYHXKU-DOCnP8P8.js → chunk-5ZQYHXKU-zDiW1Z3e.js} +1 -1
- package/viewer/dist/assets/{chunk-727SXJPM-D9YKAzha.js → chunk-727SXJPM-CI3VBaXr.js} +1 -1
- package/viewer/dist/assets/{chunk-AQP2D5EJ-B1KE4h_b.js → chunk-AQP2D5EJ-DHpkJ1wF.js} +1 -1
- package/viewer/dist/assets/{chunk-BSJP7CBP-DA3pfXCw.js → chunk-BSJP7CBP-DXx1-_Zs.js} +1 -1
- package/viewer/dist/assets/{chunk-CSCIHK7Q-Bv0Fa0Zn.js → chunk-CSCIHK7Q-DQOe6SQo.js} +1 -1
- package/viewer/dist/assets/{chunk-FMBD7UC4-k-EzzpU2.js → chunk-FMBD7UC4-DSvwBCfP.js} +1 -1
- package/viewer/dist/assets/{chunk-KSCS5N6A-CUTkv0jR.js → chunk-KSCS5N6A-C3haQOao.js} +1 -1
- package/viewer/dist/assets/{chunk-L5ZTLDWV-C_SwE6oB.js → chunk-L5ZTLDWV-DyHfVaRK.js} +1 -1
- package/viewer/dist/assets/{chunk-LZXEDZCA-DtwqVIDt.js → chunk-LZXEDZCA-CtMQqok_.js} +2 -2
- package/viewer/dist/assets/{chunk-ND2GUHAM-JJiAqLG2.js → chunk-ND2GUHAM-Cfp2zN_i.js} +1 -1
- package/viewer/dist/assets/{chunk-NZK2D7GU-BQ8Dn7FA.js → chunk-NZK2D7GU-Cn753oIP.js} +1 -1
- package/viewer/dist/assets/{chunk-O5CBEL6O-BRpqOJ1I.js → chunk-O5CBEL6O-BO32_B2k.js} +1 -1
- package/viewer/dist/assets/chunk-QZHKN3VN-uc4X3bta.js +1 -0
- package/viewer/dist/assets/chunk-WU5MYG2G-D-wARmLR.js +1 -0
- package/viewer/dist/assets/{chunk-XPW4576I-C1NcqPJd.js → chunk-XPW4576I-DQFQAfwD.js} +1 -1
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-CosoTts2.js +1 -0
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-CosoTts2.js +1 -0
- package/viewer/dist/assets/{cose-bilkent-S5V4N54A-BsJFb39B.js → cose-bilkent-S5V4N54A-Ibe8V5Cm.js} +1 -1
- package/viewer/dist/assets/{dagre-BM42HDAG-CRPovG4Q.js → dagre-BM42HDAG-BlOzR9WP.js} +1 -1
- package/viewer/dist/assets/{diagram-2AECGRRQ-D6GCKn1u.js → diagram-2AECGRRQ-l8omQVTU.js} +1 -1
- package/viewer/dist/assets/{diagram-5GNKFQAL-CoHqKdf3.js → diagram-5GNKFQAL-_rHQzAtO.js} +1 -1
- package/viewer/dist/assets/{diagram-KO2AKTUF-BEkMb40X.js → diagram-KO2AKTUF-DCLRVRMY.js} +1 -1
- package/viewer/dist/assets/{diagram-LMA3HP47-B6mfW9S2.js → diagram-LMA3HP47-14HnEIqk.js} +1 -1
- package/viewer/dist/assets/{diagram-OG6HWLK6-OBBkuJvR.js → diagram-OG6HWLK6-CVKNCbkR.js} +1 -1
- package/viewer/dist/assets/{dist-C4BxOpXa.js → dist-BcVVfWxM.js} +1 -1
- package/viewer/dist/assets/{erDiagram-TEJ5UH35-C2i3TB2-.js → erDiagram-TEJ5UH35-CNjpEfJD.js} +1 -1
- package/viewer/dist/assets/eventmodeling-FCH6USID-Dv27utnc.js +1 -0
- package/viewer/dist/assets/{flowDiagram-I6XJVG4X-SreJFib5.js → flowDiagram-I6XJVG4X-Bvekb5gu.js} +1 -1
- package/viewer/dist/assets/{ganttDiagram-6RSMTGT7-DO7GLSdw.js → ganttDiagram-6RSMTGT7-2TpeWF0N.js} +1 -1
- package/viewer/dist/assets/{gitGraph-WXDBUCRP-Cgwn_Q5_.js → gitGraph-WXDBUCRP-CPfybYvf.js} +1 -1
- package/viewer/dist/assets/{gitGraphDiagram-PVQCEYII-DLwaMyDa.js → gitGraphDiagram-PVQCEYII-BWZNJ9lY.js} +1 -1
- package/viewer/dist/assets/index-BEJYsfzU.css +2 -0
- package/viewer/dist/assets/{index-COz6c_JS.js → index-Cqx2pndu.js} +3 -3
- package/viewer/dist/assets/{info-J43DQDTF-Ci-BiM87.js → info-J43DQDTF-CxgngY4X.js} +1 -1
- package/viewer/dist/assets/{infoDiagram-5YYISTIA-Bip5dlKM.js → infoDiagram-5YYISTIA-CARF_viY.js} +1 -1
- package/viewer/dist/assets/{ishikawaDiagram-YF4QCWOH-VXV_9uEH.js → ishikawaDiagram-YF4QCWOH-DcxZvtur.js} +1 -1
- package/viewer/dist/assets/{journeyDiagram-JHISSGLW-DQz-8gAS.js → journeyDiagram-JHISSGLW-Wu7zolY5.js} +1 -1
- package/viewer/dist/assets/{kanban-definition-UN3LZRKU-BTWpEcf0.js → kanban-definition-UN3LZRKU--LMKLf5s.js} +1 -1
- package/viewer/dist/assets/{line-BnRWAabF.js → line-DH7DV7uw.js} +1 -1
- package/viewer/dist/assets/{linear-BR6v_8SI.js → linear-C6xJ2LrZ.js} +1 -1
- package/viewer/dist/assets/{mermaid-parser.core-CSsnrQhR.js → mermaid-parser.core-DkqLwTDu.js} +2 -2
- package/viewer/dist/assets/{mermaid.core-I1kLnpG2.js → mermaid.core-H-eI9axh.js} +3 -3
- package/viewer/dist/assets/{mindmap-definition-RKZ34NQL-Cq66Ilr1.js → mindmap-definition-RKZ34NQL-xjt8VE8m.js} +1 -1
- package/viewer/dist/assets/{packet-YPE3B663-BjSCEGVd.js → packet-YPE3B663-BX0W_wIa.js} +1 -1
- package/viewer/dist/assets/{pie-LRSECV5Y-Di72yxoZ.js → pie-LRSECV5Y-B8cD_uBh.js} +1 -1
- package/viewer/dist/assets/{pieDiagram-4H26LBE5-TmsfKHOO.js → pieDiagram-4H26LBE5-DpM-20zS.js} +1 -1
- package/viewer/dist/assets/{quadrantDiagram-W4KKPZXB-Dp9iSvCk.js → quadrantDiagram-W4KKPZXB-CLS4_FQ4.js} +1 -1
- package/viewer/dist/assets/{radar-GUYGQ44K-CZeWC3Jm.js → radar-GUYGQ44K-CQKcm4b5.js} +1 -1
- package/viewer/dist/assets/{requirementDiagram-4Y6WPE33-lbTbiw59.js → requirementDiagram-4Y6WPE33-ESLvOyQ5.js} +1 -1
- package/viewer/dist/assets/{sankeyDiagram-5OEKKPKP-DqmoGDJk.js → sankeyDiagram-5OEKKPKP-BT6w9JdP.js} +1 -1
- package/viewer/dist/assets/{sequenceDiagram-3UESZ5HK-B6_EiWF6.js → sequenceDiagram-3UESZ5HK-DJNAaEbv.js} +1 -1
- package/viewer/dist/assets/{src-Dz3SjXJY.js → src-ituc2uBy.js} +1 -1
- package/viewer/dist/assets/{stateDiagram-AJRCARHV-Z6QRASCx.js → stateDiagram-AJRCARHV-Bw7VoMlA.js} +1 -1
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-DZdCGd2U.js +1 -0
- package/viewer/dist/assets/{timeline-definition-PNZ67QCA-XuUZAYAP.js → timeline-definition-PNZ67QCA-Ddr17PAT.js} +1 -1
- package/viewer/dist/assets/{treeView-BLDUP644-DuGsPB97.js → treeView-BLDUP644-mqjp8QBZ.js} +1 -1
- package/viewer/dist/assets/{treemap-LRROVOQU-CSJx8IZ0.js → treemap-LRROVOQU-BeaxV5lr.js} +1 -1
- package/viewer/dist/assets/{vennDiagram-CIIHVFJN-BnebDryc.js → vennDiagram-CIIHVFJN-ySQYfWol.js} +1 -1
- package/viewer/dist/assets/{wardley-L42UT6IY-DqqoXPSq.js → wardley-L42UT6IY-BvtBpxdo.js} +1 -1
- package/viewer/dist/assets/{wardleyDiagram-YWT4CUSO-Bchy871K.js → wardleyDiagram-YWT4CUSO-DRZFQiXX.js} +1 -1
- package/viewer/dist/assets/{xychartDiagram-2RQKCTM6-Bl_zzGZm.js → xychartDiagram-2RQKCTM6-kXPrRy2n.js} +1 -1
- package/viewer/dist/index.html +2 -2
- package/viewer/dist/assets/architecture-7EHR7CIX-FCXXAu3O.js +0 -1
- package/viewer/dist/assets/channel-GJMBi5UK.js +0 -1
- package/viewer/dist/assets/chunk-QZHKN3VN-DA8qsAVF.js +0 -1
- package/viewer/dist/assets/chunk-WU5MYG2G-Dp8LMm21.js +0 -1
- package/viewer/dist/assets/classDiagram-4FO5ZUOK-wnkp0LBB.js +0 -1
- package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-wnkp0LBB.js +0 -1
- package/viewer/dist/assets/eventmodeling-FCH6USID-CCZDiBK0.js +0 -1
- package/viewer/dist/assets/index-Bqs39Itl.css +0 -2
- package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BePyUY0u.js +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: FEATURE and RELEASE are native card types
|
|
3
|
+
status: built
|
|
4
|
+
connections:
|
|
5
|
+
- DOC-CARD-TYPES
|
|
6
|
+
- FILE-TYPES
|
|
7
|
+
- DECISION-NATIVE-DECISION-TYPE
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# FEATURE and RELEASE are native card types
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Constellation modeled the *initial* build well — PLAN cards and phases, work
|
|
15
|
+
marked `status: planned` — but had no primitive for how projects actually grow
|
|
16
|
+
afterwards: feature branches that ship in release versions. `planned` marks
|
|
17
|
+
individual cards, yet nothing groups a coherent slice of work; and a version's
|
|
18
|
+
intent (theme, upgrade notes) had no home that isn't a changelog.
|
|
19
|
+
|
|
20
|
+
## Decision
|
|
21
|
+
|
|
22
|
+
Add two types (the 19th and 20th). **FEATURE** — a coherent unit of future
|
|
23
|
+
work, connected to every card it adds or touches; fields `release` (handle of
|
|
24
|
+
the RELEASE it targets — structured ref, auto-connects) and `branch`
|
|
25
|
+
(informational). **RELEASE** — a version milestone; field `version`. Status
|
|
26
|
+
carries each card's arc: a FEATURE goes `planned → building → built` as its
|
|
27
|
+
branch merges; a RELEASE goes `planned → built` as it ships.
|
|
28
|
+
|
|
29
|
+
Two guardrails hold the philosophy:
|
|
30
|
+
|
|
31
|
+
- **FEATURE is not a ticket tracker.** Work that is one card's status flip
|
|
32
|
+
needs no FEATURE card; the backlog stays a `status` query.
|
|
33
|
+
- **RELEASE is not a changelog.** What shipped is git's job ([[DOC-CHANGE-TRACKING]]);
|
|
34
|
+
the card holds only what git can't say — theme, intent, migration notes.
|
|
35
|
+
|
|
36
|
+
## Alternatives
|
|
37
|
+
|
|
38
|
+
- **Scoped PLAN cards per feature** — rejected: plans are living summaries, not
|
|
39
|
+
units of work with an arc; and retrieval by type ("show open features") needs
|
|
40
|
+
a prefix.
|
|
41
|
+
- **External trackers only (issues/boards)** — rejected: the plan is the
|
|
42
|
+
agent-facing memory; work the graph can't see can't be traversed, assembled,
|
|
43
|
+
or drift-checked.
|
|
44
|
+
|
|
45
|
+
## Consequences
|
|
46
|
+
|
|
47
|
+
- The iteration loop is now first-class: feature branch ↔ FEATURE card,
|
|
48
|
+
release version ↔ RELEASE card, wired by `release:`.
|
|
49
|
+
- A shipped FEATURE card stays, like a DECISION card
|
|
50
|
+
([[DECISION-NATIVE-DECISION-TYPE]]) — provenance of why the system grew.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: DECISION is a native card type
|
|
3
|
+
status: built
|
|
4
|
+
connections:
|
|
5
|
+
- DOC-CARD-TYPES
|
|
6
|
+
- DOC-MCP-UPGRADES
|
|
7
|
+
- FILE-TYPES
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# DECISION is a native card type
|
|
11
|
+
|
|
12
|
+
Reverses the earlier call in [[DOC-MCP-UPGRADES]] ("decided AGAINST a dedicated
|
|
13
|
+
`DECISION` card type"). This card is itself the first native decision card — the
|
|
14
|
+
new type records the *why*; [[DOC-CARD-TYPES]] records the *what*.
|
|
15
|
+
|
|
16
|
+
## Context
|
|
17
|
+
|
|
18
|
+
The original reasoning was that co-location beats a separate filing system:
|
|
19
|
+
decisions live as `append_note(kind: decision)` on the cards they concern, or as
|
|
20
|
+
a DOC card (`kind: decision`) when bigger. Field use broke that model two ways:
|
|
21
|
+
|
|
22
|
+
- **Volume.** Real projects accumulated 30+ `DOC-…` decision cards, burying the
|
|
23
|
+
actual documentation (guides, rules) in `doc/` and making "every decision" a
|
|
24
|
+
kind-filter query instead of a folder and a type.
|
|
25
|
+
- **Fan-out.** A decision routinely shapes *several* cards, so there is no single
|
|
26
|
+
card to co-locate a note on. The graph already had the right primitive —
|
|
27
|
+
connections — but no node type for the decision itself.
|
|
28
|
+
|
|
29
|
+
The skill also already mandated one-file-per-decision ("Decisions (ADRs) get one
|
|
30
|
+
DOC card each"), so the "separate filing system" existed either way; it was just
|
|
31
|
+
typed as documentation.
|
|
32
|
+
|
|
33
|
+
## Decision
|
|
34
|
+
|
|
35
|
+
Add `DECISION-` / `decision/` as the 18th type. A DECISION card is an ADR — the
|
|
36
|
+
choice, the why, the alternatives rejected — **connected to every card it
|
|
37
|
+
shaped**. One structured field, `supersedes` (an earlier DECISION handle; must
|
|
38
|
+
resolve, and connects the two). Superseded decisions are kept, never deleted.
|
|
39
|
+
|
|
40
|
+
`append_note(kind: decision)` stays: it remains the right home for a choice local
|
|
41
|
+
to a single card. Promote a note to a DECISION card when the choice touches more
|
|
42
|
+
than one card or the rejected alternatives are worth recording.
|
|
43
|
+
|
|
44
|
+
## Alternatives
|
|
45
|
+
|
|
46
|
+
- **Status quo (DOC `kind: decision`)** — rejected: pollutes `doc/`, invisible in
|
|
47
|
+
the type system, and retrieval (viewer nav, `list_cards`, `describe_type`)
|
|
48
|
+
can't treat decisions as first-class.
|
|
49
|
+
- **Notes only, no decision cards** — rejected: cross-cutting decisions have no
|
|
50
|
+
co-location target; splitting one rationale across N notes drifts.
|
|
51
|
+
|
|
52
|
+
## Consequences
|
|
53
|
+
|
|
54
|
+
- `doc/` is documentation again: suggested DOC kinds shrink to guide / rule / meta.
|
|
55
|
+
- Adding the type touched the usual four places ([[DOC-CARD-TYPES]]) plus the
|
|
56
|
+
three agent-guidance copies and the viewer palette.
|
|
57
|
+
- Existing plans with `DOC-…` decision cards can migrate one card at a time with
|
|
58
|
+
`rename_card` (e.g. `DOC-DECISION-X` → `DECISION-X`); nothing forces it.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: The
|
|
2
|
+
name: The 20 card types
|
|
3
3
|
kind: reference
|
|
4
4
|
status: built
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# The
|
|
7
|
+
# The 20 card types
|
|
8
8
|
|
|
9
|
-
The prefix before the first dash determines a card's type and must be one of these
|
|
9
|
+
The prefix before the first dash determines a card's type and must be one of these 20. Folder
|
|
10
10
|
placement matches the type (a misfiled card warns W001, not errors — the prefix is
|
|
11
11
|
authoritative). Defined in [[FILE-TYPES]] (`TYPE_NAMES`) and [[FILE-HANDLES]] (`TYPE_FOLDERS`).
|
|
12
12
|
|
|
@@ -17,6 +17,7 @@ authoritative). Defined in [[FILE-TYPES]] (`TYPE_NAMES`) and [[FILE-HANDLES]] (`
|
|
|
17
17
|
| DATATYPE | `DATATYPE-` | `datatype/` | Data type schemas (interfaces, Zod, etc.) |
|
|
18
18
|
| ROLE | `ROLE-` | `role/` | User roles / permission groups |
|
|
19
19
|
| DOC | `DOC-` | `doc/` | Documentation cards |
|
|
20
|
+
| DECISION | `DECISION-` | `decision/` | Architecture decision records — the why + rejected alternatives |
|
|
20
21
|
| FILE | `FILE-` | `file/` | Source file references (require `path`) |
|
|
21
22
|
| TEST | `TEST-` | `test/` | Test specs |
|
|
22
23
|
| EXTERNAL | `EXTERNAL-` | `external/` | External services / integrations |
|
|
@@ -29,6 +30,8 @@ authoritative). Defined in [[FILE-TYPES]] (`TYPE_NAMES`) and [[FILE-HANDLES]] (`
|
|
|
29
30
|
| DIAGRAM | `DIAGRAM-` | `diagram/` | Architecture diagrams |
|
|
30
31
|
| AGENT | `AGENT-` | `agent/` | AI agent instructions / policies |
|
|
31
32
|
| PLAN | `PLAN-` | `plan/` | Plan documents (`plan.md` = PLAN-PROJECT) |
|
|
33
|
+
| FEATURE | `FEATURE-` | `feature/` | Future work units — the iteration primitive |
|
|
34
|
+
| RELEASE | `RELEASE-` | `release/` | Version milestones — theme + upgrade notes, never a changelog |
|
|
32
35
|
|
|
33
36
|
**Adding or renaming a type touches four places that must agree:** `TYPE_NAMES`
|
|
34
37
|
([[FILE-TYPES]]) + `TYPE_FOLDERS` ([[FILE-HANDLES]]); `schemas/<folder>.json`;
|
|
@@ -17,7 +17,7 @@ normative format; the JSON Schemas in `schemas/` define per-type frontmatter and
|
|
|
17
17
|
The filename IS the handle: `api/API-TICKETS.md` defines the card `API-TICKETS`. There is no
|
|
18
18
|
`handle:` or `type:` field — the path already says it. Handle grammar:
|
|
19
19
|
`^[A-Z][A-Z0-9]*-[A-Z0-9][A-Z0-9-]*$` (3–135 chars; uppercase, digits, dashes). The prefix
|
|
20
|
-
before the first dash is the type and must be one of the
|
|
20
|
+
before the first dash is the type and must be one of the 20 canonical prefixes (see
|
|
21
21
|
[[DOC-CARD-TYPES]]). `plan.md` at the root is the one special file — the card `PLAN-PROJECT`.
|
|
22
22
|
|
|
23
23
|
## Frontmatter
|
|
@@ -15,7 +15,7 @@ Structural codes come from [[FILE-INDEXER]]; schema codes (W002/W003) from [[FIL
|
|
|
15
15
|
| Code | Rule |
|
|
16
16
|
|---|---|
|
|
17
17
|
| E001 | Filename is not a valid handle |
|
|
18
|
-
| E002 | Handle prefix is not one of the
|
|
18
|
+
| E002 | Handle prefix is not one of the 20 canonical prefixes |
|
|
19
19
|
| E003 | Duplicate handle (two files resolve to the same handle) |
|
|
20
20
|
| E004 | `connections` entry is not a handle-shaped string |
|
|
21
21
|
| E005 | `connections` or frontmatter-field target resolves to no card |
|
|
@@ -46,9 +46,10 @@ call. `assemble` fuses both into a fan-out-ready work package.
|
|
|
46
46
|
change flag; the drift verdict stays live and unstored ([[DOC-CHANGE-TRACKING]], [[FILE-SYNC]]).
|
|
47
47
|
- **Code attach is same-repo** — cards never bind across repos; reach a sibling's code via the
|
|
48
48
|
`repo` selector ([[DOC-CONNECTED-REPOS]]).
|
|
49
|
-
- **Decided AGAINST a dedicated `DECISION` card type** —
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
- **Decided AGAINST a dedicated `DECISION` card type** — *superseded by
|
|
50
|
+
[[DECISION-NATIVE-DECISION-TYPE]]*: real projects accumulated dozens of DOC decision cards,
|
|
51
|
+
and cross-cutting decisions have no single card to co-locate a note on. Card-local choices
|
|
52
|
+
still live as `append_note(kind: decision)` on the card they concern.
|
|
52
53
|
- **Memory must be retrievable to be memory** — `search` indexes note text alongside bodies,
|
|
53
54
|
and `list_notes` gives the cross-card view (every gotcha / every decision in one call). A
|
|
54
55
|
note that full-text search can't find would silently defeat the point of appending it.
|
|
@@ -3,7 +3,7 @@ name: handles.ts
|
|
|
3
3
|
status: built
|
|
4
4
|
path: src/core/handles.ts
|
|
5
5
|
language: typescript
|
|
6
|
-
summary: Handle grammar, the
|
|
6
|
+
summary: Handle grammar, the 20 canonical prefixes, and the type↔folder map
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
Defines the handle regex (`^[A-Z][A-Z0-9]*-[A-Z0-9][A-Z0-9-]*$`), `isHandleShaped` / `isKnownHandle` / `typeForHandle`, and `TYPE_FOLDERS` — the authority for which prefix is which type and where its cards live.
|
|
@@ -3,7 +3,7 @@ name: types.ts
|
|
|
3
3
|
status: built
|
|
4
4
|
path: src/core/types.ts
|
|
5
5
|
language: typescript
|
|
6
|
-
summary: Core domain types + TYPE_NAMES (the
|
|
6
|
+
summary: Core domain types + TYPE_NAMES (the 20 types)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
`Card`, `Connection`, `PlanIndex`, `Issue`, `CardRefs`, `ConnectedRepo`, and `TYPE_NAMES`. One of the four places a type addition must touch.
|
|
@@ -8,4 +8,4 @@ connections:
|
|
|
8
8
|
- FILE-TYPES
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
Validates each card's frontmatter against `schemas/`. Derives the W003 base allow-list from `card.json`'s properties (not a hardcoded list), so cross-type metadata fields are blessed on all
|
|
11
|
+
Validates each card's frontmatter against `schemas/`. Derives the W003 base allow-list from `card.json`'s properties (not a hardcoded list), so cross-type metadata fields are blessed on all 20 types. Ajv ships CJS — loaded via createRequire.
|
package/dist/core/handles.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare const HANDLE_MAX_LENGTH = 135;
|
|
|
7
7
|
export declare const TYPE_FOLDERS: Record<TypeName, string>;
|
|
8
8
|
/** True when the string matches the handle grammar (prefix may be unknown). */
|
|
9
9
|
export declare function isHandleShaped(value: string): boolean;
|
|
10
|
-
/** Type for a handle's prefix, or null when the prefix is not one of the
|
|
10
|
+
/** Type for a handle's prefix, or null when the prefix is not one of the 20. */
|
|
11
11
|
export declare function typeForHandle(handle: string): TypeName | null;
|
|
12
12
|
/** Shaped AND carries a known prefix — the test used for reference extraction. */
|
|
13
13
|
export declare function isKnownHandle(value: string): boolean;
|
package/dist/core/handles.js
CHANGED
|
@@ -10,6 +10,7 @@ export const TYPE_FOLDERS = {
|
|
|
10
10
|
DATATYPE: 'datatype',
|
|
11
11
|
ROLE: 'role',
|
|
12
12
|
DOC: 'doc',
|
|
13
|
+
DECISION: 'decision',
|
|
13
14
|
FILE: 'file',
|
|
14
15
|
TEST: 'test',
|
|
15
16
|
EXTERNAL: 'external',
|
|
@@ -22,6 +23,8 @@ export const TYPE_FOLDERS = {
|
|
|
22
23
|
DIAGRAM: 'diagram',
|
|
23
24
|
AGENT: 'agent',
|
|
24
25
|
PLAN: 'plan',
|
|
26
|
+
FEATURE: 'feature',
|
|
27
|
+
RELEASE: 'release',
|
|
25
28
|
};
|
|
26
29
|
const TYPE_SET = new Set(TYPE_NAMES);
|
|
27
30
|
/** True when the string matches the handle grammar (prefix may be unknown). */
|
|
@@ -30,7 +33,7 @@ export function isHandleShaped(value) {
|
|
|
30
33
|
value.length <= HANDLE_MAX_LENGTH &&
|
|
31
34
|
HANDLE_PATTERN.test(value));
|
|
32
35
|
}
|
|
33
|
-
/** Type for a handle's prefix, or null when the prefix is not one of the
|
|
36
|
+
/** Type for a handle's prefix, or null when the prefix is not one of the 20. */
|
|
34
37
|
export function typeForHandle(handle) {
|
|
35
38
|
const dash = handle.indexOf('-');
|
|
36
39
|
if (dash <= 0)
|
package/dist/core/handles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAEvD,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAEvD,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CACL,KAAK,CAAC,MAAM,IAAI,iBAAiB;QACjC,KAAK,CAAC,MAAM,IAAI,iBAAiB;QACjC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC"}
|
package/dist/core/indexer.js
CHANGED
|
@@ -57,7 +57,7 @@ function readCard(relPath, filePath, raw, issues) {
|
|
|
57
57
|
issues.push({
|
|
58
58
|
severity: 'error',
|
|
59
59
|
code: 'E002',
|
|
60
|
-
message: `Unknown handle prefix: ${handle.split('-')[0]}- (expected one of the
|
|
60
|
+
message: `Unknown handle prefix: ${handle.split('-')[0]}- (expected one of the 20 canonical prefixes)`,
|
|
61
61
|
file: relPath,
|
|
62
62
|
});
|
|
63
63
|
return null;
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const TYPE_NAMES: readonly ["API", "DB", "DATATYPE", "ROLE", "DOC", "FILE", "TEST", "EXTERNAL", "EVENT", "COMPONENT", "PAGE", "JOB", "FLOW", "STATE", "DIAGRAM", "AGENT", "PLAN"];
|
|
1
|
+
export declare const TYPE_NAMES: readonly ["API", "DB", "DATATYPE", "ROLE", "DOC", "DECISION", "FILE", "TEST", "EXTERNAL", "EVENT", "COMPONENT", "PAGE", "JOB", "FLOW", "STATE", "DIAGRAM", "AGENT", "PLAN", "FEATURE", "RELEASE"];
|
|
2
2
|
export type TypeName = (typeof TYPE_NAMES)[number];
|
|
3
3
|
export interface CardRefs {
|
|
4
4
|
/** Handles listed in the frontmatter `connections` key. */
|
package/dist/core/types.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export const TYPE_NAMES = [
|
|
2
|
-
'API', 'DB', 'DATATYPE', 'ROLE', 'DOC', '
|
|
3
|
-
'COMPONENT', 'PAGE', 'JOB', 'FLOW', 'STATE', 'DIAGRAM', 'AGENT', 'PLAN',
|
|
2
|
+
'API', 'DB', 'DATATYPE', 'ROLE', 'DOC', 'DECISION', 'FILE', 'TEST', 'EXTERNAL',
|
|
3
|
+
'EVENT', 'COMPONENT', 'PAGE', 'JOB', 'FLOW', 'STATE', 'DIAGRAM', 'AGENT', 'PLAN',
|
|
4
|
+
'FEATURE', 'RELEASE',
|
|
4
5
|
];
|
|
5
6
|
//# sourceMappingURL=types.js.map
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;IAChF,SAAS,EAAE,SAAS;CACZ,CAAC"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -55,12 +55,15 @@ whole card — make the honest update the easy one: append_note adds an append-o
|
|
|
55
55
|
replaces a single ## section in place. Reach for these to record a correction the moment you
|
|
56
56
|
learn it, so cards stay true instead of drifting. Notes are retrievable memory: search
|
|
57
57
|
matches note text, and list_notes lists them across cards by kind — every gotcha or decision
|
|
58
|
-
in one call.
|
|
58
|
+
in one call. A decision note is for a choice local to that one card; a decision that shaped
|
|
59
|
+
SEVERAL cards gets its own DECISION card, connected to every card it shaped (the successor
|
|
60
|
+
of a replaced decision points at it via supersedes — never delete decision history). To
|
|
61
|
+
rename a handle, use rename_card: it moves the file and rewrites every
|
|
59
62
|
reference plan-wide (connections, frontmatter values, [[links]], mermaid node IDs) as whole
|
|
60
63
|
tokens — never delete-and-recreate to rename.
|
|
61
64
|
|
|
62
65
|
describe_type is the type reference, served by this server: call it with no args for the
|
|
63
|
-
catalog of all
|
|
66
|
+
catalog of all 20 card types, or with a type (e.g. describe_type PAGE) for that type's
|
|
64
67
|
frontmatter schema + a golden example. Consult it before authoring a type you haven't used
|
|
65
68
|
this session — you don't need the authoring skill loaded to get the fields right.
|
|
66
69
|
|
|
@@ -96,6 +99,12 @@ the affected neighborhood (get_card / traverse / search, connected: "full"), the
|
|
|
96
99
|
update the cards so they describe the desired END STATE (work that isn't built yet is
|
|
97
100
|
status: planned), wiring every connection between the affected cards. Show that set of card
|
|
98
101
|
changes as the proposal; on approval, bring the CODE up to match via the sync loop above.
|
|
102
|
+
Past the initial build, model iteration explicitly: a coherent slice of future work is a
|
|
103
|
+
FEATURE card connected to every card it adds or touches (intent/scope/acceptance in the
|
|
104
|
+
body, branch: while in flight, status planned → building → built as it merges), optionally
|
|
105
|
+
targeting a RELEASE card (a version milestone; features point at it via release:). A RELEASE
|
|
106
|
+
body is theme + upgrade notes, NEVER a changelog — what shipped is git's job. Neither is a
|
|
107
|
+
ticket tracker: work that is one card's status flip needs no FEATURE card.
|
|
99
108
|
FINISH by reconciling — re-read the touched cards against the code, run check_integrity so
|
|
100
109
|
no affected card is left an orphan and every connection is set, bump status (planned →
|
|
101
110
|
building → built → verified), commit, and set_sync_point. In plan mode the write tools are
|
|
@@ -807,7 +816,7 @@ export function buildServer(options = {}) {
|
|
|
807
816
|
}));
|
|
808
817
|
server.registerTool('describe_type', {
|
|
809
818
|
annotations: { readOnlyHint: true },
|
|
810
|
-
description: 'The card-type reference, served straight from this package. Call with no args for the catalog — all
|
|
819
|
+
description: 'The card-type reference, served straight from this package. Call with no args for the catalog — all 20 types with their prefix, folder, and one-line purpose. Call with a type for everything needed to author one: the frontmatter JSON Schema (fields, which are required, descriptions) plus the golden example and authoring guidance. Use it before writing a card of a type you have not authored this session — it is the contract create_card/create_cards/update_card validate against (W002/W003), so you do not need the authoring skill loaded to get the fields right.',
|
|
811
820
|
inputSchema: {
|
|
812
821
|
type: typeSchema.optional().describe('omit for the full catalog'),
|
|
813
822
|
},
|