@slowcook-ai/cli 0.19.0-alpha.8 → 0.19.1
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/AGENTS.md +240 -0
- package/REPORTING.md +193 -0
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/brand/index.d.ts +26 -0
- package/dist/commands/brand/index.d.ts.map +1 -0
- package/dist/commands/brand/index.js +257 -0
- package/dist/commands/brand/index.js.map +1 -0
- package/dist/commands/brew/agent.d.ts +7 -2
- package/dist/commands/brew/agent.d.ts.map +1 -1
- package/dist/commands/brew/agent.js +9 -0
- package/dist/commands/brew/agent.js.map +1 -1
- package/dist/commands/brew/halt.d.ts +26 -0
- package/dist/commands/brew/halt.d.ts.map +1 -1
- package/dist/commands/brew/halt.js.map +1 -1
- package/dist/commands/brew/index.d.ts.map +1 -1
- package/dist/commands/brew/index.js +142 -18
- package/dist/commands/brew/index.js.map +1 -1
- package/dist/commands/brew/pair-navigator.d.ts +119 -0
- package/dist/commands/brew/pair-navigator.d.ts.map +1 -0
- package/dist/commands/brew/pair-navigator.js +187 -0
- package/dist/commands/brew/pair-navigator.js.map +1 -0
- package/dist/commands/budget/index.d.ts +2 -0
- package/dist/commands/budget/index.d.ts.map +1 -0
- package/dist/commands/budget/index.js +252 -0
- package/dist/commands/budget/index.js.map +1 -0
- package/dist/commands/chef/drift-fix.d.ts +33 -4
- package/dist/commands/chef/drift-fix.d.ts.map +1 -1
- package/dist/commands/chef/drift-fix.js +417 -29
- package/dist/commands/chef/drift-fix.js.map +1 -1
- package/dist/commands/chef/index.js +13 -3
- package/dist/commands/chef/index.js.map +1 -1
- package/dist/commands/chef/orchestrate.d.ts +1 -1
- package/dist/commands/chef/orchestrate.d.ts.map +1 -1
- package/dist/commands/chef/orchestrate.js +32 -9
- package/dist/commands/chef/orchestrate.js.map +1 -1
- package/dist/commands/dev-env/config.d.ts +57 -0
- package/dist/commands/dev-env/config.d.ts.map +1 -0
- package/dist/commands/dev-env/config.js +96 -0
- package/dist/commands/dev-env/config.js.map +1 -0
- package/dist/commands/dev-env/index.d.ts +27 -0
- package/dist/commands/dev-env/index.d.ts.map +1 -0
- package/dist/commands/dev-env/index.js +226 -0
- package/dist/commands/dev-env/index.js.map +1 -0
- package/dist/commands/dev-env/init.d.ts +28 -0
- package/dist/commands/dev-env/init.d.ts.map +1 -0
- package/dist/commands/dev-env/init.js +135 -0
- package/dist/commands/dev-env/init.js.map +1 -0
- package/dist/commands/docs/index.d.ts +16 -0
- package/dist/commands/docs/index.d.ts.map +1 -0
- package/dist/commands/docs/index.js +127 -0
- package/dist/commands/docs/index.js.map +1 -0
- package/dist/commands/eval/index.d.ts +54 -0
- package/dist/commands/eval/index.d.ts.map +1 -0
- package/dist/commands/eval/index.js +294 -0
- package/dist/commands/eval/index.js.map +1 -0
- package/dist/commands/extract/index.d.ts.map +1 -1
- package/dist/commands/extract/index.js +23 -1
- package/dist/commands/extract/index.js.map +1 -1
- package/dist/commands/garnish/index.d.ts +56 -0
- package/dist/commands/garnish/index.d.ts.map +1 -0
- package/dist/commands/garnish/index.js +281 -0
- package/dist/commands/garnish/index.js.map +1 -0
- package/dist/commands/garnish/trailer.d.ts +79 -0
- package/dist/commands/garnish/trailer.d.ts.map +1 -0
- package/dist/commands/garnish/trailer.js +118 -0
- package/dist/commands/garnish/trailer.js.map +1 -0
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +33 -0
- package/dist/commands/init/index.js.map +1 -1
- package/dist/commands/init/mock-vite.d.ts +54 -0
- package/dist/commands/init/mock-vite.d.ts.map +1 -0
- package/dist/commands/init/mock-vite.js +613 -0
- package/dist/commands/init/mock-vite.js.map +1 -0
- package/dist/commands/init/mock.d.ts +6 -0
- package/dist/commands/init/mock.d.ts.map +1 -1
- package/dist/commands/init/mock.js +20 -4
- package/dist/commands/init/mock.js.map +1 -1
- package/dist/commands/init/plan.d.ts +26 -1
- package/dist/commands/init/plan.d.ts.map +1 -1
- package/dist/commands/init/plan.js +41 -3
- package/dist/commands/init/plan.js.map +1 -1
- package/dist/commands/init/templates.d.ts.map +1 -1
- package/dist/commands/init/templates.js +12 -4
- package/dist/commands/init/templates.js.map +1 -1
- package/dist/commands/knowledge-add.d.ts +52 -0
- package/dist/commands/knowledge-add.d.ts.map +1 -0
- package/dist/commands/knowledge-add.js +232 -0
- package/dist/commands/knowledge-add.js.map +1 -0
- package/dist/commands/map/emit-typeorm.d.ts +117 -0
- package/dist/commands/map/emit-typeorm.d.ts.map +1 -0
- package/dist/commands/map/emit-typeorm.js +341 -0
- package/dist/commands/map/emit-typeorm.js.map +1 -0
- package/dist/commands/map/index.d.ts +18 -0
- package/dist/commands/map/index.d.ts.map +1 -1
- package/dist/commands/map/index.js +28 -0
- package/dist/commands/map/index.js.map +1 -1
- package/dist/commands/plate/agent.d.ts +7 -0
- package/dist/commands/plate/agent.d.ts.map +1 -1
- package/dist/commands/plate/agent.js +1 -1
- package/dist/commands/plate/agent.js.map +1 -1
- package/dist/commands/plate/index.d.ts.map +1 -1
- package/dist/commands/plate/index.js +6 -0
- package/dist/commands/plate/index.js.map +1 -1
- package/dist/commands/recon/index.d.ts +16 -3
- package/dist/commands/recon/index.d.ts.map +1 -1
- package/dist/commands/recon/index.js +267 -16
- package/dist/commands/recon/index.js.map +1 -1
- package/dist/commands/recon/migration-gate.d.ts +59 -0
- package/dist/commands/recon/migration-gate.d.ts.map +1 -0
- package/dist/commands/recon/migration-gate.js +131 -0
- package/dist/commands/recon/migration-gate.js.map +1 -0
- package/dist/commands/recon/reuse.d.ts +32 -0
- package/dist/commands/recon/reuse.d.ts.map +1 -1
- package/dist/commands/recon/reuse.js +66 -0
- package/dist/commands/recon/reuse.js.map +1 -1
- package/dist/commands/recon/stale-stubs.d.ts +65 -0
- package/dist/commands/recon/stale-stubs.d.ts.map +1 -0
- package/dist/commands/recon/stale-stubs.js +84 -0
- package/dist/commands/recon/stale-stubs.js.map +1 -0
- package/dist/commands/refine/agent.d.ts +23 -0
- package/dist/commands/refine/agent.d.ts.map +1 -1
- package/dist/commands/refine/agent.js +245 -15
- package/dist/commands/refine/agent.js.map +1 -1
- package/dist/commands/refine/brownfield-answer.d.ts +81 -0
- package/dist/commands/refine/brownfield-answer.d.ts.map +1 -0
- package/dist/commands/refine/brownfield-answer.js +231 -0
- package/dist/commands/refine/brownfield-answer.js.map +1 -0
- package/dist/commands/refine/context.d.ts +27 -1
- package/dist/commands/refine/context.d.ts.map +1 -1
- package/dist/commands/refine/context.js +438 -6
- package/dist/commands/refine/context.js.map +1 -1
- package/dist/commands/refine/git-attention.d.ts +123 -0
- package/dist/commands/refine/git-attention.d.ts.map +1 -0
- package/dist/commands/refine/git-attention.js +378 -0
- package/dist/commands/refine/git-attention.js.map +1 -0
- package/dist/commands/refine/history-index.d.ts +66 -0
- package/dist/commands/refine/history-index.d.ts.map +1 -1
- package/dist/commands/refine/history-index.js +195 -8
- package/dist/commands/refine/history-index.js.map +1 -1
- package/dist/commands/refine/index.d.ts.map +1 -1
- package/dist/commands/refine/index.js +105 -18
- package/dist/commands/refine/index.js.map +1 -1
- package/dist/commands/refine/multifurcate.d.ts +129 -0
- package/dist/commands/refine/multifurcate.d.ts.map +1 -0
- package/dist/commands/refine/multifurcate.js +247 -0
- package/dist/commands/refine/multifurcate.js.map +1 -0
- package/dist/commands/refine/proposals-synth.d.ts +50 -1
- package/dist/commands/refine/proposals-synth.d.ts.map +1 -1
- package/dist/commands/refine/proposals-synth.js +199 -35
- package/dist/commands/refine/proposals-synth.js.map +1 -1
- package/dist/commands/refine/spec-yaml.d.ts +214 -1210
- package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
- package/dist/commands/refine/spec-yaml.js +10 -0
- package/dist/commands/refine/spec-yaml.js.map +1 -1
- package/dist/commands/refresh-knowledge.d.ts +139 -0
- package/dist/commands/refresh-knowledge.d.ts.map +1 -0
- package/dist/commands/refresh-knowledge.js +1029 -0
- package/dist/commands/refresh-knowledge.js.map +1 -0
- package/dist/commands/run-mock/index.d.ts.map +1 -1
- package/dist/commands/run-mock/index.js +135 -22
- package/dist/commands/run-mock/index.js.map +1 -1
- package/dist/commands/testgen/agent.d.ts +13 -0
- package/dist/commands/testgen/agent.d.ts.map +1 -1
- package/dist/commands/testgen/agent.js +137 -11
- package/dist/commands/testgen/agent.js.map +1 -1
- package/dist/commands/upsert-agent-docs.d.ts +48 -0
- package/dist/commands/upsert-agent-docs.d.ts.map +1 -0
- package/dist/commands/upsert-agent-docs.js +298 -0
- package/dist/commands/upsert-agent-docs.js.map +1 -0
- package/dist/commands/vibe/agent.d.ts +7 -0
- package/dist/commands/vibe/agent.d.ts.map +1 -1
- package/dist/commands/vibe/agent.js +2 -2
- package/dist/commands/vibe/agent.js.map +1 -1
- package/dist/commands/vibe/index.d.ts.map +1 -1
- package/dist/commands/vibe/index.js +7 -1
- package/dist/commands/vibe/index.js.map +1 -1
- package/dist/cost-store.d.ts +52 -0
- package/dist/cost-store.d.ts.map +1 -0
- package/dist/cost-store.js +108 -0
- package/dist/cost-store.js.map +1 -0
- package/dist/lib/budget.d.ts +73 -0
- package/dist/lib/budget.d.ts.map +1 -0
- package/dist/lib/budget.js +225 -0
- package/dist/lib/budget.js.map +1 -0
- package/dist/lib/mock-shape.d.ts +29 -0
- package/dist/lib/mock-shape.d.ts.map +1 -0
- package/dist/lib/mock-shape.js +77 -0
- package/dist/lib/mock-shape.js.map +1 -0
- package/dist/lib/read-only.d.ts +22 -0
- package/dist/lib/read-only.d.ts.map +1 -0
- package/dist/lib/read-only.js +34 -0
- package/dist/lib/read-only.js.map +1 -0
- package/package.json +17 -12
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.19.0-α.18 (closes #109 — migration gate in recon).
|
|
3
|
+
*
|
|
4
|
+
* Pre-brew structural gate. Reads the story's spec, extracts the
|
|
5
|
+
* `proposals.schema.sql` block (if any), and checks that every table /
|
|
6
|
+
* column the spec proposes is covered by at least one migration file
|
|
7
|
+
* on disk.
|
|
8
|
+
*
|
|
9
|
+
* Why this gate matters: the rewo story-005 / story-006 incident class
|
|
10
|
+
* — brew ships green tests against mocked DBs while the consumer's
|
|
11
|
+
* `supabase/migrations/` (or `packages/postgres/src/migrations/`)
|
|
12
|
+
* never gets the matching DDL. Test-time green; production-time broken.
|
|
13
|
+
*
|
|
14
|
+
* Pure structural check. No LLM. Sees both Supabase SQL (`*.sql`) and
|
|
15
|
+
* TypeORM TS (`*.ts`) migrations via `scanMigrations`'s auto-discovery.
|
|
16
|
+
*
|
|
17
|
+
* Wiring: `recon` calls `checkMigrationGate` after the per-test
|
|
18
|
+
* structural checks; emitted gaps share the `missing_migration` kind so
|
|
19
|
+
* they roll up into the same `escalate` exit path that already exists.
|
|
20
|
+
*/
|
|
21
|
+
import { type MigrationEntry } from "../refine/history-index.js";
|
|
22
|
+
export interface MigrationGap {
|
|
23
|
+
/** Source location pointer (which spec section flagged this). */
|
|
24
|
+
source: string;
|
|
25
|
+
/** Table the spec proposes. */
|
|
26
|
+
table: string;
|
|
27
|
+
/** Columns the spec proposes that are not covered by any migration. */
|
|
28
|
+
missing_columns: string[];
|
|
29
|
+
/** Whether the table itself is uncovered (no migration creates it at all). */
|
|
30
|
+
table_missing: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface MigrationGateResult {
|
|
33
|
+
/** True if the spec touches schema at all (proposals.schema.sql present + non-empty). */
|
|
34
|
+
spec_proposes_schema: boolean;
|
|
35
|
+
/** Total migration files scanned (across all auto-discovered dirs). */
|
|
36
|
+
migrations_scanned: number;
|
|
37
|
+
/** Per-table gaps. Empty array → gate is clean. */
|
|
38
|
+
gaps: MigrationGap[];
|
|
39
|
+
/** Diagnostic notes (e.g., "spec not found", "no schema proposal"). */
|
|
40
|
+
notes: string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run the gate. `migrationsOverride` is for tests / explicit-dir callers;
|
|
44
|
+
* normal callers pass undefined and let the scanner auto-discover.
|
|
45
|
+
*
|
|
46
|
+
* Returns a structured result even when there are no gaps so callers can
|
|
47
|
+
* log how much was scanned. `gaps.length === 0` is the clean signal.
|
|
48
|
+
*/
|
|
49
|
+
export declare function checkMigrationGate(repoRoot: string, storyId: string, migrationsOverride?: MigrationEntry[]): MigrationGateResult;
|
|
50
|
+
/**
|
|
51
|
+
* Render a single migration gap into recon's `detail` + `recommendation`
|
|
52
|
+
* shape. Pulled out as its own helper so the recon entry point and tests
|
|
53
|
+
* can both consume it.
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatMigrationGap(g: MigrationGap): {
|
|
56
|
+
detail: string;
|
|
57
|
+
recommendation: string;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=migration-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-gate.d.ts","sourceRoot":"","sources":["../../../src/commands/recon/migration-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yFAAyF;IACzF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,uEAAuE;IACvE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,cAAc,EAAE,GACpC,mBAAmB,CA8FrB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,GAAG;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB,CAWA"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.19.0-α.18 (closes #109 — migration gate in recon).
|
|
3
|
+
*
|
|
4
|
+
* Pre-brew structural gate. Reads the story's spec, extracts the
|
|
5
|
+
* `proposals.schema.sql` block (if any), and checks that every table /
|
|
6
|
+
* column the spec proposes is covered by at least one migration file
|
|
7
|
+
* on disk.
|
|
8
|
+
*
|
|
9
|
+
* Why this gate matters: the rewo story-005 / story-006 incident class
|
|
10
|
+
* — brew ships green tests against mocked DBs while the consumer's
|
|
11
|
+
* `supabase/migrations/` (or `packages/postgres/src/migrations/`)
|
|
12
|
+
* never gets the matching DDL. Test-time green; production-time broken.
|
|
13
|
+
*
|
|
14
|
+
* Pure structural check. No LLM. Sees both Supabase SQL (`*.sql`) and
|
|
15
|
+
* TypeORM TS (`*.ts`) migrations via `scanMigrations`'s auto-discovery.
|
|
16
|
+
*
|
|
17
|
+
* Wiring: `recon` calls `checkMigrationGate` after the per-test
|
|
18
|
+
* structural checks; emitted gaps share the `missing_migration` kind so
|
|
19
|
+
* they roll up into the same `escalate` exit path that already exists.
|
|
20
|
+
*/
|
|
21
|
+
import { scanMigrations, extractCreateTables, extractColumnsAdded, } from "../refine/history-index.js";
|
|
22
|
+
import { readSpec } from "../refine/spec-yaml.js";
|
|
23
|
+
/**
|
|
24
|
+
* Run the gate. `migrationsOverride` is for tests / explicit-dir callers;
|
|
25
|
+
* normal callers pass undefined and let the scanner auto-discover.
|
|
26
|
+
*
|
|
27
|
+
* Returns a structured result even when there are no gaps so callers can
|
|
28
|
+
* log how much was scanned. `gaps.length === 0` is the clean signal.
|
|
29
|
+
*/
|
|
30
|
+
export function checkMigrationGate(repoRoot, storyId, migrationsOverride) {
|
|
31
|
+
const result = {
|
|
32
|
+
spec_proposes_schema: false,
|
|
33
|
+
migrations_scanned: 0,
|
|
34
|
+
gaps: [],
|
|
35
|
+
notes: [],
|
|
36
|
+
};
|
|
37
|
+
// 1. Try to read the spec. Specs may not exist for non-slowcook-driven
|
|
38
|
+
// stories (e.g., manual bug fixes). In that case the gate is a no-op:
|
|
39
|
+
// we have no PM-authored schema contract to check against.
|
|
40
|
+
let proposalSql = "";
|
|
41
|
+
try {
|
|
42
|
+
const spec = readSpec(repoRoot, storyId);
|
|
43
|
+
proposalSql = spec.proposals?.schema?.sql ?? "";
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
result.notes.push(`Spec not found or invalid for story-${storyId}: ${e.message.slice(0, 200)}`);
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
if (!proposalSql.trim()) {
|
|
50
|
+
result.notes.push(`Spec story-${storyId} has no proposals.schema.sql block — migration gate is a no-op for this story.`);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
result.spec_proposes_schema = true;
|
|
54
|
+
// 2. Parse the proposal SQL for tables + columns.
|
|
55
|
+
const proposedTables = extractCreateTables(proposalSql);
|
|
56
|
+
const proposedColumns = extractColumnsAdded(proposalSql);
|
|
57
|
+
// 3. Load migration coverage. The scanner auto-discovers Supabase vs
|
|
58
|
+
// TypeORM dirs; pass the conventional default and let it fall back.
|
|
59
|
+
const migrations = migrationsOverride ?? scanMigrations(repoRoot, "supabase/migrations");
|
|
60
|
+
result.migrations_scanned = migrations.length;
|
|
61
|
+
// 4. Build coverage indices.
|
|
62
|
+
const coveredTables = new Set(migrations.flatMap((m) => m.tables_created));
|
|
63
|
+
const coveredColumnsByTable = {};
|
|
64
|
+
for (const m of migrations) {
|
|
65
|
+
for (const [t, cols] of Object.entries(m.columns_added)) {
|
|
66
|
+
if (!coveredColumnsByTable[t]) {
|
|
67
|
+
coveredColumnsByTable[t] = new Set();
|
|
68
|
+
}
|
|
69
|
+
for (const c of cols)
|
|
70
|
+
coveredColumnsByTable[t].add(c);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 5. Walk proposed tables. Two-tier check:
|
|
74
|
+
// (a) Is the table itself present in some migration? If not → gap with
|
|
75
|
+
// table_missing=true and the FULL list of proposed columns flagged.
|
|
76
|
+
// (b) If the table exists, are all proposed columns covered? Missing
|
|
77
|
+
// columns produce a gap with table_missing=false.
|
|
78
|
+
//
|
|
79
|
+
// Tables that appear in proposedColumns but NOT in proposedTables (e.g.,
|
|
80
|
+
// a pure ALTER TABLE proposal) are also walked — that path is the
|
|
81
|
+
// "spec proposes new columns on an existing brownfield table" case,
|
|
82
|
+
// which is exactly the rewo story-005 incident shape.
|
|
83
|
+
const allProposedTables = new Set([
|
|
84
|
+
...proposedTables,
|
|
85
|
+
...Object.keys(proposedColumns),
|
|
86
|
+
]);
|
|
87
|
+
for (const t of allProposedTables) {
|
|
88
|
+
const proposedCols = proposedColumns[t] ?? [];
|
|
89
|
+
if (!coveredTables.has(t)) {
|
|
90
|
+
// Table missing entirely. If the spec ONLY proposes ALTERs (not a CREATE)
|
|
91
|
+
// and the table is brownfield-only, it shows up here too — that's the
|
|
92
|
+
// ALTER-on-uncreated-table case (rare but worth flagging the same way).
|
|
93
|
+
result.gaps.push({
|
|
94
|
+
source: `specs/story-${storyId}.yaml#proposals.schema.sql`,
|
|
95
|
+
table: t,
|
|
96
|
+
missing_columns: proposedCols,
|
|
97
|
+
table_missing: true,
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const coveredCols = coveredColumnsByTable[t] ?? new Set();
|
|
102
|
+
const missing = proposedCols.filter((c) => !coveredCols.has(c));
|
|
103
|
+
if (missing.length > 0) {
|
|
104
|
+
result.gaps.push({
|
|
105
|
+
source: `specs/story-${storyId}.yaml#proposals.schema.sql`,
|
|
106
|
+
table: t,
|
|
107
|
+
missing_columns: missing,
|
|
108
|
+
table_missing: false,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Render a single migration gap into recon's `detail` + `recommendation`
|
|
116
|
+
* shape. Pulled out as its own helper so the recon entry point and tests
|
|
117
|
+
* can both consume it.
|
|
118
|
+
*/
|
|
119
|
+
export function formatMigrationGap(g) {
|
|
120
|
+
if (g.table_missing) {
|
|
121
|
+
return {
|
|
122
|
+
detail: `Spec proposes table "${g.table}" (cols: ${g.missing_columns.join(", ") || "—"}) but no migration creates it.`,
|
|
123
|
+
recommendation: `Author a migration that creates the table BEFORE dispatching brew. For TypeORM consumers: \`packages/postgres/src/migrations/<ts>-create-${g.table}.ts\` with a \`DatabaseCreateTable\` or raw \`CREATE TABLE\`. For Supabase: \`supabase/migrations/<ts>_create_${g.table}.sql\`.`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
detail: `Spec proposes columns ${g.missing_columns.map((c) => `"${c}"`).join(", ")} on table "${g.table}" but no migration adds them.`,
|
|
128
|
+
recommendation: `Add an \`ALTER TABLE ${g.table} ADD COLUMN <col> <type>\` migration covering: ${g.missing_columns.join(", ")}. Land it BEFORE dispatching brew.`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=migration-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-gate.js","sourceRoot":"","sources":["../../../src/commands/recon/migration-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,38 @@ export declare function extractStructuralSignature(path: string, source: string)
|
|
|
54
54
|
* 0 if one is empty + the other isn't.
|
|
55
55
|
*/
|
|
56
56
|
export declare function jaccard(a: string[], b: string[]): number;
|
|
57
|
+
/**
|
|
58
|
+
* 0.19.0-α.10 (#85) — detect "this file is auto-generated, exclude
|
|
59
|
+
* from refactor-candidate scanning." Pure: takes file content, returns
|
|
60
|
+
* true if any of these markers appears in the first 400 characters:
|
|
61
|
+
*
|
|
62
|
+
* `@slowcook-template` — explicit "slowcook generated me" marker
|
|
63
|
+
* `@slowcook-stub` — placeholder waiting for brew to overwrite
|
|
64
|
+
* `@generated` — common convention (Facebook/Meta tooling)
|
|
65
|
+
* `AUTO-GENERATED` — case-insensitive plain English
|
|
66
|
+
* `auto-generated by` — common phrasing in tool output
|
|
67
|
+
* `Do not edit by hand` — common phrasing in templated files
|
|
68
|
+
*
|
|
69
|
+
* 400 chars is enough to capture a typical file header without scanning
|
|
70
|
+
* the whole body. Markers later in the file are deliberately ignored
|
|
71
|
+
* (e.g., a comment in the middle of a file mentioning "auto-generated"
|
|
72
|
+
* shouldn't kill the file's signal).
|
|
73
|
+
*/
|
|
74
|
+
export declare function isAutoTemplateFile(content: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* 0.19.0-α.10 (#85) — match a single file path against a glob-ish
|
|
77
|
+
* exclusion pattern. Same shape as the refactor command's matchesScope
|
|
78
|
+
* (kept inline rather than cross-package-imported to avoid coupling
|
|
79
|
+
* recon to the refactor module).
|
|
80
|
+
*
|
|
81
|
+
* Supported:
|
|
82
|
+
* - exact match: "src/foo.ts"
|
|
83
|
+
* - directory prefix: "src/lib/entities/" (matches anything under)
|
|
84
|
+
* - star at end: "src/lib/data/*" (one segment after)
|
|
85
|
+
* - double-star: "src/lib/entities/**" (any depth)
|
|
86
|
+
* - filename glob: "*.mock.ts" (matches any path ending with)
|
|
87
|
+
*/
|
|
88
|
+
export declare function matchesExcludePattern(filePath: string, pattern: string): boolean;
|
|
57
89
|
/**
|
|
58
90
|
* Compute similarity between two structural signatures. Auto-
|
|
59
91
|
* categorizes by JSX presence:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reuse.d.ts","sourceRoot":"","sources":["../../../src/commands/recon/reuse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;0CACsC;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;oDAEgD;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CA4GtF;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CASxD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAiB9E;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAC;IACtC,2CAA2C;IAC3C,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,aAAa,EAAE,EAC3B,SAAS,SAAM,GACd,aAAa,EAAE,CA2BjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC3C,CAyBA"}
|
|
1
|
+
{"version":3,"file":"reuse.d.ts","sourceRoot":"","sources":["../../../src/commands/recon/reuse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;0CACsC;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;oDAEgD;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CA4GtF;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CASxD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAmBhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAiB9E;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAC;IACtC,2CAA2C;IAC3C,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,aAAa,EAAE,EAC3B,SAAS,SAAM,GACd,aAAa,EAAE,CA2BjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC3C,CAyBA"}
|
|
@@ -162,6 +162,72 @@ export function jaccard(a, b) {
|
|
|
162
162
|
const union = sa.size + sb.size - inter;
|
|
163
163
|
return inter / union;
|
|
164
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* 0.19.0-α.10 (#85) — detect "this file is auto-generated, exclude
|
|
167
|
+
* from refactor-candidate scanning." Pure: takes file content, returns
|
|
168
|
+
* true if any of these markers appears in the first 400 characters:
|
|
169
|
+
*
|
|
170
|
+
* `@slowcook-template` — explicit "slowcook generated me" marker
|
|
171
|
+
* `@slowcook-stub` — placeholder waiting for brew to overwrite
|
|
172
|
+
* `@generated` — common convention (Facebook/Meta tooling)
|
|
173
|
+
* `AUTO-GENERATED` — case-insensitive plain English
|
|
174
|
+
* `auto-generated by` — common phrasing in tool output
|
|
175
|
+
* `Do not edit by hand` — common phrasing in templated files
|
|
176
|
+
*
|
|
177
|
+
* 400 chars is enough to capture a typical file header without scanning
|
|
178
|
+
* the whole body. Markers later in the file are deliberately ignored
|
|
179
|
+
* (e.g., a comment in the middle of a file mentioning "auto-generated"
|
|
180
|
+
* shouldn't kill the file's signal).
|
|
181
|
+
*/
|
|
182
|
+
export function isAutoTemplateFile(content) {
|
|
183
|
+
const head = content.slice(0, 400);
|
|
184
|
+
if (head.includes("@slowcook-template"))
|
|
185
|
+
return true;
|
|
186
|
+
if (head.includes("@slowcook-stub"))
|
|
187
|
+
return true;
|
|
188
|
+
if (head.includes("@generated"))
|
|
189
|
+
return true;
|
|
190
|
+
if (/auto-generated/i.test(head))
|
|
191
|
+
return true;
|
|
192
|
+
if (/do not edit by hand/i.test(head))
|
|
193
|
+
return true;
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 0.19.0-α.10 (#85) — match a single file path against a glob-ish
|
|
198
|
+
* exclusion pattern. Same shape as the refactor command's matchesScope
|
|
199
|
+
* (kept inline rather than cross-package-imported to avoid coupling
|
|
200
|
+
* recon to the refactor module).
|
|
201
|
+
*
|
|
202
|
+
* Supported:
|
|
203
|
+
* - exact match: "src/foo.ts"
|
|
204
|
+
* - directory prefix: "src/lib/entities/" (matches anything under)
|
|
205
|
+
* - star at end: "src/lib/data/*" (one segment after)
|
|
206
|
+
* - double-star: "src/lib/entities/**" (any depth)
|
|
207
|
+
* - filename glob: "*.mock.ts" (matches any path ending with)
|
|
208
|
+
*/
|
|
209
|
+
export function matchesExcludePattern(filePath, pattern) {
|
|
210
|
+
if (pattern === filePath)
|
|
211
|
+
return true;
|
|
212
|
+
if (pattern.endsWith("/")) {
|
|
213
|
+
return filePath.startsWith(pattern);
|
|
214
|
+
}
|
|
215
|
+
if (pattern.endsWith("/**")) {
|
|
216
|
+
return filePath.startsWith(pattern.slice(0, -3) + "/") || filePath === pattern.slice(0, -3);
|
|
217
|
+
}
|
|
218
|
+
if (pattern.endsWith("/*")) {
|
|
219
|
+
const dir = pattern.slice(0, -2);
|
|
220
|
+
if (!filePath.startsWith(dir + "/"))
|
|
221
|
+
return false;
|
|
222
|
+
const rest = filePath.slice(dir.length + 1);
|
|
223
|
+
return !rest.includes("/");
|
|
224
|
+
}
|
|
225
|
+
if (pattern.startsWith("*.")) {
|
|
226
|
+
const ext = pattern.slice(1); // ".mock.ts"
|
|
227
|
+
return filePath.endsWith(ext);
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
165
231
|
/**
|
|
166
232
|
* Compute similarity between two structural signatures. Auto-
|
|
167
233
|
* categorizes by JSX presence:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reuse.js","sourceRoot":"","sources":["../../../src/commands/recon/reuse.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reuse.js","sourceRoot":"","sources":["../../../src/commands/recon/reuse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.19.0-α.11 (#84) — stale-stub detector.
|
|
3
|
+
*
|
|
4
|
+
* Empirical finding from rewo reuse-scan 2026-05-07: 6 @slowcook-stub
|
|
5
|
+
* files survived from incomplete story-016/018 brews. They're not
|
|
6
|
+
* refactor candidates (reuse-scan misclassified them at 100% similar
|
|
7
|
+
* because they're literally the same template body); they're
|
|
8
|
+
* INCOMPLETE WORK markers that should escalate to PM after a grace
|
|
9
|
+
* period.
|
|
10
|
+
*
|
|
11
|
+
* This module: walk src/, find @slowcook-stub markers, age each via
|
|
12
|
+
* `git log --diff-filter=A` (first-add date), report stale ones
|
|
13
|
+
* + (optionally) escalate to PM via gh comment on the source issue.
|
|
14
|
+
*
|
|
15
|
+
* Pure helpers below; cli wiring in recon's --stub-scan flag.
|
|
16
|
+
*/
|
|
17
|
+
export interface StubFile {
|
|
18
|
+
/** Repo-relative path. */
|
|
19
|
+
path: string;
|
|
20
|
+
/** Story id extracted from the stub marker (e.g., "016", "018"). */
|
|
21
|
+
storyId: string | null;
|
|
22
|
+
/** ISO timestamp of the file's first-add commit. Null if git log
|
|
23
|
+
* couldn't resolve (file isn't tracked, repo isn't a git repo,
|
|
24
|
+
* etc.). */
|
|
25
|
+
firstAddedAt: string | null;
|
|
26
|
+
/** Age in days, computed against `now`. Null when firstAddedAt
|
|
27
|
+
* is null. */
|
|
28
|
+
ageDays: number | null;
|
|
29
|
+
/** Classification: fresh < gracePeriod, stale ≥ gracePeriod. */
|
|
30
|
+
classification: "fresh" | "stale" | "unknown";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Detect a `@slowcook-stub` marker in file content + extract the
|
|
34
|
+
* story id when one is named alongside it. Pure: no IO.
|
|
35
|
+
*
|
|
36
|
+
* Patterns recognized:
|
|
37
|
+
* `// @slowcook-stub story-016` — explicit story id
|
|
38
|
+
* `// @slowcook-stub` — bare; storyId = null
|
|
39
|
+
* `/* @slowcook-stub story-018 *\/` — block comment form
|
|
40
|
+
*/
|
|
41
|
+
export declare function detectStubMarker(content: string): {
|
|
42
|
+
isStub: boolean;
|
|
43
|
+
storyId: string | null;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Compute days between two ISO timestamps. Pure: no clock IO. Returns
|
|
47
|
+
* a non-negative number rounded to 1 decimal.
|
|
48
|
+
*/
|
|
49
|
+
export declare function daysBetween(earlierIso: string, laterIso: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Classify a stub by age against a grace period. Pure.
|
|
52
|
+
* ageDays === null → "unknown"
|
|
53
|
+
* ageDays < graceDays → "fresh"
|
|
54
|
+
* ageDays >= graceDays → "stale"
|
|
55
|
+
*/
|
|
56
|
+
export declare function classifyStubAge(ageDays: number | null, graceDays: number): "fresh" | "stale" | "unknown";
|
|
57
|
+
/**
|
|
58
|
+
* Synthesize a PM-actionable comment body for an overdue stub.
|
|
59
|
+
* Pure: no IO. Caller posts via gh.
|
|
60
|
+
*
|
|
61
|
+
* 0.19.0-α.12 — appends slowcook:cost HTML marker so the comment is
|
|
62
|
+
* grep-able by downstream cost / activity aggregation tools.
|
|
63
|
+
*/
|
|
64
|
+
export declare function buildStaleStubComment(stub: StubFile, graceDays: number, cliVersion?: string): string;
|
|
65
|
+
//# sourceMappingURL=stale-stubs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-stubs.d.ts","sourceRoot":"","sources":["../../../src/commands/recon/stale-stubs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;iBAEa;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;mBACe;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,cAAc,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAK7F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,GAAG,OAAO,GAAG,SAAS,CAI/B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,SAAW,GAAG,MAAM,CAoBtG"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.19.0-α.11 (#84) — stale-stub detector.
|
|
3
|
+
*
|
|
4
|
+
* Empirical finding from rewo reuse-scan 2026-05-07: 6 @slowcook-stub
|
|
5
|
+
* files survived from incomplete story-016/018 brews. They're not
|
|
6
|
+
* refactor candidates (reuse-scan misclassified them at 100% similar
|
|
7
|
+
* because they're literally the same template body); they're
|
|
8
|
+
* INCOMPLETE WORK markers that should escalate to PM after a grace
|
|
9
|
+
* period.
|
|
10
|
+
*
|
|
11
|
+
* This module: walk src/, find @slowcook-stub markers, age each via
|
|
12
|
+
* `git log --diff-filter=A` (first-add date), report stale ones
|
|
13
|
+
* + (optionally) escalate to PM via gh comment on the source issue.
|
|
14
|
+
*
|
|
15
|
+
* Pure helpers below; cli wiring in recon's --stub-scan flag.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Detect a `@slowcook-stub` marker in file content + extract the
|
|
19
|
+
* story id when one is named alongside it. Pure: no IO.
|
|
20
|
+
*
|
|
21
|
+
* Patterns recognized:
|
|
22
|
+
* `// @slowcook-stub story-016` — explicit story id
|
|
23
|
+
* `// @slowcook-stub` — bare; storyId = null
|
|
24
|
+
* `/* @slowcook-stub story-018 *\/` — block comment form
|
|
25
|
+
*/
|
|
26
|
+
export function detectStubMarker(content) {
|
|
27
|
+
const head = content.slice(0, 500);
|
|
28
|
+
if (!head.includes("@slowcook-stub"))
|
|
29
|
+
return { isStub: false, storyId: null };
|
|
30
|
+
const m = head.match(/@slowcook-stub\s+story-(\d+)/);
|
|
31
|
+
return { isStub: true, storyId: m ? m[1] : null };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compute days between two ISO timestamps. Pure: no clock IO. Returns
|
|
35
|
+
* a non-negative number rounded to 1 decimal.
|
|
36
|
+
*/
|
|
37
|
+
export function daysBetween(earlierIso, laterIso) {
|
|
38
|
+
const a = new Date(earlierIso).getTime();
|
|
39
|
+
const b = new Date(laterIso).getTime();
|
|
40
|
+
if (Number.isNaN(a) || Number.isNaN(b))
|
|
41
|
+
return 0;
|
|
42
|
+
const ms = Math.max(0, b - a);
|
|
43
|
+
return Math.round((ms / (1000 * 60 * 60 * 24)) * 10) / 10;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Classify a stub by age against a grace period. Pure.
|
|
47
|
+
* ageDays === null → "unknown"
|
|
48
|
+
* ageDays < graceDays → "fresh"
|
|
49
|
+
* ageDays >= graceDays → "stale"
|
|
50
|
+
*/
|
|
51
|
+
export function classifyStubAge(ageDays, graceDays) {
|
|
52
|
+
if (ageDays === null)
|
|
53
|
+
return "unknown";
|
|
54
|
+
if (ageDays < graceDays)
|
|
55
|
+
return "fresh";
|
|
56
|
+
return "stale";
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Synthesize a PM-actionable comment body for an overdue stub.
|
|
60
|
+
* Pure: no IO. Caller posts via gh.
|
|
61
|
+
*
|
|
62
|
+
* 0.19.0-α.12 — appends slowcook:cost HTML marker so the comment is
|
|
63
|
+
* grep-able by downstream cost / activity aggregation tools.
|
|
64
|
+
*/
|
|
65
|
+
export function buildStaleStubComment(stub, graceDays, cliVersion = "0.19.0") {
|
|
66
|
+
const lines = [];
|
|
67
|
+
lines.push(`### slowcook · stub still incomplete after ${graceDays} days`);
|
|
68
|
+
lines.push("");
|
|
69
|
+
lines.push(`A \`@slowcook-stub\` marker still exists at \`${stub.path}\`${stub.firstAddedAt ? ` (added ${stub.ageDays} day(s) ago — ${stub.firstAddedAt.slice(0, 10)})` : ""}.`);
|
|
70
|
+
lines.push("");
|
|
71
|
+
lines.push("This means a brew never converged on this file — it's a placeholder that throws at runtime / returns a 501 stub response. The story it belongs to is incomplete.");
|
|
72
|
+
lines.push("");
|
|
73
|
+
lines.push("**PM action**: choose one:");
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push("1. **Re-dispatch brew** for the story. The stub will be replaced.");
|
|
76
|
+
lines.push("2. **Hand-write the implementation** if brew can't converge after multiple attempts.");
|
|
77
|
+
lines.push("3. **Withdraw the story** if the feature is no longer wanted — close the issue + delete the stub file.");
|
|
78
|
+
lines.push("");
|
|
79
|
+
lines.push(`<sub>Posted by \`slowcook recon --stub-scan\`. Re-running this scan will re-post if the stub is still here in another ${graceDays} days.</sub>`);
|
|
80
|
+
lines.push("");
|
|
81
|
+
lines.push(`<!-- slowcook:cost agent=recon usd=0.0000 kind=stub-escalate path=${stub.path} story=${stub.storyId ?? "unknown"} age_days=${stub.ageDays ?? "unknown"} cli=${cliVersion} -->`);
|
|
82
|
+
return lines.join("\n");
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=stale-stubs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-stubs.js","sourceRoot":"","sources":["../../../src/commands/recon/stale-stubs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { LlmClient } from "./llm.js";
|
|
2
|
+
/**
|
|
3
|
+
* Strip the brand header, cost footer, and HTML cost marker out of a
|
|
4
|
+
* model-emitted markdown body. The calling code adds those around the
|
|
5
|
+
* output; if the model copies them from prior-turn context, we'd
|
|
6
|
+
* post duplicates. Cheap regex; safe to no-op when patterns absent.
|
|
7
|
+
*
|
|
8
|
+
* Visible for tests.
|
|
9
|
+
*/
|
|
10
|
+
export declare function stripModelEmittedDuplicates(body: string): string;
|
|
2
11
|
import type { ForgeAdapter, Spec } from "@slowcook-ai/core";
|
|
3
12
|
export declare const LABEL_CHANGE_OF_MIND = "change-of-mind";
|
|
4
13
|
export declare const LABEL_BLOCKED_CONTRADICTION = "blocked-contradiction";
|
|
@@ -6,6 +15,13 @@ export declare const LABEL_BLOCKED_OVERLAP = "blocked-overlap";
|
|
|
6
15
|
export declare const LABEL_SPEC_SUBMITTED = "spec-submitted";
|
|
7
16
|
export declare const LABEL_SPEC_READY = "spec-ready";
|
|
8
17
|
export declare const LABEL_NEEDS_REFINEMENT = "needs-refinement";
|
|
18
|
+
/**
|
|
19
|
+
* cli α.44 — applied to an issue when refine has posted a multifurcation
|
|
20
|
+
* proposal. While present, future refine runs skip the multifurcation
|
|
21
|
+
* step (the PM is still deciding whether to file the split). PM removes
|
|
22
|
+
* the label after acting on the proposal.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LABEL_MULTIFURCATION_PROPOSED = "slowcook-multifurcation-proposed";
|
|
9
25
|
/**
|
|
10
26
|
* Branded header prepended to every clarifying-question comment so reviewers
|
|
11
27
|
* can tell at a glance that the comment is agent-authored, even though GitHub
|
|
@@ -51,6 +67,10 @@ export type RefineOutcome = {
|
|
|
51
67
|
} | {
|
|
52
68
|
kind: "change-of-mind-accepted";
|
|
53
69
|
supersedes: string[];
|
|
70
|
+
} | {
|
|
71
|
+
kind: "multifurcation-proposed";
|
|
72
|
+
commentId: number;
|
|
73
|
+
subIssueCount: number;
|
|
54
74
|
} | {
|
|
55
75
|
kind: "noop";
|
|
56
76
|
reason: string;
|
|
@@ -62,6 +82,9 @@ interface ParseContext {
|
|
|
62
82
|
createdAt: string;
|
|
63
83
|
cliVersion: string;
|
|
64
84
|
supersedes: string[];
|
|
85
|
+
/** 0.19.0-α.29 — passed through so synthesizeProposalsFromSpec can detect
|
|
86
|
+
* multi-app vs single-app shape and emit correct route file paths. */
|
|
87
|
+
repoRoot?: string;
|
|
65
88
|
}
|
|
66
89
|
export type AgentOutput = {
|
|
67
90
|
kind: "questions";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,UAAU,CAAC;AAQtD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWhE;AAKD,OAAO,KAAK,EACV,YAAY,EAGZ,IAAI,EAEL,MAAM,mBAAmB,CAAC;AA6C3B,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AACnE,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAC7C,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,qCAAqC,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,0DAA2C,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,SAAS,CAAC;IACf,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAKrC,wBAAsB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAod9E;AAsED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;2EACuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAmHjC,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,GAChB,WAAW,CAmFb;AA4CD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IACE;;;;;OAKG;IACH,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA8CrC;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,eAAe,CAAC,CAkU1B"}
|