@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.
Files changed (194) hide show
  1. package/AGENTS.md +240 -0
  2. package/REPORTING.md +193 -0
  3. package/dist/cli.js +78 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/brand/index.d.ts +26 -0
  6. package/dist/commands/brand/index.d.ts.map +1 -0
  7. package/dist/commands/brand/index.js +257 -0
  8. package/dist/commands/brand/index.js.map +1 -0
  9. package/dist/commands/brew/agent.d.ts +7 -2
  10. package/dist/commands/brew/agent.d.ts.map +1 -1
  11. package/dist/commands/brew/agent.js +9 -0
  12. package/dist/commands/brew/agent.js.map +1 -1
  13. package/dist/commands/brew/halt.d.ts +26 -0
  14. package/dist/commands/brew/halt.d.ts.map +1 -1
  15. package/dist/commands/brew/halt.js.map +1 -1
  16. package/dist/commands/brew/index.d.ts.map +1 -1
  17. package/dist/commands/brew/index.js +142 -18
  18. package/dist/commands/brew/index.js.map +1 -1
  19. package/dist/commands/brew/pair-navigator.d.ts +119 -0
  20. package/dist/commands/brew/pair-navigator.d.ts.map +1 -0
  21. package/dist/commands/brew/pair-navigator.js +187 -0
  22. package/dist/commands/brew/pair-navigator.js.map +1 -0
  23. package/dist/commands/budget/index.d.ts +2 -0
  24. package/dist/commands/budget/index.d.ts.map +1 -0
  25. package/dist/commands/budget/index.js +252 -0
  26. package/dist/commands/budget/index.js.map +1 -0
  27. package/dist/commands/chef/drift-fix.d.ts +33 -4
  28. package/dist/commands/chef/drift-fix.d.ts.map +1 -1
  29. package/dist/commands/chef/drift-fix.js +417 -29
  30. package/dist/commands/chef/drift-fix.js.map +1 -1
  31. package/dist/commands/chef/index.js +13 -3
  32. package/dist/commands/chef/index.js.map +1 -1
  33. package/dist/commands/chef/orchestrate.d.ts +1 -1
  34. package/dist/commands/chef/orchestrate.d.ts.map +1 -1
  35. package/dist/commands/chef/orchestrate.js +32 -9
  36. package/dist/commands/chef/orchestrate.js.map +1 -1
  37. package/dist/commands/dev-env/config.d.ts +57 -0
  38. package/dist/commands/dev-env/config.d.ts.map +1 -0
  39. package/dist/commands/dev-env/config.js +96 -0
  40. package/dist/commands/dev-env/config.js.map +1 -0
  41. package/dist/commands/dev-env/index.d.ts +27 -0
  42. package/dist/commands/dev-env/index.d.ts.map +1 -0
  43. package/dist/commands/dev-env/index.js +226 -0
  44. package/dist/commands/dev-env/index.js.map +1 -0
  45. package/dist/commands/dev-env/init.d.ts +28 -0
  46. package/dist/commands/dev-env/init.d.ts.map +1 -0
  47. package/dist/commands/dev-env/init.js +135 -0
  48. package/dist/commands/dev-env/init.js.map +1 -0
  49. package/dist/commands/docs/index.d.ts +16 -0
  50. package/dist/commands/docs/index.d.ts.map +1 -0
  51. package/dist/commands/docs/index.js +127 -0
  52. package/dist/commands/docs/index.js.map +1 -0
  53. package/dist/commands/eval/index.d.ts +54 -0
  54. package/dist/commands/eval/index.d.ts.map +1 -0
  55. package/dist/commands/eval/index.js +294 -0
  56. package/dist/commands/eval/index.js.map +1 -0
  57. package/dist/commands/extract/index.d.ts.map +1 -1
  58. package/dist/commands/extract/index.js +23 -1
  59. package/dist/commands/extract/index.js.map +1 -1
  60. package/dist/commands/garnish/index.d.ts +56 -0
  61. package/dist/commands/garnish/index.d.ts.map +1 -0
  62. package/dist/commands/garnish/index.js +281 -0
  63. package/dist/commands/garnish/index.js.map +1 -0
  64. package/dist/commands/garnish/trailer.d.ts +79 -0
  65. package/dist/commands/garnish/trailer.d.ts.map +1 -0
  66. package/dist/commands/garnish/trailer.js +118 -0
  67. package/dist/commands/garnish/trailer.js.map +1 -0
  68. package/dist/commands/init/index.d.ts.map +1 -1
  69. package/dist/commands/init/index.js +33 -0
  70. package/dist/commands/init/index.js.map +1 -1
  71. package/dist/commands/init/mock-vite.d.ts +54 -0
  72. package/dist/commands/init/mock-vite.d.ts.map +1 -0
  73. package/dist/commands/init/mock-vite.js +613 -0
  74. package/dist/commands/init/mock-vite.js.map +1 -0
  75. package/dist/commands/init/mock.d.ts +6 -0
  76. package/dist/commands/init/mock.d.ts.map +1 -1
  77. package/dist/commands/init/mock.js +20 -4
  78. package/dist/commands/init/mock.js.map +1 -1
  79. package/dist/commands/init/plan.d.ts +26 -1
  80. package/dist/commands/init/plan.d.ts.map +1 -1
  81. package/dist/commands/init/plan.js +41 -3
  82. package/dist/commands/init/plan.js.map +1 -1
  83. package/dist/commands/init/templates.d.ts.map +1 -1
  84. package/dist/commands/init/templates.js +12 -4
  85. package/dist/commands/init/templates.js.map +1 -1
  86. package/dist/commands/knowledge-add.d.ts +52 -0
  87. package/dist/commands/knowledge-add.d.ts.map +1 -0
  88. package/dist/commands/knowledge-add.js +232 -0
  89. package/dist/commands/knowledge-add.js.map +1 -0
  90. package/dist/commands/map/emit-typeorm.d.ts +117 -0
  91. package/dist/commands/map/emit-typeorm.d.ts.map +1 -0
  92. package/dist/commands/map/emit-typeorm.js +341 -0
  93. package/dist/commands/map/emit-typeorm.js.map +1 -0
  94. package/dist/commands/map/index.d.ts +18 -0
  95. package/dist/commands/map/index.d.ts.map +1 -1
  96. package/dist/commands/map/index.js +28 -0
  97. package/dist/commands/map/index.js.map +1 -1
  98. package/dist/commands/plate/agent.d.ts +7 -0
  99. package/dist/commands/plate/agent.d.ts.map +1 -1
  100. package/dist/commands/plate/agent.js +1 -1
  101. package/dist/commands/plate/agent.js.map +1 -1
  102. package/dist/commands/plate/index.d.ts.map +1 -1
  103. package/dist/commands/plate/index.js +6 -0
  104. package/dist/commands/plate/index.js.map +1 -1
  105. package/dist/commands/recon/index.d.ts +16 -3
  106. package/dist/commands/recon/index.d.ts.map +1 -1
  107. package/dist/commands/recon/index.js +267 -16
  108. package/dist/commands/recon/index.js.map +1 -1
  109. package/dist/commands/recon/migration-gate.d.ts +59 -0
  110. package/dist/commands/recon/migration-gate.d.ts.map +1 -0
  111. package/dist/commands/recon/migration-gate.js +131 -0
  112. package/dist/commands/recon/migration-gate.js.map +1 -0
  113. package/dist/commands/recon/reuse.d.ts +32 -0
  114. package/dist/commands/recon/reuse.d.ts.map +1 -1
  115. package/dist/commands/recon/reuse.js +66 -0
  116. package/dist/commands/recon/reuse.js.map +1 -1
  117. package/dist/commands/recon/stale-stubs.d.ts +65 -0
  118. package/dist/commands/recon/stale-stubs.d.ts.map +1 -0
  119. package/dist/commands/recon/stale-stubs.js +84 -0
  120. package/dist/commands/recon/stale-stubs.js.map +1 -0
  121. package/dist/commands/refine/agent.d.ts +23 -0
  122. package/dist/commands/refine/agent.d.ts.map +1 -1
  123. package/dist/commands/refine/agent.js +245 -15
  124. package/dist/commands/refine/agent.js.map +1 -1
  125. package/dist/commands/refine/brownfield-answer.d.ts +81 -0
  126. package/dist/commands/refine/brownfield-answer.d.ts.map +1 -0
  127. package/dist/commands/refine/brownfield-answer.js +231 -0
  128. package/dist/commands/refine/brownfield-answer.js.map +1 -0
  129. package/dist/commands/refine/context.d.ts +27 -1
  130. package/dist/commands/refine/context.d.ts.map +1 -1
  131. package/dist/commands/refine/context.js +438 -6
  132. package/dist/commands/refine/context.js.map +1 -1
  133. package/dist/commands/refine/git-attention.d.ts +123 -0
  134. package/dist/commands/refine/git-attention.d.ts.map +1 -0
  135. package/dist/commands/refine/git-attention.js +378 -0
  136. package/dist/commands/refine/git-attention.js.map +1 -0
  137. package/dist/commands/refine/history-index.d.ts +66 -0
  138. package/dist/commands/refine/history-index.d.ts.map +1 -1
  139. package/dist/commands/refine/history-index.js +195 -8
  140. package/dist/commands/refine/history-index.js.map +1 -1
  141. package/dist/commands/refine/index.d.ts.map +1 -1
  142. package/dist/commands/refine/index.js +105 -18
  143. package/dist/commands/refine/index.js.map +1 -1
  144. package/dist/commands/refine/multifurcate.d.ts +129 -0
  145. package/dist/commands/refine/multifurcate.d.ts.map +1 -0
  146. package/dist/commands/refine/multifurcate.js +247 -0
  147. package/dist/commands/refine/multifurcate.js.map +1 -0
  148. package/dist/commands/refine/proposals-synth.d.ts +50 -1
  149. package/dist/commands/refine/proposals-synth.d.ts.map +1 -1
  150. package/dist/commands/refine/proposals-synth.js +199 -35
  151. package/dist/commands/refine/proposals-synth.js.map +1 -1
  152. package/dist/commands/refine/spec-yaml.d.ts +214 -1210
  153. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  154. package/dist/commands/refine/spec-yaml.js +10 -0
  155. package/dist/commands/refine/spec-yaml.js.map +1 -1
  156. package/dist/commands/refresh-knowledge.d.ts +139 -0
  157. package/dist/commands/refresh-knowledge.d.ts.map +1 -0
  158. package/dist/commands/refresh-knowledge.js +1029 -0
  159. package/dist/commands/refresh-knowledge.js.map +1 -0
  160. package/dist/commands/run-mock/index.d.ts.map +1 -1
  161. package/dist/commands/run-mock/index.js +135 -22
  162. package/dist/commands/run-mock/index.js.map +1 -1
  163. package/dist/commands/testgen/agent.d.ts +13 -0
  164. package/dist/commands/testgen/agent.d.ts.map +1 -1
  165. package/dist/commands/testgen/agent.js +137 -11
  166. package/dist/commands/testgen/agent.js.map +1 -1
  167. package/dist/commands/upsert-agent-docs.d.ts +48 -0
  168. package/dist/commands/upsert-agent-docs.d.ts.map +1 -0
  169. package/dist/commands/upsert-agent-docs.js +298 -0
  170. package/dist/commands/upsert-agent-docs.js.map +1 -0
  171. package/dist/commands/vibe/agent.d.ts +7 -0
  172. package/dist/commands/vibe/agent.d.ts.map +1 -1
  173. package/dist/commands/vibe/agent.js +2 -2
  174. package/dist/commands/vibe/agent.js.map +1 -1
  175. package/dist/commands/vibe/index.d.ts.map +1 -1
  176. package/dist/commands/vibe/index.js +7 -1
  177. package/dist/commands/vibe/index.js.map +1 -1
  178. package/dist/cost-store.d.ts +52 -0
  179. package/dist/cost-store.d.ts.map +1 -0
  180. package/dist/cost-store.js +108 -0
  181. package/dist/cost-store.js.map +1 -0
  182. package/dist/lib/budget.d.ts +73 -0
  183. package/dist/lib/budget.d.ts.map +1 -0
  184. package/dist/lib/budget.js +225 -0
  185. package/dist/lib/budget.js.map +1 -0
  186. package/dist/lib/mock-shape.d.ts +29 -0
  187. package/dist/lib/mock-shape.d.ts.map +1 -0
  188. package/dist/lib/mock-shape.js +77 -0
  189. package/dist/lib/mock-shape.js.map +1 -0
  190. package/dist/lib/read-only.d.ts +22 -0
  191. package/dist/lib/read-only.d.ts.map +1 -0
  192. package/dist/lib/read-only.js +34 -0
  193. package/dist/lib/read-only.js.map +1 -0
  194. package/package.json +17 -12
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @slowcook 0.19.0-alpha.43 — git-history attention layer for the refine
3
+ * history-index.
4
+ *
5
+ * Motivated by the "Attention Is All You Need" thread (memory:
6
+ * project_bounded_attention_validation_2026_04_25): a brownfield repo IS
7
+ * the product of a sequential process (git commits). Versioning history
8
+ * — diffs, commit messages, PR descriptions, specs — is a strong signal
9
+ * for which existing components/props/tests/routes/migrations are most
10
+ * relevant to a new story, BUT raw commit history is noisy. We extract
11
+ * four narrower signals:
12
+ *
13
+ * 1. Rename chains — `git log --follow` so look-ups don't miss
14
+ * historical names (e.g. ReactionsPage →
15
+ * MemberReactionsPage).
16
+ * 2. Change-coupling — file pairs that co-change in the same
17
+ * commits; surfaces architectural couplings
18
+ * file-system layout misses.
19
+ * 3. Recent PRs per file — PR descriptions are higher-quality "Keys"
20
+ * than raw commit messages because they're
21
+ * intent-shaped, not change-shaped.
22
+ * 4. PR+spec corpus — flat searchable index of PR descriptions
23
+ * and spec yaml summaries so downstream agents
24
+ * can keyword-retrieve prior intent before
25
+ * writing new code.
26
+ *
27
+ * Deliberately deterministic (no embeddings). Embedding upgrade is a
28
+ * future Phase 3 step; this lower-cost version ships the contract first.
29
+ *
30
+ * All four are graceful-degradation: missing git history, missing gh,
31
+ * unauthenticated gh, no PRs, no specs — each path returns an empty
32
+ * structure plus a warning string. The orchestrator NEVER throws.
33
+ */
34
+ export interface CoChangeEntry {
35
+ /** repo-relative path of the co-changing file */
36
+ file: string;
37
+ /** fraction of this file's co-change events that landed on `file` (0..1, 2dp) */
38
+ strength: number;
39
+ }
40
+ export interface PRRecord {
41
+ number: number;
42
+ title: string;
43
+ body: string;
44
+ merged_at: string | null;
45
+ files: string[];
46
+ }
47
+ export interface PRSpecCorpusEntry {
48
+ source: "pr" | "spec";
49
+ /** Stable id: "pr#123" or "spec:story-007". */
50
+ id: string;
51
+ title: string;
52
+ /** First ~500 chars of the body / spec summary. */
53
+ excerpt: string;
54
+ /** Files touched (empty for specs). */
55
+ files_touched: string[];
56
+ /** ISO date or "" if not applicable. */
57
+ date: string;
58
+ /** Lower-cased, stopword-stripped tokens for cheap keyword retrieval. */
59
+ tokens: string[];
60
+ }
61
+ export interface GitAttentionData {
62
+ enriched_at: string;
63
+ /** current_file -> historical paths it was renamed from, newest-first. */
64
+ rename_chains: Record<string, string[]>;
65
+ /** file -> top-K co-changing files (by frequency in same commits). */
66
+ co_changes: Record<string, CoChangeEntry[]>;
67
+ /** file -> last 5 PRs that touched it (newest-first; merged before open). */
68
+ recent_prs_by_file: Record<string, PRRecord[]>;
69
+ /** Flat searchable corpus of PR descriptions + spec yaml summaries. */
70
+ pr_spec_corpus: PRSpecCorpusEntry[];
71
+ /** Non-fatal degradation notices ("gh not installed", "git history shallow", etc.). */
72
+ warnings: string[];
73
+ }
74
+ export interface GitAttentionOptions {
75
+ repoRoot: string;
76
+ /** Files we want enrichment for (typically the union of components/api/tests/migrations from the history index). */
77
+ trackedFiles: string[];
78
+ /** Months of git log to consider for co-change. Default 6. */
79
+ coChangeWindowMonths?: number;
80
+ /** Skip commits with more files than this (mass refactor filter). Default 50. */
81
+ coChangeMaxFilesPerCommit?: number;
82
+ /** How many co-changes to keep per file. Default 5. */
83
+ coChangesPerFile?: number;
84
+ /** How many recent PRs to fetch from gh. Default 50. */
85
+ prsToFetch?: number;
86
+ /** Injectable for tests: override `git -C <root> ...` */
87
+ gitExec?: (cmd: string) => string;
88
+ /** Injectable for tests: override `gh ...` */
89
+ ghExec?: (cmd: string) => string;
90
+ }
91
+ export declare function computeGitAttention(opts: GitAttentionOptions): GitAttentionData;
92
+ export declare function computeRenameChains(files: string[], git: (cmd: string) => string): Record<string, string[]>;
93
+ /**
94
+ * Parse `git log --follow --name-status -M` output for a single file.
95
+ * Each rename is a line `R<score>\told\tnew`. Returns OLD paths in the
96
+ * order git reports them (newest commit first, so most-recent rename
97
+ * is index 0).
98
+ */
99
+ export declare function parseRenameChain(stdout: string, currentFile: string): string[];
100
+ export interface CoChangeBuildOptions {
101
+ windowMonths: number;
102
+ maxFilesPerCommit: number;
103
+ topPerFile: number;
104
+ }
105
+ export declare function computeCoChanges(trackedFiles: string[], git: (cmd: string) => string, opts: CoChangeBuildOptions): Record<string, CoChangeEntry[]>;
106
+ export declare function parseLogIntoCommits(stdout: string): Array<{
107
+ sha: string;
108
+ files: string[];
109
+ }>;
110
+ export declare function fetchRecentPRs(gh: (cmd: string) => string, limit: number): PRRecord[];
111
+ export declare function parseGhPRList(stdout: string): PRRecord[];
112
+ export declare function indexPRsByFile(prs: PRRecord[], files: string[]): Record<string, PRRecord[]>;
113
+ /**
114
+ * Lowercase, stopword-stripped, deduped token list capped at 60. Cheap
115
+ * substitute for embeddings — agents can intersect query tokens with
116
+ * each corpus entry's `tokens` to rank relevance without an LLM call.
117
+ *
118
+ * Embedding upgrade is Phase 3 (slowcook 0.14.0+, evidence-gated). Until
119
+ * then this is what we ship.
120
+ */
121
+ export declare function tokeniseForCorpus(text: string): string[];
122
+ export declare function buildPRSpecCorpus(prs: PRRecord[], repoRoot: string): PRSpecCorpusEntry[];
123
+ //# sourceMappingURL=git-attention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-attention.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/git-attention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,378 @@
1
+ /**
2
+ * @slowcook 0.19.0-alpha.43 — git-history attention layer for the refine
3
+ * history-index.
4
+ *
5
+ * Motivated by the "Attention Is All You Need" thread (memory:
6
+ * project_bounded_attention_validation_2026_04_25): a brownfield repo IS
7
+ * the product of a sequential process (git commits). Versioning history
8
+ * — diffs, commit messages, PR descriptions, specs — is a strong signal
9
+ * for which existing components/props/tests/routes/migrations are most
10
+ * relevant to a new story, BUT raw commit history is noisy. We extract
11
+ * four narrower signals:
12
+ *
13
+ * 1. Rename chains — `git log --follow` so look-ups don't miss
14
+ * historical names (e.g. ReactionsPage →
15
+ * MemberReactionsPage).
16
+ * 2. Change-coupling — file pairs that co-change in the same
17
+ * commits; surfaces architectural couplings
18
+ * file-system layout misses.
19
+ * 3. Recent PRs per file — PR descriptions are higher-quality "Keys"
20
+ * than raw commit messages because they're
21
+ * intent-shaped, not change-shaped.
22
+ * 4. PR+spec corpus — flat searchable index of PR descriptions
23
+ * and spec yaml summaries so downstream agents
24
+ * can keyword-retrieve prior intent before
25
+ * writing new code.
26
+ *
27
+ * Deliberately deterministic (no embeddings). Embedding upgrade is a
28
+ * future Phase 3 step; this lower-cost version ships the contract first.
29
+ *
30
+ * All four are graceful-degradation: missing git history, missing gh,
31
+ * unauthenticated gh, no PRs, no specs — each path returns an empty
32
+ * structure plus a warning string. The orchestrator NEVER throws.
33
+ */
34
+ import { execSync } from "node:child_process";
35
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
36
+ import { join } from "node:path";
37
+ import YAML from "yaml";
38
+ export function computeGitAttention(opts) {
39
+ const warnings = [];
40
+ const git = opts.gitExec ?? defaultGit(opts.repoRoot);
41
+ const gh = opts.ghExec ?? defaultGh();
42
+ let isRepo = true;
43
+ try {
44
+ git("rev-parse --git-dir");
45
+ }
46
+ catch (e) {
47
+ isRepo = false;
48
+ warnings.push(`Not a git repo (${e.message.slice(0, 80)}); git-history signals skipped.`);
49
+ }
50
+ let rename_chains = {};
51
+ let co_changes = {};
52
+ if (isRepo) {
53
+ try {
54
+ rename_chains = computeRenameChains(opts.trackedFiles, git);
55
+ }
56
+ catch (e) {
57
+ warnings.push(`Rename detection failed: ${e.message.slice(0, 120)}`);
58
+ }
59
+ try {
60
+ co_changes = computeCoChanges(opts.trackedFiles, git, {
61
+ windowMonths: opts.coChangeWindowMonths ?? 6,
62
+ maxFilesPerCommit: opts.coChangeMaxFilesPerCommit ?? 50,
63
+ topPerFile: opts.coChangesPerFile ?? 5,
64
+ });
65
+ }
66
+ catch (e) {
67
+ warnings.push(`Co-change matrix failed: ${e.message.slice(0, 120)}`);
68
+ }
69
+ }
70
+ let prs = [];
71
+ let recent_prs_by_file = {};
72
+ try {
73
+ prs = fetchRecentPRs(gh, opts.prsToFetch ?? 50);
74
+ recent_prs_by_file = indexPRsByFile(prs, opts.trackedFiles);
75
+ }
76
+ catch (e) {
77
+ warnings.push(`gh pr list failed (PR-as-Key signal skipped): ${e.message.slice(0, 120)}`);
78
+ }
79
+ let pr_spec_corpus = [];
80
+ try {
81
+ pr_spec_corpus = buildPRSpecCorpus(prs, opts.repoRoot);
82
+ }
83
+ catch (e) {
84
+ warnings.push(`PR+spec corpus build failed: ${e.message.slice(0, 120)}`);
85
+ }
86
+ return {
87
+ enriched_at: new Date().toISOString(),
88
+ rename_chains,
89
+ co_changes,
90
+ recent_prs_by_file,
91
+ pr_spec_corpus,
92
+ warnings,
93
+ };
94
+ }
95
+ // ─── git/gh execution shims ─────────────────────────────────────────────
96
+ function defaultGit(repoRoot) {
97
+ return (cmd) => execSync(`git -C "${repoRoot}" ${cmd}`, {
98
+ encoding: "utf8",
99
+ stdio: ["ignore", "pipe", "pipe"],
100
+ maxBuffer: 50 * 1024 * 1024,
101
+ });
102
+ }
103
+ function defaultGh() {
104
+ return (cmd) => execSync(`gh ${cmd}`, {
105
+ encoding: "utf8",
106
+ stdio: ["ignore", "pipe", "pipe"],
107
+ maxBuffer: 50 * 1024 * 1024,
108
+ });
109
+ }
110
+ // ─── rename chains ──────────────────────────────────────────────────────
111
+ export function computeRenameChains(files, git) {
112
+ const out = {};
113
+ for (const file of files) {
114
+ if (file.includes('"') || file.includes("`"))
115
+ continue; // refuse shell-injection candidates
116
+ let stdout = "";
117
+ try {
118
+ stdout = git(`log --follow --name-status -M --pretty=format:"" -- "${file}"`);
119
+ }
120
+ catch {
121
+ continue; // per-file failures are fine (file may not be tracked)
122
+ }
123
+ const chain = parseRenameChain(stdout, file);
124
+ if (chain.length > 0)
125
+ out[file] = chain;
126
+ }
127
+ return out;
128
+ }
129
+ /**
130
+ * Parse `git log --follow --name-status -M` output for a single file.
131
+ * Each rename is a line `R<score>\told\tnew`. Returns OLD paths in the
132
+ * order git reports them (newest commit first, so most-recent rename
133
+ * is index 0).
134
+ */
135
+ export function parseRenameChain(stdout, currentFile) {
136
+ const renames = [];
137
+ for (const rawLine of stdout.split("\n")) {
138
+ const line = rawLine.trim();
139
+ if (!line)
140
+ continue;
141
+ if (!line.startsWith("R"))
142
+ continue;
143
+ const parts = line.split("\t");
144
+ if (parts.length < 3)
145
+ continue;
146
+ const oldPath = parts[1];
147
+ if (oldPath === currentFile)
148
+ continue;
149
+ if (renames.includes(oldPath))
150
+ continue;
151
+ renames.push(oldPath);
152
+ }
153
+ return renames;
154
+ }
155
+ export function computeCoChanges(trackedFiles, git, opts) {
156
+ const since = isoDaysAgo(opts.windowMonths * 30);
157
+ const stdout = git(`log --name-only --pretty=format:"COMMIT %H" --since="${since}"`);
158
+ const commits = parseLogIntoCommits(stdout);
159
+ const tracked = new Set(trackedFiles);
160
+ const counts = new Map();
161
+ for (const file of trackedFiles)
162
+ counts.set(file, new Map());
163
+ for (const commit of commits) {
164
+ if (commit.files.length === 0 || commit.files.length > opts.maxFilesPerCommit)
165
+ continue;
166
+ if (!commit.files.some((f) => tracked.has(f)))
167
+ continue;
168
+ for (const a of commit.files) {
169
+ if (!tracked.has(a))
170
+ continue;
171
+ const aMap = counts.get(a);
172
+ for (const b of commit.files) {
173
+ if (b === a)
174
+ continue;
175
+ aMap.set(b, (aMap.get(b) ?? 0) + 1);
176
+ }
177
+ }
178
+ }
179
+ const out = {};
180
+ for (const [file, others] of counts) {
181
+ if (others.size === 0)
182
+ continue;
183
+ const total = Array.from(others.values()).reduce((s, n) => s + n, 0);
184
+ const sorted = Array.from(others.entries())
185
+ .sort((a, b) => b[1] - a[1])
186
+ .slice(0, opts.topPerFile)
187
+ .map(([f, c]) => ({ file: f, strength: round2(c / Math.max(total, 1)) }));
188
+ out[file] = sorted;
189
+ }
190
+ return out;
191
+ }
192
+ export function parseLogIntoCommits(stdout) {
193
+ const commits = [];
194
+ let current = null;
195
+ for (const rawLine of stdout.split("\n")) {
196
+ const line = rawLine.trim();
197
+ if (line.startsWith("COMMIT ")) {
198
+ if (current)
199
+ commits.push(current);
200
+ current = { sha: line.slice("COMMIT ".length), files: [] };
201
+ }
202
+ else if (line.length > 0 && current) {
203
+ current.files.push(line);
204
+ }
205
+ }
206
+ if (current)
207
+ commits.push(current);
208
+ return commits;
209
+ }
210
+ function isoDaysAgo(days) {
211
+ const d = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
212
+ return d.toISOString().slice(0, 10);
213
+ }
214
+ function round2(x) {
215
+ return Math.round(x * 100) / 100;
216
+ }
217
+ // ─── recent PRs via gh ──────────────────────────────────────────────────
218
+ export function fetchRecentPRs(gh, limit) {
219
+ const stdout = gh(`pr list --state all --limit ${limit} --json number,title,body,mergedAt,files`);
220
+ return parseGhPRList(stdout);
221
+ }
222
+ export function parseGhPRList(stdout) {
223
+ let raw;
224
+ try {
225
+ raw = JSON.parse(stdout);
226
+ }
227
+ catch {
228
+ return [];
229
+ }
230
+ if (!Array.isArray(raw))
231
+ return [];
232
+ const out = [];
233
+ for (const item of raw) {
234
+ if (!item || typeof item !== "object")
235
+ continue;
236
+ const o = item;
237
+ const filesField = o.files;
238
+ const files = Array.isArray(filesField)
239
+ ? filesField
240
+ .map((f) => f && typeof f === "object"
241
+ ? f.path
242
+ : null)
243
+ .filter((p) => typeof p === "string")
244
+ : [];
245
+ out.push({
246
+ number: typeof o.number === "number" ? o.number : 0,
247
+ title: typeof o.title === "string" ? o.title : "",
248
+ body: typeof o.body === "string" ? o.body : "",
249
+ merged_at: typeof o.mergedAt === "string" ? o.mergedAt : null,
250
+ files,
251
+ });
252
+ }
253
+ return out;
254
+ }
255
+ export function indexPRsByFile(prs, files) {
256
+ const out = {};
257
+ const tracked = new Set(files);
258
+ for (const pr of prs) {
259
+ for (const f of pr.files) {
260
+ if (!tracked.has(f))
261
+ continue;
262
+ (out[f] ??= []).push(pr);
263
+ }
264
+ }
265
+ for (const key of Object.keys(out)) {
266
+ out[key].sort((a, b) => {
267
+ if (a.merged_at === b.merged_at)
268
+ return b.number - a.number;
269
+ if (!a.merged_at)
270
+ return -1; // open PRs first
271
+ if (!b.merged_at)
272
+ return 1;
273
+ return a.merged_at < b.merged_at ? 1 : -1;
274
+ });
275
+ out[key] = out[key].slice(0, 5);
276
+ }
277
+ return out;
278
+ }
279
+ // ─── PR + spec corpus ───────────────────────────────────────────────────
280
+ const STOPWORDS = new Set([
281
+ "the", "and", "for", "with", "that", "this", "from", "into", "over", "under",
282
+ "when", "where", "what", "how", "why", "not", "but", "you", "your", "our", "its",
283
+ "are", "was", "were", "has", "have", "had", "can", "may", "might", "will", "would",
284
+ "should", "could", "does", "did", "done", "than", "then", "also", "just", "like",
285
+ "use", "using", "used", "make", "made", "get", "got", "set", "new", "old", "add",
286
+ "added", "fix", "fixed", "update", "updated", "remove", "removed", "pull",
287
+ "request", "merge", "branch", "commit", "file", "files", "code", "main", "alpha",
288
+ "beta", "wip", "tbd", "docs", "doc", "feat", "chore", "refactor", "src", "test", "tests",
289
+ ]);
290
+ /**
291
+ * Lowercase, stopword-stripped, deduped token list capped at 60. Cheap
292
+ * substitute for embeddings — agents can intersect query tokens with
293
+ * each corpus entry's `tokens` to rank relevance without an LLM call.
294
+ *
295
+ * Embedding upgrade is Phase 3 (slowcook 0.14.0+, evidence-gated). Until
296
+ * then this is what we ship.
297
+ */
298
+ export function tokeniseForCorpus(text) {
299
+ const raw = text.toLowerCase().match(/[a-z][a-z0-9_-]{2,}/g) ?? [];
300
+ const seen = new Set();
301
+ const out = [];
302
+ for (const tok of raw) {
303
+ if (STOPWORDS.has(tok))
304
+ continue;
305
+ if (seen.has(tok))
306
+ continue;
307
+ seen.add(tok);
308
+ out.push(tok);
309
+ if (out.length >= 60)
310
+ break;
311
+ }
312
+ return out;
313
+ }
314
+ export function buildPRSpecCorpus(prs, repoRoot) {
315
+ const out = [];
316
+ for (const pr of prs) {
317
+ out.push({
318
+ source: "pr",
319
+ id: `pr#${pr.number}`,
320
+ title: pr.title,
321
+ excerpt: trimExcerpt(pr.body, 500),
322
+ files_touched: pr.files,
323
+ date: pr.merged_at ?? "",
324
+ tokens: tokeniseForCorpus(`${pr.title}\n${pr.body}\n${pr.files.join(" ")}`),
325
+ });
326
+ }
327
+ const specsDir = join(repoRoot, "specs");
328
+ if (existsSync(specsDir)) {
329
+ let entries = [];
330
+ try {
331
+ entries = readdirSync(specsDir)
332
+ .filter((f) => f.endsWith(".yaml") || f.endsWith(".yml"))
333
+ .sort();
334
+ }
335
+ catch {
336
+ return out;
337
+ }
338
+ for (const name of entries) {
339
+ const full = join(specsDir, name);
340
+ let raw = "";
341
+ try {
342
+ raw = readFileSync(full, "utf8");
343
+ }
344
+ catch {
345
+ continue;
346
+ }
347
+ let title = "";
348
+ let summary = "";
349
+ try {
350
+ const parsed = YAML.parse(raw);
351
+ if (parsed && typeof parsed === "object") {
352
+ title = typeof parsed.title === "string" ? parsed.title : "";
353
+ summary = typeof parsed.summary === "string" ? parsed.summary : "";
354
+ }
355
+ }
356
+ catch {
357
+ // malformed yaml — index raw text anyway
358
+ }
359
+ out.push({
360
+ source: "spec",
361
+ id: `spec:${name.replace(/\.(yaml|yml)$/, "")}`,
362
+ title,
363
+ excerpt: summary || trimExcerpt(raw, 500),
364
+ files_touched: [],
365
+ date: "",
366
+ tokens: tokeniseForCorpus(`${title}\n${summary}\n${raw}`),
367
+ });
368
+ }
369
+ }
370
+ return out;
371
+ }
372
+ function trimExcerpt(text, limit) {
373
+ const trimmed = (text || "").trim();
374
+ if (trimmed.length <= limit)
375
+ return trimmed;
376
+ return trimmed.slice(0, limit) + " …";
377
+ }
378
+ //# sourceMappingURL=git-attention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-attention.js","sourceRoot":"","sources":["../../../src/commands/refine/git-attention.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@
17
17
  * Pure functions over the filesystem. No LLM. Generated on every refine
