@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.
Files changed (60) hide show
  1. package/dist/commands/build-embeddings.d.ts +1 -1
  2. package/dist/commands/build-embeddings.js +4 -4
  3. package/dist/commands/build-embeddings.js.map +1 -1
  4. package/dist/commands/create.d.ts +32 -0
  5. package/dist/commands/create.js +176 -16
  6. package/dist/commands/create.js.map +1 -1
  7. package/dist/commands/freshness.d.ts +1 -1
  8. package/dist/commands/freshness.js +4 -4
  9. package/dist/commands/freshness.js.map +1 -1
  10. package/dist/commands/index-spec.d.ts +22 -0
  11. package/dist/commands/index-spec.js +48 -0
  12. package/dist/commands/index-spec.js.map +1 -0
  13. package/dist/commands/promote.d.ts +46 -0
  14. package/dist/commands/promote.js +175 -0
  15. package/dist/commands/promote.js.map +1 -0
  16. package/dist/commands/verify-acs.d.ts +9 -1
  17. package/dist/commands/verify-acs.js +93 -31
  18. package/dist/commands/verify-acs.js.map +1 -1
  19. package/dist/index.d.ts +6 -1
  20. package/dist/index.js +20 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/lib/config.d.ts +33 -1
  23. package/dist/lib/config.js +34 -2
  24. package/dist/lib/config.js.map +1 -1
  25. package/dist/lib/design-doc.d.ts +26 -0
  26. package/dist/lib/design-doc.js +42 -0
  27. package/dist/lib/design-doc.js.map +1 -0
  28. package/dist/lib/exec.d.ts +6 -1
  29. package/dist/lib/exec.js +5 -1
  30. package/dist/lib/exec.js.map +1 -1
  31. package/dist/lib/frontmatter.d.ts +15 -0
  32. package/dist/lib/frontmatter.js +34 -0
  33. package/dist/lib/frontmatter.js.map +1 -1
  34. package/dist/lib/git-ids.d.ts +11 -0
  35. package/dist/lib/git-ids.js +56 -0
  36. package/dist/lib/git-ids.js.map +1 -0
  37. package/dist/lib/handoff.d.ts +27 -0
  38. package/dist/lib/handoff.js +21 -0
  39. package/dist/lib/handoff.js.map +1 -0
  40. package/dist/lib/pipeline-config.d.ts +7 -5
  41. package/dist/lib/pipeline-config.js +17 -6
  42. package/dist/lib/pipeline-config.js.map +1 -1
  43. package/dist/lib/precedent-search.d.ts +31 -1
  44. package/dist/lib/precedent-search.js +13 -6
  45. package/dist/lib/precedent-search.js.map +1 -1
  46. package/dist/lib/seed-acs.d.ts +10 -0
  47. package/dist/lib/seed-acs.js +20 -0
  48. package/dist/lib/seed-acs.js.map +1 -0
  49. package/dist/lib/spec-id-guard.d.ts +19 -0
  50. package/dist/lib/spec-id-guard.js +34 -0
  51. package/dist/lib/spec-id-guard.js.map +1 -0
  52. package/dist/lib/spec-index.d.ts +20 -0
  53. package/dist/lib/spec-index.js +80 -0
  54. package/dist/lib/spec-index.js.map +1 -0
  55. package/dist/lib/version.d.ts +1 -1
  56. package/dist/lib/version.js +1 -1
  57. package/dist/pure.d.ts +2 -0
  58. package/dist/pure.js +7 -0
  59. package/dist/pure.js.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1,175 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { basename, dirname, isAbsolute, relative } from 'node:path';
