@imix-js/taproot 0.2.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 (124) hide show
  1. package/README.md +88 -0
  2. package/dist/adapters/index.d.ts +20 -0
  3. package/dist/adapters/index.js +452 -0
  4. package/dist/adapters/index.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +40 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/acceptance-check.d.ts +26 -0
  9. package/dist/commands/acceptance-check.js +213 -0
  10. package/dist/commands/acceptance-check.js.map +1 -0
  11. package/dist/commands/check-orphans.d.ts +8 -0
  12. package/dist/commands/check-orphans.js +157 -0
  13. package/dist/commands/check-orphans.js.map +1 -0
  14. package/dist/commands/commithook.d.ts +15 -0
  15. package/dist/commands/commithook.js +389 -0
  16. package/dist/commands/commithook.js.map +1 -0
  17. package/dist/commands/coverage.d.ts +41 -0
  18. package/dist/commands/coverage.js +390 -0
  19. package/dist/commands/coverage.js.map +1 -0
  20. package/dist/commands/dod.d.ts +13 -0
  21. package/dist/commands/dod.js +141 -0
  22. package/dist/commands/dod.js.map +1 -0
  23. package/dist/commands/init.d.ts +14 -0
  24. package/dist/commands/init.js +378 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/link-commits.d.ts +12 -0
  27. package/dist/commands/link-commits.js +126 -0
  28. package/dist/commands/link-commits.js.map +1 -0
  29. package/dist/commands/overview.d.ts +6 -0
  30. package/dist/commands/overview.js +192 -0
  31. package/dist/commands/overview.js.map +1 -0
  32. package/dist/commands/plan.d.ts +23 -0
  33. package/dist/commands/plan.js +167 -0
  34. package/dist/commands/plan.js.map +1 -0
  35. package/dist/commands/sync-check.d.ts +8 -0
  36. package/dist/commands/sync-check.js +118 -0
  37. package/dist/commands/sync-check.js.map +1 -0
  38. package/dist/commands/update.d.ts +7 -0
  39. package/dist/commands/update.js +309 -0
  40. package/dist/commands/update.js.map +1 -0
  41. package/dist/commands/validate-format.d.ts +8 -0
  42. package/dist/commands/validate-format.js +93 -0
  43. package/dist/commands/validate-format.js.map +1 -0
  44. package/dist/commands/validate-structure.d.ts +8 -0
  45. package/dist/commands/validate-structure.js +29 -0
  46. package/dist/commands/validate-structure.js.map +1 -0
  47. package/dist/core/config.d.ts +6 -0
  48. package/dist/core/config.js +86 -0
  49. package/dist/core/config.js.map +1 -0
  50. package/dist/core/configuration.d.ts +7 -0
  51. package/dist/core/configuration.js +112 -0
  52. package/dist/core/configuration.js.map +1 -0
  53. package/dist/core/dod-runner.d.ts +20 -0
  54. package/dist/core/dod-runner.js +233 -0
  55. package/dist/core/dod-runner.js.map +1 -0
  56. package/dist/core/dor-runner.d.ts +18 -0
  57. package/dist/core/dor-runner.js +156 -0
  58. package/dist/core/dor-runner.js.map +1 -0
  59. package/dist/core/fs-walker.d.ts +5 -0
  60. package/dist/core/fs-walker.js +74 -0
  61. package/dist/core/fs-walker.js.map +1 -0
  62. package/dist/core/git.d.ts +24 -0
  63. package/dist/core/git.js +76 -0
  64. package/dist/core/git.js.map +1 -0
  65. package/dist/core/impl-reader.d.ts +8 -0
  66. package/dist/core/impl-reader.js +39 -0
  67. package/dist/core/impl-reader.js.map +1 -0
  68. package/dist/core/language.d.ts +39 -0
  69. package/dist/core/language.js +159 -0
  70. package/dist/core/language.js.map +1 -0
  71. package/dist/core/markdown-parser.d.ts +3 -0
  72. package/dist/core/markdown-parser.js +37 -0
  73. package/dist/core/markdown-parser.js.map +1 -0
  74. package/dist/core/reporter.d.ts +3 -0
  75. package/dist/core/reporter.js +33 -0
  76. package/dist/core/reporter.js.map +1 -0
  77. package/dist/templates/index.d.ts +4 -0
  78. package/dist/templates/index.js +126 -0
  79. package/dist/templates/index.js.map +1 -0
  80. package/dist/validators/format-rules.d.ts +10 -0
  81. package/dist/validators/format-rules.js +238 -0
  82. package/dist/validators/format-rules.js.map +1 -0
  83. package/dist/validators/structure-rules.d.ts +10 -0
  84. package/dist/validators/structure-rules.js +94 -0
  85. package/dist/validators/structure-rules.js.map +1 -0
  86. package/dist/validators/types.d.ts +68 -0
  87. package/dist/validators/types.js +2 -0
  88. package/dist/validators/types.js.map +1 -0
  89. package/docs/agents.md +88 -0
  90. package/docs/architecture.md +53 -0
  91. package/docs/cli.md +226 -0
  92. package/docs/concepts.md +268 -0
  93. package/docs/configuration.md +255 -0
  94. package/docs/demo.svg +111 -0
  95. package/docs/patterns.md +118 -0
  96. package/docs/security.md +95 -0
  97. package/docs/workflows.md +151 -0
  98. package/languages/de.json +20 -0
  99. package/languages/en.json +20 -0
  100. package/languages/es.json +20 -0
  101. package/languages/fr.json +20 -0
  102. package/languages/ja.json +20 -0
  103. package/languages/pt.json +20 -0
  104. package/package.json +54 -0
  105. package/skills/analyse-change.md +101 -0
  106. package/skills/behaviour.md +179 -0
  107. package/skills/bug.md +70 -0
  108. package/skills/commit.md +99 -0
  109. package/skills/decompose.md +101 -0
  110. package/skills/discover.md +392 -0
  111. package/skills/grill-me.md +65 -0
  112. package/skills/guide.md +118 -0
  113. package/skills/implement.md +149 -0
  114. package/skills/ineed.md +147 -0
  115. package/skills/intent.md +104 -0
  116. package/skills/plan.md +63 -0
  117. package/skills/promote.md +69 -0
  118. package/skills/refine.md +78 -0
  119. package/skills/research.md +122 -0
  120. package/skills/review-all.md +92 -0
  121. package/skills/review.md +80 -0
  122. package/skills/status.md +103 -0
  123. package/skills/sweep.md +89 -0
  124. package/skills/trace.md +151 -0
