@encore-os/eos-spec 0.13.0 → 0.15.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/dist/commands/build-embeddings.d.ts +1 -1
- package/dist/commands/build-embeddings.js +4 -4
- package/dist/commands/build-embeddings.js.map +1 -1
- package/dist/commands/create.d.ts +32 -0
- package/dist/commands/create.js +176 -16
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/freshness.d.ts +1 -1
- package/dist/commands/freshness.js +4 -4
- package/dist/commands/freshness.js.map +1 -1
- package/dist/commands/index-spec.d.ts +22 -0
- package/dist/commands/index-spec.js +48 -0
- package/dist/commands/index-spec.js.map +1 -0
- package/dist/commands/promote.d.ts +46 -0
- package/dist/commands/promote.js +175 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/verify-acs.d.ts +9 -1
- package/dist/commands/verify-acs.js +93 -31
- package/dist/commands/verify-acs.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +33 -1
- package/dist/lib/config.js +34 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/design-doc.d.ts +26 -0
- package/dist/lib/design-doc.js +42 -0
- package/dist/lib/design-doc.js.map +1 -0
- package/dist/lib/exec.d.ts +6 -1
- package/dist/lib/exec.js +5 -1
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/frontmatter.d.ts +15 -0
- package/dist/lib/frontmatter.js +34 -0
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/git-ids.d.ts +11 -0
- package/dist/lib/git-ids.js +56 -0
- package/dist/lib/git-ids.js.map +1 -0
- package/dist/lib/handoff.d.ts +27 -0
- package/dist/lib/handoff.js +21 -0
- package/dist/lib/handoff.js.map +1 -0
- package/dist/lib/pipeline-config.d.ts +7 -5
- package/dist/lib/pipeline-config.js +17 -6
- package/dist/lib/pipeline-config.js.map +1 -1
- package/dist/lib/precedent-search.d.ts +31 -1
- package/dist/lib/precedent-search.js +13 -6
- package/dist/lib/precedent-search.js.map +1 -1
- package/dist/lib/seed-acs.d.ts +10 -0
- package/dist/lib/seed-acs.js +20 -0
- package/dist/lib/seed-acs.js.map +1 -0
- package/dist/lib/spec-id-guard.d.ts +19 -0
- package/dist/lib/spec-id-guard.js +34 -0
- package/dist/lib/spec-id-guard.js.map +1 -0
- package/dist/lib/spec-index.d.ts +20 -0
- package/dist/lib/spec-index.js +80 -0
- package/dist/lib/spec-index.js.map +1 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/pure.d.ts +2 -0
- package/dist/pure.js +7 -0
- package/dist/pure.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"precedent-search.js","sourceRoot":"","sources":["../../src/lib/precedent-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"precedent-search.js","sourceRoot":"","sources":["../../src/lib/precedent-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA4DjD,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,4EAA4E;AAC5E,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,gFAAgF;AAChF,oEAAoE;AACpE,0DAA0D;AAC1D,MAAM,aAAa,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAC1D,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAExD,8EAA8E;AAC9E,kFAAkF;AAClF,kFAAkF;AAClF,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,WAAW,GAAG;IAClB,SAAS;IACT,cAAc;IACd,qBAAqB;IACrB,yBAAyB;IACzB,6BAA6B;IAC7B,iBAAiB;CACT,CAAC;AAEX,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,8EAA8E;AAC9E,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK;SACT,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED;oFACoF;AACpF,SAAS,WAAW,CAAC,MAAgB;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,MAAM,CAAC,kBAAkB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,kBAAkB,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,+EAA+E;AAC/E,SAAS,OAAO,CAAI,KAA6B;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,SAAS,MAAM,CAAC,EAAkB;IAChC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,IAAe,EAAE,KAAmC;IACrE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnD,IAAI,KAAK,KAAK,qBAAqB;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;SACzB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAe;IACjC,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/E,CAAC;AAED,uFAAuF;AACvF,SAAS,gBAAgB,CAAC,QAAgB,EAAE,QAAkB;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;yCAGyC;AACzC,IAAI,WAAW,GAA+D,IAAI,CAAC;AACnF,MAAM,UAAU,iBAAiB;IAC/B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AACD,SAAS,eAAe,CAAC,SAAiB;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;IAC5C,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QACrF,OAAO,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAc,CAAC;IACvE,WAAW,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;kDAKkD;AAClD,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,IAAoF;IAEpF,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAClE,2EAA2E;IAC3E,8EAA8E;IAC9E,0BAA0B;IAC1B,MAAM,KAAK,GAAc,UAAU,CAAC,SAAS,CAAC;QAC5C,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC;QAC5B,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAA2B,EAAE,CAAC;IAEvE,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI;YAAE,SAAS;QACxD,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAExD,gBAAgB;QAChB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC9C,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAChF,CAAC;QACF,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACzD,4EAA4E;QAC5E,MAAM,iBAAiB,GAAG,YAAY,GAAG,aAAa,CAAC;QAEvD,yCAAyC;QACzC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACzF,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzG,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAE9G,MAAM,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;QACrC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAS;QAEzB,yEAAyE;QACzE,4EAA4E;QAC5E,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,IAAI,UAAU,GAAG,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,GACR,UAAU,IAAI,SAAS,KAAK,YAAY,CAAC,MAAM;gBAC7C,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,OAAO,IAAI,SAAS,KAAK,YAAY,CAAC,GAAG;oBACzC,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,SAAS,CAAC;YAClB,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC/B,MAAM,WAAW,GACf,IAAI,KAAK,QAAQ;oBACf,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;oBAChB,CAAC,CAAC,IAAI,KAAK,KAAK;wBACd,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,GAAG,CAAC;wBAC1B,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,IAAI,WAAW;oBAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC;YACR,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;YAChC,KAAK;YACL,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AcEntry } from './ac-response-parser.js';
|
|
2
|
+
/**
|
|
3
|
+
* Present-but-`planned` placeholder acceptance criteria, so a spec minted by the
|
|
4
|
+
* `promote` verb is never born AC-less. Presence — not quality — is the bar the
|
|
5
|
+
* BUILDER AC cap (pipeline-config.ts) and `check:handoff` enforce; spec-review
|
|
6
|
+
* judges quality later. Each scaffold carries `status: 'planned'` + `draft: true`
|
|
7
|
+
* and TODO Given/When/Then so a downstream author fills it before review. No AI /
|
|
8
|
+
* `AI_GATEWAY_API_KEY` dependency — this is the deterministic no-AI seed.
|
|
9
|
+
*/
|
|
10
|
+
export declare function placeholderAcs(count?: number): AcEntry[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Present-but-`planned` placeholder acceptance criteria, so a spec minted by the
|
|
3
|
+
* `promote` verb is never born AC-less. Presence — not quality — is the bar the
|
|
4
|
+
* BUILDER AC cap (pipeline-config.ts) and `check:handoff` enforce; spec-review
|
|
5
|
+
* judges quality later. Each scaffold carries `status: 'planned'` + `draft: true`
|
|
6
|
+
* and TODO Given/When/Then so a downstream author fills it before review. No AI /
|
|
7
|
+
* `AI_GATEWAY_API_KEY` dependency — this is the deterministic no-AI seed.
|
|
8
|
+
*/
|
|
9
|
+
export function placeholderAcs(count = 1) {
|
|
10
|
+
return Array.from({ length: count }, (_, i) => ({
|
|
11
|
+
id: `AC-${i + 1}`,
|
|
12
|
+
title: 'TODO — draft this acceptance criterion before spec review',
|
|
13
|
+
status: 'planned',
|
|
14
|
+
draft: true,
|
|
15
|
+
given: ['TODO — precondition'],
|
|
16
|
+
when: ['TODO — action'],
|
|
17
|
+
then: ['TODO — observable outcome'],
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=seed-acs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-acs.js","sourceRoot":"","sources":["../../src/lib/seed-acs.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAK,GAAG,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,EAAE,2DAA2D;QAClE,MAAM,EAAE,SAAkB;QAC1B,KAAK,EAAE,IAAa;QACpB,KAAK,EAAE,CAAC,qBAAqB,CAAC;QAC9B,IAAI,EAAE,CAAC,eAAe,CAAC;QACvB,IAAI,EAAE,CAAC,2BAA2B,CAAC;KACpC,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create-time guard against the two silent spec-filename traps `spec:lint-ids` can
|
|
3
|
+
* only detect POST-merge:
|
|
4
|
+
*
|
|
5
|
+
* 1. **Grammar over-match** — a slug whose first word is a complete `e<n>`/`p<n>`
|
|
6
|
+
* segment (e.g. `WEB-05-e2-foo.md`) is parsed as the id `WEB-05-E2`, absorbing
|
|
7
|
+
* the slug into the id. (`e2e-…` is safe — the id grammar's boundary fix, #14,
|
|
8
|
+
* only over-matches a *complete* trailing segment.)
|
|
9
|
+
* 2. **Reserved lifecycle token** — a slug containing a lifecycle/artifact token
|
|
10
|
+
* (`review`, `clarification`, …) makes the loader classify the file as a
|
|
11
|
+
* derivative artifact and drop it, so it is never loaded as the intended spec.
|
|
12
|
+
*
|
|
13
|
+
* Throws an `Error` tagged `code: 'INVALID_ARGUMENT'` (with a rename suggestion)
|
|
14
|
+
* unless the round-trip holds both ways: `extractSpecId(filename) === id` AND
|
|
15
|
+
* `resolveSpecFileId(core, filename) === id`. Pure (fs-free) — reuses the id grammar
|
|
16
|
+
* in spec-pure.ts. Wired into `create`/`promote` before the file is written so the
|
|
17
|
+
* trap is refused at mint time, not discovered later.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertSafeSpecFilename(core: string, id: string, slug: string): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { extractSpecId, resolveSpecFileId } from './spec-pure.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create-time guard against the two silent spec-filename traps `spec:lint-ids` can
|
|
4
|
+
* only detect POST-merge:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Grammar over-match** — a slug whose first word is a complete `e<n>`/`p<n>`
|
|
7
|
+
* segment (e.g. `WEB-05-e2-foo.md`) is parsed as the id `WEB-05-E2`, absorbing
|
|
8
|
+
* the slug into the id. (`e2e-…` is safe — the id grammar's boundary fix, #14,
|
|
9
|
+
* only over-matches a *complete* trailing segment.)
|
|
10
|
+
* 2. **Reserved lifecycle token** — a slug containing a lifecycle/artifact token
|
|
11
|
+
* (`review`, `clarification`, …) makes the loader classify the file as a
|
|
12
|
+
* derivative artifact and drop it, so it is never loaded as the intended spec.
|
|
13
|
+
*
|
|
14
|
+
* Throws an `Error` tagged `code: 'INVALID_ARGUMENT'` (with a rename suggestion)
|
|
15
|
+
* unless the round-trip holds both ways: `extractSpecId(filename) === id` AND
|
|
16
|
+
* `resolveSpecFileId(core, filename) === id`. Pure (fs-free) — reuses the id grammar
|
|
17
|
+
* in spec-pure.ts. Wired into `create`/`promote` before the file is written so the
|
|
18
|
+
* trap is refused at mint time, not discovered later.
|
|
19
|
+
*/
|
|
20
|
+
export function assertSafeSpecFilename(core, id, slug) {
|
|
21
|
+
const filename = `${id}-${slug}.md`;
|
|
22
|
+
const fail = (why) => {
|
|
23
|
+
const e = new Error(`Refusing to mint "${filename}": ${why}. Rename the slug (e.g. prefix a descriptive word) so the loader keeps this file as ${id}.`);
|
|
24
|
+
e.code = 'INVALID_ARGUMENT';
|
|
25
|
+
throw e;
|
|
26
|
+
};
|
|
27
|
+
if (extractSpecId(filename, core)?.toUpperCase() !== id.toUpperCase()) {
|
|
28
|
+
fail('the id grammar mis-parses this filename (a leading e<n>/p<n> slug word is read as an enhancement suffix)');
|
|
29
|
+
}
|
|
30
|
+
if (resolveSpecFileId(core, filename, undefined) !== id) {
|
|
31
|
+
fail('a reserved lifecycle/artifact token in the slug makes the loader drop this file');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=spec-id-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-id-guard.js","sourceRoot":"","sources":["../../src/lib/spec-id-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,EAAU,EAAE,IAAY;IAC3E,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,IAAI,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAS,EAAE;QAClC,MAAM,CAAC,GAAG,IAAI,KAAK,CACjB,qBAAqB,QAAQ,MAAM,GAAG,uFAAuF,EAAE,GAAG,CACnI,CAAC;QACD,CAA+B,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC3D,MAAM,CAAC,CAAC;IACV,CAAC,CAAC;IACF,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACtE,IAAI,CAAC,0GAA0G,CAAC,CAAC;IACnH,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SpecIndexEntry } from './precedent-search.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract the `## Summary` prose from a spec body — the bounded domain-vocabulary
|
|
4
|
+
* field the precedent search weights for paraphrase recall. Returns the section
|
|
5
|
+
* text up to the next `#`/`##` heading, whitespace-collapsed; "" when absent.
|
|
6
|
+
* (Ported from builder's scripts/specs/build-spec-index.mjs.)
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractSummary(specText: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Build the spec-index entries for `repoRoot` from the engine's own corpus walk
|
|
11
|
+
* (the same specs `audit`/`list` see, archive included). Deterministically
|
|
12
|
+
* ordered by file path so a written index diffs cleanly.
|
|
13
|
+
*
|
|
14
|
+
* The projection is builder's build-spec-index.mjs, field for field: frontmatter
|
|
15
|
+
* arrays pass through untyped (the search consumer treats every nested shape as
|
|
16
|
+
* untrusted and degrades per-field), `functional_requirements` maps from the
|
|
17
|
+
* frontmatter's `requirements` spelling, and non-functional requirements /
|
|
18
|
+
* success metrics are not modeled in eos-spec frontmatter, so they index empty.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildSpecIndex(repoRoot: string): SpecIndexEntry[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in spec-index generator (Phase 2a Task 1). Builds the lexical corpus
|
|
3
|
+
* `searchSpecs` (precedent-search.ts) ranks against — the SAME projection
|
|
4
|
+
* builder's consumer-local scripts/specs/build-spec-index.mjs produces — so a
|
|
5
|
+
* consumer repo needs no generator script of its own: `eos-spec index` writes
|
|
6
|
+
* `specs/spec-index.json`, and lexical search falls back to `buildSpecIndex`
|
|
7
|
+
* in memory when the file is absent (slower, never stale).
|
|
8
|
+
*
|
|
9
|
+
* One entry per primary spec FILE (duplicate-id files each get a row — the
|
|
10
|
+
* collision gate, not the index, adjudicates those), archive included so
|
|
11
|
+
* `precedent --topic` with includeArchived keeps surfacing archived prior art.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { relative, sep } from 'node:path';
|
|
15
|
+
import { readFrontmatter } from './frontmatter.js';
|
|
16
|
+
import { listSpecs } from './specs.js';
|
|
17
|
+
/** Runtime guard mirroring the search consumer: anything non-array becomes []. */
|
|
18
|
+
function asArray(value) {
|
|
19
|
+
return Array.isArray(value) ? value : [];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract the `## Summary` prose from a spec body — the bounded domain-vocabulary
|
|
23
|
+
* field the precedent search weights for paraphrase recall. Returns the section
|
|
24
|
+
* text up to the next `#`/`##` heading, whitespace-collapsed; "" when absent.
|
|
25
|
+
* (Ported from builder's scripts/specs/build-spec-index.mjs.)
|
|
26
|
+
*/
|
|
27
|
+
export function extractSummary(specText) {
|
|
28
|
+
const lines = specText.split(/\r?\n/);
|
|
29
|
+
const start = lines.findIndex((l) => /^##\s+Summary\s*$/i.test(l));
|
|
30
|
+
if (start === -1)
|
|
31
|
+
return '';
|
|
32
|
+
const out = [];
|
|
33
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
34
|
+
if (/^#{1,2}\s/.test(lines[i]))
|
|
35
|
+
break; // stop at the next heading
|
|
36
|
+
out.push(lines[i]);
|
|
37
|
+
}
|
|
38
|
+
return out.join(' ').replace(/\s+/g, ' ').trim();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the spec-index entries for `repoRoot` from the engine's own corpus walk
|
|
42
|
+
* (the same specs `audit`/`list` see, archive included). Deterministically
|
|
43
|
+
* ordered by file path so a written index diffs cleanly.
|
|
44
|
+
*
|
|
45
|
+
* The projection is builder's build-spec-index.mjs, field for field: frontmatter
|
|
46
|
+
* arrays pass through untyped (the search consumer treats every nested shape as
|
|
47
|
+
* untrusted and degrades per-field), `functional_requirements` maps from the
|
|
48
|
+
* frontmatter's `requirements` spelling, and non-functional requirements /
|
|
49
|
+
* success metrics are not modeled in eos-spec frontmatter, so they index empty.
|
|
50
|
+
*/
|
|
51
|
+
export function buildSpecIndex(repoRoot) {
|
|
52
|
+
const entries = [];
|
|
53
|
+
for (const spec of listSpecs(repoRoot, undefined, { includeArchived: true })) {
|
|
54
|
+
let text = '';
|
|
55
|
+
try {
|
|
56
|
+
text = readFileSync(spec.path, 'utf8');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// unreadable file — index what listSpecs resolved; text-derived fields stay empty
|
|
60
|
+
}
|
|
61
|
+
const fm = readFrontmatter(text);
|
|
62
|
+
entries.push({
|
|
63
|
+
id: spec.id,
|
|
64
|
+
core: spec.core,
|
|
65
|
+
title: spec.title ?? '',
|
|
66
|
+
status: spec.status ?? null,
|
|
67
|
+
file: relative(repoRoot, spec.path).split(sep).join('/'),
|
|
68
|
+
summary: extractSummary(text),
|
|
69
|
+
user_stories: asArray(fm.user_stories),
|
|
70
|
+
acceptance_criteria: asArray(fm.acceptance_criteria),
|
|
71
|
+
functional_requirements: asArray(fm.requirements),
|
|
72
|
+
non_functional_requirements: [],
|
|
73
|
+
success_metrics: [],
|
|
74
|
+
tags: asArray(fm.tags),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
entries.sort((a, b) => a.file.localeCompare(b.file));
|
|
78
|
+
return entries;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=spec-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-index.js","sourceRoot":"","sources":["../../src/lib/spec-index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
* Please bumps this in lockstep with package.json via the `x-release-please-version`
|
|
5
5
|
* annotation below (release-please-config.json `extra-files`); for a break-glass
|
|
6
6
|
* manual release, bump it together with package.json by hand. */
|
|
7
|
-
export declare const ENGINE_VERSION = "0.
|
|
7
|
+
export declare const ENGINE_VERSION = "0.15.0";
|
package/dist/lib/version.js
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* Please bumps this in lockstep with package.json via the `x-release-please-version`
|
|
5
5
|
* annotation below (release-please-config.json `extra-files`); for a break-glass
|
|
6
6
|
* manual release, bump it together with package.json by hand. */
|
|
7
|
-
export const ENGINE_VERSION = '0.
|
|
7
|
+
export const ENGINE_VERSION = '0.15.0'; // x-release-please-version
|
|
8
8
|
//# sourceMappingURL=version.js.map
|
package/dist/pure.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
export * from './lib/pipeline-map.js';
|
|
9
9
|
export * from './lib/blockers.js';
|
|
10
10
|
export * from './lib/frontmatter.js';
|
|
11
|
+
export * from './lib/design-doc.js';
|
|
11
12
|
export * from './lib/requirements.js';
|
|
12
13
|
export * from './lib/next-action.js';
|
|
13
14
|
export * from './lib/spec-pure.js';
|
|
@@ -17,3 +18,4 @@ export type { PipelineSchema, PredicateRegistry } from './lib/pipeline-schema.js
|
|
|
17
18
|
export * from './lib/completion-gate.js';
|
|
18
19
|
export * from './lib/compliance-signoff.js';
|
|
19
20
|
export type { SessionState } from './lib/session-state.js';
|
|
21
|
+
export * from './lib/handoff.js';
|
package/dist/pure.js
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
export * from './lib/pipeline-map.js';
|
|
9
9
|
export * from './lib/blockers.js';
|
|
10
10
|
export * from './lib/frontmatter.js';
|
|
11
|
+
// Pure design-doc lifecycle transform (the `promote` verb's Status-line flip),
|
|
12
|
+
// sibling to frontmatter.ts's setDesignDoc — fs-free, so a client can preview it.
|
|
13
|
+
export * from './lib/design-doc.js';
|
|
11
14
|
export * from './lib/requirements.js';
|
|
12
15
|
export * from './lib/next-action.js';
|
|
13
16
|
// Fs-free spec helpers: deriveSignalsFromText + path classification +
|
|
@@ -28,4 +31,8 @@ export { DEFAULT_PREDICATES } from './lib/predicate-registry.js';
|
|
|
28
31
|
// (erased at build) and keep the fs readers behind the main entry.
|
|
29
32
|
export * from './lib/completion-gate.js';
|
|
30
33
|
export * from './lib/compliance-signoff.js';
|
|
34
|
+
// Brainstorm→spec handoff config: the pure per-key merge + defaults the `promote`
|
|
35
|
+
// verb (and a client previewing it) reads. Fs-free — the fs-bound `resolveHandoff`
|
|
36
|
+
// wrapper stays in config.ts behind the main entry.
|
|
37
|
+
export * from './lib/handoff.js';
|
|
31
38
|
//# sourceMappingURL=pure.js.map
|
package/dist/pure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pure.js","sourceRoot":"","sources":["../src/pure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,sEAAsE;AACtE,8EAA8E;AAC9E,kFAAkF;AAClF,cAAc,oBAAoB,CAAC;AACnC,+EAA+E;AAC/E,sFAAsF;AACtF,gFAAgF;AAChF,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,qEAAqE;AACrE,2EAA2E;AAC3E,yEAAyE;AACzE,0EAA0E;AAC1E,iEAAiE;AACjE,+EAA+E;AAC/E,mEAAmE;AACnE,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"pure.js","sourceRoot":"","sources":["../src/pure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,+EAA+E;AAC/E,kFAAkF;AAClF,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,sEAAsE;AACtE,8EAA8E;AAC9E,kFAAkF;AAClF,cAAc,oBAAoB,CAAC;AACnC,+EAA+E;AAC/E,sFAAsF;AACtF,gFAAgF;AAChF,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,qEAAqE;AACrE,2EAA2E;AAC3E,yEAAyE;AACzE,0EAA0E;AAC1E,iEAAiE;AACjE,+EAA+E;AAC/E,mEAAmE;AACnE,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAE5C,kFAAkF;AAClF,mFAAmF;AACnF,oDAAoD;AACpD,cAAc,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@encore-os/eos-spec",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Portable, config-driven spec-pipeline engine + quality harness. One canonical engine consumed as a library (with a client-safe /pure subpath) by every Encore-OS repo.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|