3
+ import { resolveHandoff } from '../lib/config.js';
4
+ import { addClaim, DEFAULT_TTL_MINUTES } from '../lib/claims.js';
5
+ import { setDesignDocStatusShipped } from '../lib/design-doc.js';
6
+ import { appendAcceptanceCriteria, setDesignDoc } from '../lib/frontmatter.js';
7
+ import { emit, ErrorCode, getGlobalOptions } from '../lib/output.js';
8
+ import { getRepoRoot, isKnownCore, isProtectedBranch } from '../lib/repo.js';
9
+ import { placeholderAcs } from '../lib/seed-acs.js';
10
+ import { assertSafeSpecFilename } from '../lib/spec-id-guard.js';
11
+ import { withEventLog } from '../lib/with-event-log.js';
12
+ import { resolveClaimedBy } from './claim.js';
13
+ import { humanizeName, nextFreeId, scaffoldSpec, slugify } from './create.js';
14
+ const TEMPLATES = ['full', 'lite', 'micro'];
15
+ function fail(code, message) {
16
+ const e = new Error(message);
17
+ e.code = code;
18
+ throw e;
19
+ }
20
+ /** Derive a spec slug from a design-doc basename: drop the extension, a leading
21
+ * `YYYY-MM-DD-` date prefix, and a trailing `-design`, then slugify. */
22
+ function slugFromDesignDoc(designDocPath) {
23
+ const stem = basename(designDocPath)
24
+ .replace(/\.md$/i, '')
25
+ .replace(/^\d{4}-\d{2}-\d{2}-/, '')
26
+ .replace(/-design$/i, '');
27
+ return slugify(stem);
28
+ }
29
+ export function promoteDesignDoc(repoRoot, opts) {
30
+ const core = opts.core.toLowerCase();
31
+ if (!isKnownCore(core, repoRoot)) {
32
+ fail(ErrorCode.UNKNOWN_CORE, `promote: unknown core "${opts.core}" (not declared in specs/config.yaml)`);
33
+ }
34
+ if (opts.template !== undefined && !TEMPLATES.includes(opts.template)) {
35
+ fail(ErrorCode.INVALID_ARGUMENT, `promote: --template must be one of ${TEMPLATES.join(' | ')}`);
36
+ }
37
+ const designDocAbs = isAbsolute(opts.designDoc) ? opts.designDoc : `${repoRoot}/${opts.designDoc}`;
38
+ if (!existsSync(designDocAbs)) {
39
+ fail(ErrorCode.INVALID_ARGUMENT, `promote: design doc not found: ${opts.designDoc}`);
40
+ }
41
+ const designDocText = readFileSync(designDocAbs, 'utf8');
42
+ const designDocRel = isAbsolute(opts.designDoc) ? relative(repoRoot, opts.designDoc) : opts.designDoc;
43
+ const slug = slugify(opts.slug ?? slugFromDesignDoc(designDocAbs));
44
+ if (!slug)
45
+ fail(ErrorCode.INVALID_ARGUMENT, `promote: could not derive a slug from "${opts.designDoc}" — pass --name`);
46
+ const specId = nextFreeId(repoRoot, core, 'base');
47
+ assertSafeSpecFilename(core, specId, slug);
48
+ const handoff = resolveHandoff(repoRoot, opts.configOverride);
49
+ // Render the templated spec (not written yet), then seed placeholder ACs and stamp the
50
+ // design_doc backlink so the file is born AC-bearing + back-linked in one write.
51
+ const scaffold = scaffoldSpec(repoRoot, {
52
+ id: specId,
53
+ core,
54
+ slug,
55
+ title: opts.title ?? humanizeName(slug), // a readable H1/title, not the bare id
56
+ template: opts.template,
57
+ write: false,
58
+ configOverride: opts.configOverride,
59
+ });
60
+ const acs = placeholderAcs();
61
+ let specText = appendAcceptanceCriteria(scaffold.content, acs);
62
+ specText = setDesignDoc(specText, [designDocRel]);
63
+ const specWritten = opts.write && !existsSync(scaffold.path);
64
+ if (specWritten) {
65
+ mkdirSync(dirname(scaffold.path), { recursive: true });
66
+ writeFileSync(scaffold.path, specText, 'utf8');
67
+ }
68
+ // Flip the design doc's lifecycle line to the configured shipped marker (write-if-changed).
69
+ const flipped = setDesignDocStatusShipped(designDocText, specId, {
70
+ lifecycleLine: handoff.lifecycle_line,
71
+ shippedMarker: handoff.shipped_marker,
72
+ });
73
+ const designDocWritten = opts.write && flipped !== designDocText;
74
+ if (designDocWritten)
75
+ writeFileSync(designDocAbs, flipped, 'utf8');
76
+ // Claim the id up front so a parallel worktree can't duplicate the work. Fail-open:
77
+ // a repo with no writable claim store must never make promote unusable.
78
+ let claimed = false;
79
+ if (opts.write) {
80
+ try {
81
+ addClaim(repoRoot, specId, {
82
+ by: resolveClaimedBy(opts.by, repoRoot),
83
+ ttlMinutes: opts.ttlMinutes ?? DEFAULT_TTL_MINUTES,
84
+ });
85
+ claimed = true;
86
+ }
87
+ catch {
88
+ /* no claim store / non-writable dir → proceed without a claim */
89
+ }
90
+ }
91
+ return {
92
+ specId,
93
+ specPath: scaffold.path,
94
+ designDoc: designDocRel,
95
+ acSeeded: acs.length,
96
+ claimed,
97
+ specWritten,
98
+ designDocWritten,
99
+ };
100
+ }
101
+ function formatPromoteText(r, write) {
102
+ const verb = write ? 'Promoted' : 'Would promote';
103
+ return (`${verb} ${r.designDoc} → ${r.specId} (${r.specPath})\n` +
104
+ ` acceptance_criteria seeded: ${r.acSeeded} (present-but-planned)\n` +
105
+ ` design_doc backlink + Status flip: ${write ? (r.designDocWritten ? 'written' : 'already shipped') : 'dry-run'}\n` +
106
+ ` claim: ${r.claimed ? 'held' : write ? 'skipped (no claim store)' : 'dry-run'}\n` +
107
+ ` next: eos-spec next --spec ${r.specId}`);
108
+ }
109
+ export function registerPromote(program) {
110
+ program
111
+ .command('promote')
112
+ .description('Promote an approved design doc into a claimed, AC-bearing eos-spec (brainstorm→spec, one action)')
113
+ .option('--design-doc <path>', 'Path to the approved design doc (required)')
114
+ .option('--core <core>', 'Target core (required)')
115
+ .option('--name <slug>', 'Spec name slug (default: derived from the design-doc filename)')
116
+ .option('--template <t>', 'Template tier: full | lite | micro')
117
+ .option('--dry-run', 'Compute the result without writing anything', false)
118
+ .option('--by <who>', 'Claim identity (default: env EOS_SPEC_CLAIMED_BY / worktree name)')
119
+ .option('--ttl <min>', 'Claim TTL in minutes')
120
+ .action(withEventLog('promote', async (options, cmd) => {
121
+ const global = getGlobalOptions(cmd);
122
+ const repoRoot = getRepoRoot(global.repoRoot);
123
+ if (!options.designDoc || !options.core) {
124
+ emit(global, {
125
+ ok: false,
126
+ error: {
127
+ code: ErrorCode.SCOPE_REQUIRED,
128
+ message: 'promote requires --design-doc <path> and --core <core>',
129
+ },
130
+ data: null,
131
+ text: 'promote: requires --design-doc <path> and --core <core>',
132
+ exitCode: 2,
133
+ });
134
+ return;
135
+ }
136
+ const write = !options.dryRun;
137
+ if (write && isProtectedBranch(repoRoot)) {
138
+ emit(global, {
139
+ ok: false,
140
+ error: {
141
+ code: ErrorCode.VALIDATION_FAILED,
142
+ message: 'promote: refusing to write on a protected branch (main/master); use a feature branch or --dry-run',
143
+ },
144
+ data: null,
145
+ text: 'promote: refusing to write on a protected branch (main/master); use a feature branch or --dry-run',
146
+ exitCode: 2,
147
+ });
148
+ return;
149
+ }
150
+ try {
151
+ const result = promoteDesignDoc(repoRoot, {
152
+ designDoc: options.designDoc,
153
+ core: options.core,
154
+ slug: options.name,
155
+ template: options.template,
156
+ write,
157
+ by: options.by,
158
+ ttlMinutes: options.ttl ? Number(options.ttl) : undefined,
159
+ configOverride: global.config,
160
+ });
161
+ emit(global, { ok: true, data: result, text: formatPromoteText(result, write) });
162
+ }
163
+ catch (e) {
164
+ const raw = e.code;
165
+ const code = raw && Object.values(ErrorCode).includes(raw) ? raw : ErrorCode.IO_ERROR;
166
+ emit(global, {
167
+ ok: false,
168
+ error: { code, message: e.message },
169
+ data: null,
170
+ text: e.message,
171
+ });
172
+ }
173
+ }));
174
+ }
175
+ //# sourceMappingURL=promote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Command } from 'commander';
2
+ import { type LaneDef } from '../lib/config.js';
2
3
  export type Section = 'acceptance_criteria' | 'user_stories' | 'requirements';