@@ -0,0 +1,389 @@
1
+ import { spawnSync } from 'child_process';
2
+ import { existsSync, readFileSync, readdirSync } from 'fs';
3
+ import { resolve, join, relative } from 'path';
4
+ import { parseMarkdown } from '../core/markdown-parser.js';
5
+ import { loadConfig } from '../core/config.js';
6
+ import { loadLanguagePack, supportedLanguages } from '../core/language.js';
7
+ import { runDorChecks } from '../core/dor-runner.js';
8
+ import { runDod } from './dod.js';
9
+ import { runValidateStructure } from './validate-structure.js';
10
+ import { runValidateFormat } from './validate-format.js';
11
+ import { renderViolations } from '../core/reporter.js';
12
+ // ─── File classification ───────────────────────────────────────────────────────
13
+ function isImplMd(f) {
14
+ return /^taproot[/\\].+[/\\]impl\.md$/.test(f);
15
+ }
16
+ function isHierarchyFile(f) {
17
+ return f.startsWith('taproot/') || f.startsWith('taproot\\');
18
+ }
19
+ function getStagedFiles(cwd) {
20
+ const result = spawnSync('git', ['diff', '--cached', '--name-only'], {
21
+ cwd,
22
+ encoding: 'utf-8',
23
+ });
24
+ if (result.status !== 0)
25
+ return [];
26
+ return result.stdout.split('\n').filter(Boolean);
27
+ }
28
+ /** Walk all impl.md files on disk and build a map of source file path → impl.md path. */
29
+ export function buildSourceToImplMap(cwd) {
30
+ const map = new Map();
31
+ const taprootDir = join(cwd, 'taproot');
32
+ if (!existsSync(taprootDir))
33
+ return map;
34
+ function walkDir(dir) {
35
+ let entries;
36
+ try {
37
+ entries = readdirSync(dir, { withFileTypes: true });
38
+ }
39
+ catch {
40
+ return;
41
+ }
42
+ for (const entry of entries) {
43
+ const fullPath = join(dir, entry.name);
44
+ if (entry.isDirectory()) {
45
+ walkDir(fullPath);
46
+ }
47
+ else if (entry.isFile() && entry.name === 'impl.md') {
48
+ const relImpl = relative(cwd, fullPath).replace(/\\/g, '/');
49
+ let content;
50
+ try {
51
+ content = readFileSync(fullPath, 'utf-8');
52
+ }
53
+ catch {
54
+ continue;
55
+ }
56
+ const parsed = parseMarkdown(relImpl, content);
57
+ const sourceSection = parsed.sections.get('source files');
58
+ if (sourceSection) {
59
+ for (const m of sourceSection.rawBody.matchAll(/`([^`]+)`/g)) {
60
+ map.set(m[1], relImpl);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ walkDir(taprootDir);
67
+ return map;
68
+ }
69
+ function classifyCommit(files, sourceToImpl) {
70
+ const hasImplMd = files.some(isImplMd);
71
+ const hasHierarchy = files.some(f => isHierarchyFile(f) && !isImplMd(f));
72
+ const hasTrackedSource = files.some(f => sourceToImpl.has(f));
73
+ if (!hasImplMd && !hasHierarchy && !hasTrackedSource)
74
+ return ['plain'];
75
+ const tiers = [];
76
+ if (hasHierarchy)
77
+ tiers.push('requirement');
78
+ if (hasTrackedSource)
79
+ tiers.push('implementation');
80
+ else if (hasImplMd)
81
+ tiers.push('declaration');
82
+ return tiers;
83
+ }
84
+ const TECH_KEYWORDS = /\b(REST|GraphQL|API|SQL|PostgreSQL|MySQL|Redis|HTTP|gRPC|JSON|XML|YAML|endpoint|database|query|table|schema|microservice|lambda|function|webhook)\b/i;
85
+ const VERB_STARTS = /^(Enable|Allow|Provide|Ensure|Support|Let|Give|Help|Make|Prevent|Reduce|Increase|Improve|Create|Manage|Track|Monitor|Enforce|Detect|Generate|Expose|Send|Receive|Process|Handle|Validate|Notify|Authorize|Authenticate|Store|Retrieve|Display|Show|List|Search|Filter|Export|Import|Sync|Deploy|Configure|Schedule|Audit|Report|Analyse|Analyze)\b/i;
86
+ const IMPL_MECHANISM_ACTORS = /\b(endpoint|REST|API route|database|query|table|function|lambda|microservice|webhook|handler|controller|service|repository|middleware)\b/i;
87
+ /** Extract the body text of a named `## Section` from markdown content. */
88
+ function getSection(content, name) {
89
+ const parts = content.split(/\n(?=## )/);
90
+ const section = parts.find(p => p.startsWith(`## ${name}`));
91
+ if (!section)
92
+ return null;
93
+ return section.replace(/^## [^\n]*\n/, '');
94
+ }
95
+ /** Resolve the localised heading for a given English key from the pack. */
96
+ function localizedHeading(englishKey, pack) {
97
+ if (!pack)
98
+ return englishKey;
99
+ return pack[englishKey] ?? englishKey;
100
+ }
101
+ export function checkUsecaseQuality(filePath, content, pack = null) {
102
+ const failures = [];
103
+ const acHeading = localizedHeading('Acceptance Criteria', pack);
104
+ const actorHeading = localizedHeading('Actor', pack);
105
+ const postHeading = localizedHeading('Postconditions', pack);
106
+ // AC section present with AC-N: entry
107
+ const acPattern = new RegExp(`^## ${acHeading}`, 'm');
108
+ if (!acPattern.test(content)) {
109
+ failures.push({
110
+ file: filePath,
111
+ message: `Missing \`## ${acHeading}\` section`,
112
+ hint: `Add an \`## ${acHeading}\` section with at least one \`AC-1:\` Gherkin scenario before committing`,
113
+ });
114
+ }
115
+ else if (!/\*\*AC-\d+:/m.test(content)) {
116
+ failures.push({
117
+ file: filePath,
118
+ message: `\`## ${acHeading}\` section has no AC-N: entries`,
119
+ hint: "Add at least one `**AC-1:**` entry with a Given/When/Then scenario",
120
+ });
121
+ }
122
+ // Actor section: must not describe an implementation mechanism
123
+ const actorBody = getSection(content, actorHeading);
124
+ if (actorBody !== null) {
125
+ const firstLine = actorBody.trim().split('\n')[0] ?? '';
126
+ if (IMPL_MECHANISM_ACTORS.test(firstLine)) {
127
+ failures.push({
128
+ file: filePath,
129
+ message: `Actor describes an implementation mechanism: "${firstLine}"`,
130
+ hint: "Actor should be a human, system, or external service — not an implementation detail (e.g. 'Developer', 'External payment service')",
131
+ });
132
+ }
133
+ }
134
+ // Postconditions section present and non-empty
135
+ const postBody = getSection(content, postHeading);
136
+ if (postBody === null || postBody.trim().length === 0) {
137
+ failures.push({
138
+ file: filePath,
139
+ message: `Missing or empty \`## ${postHeading}\` section`,
140
+ hint: `Add a \`## ${postHeading}\` section describing what is true after the flow succeeds`,
141
+ });
142
+ }
143
+ return failures;
144
+ }
145
+ export function checkIntentQuality(filePath, content, pack = null) {
146
+ const failures = [];
147
+ const goalHeading = localizedHeading('Goal', pack);
148
+ const stakeHeading = localizedHeading('Stakeholders', pack);
149
+ const scHeading = localizedHeading('Success Criteria', pack);
150
+ // Goal section: present, starts with a verb
151
+ const goalBody = getSection(content, goalHeading);
152
+ if (goalBody === null || goalBody.trim().length === 0) {
153
+ failures.push({
154
+ file: filePath,
155
+ message: `Missing or empty \`## ${goalHeading}\` section`,
156
+ hint: `Add a \`## ${goalHeading}\` section starting with a verb describing a business outcome — e.g. 'Enable users to...', 'Allow operators to...'`,
157
+ });
158
+ }
159
+ else {
160
+ const firstLine = goalBody.trim().split('\n')[0].trim();
161
+ if (!pack && !VERB_STARTS.test(firstLine)) {
162
+ failures.push({
163
+ file: filePath,
164
+ message: `Goal does not start with a verb: "${firstLine}"`,
165
+ hint: "Goal must start with a verb describing a business outcome — e.g. 'Enable users to...', 'Allow operators to...', 'Ensure teams can...'",
166
+ });
167
+ }
168
+ if (TECH_KEYWORDS.test(firstLine)) {
169
+ failures.push({
170
+ file: filePath,
171
+ message: `Goal describes implementation technology: "${firstLine}"`,
172
+ hint: "Goal should describe the business outcome, not the technical approach. Remove references to implementation technology (REST, SQL, etc.)",
173
+ });
174
+ }
175
+ }
176
+ // Stakeholders section: present and non-empty
177
+ const stakeBody = getSection(content, stakeHeading);
178
+ if (stakeBody === null || stakeBody.trim().length === 0) {
179
+ failures.push({
180
+ file: filePath,
181
+ message: `Missing or empty \`## ${stakeHeading}\` section`,
182
+ hint: `Add a \`## ${stakeHeading}\` section with at least one stakeholder and their perspective`,
183
+ });
184
+ }
185
+ // Success Criteria section: present and non-empty
186
+ const scBody = getSection(content, scHeading);
187
+ if (scBody === null || scBody.trim().length === 0) {
188
+ failures.push({
189
+ file: filePath,
190
+ message: `Missing or empty \`## ${scHeading}\` section`,
191
+ hint: "Add at least one measurable success criterion that is observable and distinct from the goal statement",
192
+ });
193
+ }
194
+ return failures;
195
+ }
196
+ function getStagedContent(filePath, cwd) {
197
+ const result = spawnSync('git', ['show', `:${filePath}`], { cwd, encoding: 'utf-8' });
198
+ if (result.status !== 0)
199
+ return null;
200
+ return result.stdout;
201
+ }
202
+ // ─── Impl state helpers ───────────────────────────────────────────────────────
203
+ /** Read the **State:** value from an impl.md file on disk. Returns empty string if unreadable. */
204
+ function getImplState(implFullPath) {
205
+ try {
206
+ const content = readFileSync(implFullPath, 'utf-8');
207
+ const match = content.match(/\*\*State:\*\*\s*(\S+)/);
208
+ return match?.[1] ?? '';
209
+ }
210
+ catch {
211
+ return '';
212
+ }
213
+ }
214
+ // ─── Status-only change check ─────────────────────────────────────────────────
215
+ function checkStatusOnly(implRelPath, cwd) {
216
+ // New file in HEAD?
217
+ const head = spawnSync('git', ['show', `HEAD:${implRelPath}`], { cwd, encoding: 'utf-8' });
218
+ if (head.status !== 0) {
219
+ return {
220
+ passed: false,
221
+ message: `${implRelPath} is new — commit impl.md alone first (declaration commit) before committing source code`,
222
+ };
223
+ }
224
+ const staged = spawnSync('git', ['show', `:${implRelPath}`], { cwd, encoding: 'utf-8' });
225
+ if (staged.status !== 0)
226
+ return { passed: true, message: '' }; // unstaged, skip
227
+ const headParsed = parseMarkdown(implRelPath, head.stdout);
228
+ const stagedParsed = parseMarkdown(implRelPath, staged.stdout);
229
+ const allSections = new Set([...headParsed.sections.keys(), ...stagedParsed.sections.keys()]);
230
+ const changedSections = [];
231
+ for (const section of allSections) {
232
+ const headBody = headParsed.sections.get(section)?.rawBody ?? '';
233
+ const stagedBody = stagedParsed.sections.get(section)?.rawBody ?? '';
234
+ if (headBody !== stagedBody)
235
+ changedSections.push(section);
236
+ }
237
+ const ALLOWED_IMPL_SECTIONS = new Set(['status', 'dod resolutions', 'dor resolutions']);
238
+ const nonStatus = changedSections.filter(s => !ALLOWED_IMPL_SECTIONS.has(s));
239
+ if (nonStatus.length > 0) {
240
+ return {
241
+ passed: false,
242
+ message: `impl.md has changes outside ## Status (sections: ${nonStatus.join(', ')}). Stage impl.md changes in a separate declaration commit.`,
243
+ };
244
+ }
245
+ return { passed: true, message: '' };
246
+ }
247
+ // ─── Reporting ────────────────────────────────────────────────────────────────
248
+ function printDorReport(report) {
249
+ for (const r of report.results) {
250
+ const icon = r.passed ? '✓' : '✗';
251
+ process.stdout.write(` ${icon} ${r.name}\n`);
252
+ if (!r.passed) {
253
+ if (r.output) {
254
+ for (const line of r.output.split('\n')) {
255
+ process.stdout.write(` ${line}\n`);
256
+ }
257
+ }
258
+ process.stdout.write(` → ${r.correction}\n`);
259
+ }
260
+ }
261
+ }
262
+ // ─── Main hook logic ──────────────────────────────────────────────────────────
263
+ export async function runCommithook(options) {
264
+ const { cwd } = options;
265
+ const staged = getStagedFiles(cwd);
266
+ const sourceToImpl = buildSourceToImplMap(cwd);
267
+ const tiers = classifyCommit(staged, sourceToImpl);
268
+ if (tiers.includes('plain'))
269
+ return 0;
270
+ // Load language pack if configured
271
+ const { config } = loadConfig(cwd);
272
+ let pack = null;
273
+ if (config.language) {
274
+ pack = loadLanguagePack(config.language);
275
+ if (!pack) {
276
+ process.stderr.write(`Warning: Language pack '${config.language}' could not be loaded — falling back to English. ` +
277
+ `Supported: ${supportedLanguages().join(', ')}. Check your taproot installation.\n`);
278
+ }
279
+ }
280
+ let failed = false;
281
+ // Requirement tier: validate hierarchy files
282
+ if (tiers.includes('requirement')) {
283
+ const structViolations = await runValidateStructure({ cwd });
284
+ const formatViolations = await runValidateFormat({ cwd });
285
+ const violations = [...structViolations, ...formatViolations];
286
+ if (violations.some(v => v.type === 'error')) {
287
+ process.stdout.write('taproot commithook — Requirement commit: hierarchy violations found\n');
288
+ process.stdout.write(renderViolations(violations));
289
+ failed = true;
290
+ }
291
+ // Spec quality checks for usecase.md and intent.md files
292
+ const specFailures = [];
293
+ for (const f of staged) {
294
+ if (!isHierarchyFile(f))
295
+ continue;
296
+ const content = getStagedContent(f, cwd);
297
+ if (!content)
298
+ continue;
299
+ if (f.endsWith('usecase.md')) {
300
+ specFailures.push(...checkUsecaseQuality(f, content, pack));
301
+ }
302
+ else if (f.endsWith('intent.md')) {
303
+ specFailures.push(...checkIntentQuality(f, content, pack));
304
+ }
305
+ }
306
+ if (specFailures.length > 0) {
307
+ process.stdout.write('taproot commithook — Requirement commit: spec quality issues found\n');
308
+ for (const failure of specFailures) {
309
+ process.stdout.write(` ✗ ${failure.file}: ${failure.message}\n`);
310
+ process.stdout.write(` → ${failure.hint}\n`);
311
+ }
312
+ failed = true;
313
+ }
314
+ }
315
+ // Declaration tier: DoR check on the behaviour spec
316
+ if (tiers.includes('declaration')) {
317
+ for (const implFile of staged.filter(isImplMd)) {
318
+ // Skip DoR for modifications to already-committed impl files — only gate first declarations
319
+ const headCheck = spawnSync('git', ['show', `HEAD:${implFile}`], { cwd, encoding: 'utf-8' });
320
+ if (headCheck.status === 0)
321
+ continue;
322
+ const report = runDorChecks(implFile, cwd);
323
+ if (!report.allPassed) {
324
+ process.stdout.write(`taproot commithook — Declaration commit: DoR failed for ${implFile}\n`);
325
+ printDorReport(report);
326
+ failed = true;
327
+ }
328
+ }
329
+ }
330
+ // Implementation tier: reverse-lookup which impl.md(s) are implicated, then Status-only + DoD
331
+ if (tiers.includes('implementation')) {
332
+ // Group staged source files by the impl.md that tracks them
333
+ const implToSources = new Map();
334
+ for (const f of staged) {
335
+ const implPath = sourceToImpl.get(f);
336
+ if (implPath) {
337
+ if (!implToSources.has(implPath))
338
+ implToSources.set(implPath, []);
339
+ implToSources.get(implPath).push(f);
340
+ }
341
+ }
342
+ for (const [implFile] of implToSources) {
343
+ // If impl.md is not staged, only require co-staging for non-complete impls
344
+ if (!staged.includes(implFile)) {
345
+ if (getImplState(join(cwd, implFile)) === 'complete')
346
+ continue;
347
+ process.stdout.write(`taproot commithook — Implementation commit: Stage \`${implFile}\` alongside your source files. No implementation commit should proceed without its traceability record.\n`);
348
+ failed = true;
349
+ continue;
350
+ }
351
+ const statusCheck = checkStatusOnly(implFile, cwd);
352
+ if (!statusCheck.passed) {
353
+ process.stdout.write(`taproot commithook — Implementation commit: ${statusCheck.message}\n`);
354
+ failed = true;
355
+ continue;
356
+ }
357
+ const dodReport = await runDod({
358
+ implPath: resolve(cwd, implFile),
359
+ dryRun: true,
360
+ cwd,
361
+ });
362
+ if (!dodReport.allPassed) {
363
+ process.stdout.write(`taproot commithook — Implementation commit: DoD failed for ${implFile}\n`);
364
+ for (const r of dodReport.results) {
365
+ if (!r.passed) {
366
+ process.stdout.write(` ✗ ${r.name}\n`);
367
+ if (r.output)
368
+ process.stdout.write(` ${r.output}\n`);
369
+ process.stdout.write(` → ${r.correction}\n`);
370
+ }
371
+ }
372
+ failed = true;
373
+ }
374
+ }
375
+ }
376
+ return failed ? 1 : 0;
377
+ }
378
+ export function registerCommithook(program) {
379
+ program
380
+ .command('commithook')
381
+ .description('Pre-commit hook: classify staged files and run appropriate quality gates')
382
+ .option('--cwd <dir>', 'Working directory')
383
+ .action(async (options) => {
384
+ const cwd = options.cwd ? resolve(options.cwd) : process.cwd();
385
+ const code = await runCommithook({ cwd });
386
+ process.exitCode = code;
387
+ });
388
+ }
389
+ //# sourceMappingURL=commithook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commithook.js","sourceRoot":"","sources":["../../src/commands/commithook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Command } from 'commander';
2
+ export type CoverageFormat = 'tree' | 'json' | 'markdown' | 'context';
3
+ export interface ImplSummary {
4
+ name: string;
5
+ path: string;
6
+ state: string;
7
+ commitCount: number;
8
+ testCount: number;
9
+ }
10
+ export interface BehaviourSummary {
11
+ name: string;
12
+ path: string;
13
+ state: string;
14
+ implementations: ImplSummary[];
15
+ subBehaviours: BehaviourSummary[];
16
+ }
17
+ export interface IntentSummary {
18
+ name: string;
19
+ path: string;
20
+ state: string;
21
+ behaviours: BehaviourSummary[];
22
+ }
23
+ export interface CoverageReport {
24
+ intents: IntentSummary[];
25
+ totals: {
26
+ intents: number;
27
+ behaviours: number;
28
+ implementations: number;
29
+ completeImpls: number;
30
+ testedImpls: number;
31
+ deferredBehaviours: number;
32
+ deferredImpls: number;
33
+ };
34
+ }
35
+ export declare function registerCoverage(program: Command): void;
36
+ export declare function runCoverage(options: {
37
+ path?: string;
38
+ cwd?: string;
39
+ }): Promise<CoverageReport>;
40
+ export declare function formatReport(report: CoverageReport, format: CoverageFormat): string;
41
+ export declare function formatContext(report: CoverageReport, outputPath: string): string;