@selvakumaresra/specship 0.7.0 → 0.10.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 (143) hide show
  1. package/commands/ss-domain.md +98 -0
  2. package/commands/ss-triage.md +177 -0
  3. package/dist/bin/specship.js +308 -0
  4. package/dist/bin/specship.js.map +1 -1
  5. package/dist/db/migrations.d.ts +1 -1
  6. package/dist/db/migrations.d.ts.map +1 -1
  7. package/dist/db/migrations.js +28 -1
  8. package/dist/db/migrations.js.map +1 -1
  9. package/dist/db/schema.sql +26 -2
  10. package/dist/db/spec-queries.d.ts +29 -0
  11. package/dist/db/spec-queries.d.ts.map +1 -1
  12. package/dist/db/spec-queries.js +63 -0
  13. package/dist/db/spec-queries.js.map +1 -1
  14. package/dist/enforce/enforce.d.ts +70 -0
  15. package/dist/enforce/enforce.d.ts.map +1 -0
  16. package/dist/enforce/enforce.js +125 -0
  17. package/dist/enforce/enforce.js.map +1 -0
  18. package/dist/extraction/specs/markdown-spec-extractor.d.ts +21 -0
  19. package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
  20. package/dist/extraction/specs/markdown-spec-extractor.js +144 -0
  21. package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
  22. package/dist/fitness/fitness.d.ts +75 -0
  23. package/dist/fitness/fitness.d.ts.map +1 -0
  24. package/dist/fitness/fitness.js +204 -0
  25. package/dist/fitness/fitness.js.map +1 -0
  26. package/dist/graph/maintainability.d.ts +101 -0
  27. package/dist/graph/maintainability.d.ts.map +1 -0
  28. package/dist/graph/maintainability.js +278 -0
  29. package/dist/graph/maintainability.js.map +1 -0
  30. package/dist/index.d.ts +65 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +149 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/installer/instructions-template.d.ts +5 -4
  35. package/dist/installer/instructions-template.d.ts.map +1 -1
  36. package/dist/installer/instructions-template.js +10 -4
  37. package/dist/installer/instructions-template.js.map +1 -1
  38. package/dist/installer/targets/claude.d.ts.map +1 -1
  39. package/dist/installer/targets/claude.js +4 -0
  40. package/dist/installer/targets/claude.js.map +1 -1
  41. package/dist/installer/targets/shared.d.ts.map +1 -1
  42. package/dist/installer/targets/shared.js +4 -0
  43. package/dist/installer/targets/shared.js.map +1 -1
  44. package/dist/mcp/fitness-tool.d.ts +12 -0
  45. package/dist/mcp/fitness-tool.d.ts.map +1 -0
  46. package/dist/mcp/fitness-tool.js +46 -0
  47. package/dist/mcp/fitness-tool.js.map +1 -0
  48. package/dist/mcp/maintainability-tool.d.ts +13 -0
  49. package/dist/mcp/maintainability-tool.d.ts.map +1 -0
  50. package/dist/mcp/maintainability-tool.js +64 -0
  51. package/dist/mcp/maintainability-tool.js.map +1 -0
  52. package/dist/mcp/server-instructions.d.ts +1 -1
  53. package/dist/mcp/server-instructions.d.ts.map +1 -1
  54. package/dist/mcp/server-instructions.js +3 -2
  55. package/dist/mcp/server-instructions.js.map +1 -1
  56. package/dist/mcp/spec-tools.d.ts.map +1 -1
  57. package/dist/mcp/spec-tools.js +115 -1
  58. package/dist/mcp/spec-tools.js.map +1 -1
  59. package/dist/mcp/tools.d.ts +13 -0
  60. package/dist/mcp/tools.d.ts.map +1 -1
  61. package/dist/mcp/tools.js +75 -0
  62. package/dist/mcp/tools.js.map +1 -1
  63. package/dist/reflect/apply.d.ts +31 -0
  64. package/dist/reflect/apply.d.ts.map +1 -0
  65. package/dist/reflect/apply.js +286 -0
  66. package/dist/reflect/apply.js.map +1 -0
  67. package/dist/reflect/hash.d.ts +20 -0
  68. package/dist/reflect/hash.d.ts.map +1 -0
  69. package/dist/reflect/hash.js +36 -0
  70. package/dist/reflect/hash.js.map +1 -0
  71. package/dist/reflect/index.d.ts +16 -0
  72. package/dist/reflect/index.d.ts.map +1 -0
  73. package/dist/reflect/index.js +43 -0
  74. package/dist/reflect/index.js.map +1 -0
  75. package/dist/reflect/miner.d.ts +21 -0
  76. package/dist/reflect/miner.d.ts.map +1 -0
  77. package/dist/reflect/miner.js +463 -0
  78. package/dist/reflect/miner.js.map +1 -0
  79. package/dist/reflect/store.d.ts +31 -0
  80. package/dist/reflect/store.d.ts.map +1 -0
  81. package/dist/reflect/store.js +101 -0
  82. package/dist/reflect/store.js.map +1 -0
  83. package/dist/reflect/sweep.d.ts +26 -0
  84. package/dist/reflect/sweep.d.ts.map +1 -0
  85. package/dist/reflect/sweep.js +42 -0
  86. package/dist/reflect/sweep.js.map +1 -0
  87. package/dist/reflect/targets.d.ts +52 -0
  88. package/dist/reflect/targets.d.ts.map +1 -0
  89. package/dist/reflect/targets.js +192 -0
  90. package/dist/reflect/targets.js.map +1 -0
  91. package/dist/reflect/types.d.ts +96 -0
  92. package/dist/reflect/types.d.ts.map +1 -0
  93. package/dist/reflect/types.js +13 -0
  94. package/dist/reflect/types.js.map +1 -0
  95. package/dist/resolution/domain-gap-seed.d.ts +60 -0
  96. package/dist/resolution/domain-gap-seed.d.ts.map +1 -0
  97. package/dist/resolution/domain-gap-seed.js +87 -0
  98. package/dist/resolution/domain-gap-seed.js.map +1 -0
  99. package/dist/resolution/spec-link-resolver.d.ts +46 -1
  100. package/dist/resolution/spec-link-resolver.d.ts.map +1 -1
  101. package/dist/resolution/spec-link-resolver.js +78 -0
  102. package/dist/resolution/spec-link-resolver.js.map +1 -1
  103. package/dist/server/routes/domain.js +0 -0
  104. package/dist/server/routes/events.js +20 -0
  105. package/dist/server/routes/maintainability.js +18 -0
  106. package/dist/server/routes/reflect.js +93 -0
  107. package/dist/server/server.js +6 -0
  108. package/dist/types.d.ts +4 -2
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/types.js +6 -0
  111. package/dist/types.js.map +1 -1
  112. package/dist/web/chunk-EZZBWC7Z.js +1 -0
  113. package/dist/web/chunk-ITHLF4GI.js +1 -0
  114. package/dist/web/{chunk-UBOZGQNK.js → chunk-IZQXYQNQ.js} +1 -1
  115. package/dist/web/chunk-JBO7ZIPO.js +1 -0
  116. package/dist/web/chunk-JQXCRIK2.js +1 -0
  117. package/dist/web/{chunk-ASZ77FMZ.js → chunk-JT2YIHPL.js} +1 -1
  118. package/dist/web/{chunk-WLIMNDS3.js → chunk-ONKHTXHJ.js} +1 -1
  119. package/dist/web/{chunk-FHZHD2ZG.js → chunk-P5JX67LT.js} +1 -1
  120. package/dist/web/chunk-PDTQX2UL.js +6 -0
  121. package/dist/web/chunk-TPDB5GJN.js +1 -0
  122. package/dist/web/{chunk-RASJHUXS.js → chunk-XWDR6MPC.js} +1 -1
  123. package/dist/web/chunk-Y6WWDS4R.js +1 -0
  124. package/dist/web/chunk-Z5L3T5EO.js +1 -0
  125. package/dist/web/{chunk-D5OCNEJA.js → chunk-ZG7H3XPL.js} +1 -1
  126. package/dist/web/index.html +1 -1
  127. package/dist/web/main-GYPY5V5H.js +1 -0
  128. package/dist/workflows/executor.d.ts.map +1 -1
  129. package/dist/workflows/executor.js +3 -0
  130. package/dist/workflows/executor.js.map +1 -1
  131. package/dist/workflows/runners/prompt.d.ts +31 -8
  132. package/dist/workflows/runners/prompt.d.ts.map +1 -1
  133. package/dist/workflows/runners/prompt.js +117 -23
  134. package/dist/workflows/runners/prompt.js.map +1 -1
  135. package/dist/workflows/runners/types.d.ts +7 -1
  136. package/dist/workflows/runners/types.d.ts.map +1 -1
  137. package/package.json +1 -1
  138. package/dist/web/chunk-HGBF7AY5.js +0 -1
  139. package/dist/web/chunk-JQ534IB6.js +0 -6
  140. package/dist/web/chunk-MVOMVPYB.js +0 -1
  141. package/dist/web/chunk-NZEZCT65.js +0 -1
  142. package/dist/web/chunk-WQWYTRFN.js +0 -1
  143. package/dist/web/main-LHCYPOXF.js +0 -1
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ /**
3
+ * Apply pipeline (REQ-REFLECT-003 / 004 / 005).
4
+ *
5
+ * `previewProposal` is pure-read: it computes the before/after the apply would
6
+ * produce and a diff, touching nothing on disk. `applyProposal` performs the
7
+ * write — idempotently (re-applying an unchanged proposal returns `unchanged`)
8
+ * and reversibly (every write is either a marker-bounded block or an
9
+ * engine-owned file, so `undoProposal` removes exactly what apply added). A
10
+ * new-file write whose path is already occupied by a non-engine file is refused
11
+ * as a `conflict` rather than clobbering it.
12
+ *
13
+ * Marker-bounded writes reuse the installer's battle-tested upsert/remove
14
+ * helpers; hooks merge structurally into `.claude/settings.json`.
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.lineDiff = lineDiff;
51
+ exports.previewProposal = previewProposal;
52
+ exports.applyProposal = applyProposal;
53
+ exports.undoProposal = undoProposal;
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const shared_1 = require("../installer/targets/shared");
57
+ const targets_1 = require("./targets");
58
+ function readFileSafe(p) {
59
+ try {
60
+ return { exists: true, content: fs.readFileSync(p, 'utf-8') };
61
+ }
62
+ catch {
63
+ return { exists: false, content: '' };
64
+ }
65
+ }
66
+ /** Minimal line-based unified-style diff for the preview surface. */
67
+ function lineDiff(before, after) {
68
+ if (before === after)
69
+ return '(no change)';
70
+ const a = before.length ? before.split('\n') : [];
71
+ const b = after.length ? after.split('\n') : [];
72
+ const out = [];
73
+ // Cheap common-prefix / common-suffix trim, then mark the middle.
74
+ let start = 0;
75
+ while (start < a.length && start < b.length && a[start] === b[start])
76
+ start++;
77
+ let endA = a.length - 1;
78
+ let endB = b.length - 1;
79
+ while (endA >= start && endB >= start && a[endA] === b[endB]) {
80
+ endA--;
81
+ endB--;
82
+ }
83
+ for (let i = Math.max(0, start - 2); i < start; i++)
84
+ out.push(' ' + a[i]);
85
+ for (let i = start; i <= endA; i++)
86
+ out.push('- ' + a[i]);
87
+ for (let i = start; i <= endB; i++)
88
+ out.push('+ ' + b[i]);
89
+ for (let i = endA + 1; i <= Math.min(a.length - 1, endA + 2); i++)
90
+ out.push(' ' + a[i]);
91
+ return out.join('\n');
92
+ }
93
+ /** Whether a CLAUDE.md / command file already carries this proposal's marker. */
94
+ function hasMarker(content, id) {
95
+ const { start } = (0, targets_1.learningMarkers)(id);
96
+ return content.includes(start);
97
+ }
98
+ /** Compute the after-content of a marked-block upsert without writing. */
99
+ function previewMarkedUpsert(content, startMarker, endMarker, block) {
100
+ const s = content.indexOf(startMarker);
101
+ const e = content.indexOf(endMarker);
102
+ if (s !== -1 && e > s) {
103
+ return content.substring(0, s) + block + content.substring(e + endMarker.length);
104
+ }
105
+ if (content.trim() === '')
106
+ return block + '\n';
107
+ return content.replace(/\s*$/, '') + '\n\n' + block + '\n';
108
+ }
109
+ const MEMORY_INDEX = (homeDir) => path.join(homeDir, '.claude', 'memory', 'MEMORY.md');
110
+ /**
111
+ * Non-mutating preview of the change a proposal would make (REQ-REFLECT-003).
112
+ */
113
+ function previewProposal(p) {
114
+ const { payload, targetPath, targetKind } = p;
115
+ const cur = readFileSafe(targetPath);
116
+ if (payload.kind === 'claude_md') {
117
+ const { start, end } = (0, targets_1.learningMarkers)(payload.markerId);
118
+ const after = previewMarkedUpsert(cur.content, start, end, payload.block);
119
+ return { targetPath, targetKind, exists: cur.exists, before: cur.content, after, diff: lineDiff(cur.content, after) };
120
+ }
121
+ if (payload.kind === 'memory_note') {
122
+ const conflict = cur.exists && !cur.content.includes((0, targets_1.memoryNoteMarker)(payload.slug));
123
+ const after = conflict ? cur.content : payload.note;
124
+ return {
125
+ targetPath,
126
+ targetKind,
127
+ exists: cur.exists,
128
+ before: cur.content,
129
+ after,
130
+ diff: conflict ? '(conflict: a non-SpecShip file already exists here)' : lineDiff(cur.content, after),
131
+ conflict,
132
+ };
133
+ }
134
+ if (payload.kind === 'command') {
135
+ const conflict = cur.exists && !hasMarker(cur.content, p.contentHash);
136
+ const after = conflict ? cur.content : payload.content;
137
+ return {
138
+ targetPath,
139
+ targetKind,
140
+ exists: cur.exists,
141
+ before: cur.content,
142
+ after,
143
+ diff: conflict ? '(conflict: a non-SpecShip command already exists here)' : lineDiff(cur.content, after),
144
+ conflict,
145
+ };
146
+ }
147
+ // settings_hook — structural JSON merge preview.
148
+ const settings = cur.exists ? (0, shared_1.readJsonFile)(targetPath) : {};
149
+ const merged = mergeHook(structuredClone(settings), payload.event, payload.matcher, payload.entry);
150
+ const before = JSON.stringify(settings, null, 2);
151
+ const after = JSON.stringify(merged, null, 2);
152
+ return { targetPath, targetKind, exists: cur.exists, before, after, diff: lineDiff(before, after) };
153
+ }
154
+ /**
155
+ * Apply a proposal — write its change idempotently and reversibly (REQ-REFLECT-004).
156
+ */
157
+ function applyProposal(p, homeDir) {
158
+ const { payload, targetPath } = p;
159
+ if (payload.kind === 'claude_md') {
160
+ const { start, end } = (0, targets_1.learningMarkers)(payload.markerId);
161
+ const res = (0, shared_1.upsertMarkedSection)(targetPath, start, end, payload.block);
162
+ return res === 'unchanged' ? 'unchanged' : 'applied';
163
+ }
164
+ if (payload.kind === 'memory_note') {
165
+ const cur = readFileSafe(targetPath);
166
+ if (cur.exists && !cur.content.includes((0, targets_1.memoryNoteMarker)(payload.slug)))
167
+ return 'conflict';
168
+ const noteUnchanged = cur.exists && cur.content === payload.note;
169
+ if (!noteUnchanged)
170
+ (0, shared_1.atomicWriteFileSync)(targetPath, payload.note);
171
+ const indexAdded = ensureIndexLine(MEMORY_INDEX(homeDir), payload.indexLine);
172
+ return noteUnchanged && !indexAdded ? 'unchanged' : 'applied';
173
+ }
174
+ if (payload.kind === 'command') {
175
+ const cur = readFileSafe(targetPath);
176
+ if (cur.exists && !hasMarker(cur.content, p.contentHash))
177
+ return 'conflict';
178
+ const { start, end } = (0, targets_1.learningMarkers)(p.contentHash);
179
+ const res = (0, shared_1.upsertMarkedSection)(targetPath, start, end, payload.content.replace(/\n$/, ''));
180
+ return res === 'unchanged' ? 'unchanged' : 'applied';
181
+ }
182
+ // settings_hook
183
+ const settings = readFileSafe(targetPath).exists ? (0, shared_1.readJsonFile)(targetPath) : {};
184
+ const merged = mergeHook(structuredClone(settings), payload.event, payload.matcher, payload.entry);
185
+ if (JSON.stringify(merged) === JSON.stringify(settings))
186
+ return 'unchanged';
187
+ (0, shared_1.writeJsonFile)(targetPath, merged);
188
+ return 'applied';
189
+ }
190
+ /**
191
+ * Undo a previously applied proposal — remove exactly what apply added
192
+ * (REQ-REFLECT-004.A3). A never-applied proposal is a no-op.
193
+ */
194
+ function undoProposal(p, homeDir) {
195
+ const { payload, targetPath } = p;
196
+ if (payload.kind === 'claude_md') {
197
+ const { start, end } = (0, targets_1.learningMarkers)(payload.markerId);
198
+ return (0, shared_1.removeMarkedSection)(targetPath, start, end) === 'removed' ? 'undone' : 'noop';
199
+ }
200
+ if (payload.kind === 'memory_note') {
201
+ const cur = readFileSafe(targetPath);
202
+ let touched = false;
203
+ if (cur.exists && cur.content.includes((0, targets_1.memoryNoteMarker)(payload.slug))) {
204
+ try {
205
+ fs.unlinkSync(targetPath);
206
+ touched = true;
207
+ }
208
+ catch { /* ignore */ }
209
+ }
210
+ if (removeIndexLine(MEMORY_INDEX(homeDir), payload.indexLine))
211
+ touched = true;
212
+ return touched ? 'undone' : 'noop';
213
+ }
214
+ if (payload.kind === 'command') {
215
+ const { start, end } = (0, targets_1.learningMarkers)(p.contentHash);
216
+ return (0, shared_1.removeMarkedSection)(targetPath, start, end) === 'removed' ? 'undone' : 'noop';
217
+ }
218
+ // settings_hook
219
+ const cur = readFileSafe(targetPath);
220
+ if (!cur.exists)
221
+ return 'noop';
222
+ const settings = (0, shared_1.readJsonFile)(targetPath);
223
+ const stripped = removeHook(structuredClone(settings), payload.event, payload.matcher, payload.entry);
224
+ if (JSON.stringify(stripped) === JSON.stringify(settings))
225
+ return 'noop';
226
+ (0, shared_1.writeJsonFile)(targetPath, stripped);
227
+ return 'undone';
228
+ }
229
+ // --- MEMORY.md index line helpers (idempotent add / clean remove) ---
230
+ function ensureIndexLine(indexPath, line) {
231
+ const cur = readFileSafe(indexPath);
232
+ if (cur.exists && cur.content.includes(line))
233
+ return false;
234
+ if (!cur.exists || cur.content.trim() === '') {
235
+ (0, shared_1.atomicWriteFileSync)(indexPath, `# Memory index\n\n${line}\n`);
236
+ return true;
237
+ }
238
+ (0, shared_1.atomicWriteFileSync)(indexPath, cur.content.replace(/\s*$/, '') + '\n' + line + '\n');
239
+ return true;
240
+ }
241
+ function removeIndexLine(indexPath, line) {
242
+ const cur = readFileSafe(indexPath);
243
+ if (!cur.exists || !cur.content.includes(line))
244
+ return false;
245
+ const kept = cur.content
246
+ .split('\n')
247
+ .filter((l) => l.trim() !== line.trim())
248
+ .join('\n')
249
+ .replace(/\n{3,}/g, '\n\n');
250
+ (0, shared_1.atomicWriteFileSync)(indexPath, kept.replace(/\s*$/, '') + '\n');
251
+ return true;
252
+ }
253
+ function mergeHook(settings, event, matcher, entry) {
254
+ const hooks = (settings.hooks ??= {});
255
+ const groups = (hooks[event] ??= []);
256
+ let group = groups.find((g) => g.matcher === matcher);
257
+ if (!group) {
258
+ group = { matcher, hooks: [] };
259
+ groups.push(group);
260
+ }
261
+ const exists = group.hooks.some((h) => JSON.stringify(h) === JSON.stringify(entry));
262
+ if (!exists)
263
+ group.hooks.push(entry);
264
+ return settings;
265
+ }
266
+ function removeHook(settings, event, matcher, entry) {
267
+ const groups = settings.hooks?.[event];
268
+ if (!groups)
269
+ return settings;
270
+ const group = groups.find((g) => g.matcher === matcher);
271
+ if (!group)
272
+ return settings;
273
+ group.hooks = group.hooks.filter((h) => JSON.stringify(h) !== JSON.stringify(entry));
274
+ // Prune empty group / event / hooks object so undo leaves no residue.
275
+ if (group.hooks.length === 0) {
276
+ settings.hooks[event] = groups.filter((g) => g !== group);
277
+ }
278
+ if (Array.isArray(settings.hooks[event]) && settings.hooks[event].length === 0) {
279
+ delete settings.hooks[event];
280
+ }
281
+ if (settings.hooks && Object.keys(settings.hooks).length === 0) {
282
+ delete settings.hooks;
283
+ }
284
+ return settings;
285
+ }
286
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/reflect/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Stable content hashing for proposals (REQ-REFLECT-007.A1).
3
+ *
4
+ * The hash is computed over the *identity* of a proposal — its type, target,
5
+ * and intended payload — and deliberately EXCLUDES evidence (which session ids
6
+ * contributed) and timestamps, both of which vary run to run. Two reflection
7
+ * passes over the same underlying pattern therefore produce the same hash, so
8
+ * the store converges to a single row rather than duplicating.
9
+ */
10
+ import { ProposalPayload, ProposalType, TargetKind } from './types';
11
+ /**
12
+ * Derive the stable content hash for a proposal's identity.
13
+ */
14
+ export declare function proposalHash(parts: {
15
+ type: ProposalType;
16
+ targetKind: TargetKind;
17
+ targetPath: string;
18
+ payload: ProposalPayload;
19
+ }): string;
20
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/reflect/hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAWpE;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,eAAe,CAAC;CAC1B,GAAG,MAAM,CAQT"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Stable content hashing for proposals (REQ-REFLECT-007.A1).
4
+ *
5
+ * The hash is computed over the *identity* of a proposal — its type, target,
6
+ * and intended payload — and deliberately EXCLUDES evidence (which session ids
7
+ * contributed) and timestamps, both of which vary run to run. Two reflection
8
+ * passes over the same underlying pattern therefore produce the same hash, so
9
+ * the store converges to a single row rather than duplicating.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.proposalHash = proposalHash;
13
+ const crypto_1 = require("crypto");
14
+ /** Canonical JSON: object keys sorted recursively so key order can't perturb the hash. */
15
+ function canonical(value) {
16
+ if (value === null || typeof value !== 'object')
17
+ return JSON.stringify(value);
18
+ if (Array.isArray(value))
19
+ return '[' + value.map(canonical).join(',') + ']';
20
+ const obj = value;
21
+ const keys = Object.keys(obj).sort();
22
+ return '{' + keys.map((k) => JSON.stringify(k) + ':' + canonical(obj[k])).join(',') + '}';
23
+ }
24
+ /**
25
+ * Derive the stable content hash for a proposal's identity.
26
+ */
27
+ function proposalHash(parts) {
28
+ const sig = canonical({
29
+ type: parts.type,
30
+ targetKind: parts.targetKind,
31
+ targetPath: parts.targetPath,
32
+ payload: parts.payload,
33
+ });
34
+ return (0, crypto_1.createHash)('sha256').update(sig).digest('hex').slice(0, 16);
35
+ }
36
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/reflect/hash.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAiBH,oCAaC;AA5BD,mCAAoC;AAGpC,0FAA0F;AAC1F,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC5E,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAC5F,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,KAK5B;IACC,MAAM,GAAG,GAAG,SAAS,CAAC;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Reflection engine (REFLECT-DOC) — barrel.
3
+ *
4
+ * Mines the ingested `claude_*` transcript tables for recurring, actionable
5
+ * patterns and turns them into durable, human-gated proposals (memory/CLAUDE.md
6
+ * rules, skills/commands, hooks). Surfaced via the SpecShip class methods, the
7
+ * `specship reflect` CLI, and the dashboard's Improvements list.
8
+ */
9
+ export * from './types';
10
+ export { mineProposals } from './miner';
11
+ export { buildProposal, learningMarkers, memoryNoteMarker } from './targets';
12
+ export { previewProposal, applyProposal, undoProposal, lineDiff } from './apply';
13
+ export { ReflectStore } from './store';
14
+ export { analyze, sweep } from './sweep';
15
+ export type { AnalyzeResult, SweepResult } from './sweep';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reflect/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ /**
3
+ * Reflection engine (REFLECT-DOC) — barrel.
4
+ *
5
+ * Mines the ingested `claude_*` transcript tables for recurring, actionable
6
+ * patterns and turns them into durable, human-gated proposals (memory/CLAUDE.md
7
+ * rules, skills/commands, hooks). Surfaced via the SpecShip class methods, the
8
+ * `specship reflect` CLI, and the dashboard's Improvements list.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.sweep = exports.analyze = exports.ReflectStore = exports.lineDiff = exports.undoProposal = exports.applyProposal = exports.previewProposal = exports.memoryNoteMarker = exports.learningMarkers = exports.buildProposal = exports.mineProposals = void 0;
26
+ __exportStar(require("./types"), exports);
27
+ var miner_1 = require("./miner");
28
+ Object.defineProperty(exports, "mineProposals", { enumerable: true, get: function () { return miner_1.mineProposals; } });
29
+ var targets_1 = require("./targets");
30
+ Object.defineProperty(exports, "buildProposal", { enumerable: true, get: function () { return targets_1.buildProposal; } });
31
+ Object.defineProperty(exports, "learningMarkers", { enumerable: true, get: function () { return targets_1.learningMarkers; } });
32
+ Object.defineProperty(exports, "memoryNoteMarker", { enumerable: true, get: function () { return targets_1.memoryNoteMarker; } });
33
+ var apply_1 = require("./apply");
34
+ Object.defineProperty(exports, "previewProposal", { enumerable: true, get: function () { return apply_1.previewProposal; } });
35
+ Object.defineProperty(exports, "applyProposal", { enumerable: true, get: function () { return apply_1.applyProposal; } });
36
+ Object.defineProperty(exports, "undoProposal", { enumerable: true, get: function () { return apply_1.undoProposal; } });
37
+ Object.defineProperty(exports, "lineDiff", { enumerable: true, get: function () { return apply_1.lineDiff; } });
38
+ var store_1 = require("./store");
39
+ Object.defineProperty(exports, "ReflectStore", { enumerable: true, get: function () { return store_1.ReflectStore; } });
40
+ var sweep_1 = require("./sweep");
41
+ Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return sweep_1.analyze; } });
42
+ Object.defineProperty(exports, "sweep", { enumerable: true, get: function () { return sweep_1.sweep; } });
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reflect/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AACtB,qCAA6E;AAApE,wGAAA,aAAa,OAAA;AAAE,0GAAA,eAAe,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AACzD,iCAAiF;AAAxE,wGAAA,eAAe,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAC/D,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,iCAAyC;AAAhC,gGAAA,OAAO,OAAA;AAAE,8FAAA,KAAK,OAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Proposal miner (REQ-REFLECT-001 / 002).
3
+ *
4
+ * Reads the ingested `claude_*` transcript tables and detects recurring,
5
+ * actionable patterns, emitting one typed Proposal per finding with cited
6
+ * evidence and a severity. Each rule is a bounded SQL query (mirroring the tips
7
+ * engine's shape) feeding `buildProposal`, which resolves the concrete write
8
+ * target and the stable content hash.
9
+ *
10
+ * The *set* of rules is the implementation frontier the spec deliberately left
11
+ * open — new detectors slot in here without touching apply/store/surface.
12
+ *
13
+ * When the transcript tables are absent (a headless `specship reflect` against a
14
+ * project the dashboard has never ingested), the miner returns `[]` so the
15
+ * caller can render the empty state rather than erroring (REQ-REFLECT-001.A2).
16
+ */
17
+ import { SqliteDatabase } from '../db/sqlite-adapter';
18
+ import { Proposal, ReflectContext } from './types';
19
+ /** Mine all rules. Pure read — never writes the DB or disk. */
20
+ export declare function mineProposals(db: SqliteDatabase, ctx: ReflectContext): Proposal[];
21
+ //# sourceMappingURL=miner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miner.d.ts","sourceRoot":"","sources":["../../src/reflect/miner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAkCnD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,QAAQ,EAAE,CAkBjF"}