3
4
  export type Item = {
4
5
  section: Section;
@@ -7,7 +8,14 @@ export type Item = {
7
8
  };
8
9
  /** Flatten a spec's frontmatter AC/US/FR into a uniform item list (id + current status). */
9
10
  export declare function resolveItems(text: string): Item[];
10
- /** Split backing test files into those the root Vitest can run vs. deferred lanes. */
11
+ /** Split backing test files into their Vitest lane ('root' + any config-driven
12
+ * `verify_lanes` prefix, keyed by lane) vs. genuinely deferred (no lane claims it). */
13
+ export declare function partitionBackingFilesWithLanes(files: string[], laneDefs: LaneDef[]): {
14
+ lanes: Map<string, string[]>;
15
+ deferred: string[];
16
+ };
17
+ /** Split backing test files into those the root Vitest can run vs. deferred lanes.
18
+ * Back-compat shim over `partitionBackingFilesWithLanes` with no configured lanes. */
11
19
  export declare function partitionBackingFiles(files: string[]): {
12
20
  rootVitest: string[];
13
21
  deferred: string[];
@@ -2,7 +2,7 @@ import { execFileSync } from 'node:child_process';
2
2
  import { readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
3
  import { tmpdir } from 'node:os';
4
4
  import { join, relative } from 'node:path';
5
- import { resolveDiscoveryPaths } from '../lib/config.js';
5
+ import { resolveDiscoveryPaths, resolveVerifyLanes } from '../lib/config.js';
6
6
  import { readFrontmatter, setRequirementStatus } from '../lib/frontmatter.js';
7
7
  import { emit, getGlobalOptions } from '../lib/output.js';
8
8
  import { withEventLog } from '../lib/with-event-log.js';
@@ -22,33 +22,39 @@ export function resolveItems(text) {
22
22
  out.push({ section: 'requirements', id: fr.id, status: fr.status });
23
23
  return out;
24
24
  }
25
- /** Split backing test files into those the root Vitest can run vs. deferred lanes. */
26
- export function partitionBackingFiles(files) {
27
- const rootVitest = [];
25
+ const TEST_FILE_RE = /\.(test|spec)\.tsx?$/;
26
+ /** Split backing test files into their Vitest lane ('root' + any config-driven
27
+ * `verify_lanes` prefix, keyed by lane) vs. genuinely deferred (no lane claims it). */
28
+ export function partitionBackingFilesWithLanes(files, laneDefs) {
29
+ const lanes = new Map();
28
30
  const deferred = [];
29
31
  for (const f of files) {
30
- if ((f.startsWith('src/') || f.startsWith('scripts/')) && /\.(test|spec)\.tsx?$/.test(f))
31
- rootVitest.push(f);
32
- else
33
- deferred.push(f);
32
+ if ((f.startsWith('src/') || f.startsWith('scripts/')) && TEST_FILE_RE.test(f)) {
33
+ lanes.set('root', [...(lanes.get('root') ?? []), f]);
34
+ }
35
+ else {
36
+ const lane = laneDefs.find((l) => f.startsWith(l.prefix) && TEST_FILE_RE.test(f));
37
+ if (lane)
38
+ lanes.set(lane.prefix, [...(lanes.get(lane.prefix) ?? []), f]);
39
+ else
40
+ deferred.push(f);
41
+ }
34
42
  }
35
- return { rootVitest, deferred };
43
+ return { lanes, deferred };
36
44
  }
37
- /** Run root-Vitest files, returning rel-path {passed,failed,skipped}. */
38
- function runRootVitest(repoRoot, relFiles) {
45
+ /** Split backing test files into those the root Vitest can run vs. deferred lanes.
46
+ * Back-compat shim over `partitionBackingFilesWithLanes` with no configured lanes. */
47
+ export function partitionBackingFiles(files) {
48
+ const { lanes, deferred } = partitionBackingFilesWithLanes(files, []);
49
+ return { rootVitest: lanes.get('root') ?? [], deferred };
50
+ }
51
+ /** Parse a Vitest `--reporter=json` output file into rel-path (from `repoRoot`) →
52
+ * {passed,failed,skipped}. The reporter always names each test file by its absolute
53
+ * filesystem path regardless of the `cwd` Vitest ran under, so re-relativizing every
54
+ * key against `repoRoot` — not the invocation cwd — is what "re-prefixes results back
55
+ * to repo-relative" for a lane run; no separate remap step is needed. */
56
+ function parseVitestJsonReport(repoRoot, outFile) {
39
57
  const stats = new Map();
40
- if (relFiles.length === 0)
41
- return stats;
42
- const outFile = join(tmpdir(), `eos-verify-acs-${process.pid}.json`);
43
- try {
44
- execFileSync('bunx', ['vitest', 'run', ...relFiles, '--reporter=json', `--outputFile=${outFile}`], {
45
- cwd: repoRoot,
46
- stdio: ['ignore', 'ignore', 'inherit'],
47
- });
48
- }
49
- catch {
50
- /* nonzero exit = a failing test; the JSON report still carries the per-file outcome */
51
- }
52
58
  let report;
53
59
  try {
54
60
  report = JSON.parse(readFileSync(outFile, 'utf8'));
@@ -70,6 +76,58 @@ function runRootVitest(repoRoot, relFiles) {
70
76
  }
71
77
  return stats;
72
78
  }
79
+ /** Run root-Vitest files, returning rel-path → {passed,failed,skipped}. */
80
+ function runRootVitest(repoRoot, relFiles) {
81
+ if (relFiles.length === 0)
82
+ return new Map();
83
+ const outFile = join(tmpdir(), `eos-verify-acs-${process.pid}.json`);
84
+ try {
85
+ execFileSync('bunx', ['vitest', 'run', ...relFiles, '--reporter=json', `--outputFile=${outFile}`], {
86
+ cwd: repoRoot,
87
+ stdio: ['ignore', 'ignore', 'inherit'],
88
+ });
89
+ }
90
+ catch {
91
+ /* nonzero exit = a failing test; the JSON report still carries the per-file outcome */
92
+ }
93
+ return parseVitestJsonReport(repoRoot, outFile);
94
+ }
95
+ /** Run one config-driven lane's backing files with Vitest in `lane.cwd` (v1: JSON
96
+ * reporter only), returning the same rel-path (from `repoRoot`) → FileStat shape as
97
+ * `runRootVitest`. `relFiles` are repo-relative (e.g. `runner/src/b.test.ts`) and are
98
+ * re-relativized into the lane's `cwd` (e.g. `src/b.test.ts`) for the invocation, since
99
+ * Vitest resolves its file args against its own `cwd`, not the repo root. */
100
+ function runLaneVitest(repoRoot, lane, relFiles) {
101
+ if (relFiles.length === 0)
102
+ return new Map();
103
+ const laneCwd = join(repoRoot, lane.cwd);
104
+ const laneFiles = relFiles.map((f) => relative(laneCwd, join(repoRoot, f)));
105
+ const outFile = join(tmpdir(), `eos-verify-acs-lane-${process.pid}-${lane.prefix.replace(/[^a-zA-Z0-9]/g, '_')}.json`);
106
+ const [cmd, ...cmdArgs] = (lane.command ?? 'bunx vitest run').split(/\s+/);
107
+ try {
108
+ execFileSync(cmd, [...cmdArgs, ...laneFiles, '--reporter=json', `--outputFile=${outFile}`], {
109
+ cwd: laneCwd,
110
+ stdio: ['ignore', 'ignore', 'inherit'],
111
+ });
112
+ }
113
+ catch {
114
+ /* nonzero exit = a failing test; the JSON report still carries the per-file outcome */
115
+ }
116
+ return parseVitestJsonReport(repoRoot, outFile);
117
+ }
118
+ /** Merge a lane's stats into the accumulated map. `partitionBackingFilesWithLanes`
119
+ * assigns each file to exactly one lane, so two lanes should never both produce the
120
+ * same repo-relative key — a collision means a `verify_lanes` prefix overlaps root's
121
+ * `src/`/`scripts/` or another lane's prefix, which is a config error worth failing
122
+ * loudly on rather than silently letting one lane's result clobber another's. */
123
+ function mergeLaneStats(into, from) {
124
+ for (const [key, val] of from) {
125
+ if (into.has(key)) {
126
+ throw new Error(`verify-acs: verify_lanes collision on "${key}" — check for overlapping lane prefixes`);
127
+ }
128
+ into.set(key, val);
129
+ }
130
+ }
73
131
  /** id → Set(backing test files, repo-relative) for one spec (per-file granularity).
74
132
  * `roots` is config-resolved by the caller (TOOL-03); defaults to the fork layout. */
75
133
  function backlinkFilesByItem(repoRoot, specId, roots) {
@@ -134,21 +192,25 @@ export function registerVerifyAcs(program) {
134
192
  const text = readFileSync(spec.path, 'utf8');
135
193
  const items = resolveItems(text);
136
194
  const { verifiesBacklinkRoots } = resolveDiscoveryPaths(repoRoot, global.config);
195
+ const laneDefs = resolveVerifyLanes(repoRoot, global.config);
137
196
  const backlinkFiles = backlinkFilesByItem(repoRoot, spec.id, verifiesBacklinkRoots);
138
- const allRoot = partitionBackingFiles([
139
- ...new Set([...backlinkFiles.values()].flatMap((s) => [...s])),
140
- ]).rootVitest;
141
- const stats = runRootVitest(repoRoot, allRoot);
197
+ const allFiles = [...new Set([...backlinkFiles.values()].flatMap((s) => [...s]))];
198
+ const { lanes: allLanes } = partitionBackingFilesWithLanes(allFiles, laneDefs);
199
+ const stats = runRootVitest(repoRoot, allLanes.get('root') ?? []);
200
+ for (const lane of laneDefs) {
201
+ mergeLaneStats(stats, runLaneVitest(repoRoot, lane, allLanes.get(lane.prefix) ?? []));
202
+ }
142
203
  const results = items.map((it) => {
143
204
  const files = [...(backlinkFiles.get(it.id) ?? [])];
144
- const { rootVitest, deferred } = partitionBackingFiles(files);
145
- const v = verdictFor(rootVitest, stats);
205
+ const { lanes, deferred } = partitionBackingFilesWithLanes(files, laneDefs);
206
+ const laneFiles = [...lanes.values()].flat();
207
+ const v = verdictFor(laneFiles, stats);
146
208
  const reason = !files.length
147
209
  ? 'no @verifies backlink'
148
- : rootVitest.length === 0
210
+ : laneFiles.length === 0
149
211
  ? `not_run (lane not wired: ${deferred.join(', ')})`
150
212
  : v.reason;
151
- return { ...it, files, proven: rootVitest.length > 0 && v.proven, reason };
213
+ return { ...it, files, proven: laneFiles.length > 0 && v.proven, reason };
152
214
  });
153
215
  if (options.enforce) {
154
216
  const liars = results.filter((r) => r.status === 'verified' && !r.proven);
@@ -1 +1 @@
1
- {"version":3,"file":"verify-acs.js","sourceRoot":"","sources":["../../src/commands/verify-acs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify-acs.js","sourceRoot":"","sources":["../../src/commands/verify-acs.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { Command } from 'commander';
2
2
  export type { SpecFile, SpecSignals, MissingSpecDiagnosis } from './lib/specs.js';
3
3
  export { listSpecs, findSpec, findSpecsById, deriveSignals, diagnoseMissingSpec } from './lib/specs.js';
4
- export { loadConfig, resetConfigCache, coresFromConfig, migrationsDir, generatedTestsDir, verifiesScanRoots, verifiesBacklinkRoots, resolveDiscoveryPaths, type SpecConfig, type CoreDef, type DiscoveryPaths, } from './lib/config.js';
4
+ export { loadConfig, resetConfigCache, coresFromConfig, migrationsDir, generatedTestsDir, verifiesScanRoots, verifiesBacklinkRoots, resolveDiscoveryPaths, resolveHandoff, type SpecConfig, type CoreDef, type DiscoveryPaths, } from './lib/config.js';
5
+ export { handoffConfig, DEFAULT_HANDOFF, type HandoffConfig } from './lib/handoff.js';
5
6
  export type { EmbeddingsSource } from './lib/embeddings-source.js';
6
7
  export { embeddingsSourceFromConfig, FilesystemEmbeddingsSource } from './lib/embeddings-source.js';
8
+ export { buildSpecIndex, extractSummary } from './lib/spec-index.js';
9
+ export type { SpecIndexEntry } from './lib/precedent-search.js';
7
10
  export { recommendAction } from './commands/next.js';
8
11
  export type { NextAction } from './lib/next-action.js';
9
12
  export { getRepoRoot, coresList } from './lib/repo.js';
@@ -18,6 +21,8 @@ export { parseComplianceSignoff } from './lib/compliance-signoff.js';
18
21
  export { loadEnforcementAllowlist, type EnforcementAllowlist } from './lib/enforcement-allowlist.js';
19
22
  export type { SessionState } from './lib/session-state.js';
20
23
  export { runPipeline, HALT_BEFORE_IMPLEMENT } from './lib/run-pipeline.js';
24
+ export { promoteDesignDoc } from './commands/promote.js';
25
+ export type { PromoteResult, PromoteOptions } from './commands/promote.js';
21
26
  export type { RunAutonomy, RunNextAction, GateExecution, GateExecutor, RunGateEvent, RunHaltReason, RunResult, RunDeps, RunConfig, } from './lib/run-pipeline.js';
22
27
  /** The fully-registered CLI program. Exported (not parsed on import — the parse
23
28
  * call below is guarded by the main-module check) so the command-surface gate
package/dist/index.js CHANGED
@@ -17,12 +17,14 @@ import { registerBuildEmbeddings } from './commands/build-embeddings.js';
17
17
  import { registerFreshness } from './commands/freshness.js';
18
18
  import { registerFunnel } from './commands/funnel.js';
19
19
  import { registerGenTests } from './commands/gen-tests.js';
20
+ import { registerIndex } from './commands/index-spec.js';
20
21
  import { registerInit } from './commands/init.js';
21
22
  import { registerList } from './commands/list.js';
22
23
  import { registerMetrics } from './commands/metrics.js';
23
24
  import { registerNext } from './commands/next.js';
24
25
  import { registerPrecedent } from './commands/precedent.js';
25
26
  import { registerProceed } from './commands/proceed.js';
27
+ import { registerPromote } from './commands/promote.js';
26
28
  import { registerProfile } from './commands/profile.js';
27
29
  import { registerReady } from './commands/ready.js';
28
30
  import { registerReconcile } from './commands/reconcile.js';
@@ -37,8 +39,17 @@ import { registerValidate } from './commands/validate.js';
37
39
  import { registerVerifyAcs } from './commands/verify-acs.js';
38
40
  import { registerVerifyRollout } from './commands/verifyRollout.js';
39
41
  export { listSpecs, findSpec, findSpecsById, deriveSignals, diagnoseMissingSpec } from './lib/specs.js';
40
- export { loadConfig, resetConfigCache, coresFromConfig, migrationsDir, generatedTestsDir, verifiesScanRoots, verifiesBacklinkRoots, resolveDiscoveryPaths, } from './lib/config.js';
42
+ export { loadConfig, resetConfigCache, coresFromConfig, migrationsDir, generatedTestsDir, verifiesScanRoots, verifiesBacklinkRoots, resolveDiscoveryPaths, resolveHandoff, } from './lib/config.js';
43
+ // Brainstorm→spec handoff config (issue #60): the pure per-key merge + defaults a
44
+ // Switchboard app / the `promote` verb reads. `handoffConfig`/`HandoffConfig` are
45
+ // fs-free (also on `/pure`); `resolveHandoff` (above) is the fs-bound resolver.
46
+ export { handoffConfig, DEFAULT_HANDOFF } from './lib/handoff.js';
41
47
  export { embeddingsSourceFromConfig, FilesystemEmbeddingsSource } from './lib/embeddings-source.js';
48
+ // Built-in spec-index generator (Phase 2a): the projection `eos-spec index`
49
+ // writes and `searchSpecs` falls back to in memory — exported so a consumer
50
+ // with its own generator script (builder's build-spec-index.mjs) can delete it
51
+ // and import the engine's.
52
+ export { buildSpecIndex, extractSummary } from './lib/spec-index.js';
42
53
  // ── Consumer surface (epic #300, Wave 3a — encoreos repoint) ─────────────────
43
54
  // The other heavy consumer (encoreos: navigator evals, verification-debt and
44
55
  // scorecard scripts, the navigator-SSOT and compliance/UI-evidence gates) reaches
@@ -80,6 +91,11 @@ export { loadEnforcementAllowlist } from './lib/enforcement-allowlist.js';
80
91
  // consumer pays no fs cost; it is deliberately NOT on `/pure` (per #29). Types are
81
92
  // exported so a consumer can implement `GateExecutor`/`RunDeps` against the contract.
82
93
  export { runPipeline, HALT_BEFORE_IMPLEMENT } from './lib/run-pipeline.js';
94
+ // The brainstorm→spec `promote` seam (issue #60): the SAME engine function the CLI
95
+ // runs, exported so a Switchboard app (Spec Studio's "Promote to spec" action) mints
96
+ // a spec through one code path. fs-bound (reads/writes files, shells git) — main entry
97
+ // only, never `/pure`.
98
+ export { promoteDesignDoc } from './commands/promote.js';
83
99
  import { ENGINE_VERSION } from './lib/version.js';
84
100
  /** The fully-registered CLI program. Exported (not parsed on import — the parse
85
101
  * call below is guarded by the main-module check) so the command-surface gate
@@ -107,7 +123,9 @@ registerNext(program);
107
123
  registerReady(program);
108
124
  registerClaim(program);
109
125
  registerPrecedent(program);
126
+ registerIndex(program);
110
127
  registerProceed(program);
128
+ registerPromote(program);
111
129
  registerStatus(program);
112
130
  registerList(program);
113
131
  registerCreate(program);
@@ -151,6 +169,7 @@ Examples:
151
169
  $ eos-spec status --spec PF-37 # Detail spec status (phases, tests, deferred)
152
170
  $ eos-spec list --core pm --status InProgress
153
171
  $ eos-spec create PF-99 "Foo Feature" # Scaffold spec/plan/tasks files (stubs)
172
+ $ eos-spec promote --design-doc docs/superpowers/specs/x-design.md --core web # Brainstorm→spec: claim + collision-safe id + AC seed + design_doc backlink + Status flip
154
173
  $ eos-spec tasks PF-99 # Generate or refresh TASKS file
155
174
  $ eos-spec complete --spec PF-37 --update-registry
156
175
  $ eos-spec close-out --spec LO-50 # Verified close-out: promote status->complete when ACs are verified at tasks_generated
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type HandoffConfig } from './handoff.js';
1
2
  export type CoreDef = {
2
3
  id: string;
3
4
  name: string;
@@ -16,6 +17,14 @@ export type ArchivePolicy = {
16
17
  preserves: string[];
17
18
  removes_from: string[];
18
19
  };
20
+ /** One `verify-acs` lane: backing files whose repo-relative path starts with `prefix`
21
+ * run via Vitest in `cwd` instead of landing in `deferred`. V1 is Vitest-JSON-reporter
22
+ * only; `command` defaults to `bunx vitest run`. */
23
+ export type LaneDef = {
24
+ prefix: string;
25
+ cwd: string;
26
+ command?: string;
27
+ };
19
28
  export type SpecConfig = {
20
29
  version: number;
21
30
  last_updated: string;
@@ -80,12 +89,22 @@ export type SpecConfig = {
80
89
  verification_coverage_min?: number;
81
90
  per_core?: Record<string, number>;
82
91
  };
92
+ /** Additional Vitest lanes for `verify-acs`: prefix-matched backing files run in
93
+ * `cwd` instead of `deferred` (Phase 2a Task 2). Absent ⇒ [] — every non-`src/`/
94
+ * `scripts/` backing file stays deferred, exactly as before this feature. */
95
+ verify_lanes?: LaneDef[];
96
+ /** Brainstorm→spec handoff tuning for the `promote` verb (design-doc dir, lifecycle
97
+ * line, shipped marker, template map). Additive + fully defaulted — absent ⇒
98
+ * `DEFAULT_HANDOFF` (a repo without it behaves exactly as before). See handoff.ts. */
99
+ handoff?: HandoffConfig;
83
100
  };
84
101
  export declare function loadConfig(repoRoot: string, configOverride?: string): SpecConfig;
85
102
  export declare function resetConfigCache(): void;
86
103
  export declare function coresFromConfig(config: SpecConfig): string[];
87
104
  export declare function isKnownCoreFromConfig(config: SpecConfig, core: string): boolean;
88
- /** Resolve a flat template key (e.g. 'full_spec', 'plan') to its path relative to repo root. */
105
+ /** Resolve a flat template key (e.g. 'full_spec', 'plan') to its path relative to repo
106
+ * root. Null-safe: a config with no `templates:` block resolves to null, so the caller
107
+ * falls back to the conventional `specs/_templates/<NAME>.md` default. */
89
108
  export declare function resolveTemplatePath(config: SpecConfig, key: string): string | null;
90
109
  /** Dir holding committed SQL migrations, relative to repo root. */
91
110
  export declare function migrationsDir(config: SpecConfig): string;
@@ -95,6 +114,19 @@ export declare function generatedTestsDir(config: SpecConfig): string;
95
114
  export declare function verifiesScanRoots(config: SpecConfig): string[];
96
115
  /** Roots walked for a single spec's `@verifies` backing-test backlinks. */
97
116
  export declare function verifiesBacklinkRoots(config: SpecConfig): string[];
117
+ /** Config-driven `verify-acs` Vitest lanes (Phase 2a Task 2). Absent ⇒ []. */
118
+ export declare function verifyLanes(config: SpecConfig): LaneDef[];
119
+ /** Resolve `verify_lanes` from `specs/config.yaml`, fail-safe to `[]` when the repo has
120
+ * no config file (or the key is absent) — so a repo without lane config keeps every
121
+ * non-root backing file deferred exactly as before this feature. Kept separate from
122
+ * `resolveDiscoveryPaths` so its `DiscoveryPaths` result shape is unaffected. */
123
+ export declare function resolveVerifyLanes(repoRoot: string, configOverride?: string): LaneDef[];
124
+ /** Resolve the brainstorm→spec `handoff:` block from `specs/config.yaml`, per-key
125
+ * merged over `DEFAULT_HANDOFF` and fail-safe to the documented defaults when the
126
+ * repo has no config file (or no `handoff:` key). Mirrors `resolveVerifyLanes`. The
127
+ * `promote` verb reads this so its behavior is config-tuned per repo but identical
128
+ * by default across every eos-spec repo. */
129
+ export declare function resolveHandoff(repoRoot: string, configOverride?: string): Required<HandoffConfig>;
98
130
  export type DiscoveryPaths = {
99
131
  migrationsDir: string;
100
132
  generatedTestsDir: string;