18
18
  * invocation so it's always current.
19
19
  */
20
+ import type { GitAttentionData } from "./git-attention.js";
20
21
  export interface ComponentEntry {
21
22
  /** PascalCase component name (the default-export or first named export). */
22
23
  name: string;
@@ -59,6 +60,30 @@ export interface TestFileEntry {
59
60
  /** describe / it titles found in the file (best-effort regex). */
60
61
  test_names: string[];
61
62
  }
63
+ /**
64
+ * A mock page or component, captured so refine can answer
65
+ * "match the mock" without making the PM cite paths.
66
+ *
67
+ * 0.19.0-α.23 — added because real PM issues describe user pain
68
+ * ("registration should look like the mock"), and the indexer
69
+ * previously only saw production `src/`. Refine then either
70
+ * hallucinated a design or had to ask. Surfacing mock files in
71
+ * context closes the loop: PM says "as mock" → refine reads the
72
+ * actual mock excerpt → spec mirrors it.
73
+ *
74
+ * The excerpt is bounded to the first ~1.5KB so refine's prompt
75
+ * doesn't blow up on a 5KB mock file.
76
+ */
77
+ export interface MockEntry {
78
+ /** repo-relative path. */
79
+ file: string;
80
+ /** Route inferred from app/router-shape file location, or null for components. */
81
+ route: string | null;
82
+ /** Component or page name (best-effort extraction, falls back to file basename). */
83
+ name: string;
84
+ /** First ~1500 chars of the file (after trimming whitespace) so refine sees the actual JSX/markup. */
85
+ excerpt: string;
86
+ }
62
87
  export interface HistoryIndex {
63
88
  generated_at: string;
64
89
  generator: "slowcook-refine-history-index@0.17.0";
@@ -67,6 +92,14 @@ export interface HistoryIndex {
67
92
  migrations: MigrationEntry[];
68
93
  test_helpers: TestHelperEntry[];
69
94
  test_files: TestFileEntry[];
95
+ /** 0.19.0-α.23 — mock surface (design source-of-truth). */
96
+ mock_surface: MockEntry[];
97
+ /**
98
+ * 0.19.0-α.43 — git-history attention layer. Set when enrichment ran
99
+ * (refine emits with it on by default; pure-filesystem callers / tests
100
+ * may leave it undefined). See git-attention.ts for the four sub-signals.
101
+ */
102
+ git_attention?: GitAttentionData;
70
103
  }
71
104
  interface BuildOptions {
72
105
  repoRoot: string;
@@ -77,8 +110,41 @@ interface BuildOptions {
77
110
  migrations?: string;
78
111
  tests?: string;
79
112
  helpers?: string;
113
+ /** Default: `mock/src` (matches slowcook init scaffold). */
114
+ mockRoot?: string;
80
115
  };
81
116
  }
82
117
  export declare function buildHistoryIndex(opts: BuildOptions): HistoryIndex;
118
+ export declare const TYPEORM_MIGRATION_FALLBACK_DIRS: string[];
119
+ /**
120
+ * The columns `DatabaseCreateTable` (delgoosh's helper) adds implicitly on
121
+ * EVERY table. Knowing these prevents the migration gate from raising a
122
+ * false-positive "missing column" verdict when the spec references e.g.
123
+ * `created_at` and the migration uses the helper.
124
+ *
125
+ * Kept conservative: only columns added by the helper at delgoosh-monorepo's
126
+ * version (id, created_at, updated_at, deleted_at). Future TypeORM helpers
127
+ * with different defaults need their own entry — or, longer-term, slowcook
128
+ * should infer this from the helper's source.
129
+ */
130
+ export declare const TYPEORM_HELPER_IMPLICIT_COLUMNS: string[];
131
+ export declare function scanMigrations(repoRoot: string, dir: string): MigrationEntry[];
132
+ /**
133
+ * Parse a single TypeORM migration TS file into the same MigrationEntry shape
134
+ * the SQL parser produces. Sees two patterns:
135
+ *
136
+ * 1. `await queryRunner.query(\`CREATE TABLE x ...\`)` — extract the SQL
137
+ * template body and run it through the existing SQL parsers.
138
+ * 2. `await DatabaseCreateTable(queryRunner, 'tbl', [{name:'a'},{name:'b'}])`
139
+ * — extract `tbl` + each column's name + the implicit-columns helpers
140
+ * add (id, created_at, updated_at, deleted_at).
141
+ *
142
+ * Pattern 2 is delgoosh-monorepo-specific; pattern 1 covers raw SQL writers.
143
+ * EXPORTED for unit testing.
144
+ */
145
+ export declare function parseTypeOrmMigration(name: string, body: string): MigrationEntry;
146
+ export declare function extractCreateTables(sql: string): string[];
147
+ export declare function extractColumnsAdded(sql: string): Record<string, string[]>;
148
+ export declare function scanMockSurface(repoRoot: string, mockRoot: string): MockEntry[];
83
149
  export {};
84
150
  //# sourceMappingURL=history-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-index.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/history-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kEAAkE;IAClE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,sCAAsC,CAAC;IAClD,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAoClE"}
1
+ {"version":3,"file":"history-index.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/history-index.ts"],"names":[],"mappings":"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"}