@codeledger/cli 0.6.7 → 0.6.9

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 (175) hide show
  1. package/dist/architecture-graph/dependency-scanner.d.ts +16 -0
  2. package/dist/architecture-graph/dependency-scanner.d.ts.map +1 -0
  3. package/dist/architecture-graph/dependency-scanner.js +96 -0
  4. package/dist/architecture-graph/dependency-scanner.js.map +1 -0
  5. package/dist/architecture-graph/graph-builder.d.ts +70 -0
  6. package/dist/architecture-graph/graph-builder.d.ts.map +1 -0
  7. package/dist/architecture-graph/graph-builder.js +231 -0
  8. package/dist/architecture-graph/graph-builder.js.map +1 -0
  9. package/dist/architecture-graph/index.d.ts +4 -0
  10. package/dist/architecture-graph/index.d.ts.map +1 -0
  11. package/dist/architecture-graph/index.js +7 -0
  12. package/dist/architecture-graph/index.js.map +1 -0
  13. package/dist/architecture-graph/service-scanner.d.ts +22 -0
  14. package/dist/architecture-graph/service-scanner.d.ts.map +1 -0
  15. package/dist/architecture-graph/service-scanner.js +181 -0
  16. package/dist/architecture-graph/service-scanner.js.map +1 -0
  17. package/dist/commands/activate.d.ts.map +1 -1
  18. package/dist/commands/activate.js +16 -1
  19. package/dist/commands/activate.js.map +1 -1
  20. package/dist/commands/audit-export.d.ts +8 -0
  21. package/dist/commands/audit-export.d.ts.map +1 -0
  22. package/dist/commands/audit-export.js +190 -0
  23. package/dist/commands/audit-export.js.map +1 -0
  24. package/dist/commands/commit-msg.d.ts +58 -0
  25. package/dist/commands/commit-msg.d.ts.map +1 -0
  26. package/dist/commands/commit-msg.js +461 -0
  27. package/dist/commands/commit-msg.js.map +1 -0
  28. package/dist/commands/fix.d.ts +7 -0
  29. package/dist/commands/fix.d.ts.map +1 -0
  30. package/dist/commands/fix.js +107 -0
  31. package/dist/commands/fix.js.map +1 -0
  32. package/dist/commands/graph.d.ts +8 -0
  33. package/dist/commands/graph.d.ts.map +1 -0
  34. package/dist/commands/graph.js +29 -0
  35. package/dist/commands/graph.js.map +1 -0
  36. package/dist/commands/init.d.ts.map +1 -1
  37. package/dist/commands/init.js +14 -0
  38. package/dist/commands/init.js.map +1 -1
  39. package/dist/commands/intent.d.ts +3 -1
  40. package/dist/commands/intent.d.ts.map +1 -1
  41. package/dist/commands/intent.js +68 -2
  42. package/dist/commands/intent.js.map +1 -1
  43. package/dist/commands/learn.d.ts +8 -0
  44. package/dist/commands/learn.d.ts.map +1 -0
  45. package/dist/commands/learn.js +33 -0
  46. package/dist/commands/learn.js.map +1 -0
  47. package/dist/commands/pack.d.ts +12 -0
  48. package/dist/commands/pack.d.ts.map +1 -0
  49. package/dist/commands/pack.js +75 -0
  50. package/dist/commands/pack.js.map +1 -0
  51. package/dist/commands/pr-summary.d.ts +59 -0
  52. package/dist/commands/pr-summary.d.ts.map +1 -0
  53. package/dist/commands/pr-summary.js +524 -0
  54. package/dist/commands/pr-summary.js.map +1 -0
  55. package/dist/commands/serve.d.ts +13 -0
  56. package/dist/commands/serve.d.ts.map +1 -0
  57. package/dist/commands/serve.js +179 -0
  58. package/dist/commands/serve.js.map +1 -0
  59. package/dist/commands/session-cleanup.js +1 -0
  60. package/dist/commands/session-cleanup.js.map +1 -1
  61. package/dist/commands/session-summary.d.ts.map +1 -1
  62. package/dist/commands/session-summary.js +135 -3
  63. package/dist/commands/session-summary.js.map +1 -1
  64. package/dist/commands/setup-ci.d.ts +6 -4
  65. package/dist/commands/setup-ci.d.ts.map +1 -1
  66. package/dist/commands/setup-ci.js +228 -23
  67. package/dist/commands/setup-ci.js.map +1 -1
  68. package/dist/commands/verify.d.ts.map +1 -1
  69. package/dist/commands/verify.js +35 -3
  70. package/dist/commands/verify.js.map +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +127 -4
  73. package/dist/index.js.map +1 -1
  74. package/dist/intent/extractor.d.ts +15 -0
  75. package/dist/intent/extractor.d.ts.map +1 -0
  76. package/dist/intent/extractor.js +149 -0
  77. package/dist/intent/extractor.js.map +1 -0
  78. package/dist/intent/fetcher.d.ts +33 -0
  79. package/dist/intent/fetcher.d.ts.map +1 -0
  80. package/dist/intent/fetcher.js +364 -0
  81. package/dist/intent/fetcher.js.map +1 -0
  82. package/dist/intent/loader.d.ts +26 -0
  83. package/dist/intent/loader.d.ts.map +1 -0
  84. package/dist/intent/loader.js +80 -0
  85. package/dist/intent/loader.js.map +1 -0
  86. package/dist/intent/types.d.ts +33 -0
  87. package/dist/intent/types.d.ts.map +1 -0
  88. package/dist/intent/types.js +9 -0
  89. package/dist/intent/types.js.map +1 -0
  90. package/dist/project-config.d.ts +38 -0
  91. package/dist/project-config.d.ts.map +1 -0
  92. package/dist/project-config.js +206 -0
  93. package/dist/project-config.js.map +1 -0
  94. package/dist/review-intelligence/detectors/architecture-graph.d.ts +18 -0
  95. package/dist/review-intelligence/detectors/architecture-graph.d.ts.map +1 -0
  96. package/dist/review-intelligence/detectors/architecture-graph.js +73 -0
  97. package/dist/review-intelligence/detectors/architecture-graph.js.map +1 -0
  98. package/dist/review-intelligence/detectors/cjs-named-import.d.ts +13 -0
  99. package/dist/review-intelligence/detectors/cjs-named-import.d.ts.map +1 -0
  100. package/dist/review-intelligence/detectors/cjs-named-import.js +134 -0
  101. package/dist/review-intelligence/detectors/cjs-named-import.js.map +1 -0
  102. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts +17 -0
  103. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts.map +1 -0
  104. package/dist/review-intelligence/detectors/exact-count-assertion.js +93 -0
  105. package/dist/review-intelligence/detectors/exact-count-assertion.js.map +1 -0
  106. package/dist/review-intelligence/detectors/exports-map-missing.d.ts +14 -0
  107. package/dist/review-intelligence/detectors/exports-map-missing.d.ts.map +1 -0
  108. package/dist/review-intelligence/detectors/exports-map-missing.js +131 -0
  109. package/dist/review-intelligence/detectors/exports-map-missing.js.map +1 -0
  110. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts +12 -0
  111. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts.map +1 -0
  112. package/dist/review-intelligence/detectors/fixture-keyword-drift.js +82 -0
  113. package/dist/review-intelligence/detectors/fixture-keyword-drift.js.map +1 -0
  114. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts +12 -0
  115. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts.map +1 -0
  116. package/dist/review-intelligence/detectors/optional-infra-crash.js +97 -0
  117. package/dist/review-intelligence/detectors/optional-infra-crash.js.map +1 -0
  118. package/dist/review-intelligence/detectors/pack-rules.d.ts +16 -0
  119. package/dist/review-intelligence/detectors/pack-rules.d.ts.map +1 -0
  120. package/dist/review-intelligence/detectors/pack-rules.js +107 -0
  121. package/dist/review-intelligence/detectors/pack-rules.js.map +1 -0
  122. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts +11 -0
  123. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts.map +1 -0
  124. package/dist/review-intelligence/detectors/undeclared-dependency.js +100 -0
  125. package/dist/review-intelligence/detectors/undeclared-dependency.js.map +1 -0
  126. package/dist/review-intelligence/engine/ast-parser.d.ts +90 -0
  127. package/dist/review-intelligence/engine/ast-parser.d.ts.map +1 -0
  128. package/dist/review-intelligence/engine/ast-parser.js +266 -0
  129. package/dist/review-intelligence/engine/ast-parser.js.map +1 -0
  130. package/dist/review-intelligence/engine/dataflow.d.ts +34 -0
  131. package/dist/review-intelligence/engine/dataflow.d.ts.map +1 -0
  132. package/dist/review-intelligence/engine/dataflow.js +115 -0
  133. package/dist/review-intelligence/engine/dataflow.js.map +1 -0
  134. package/dist/review-intelligence/engine/index.d.ts +7 -0
  135. package/dist/review-intelligence/engine/index.d.ts.map +1 -0
  136. package/dist/review-intelligence/engine/index.js +7 -0
  137. package/dist/review-intelligence/engine/index.js.map +1 -0
  138. package/dist/review-intelligence/engine/symbol-resolver.d.ts +34 -0
  139. package/dist/review-intelligence/engine/symbol-resolver.d.ts.map +1 -0
  140. package/dist/review-intelligence/engine/symbol-resolver.js +106 -0
  141. package/dist/review-intelligence/engine/symbol-resolver.js.map +1 -0
  142. package/dist/review-intelligence/fixes/index.d.ts +54 -0
  143. package/dist/review-intelligence/fixes/index.d.ts.map +1 -0
  144. package/dist/review-intelligence/fixes/index.js +346 -0
  145. package/dist/review-intelligence/fixes/index.js.map +1 -0
  146. package/dist/review-intelligence/index.d.ts +4 -1
  147. package/dist/review-intelligence/index.d.ts.map +1 -1
  148. package/dist/review-intelligence/index.js +22 -3
  149. package/dist/review-intelligence/index.js.map +1 -1
  150. package/dist/review-intelligence/invariants.d.ts +15 -0
  151. package/dist/review-intelligence/invariants.d.ts.map +1 -1
  152. package/dist/review-intelligence/invariants.js +48 -4
  153. package/dist/review-intelligence/invariants.js.map +1 -1
  154. package/dist/review-intelligence/learning/index.d.ts +39 -0
  155. package/dist/review-intelligence/learning/index.d.ts.map +1 -0
  156. package/dist/review-intelligence/learning/index.js +265 -0
  157. package/dist/review-intelligence/learning/index.js.map +1 -0
  158. package/dist/review-intelligence/packs/index.d.ts +69 -0
  159. package/dist/review-intelligence/packs/index.d.ts.map +1 -0
  160. package/dist/review-intelligence/packs/index.js +168 -0
  161. package/dist/review-intelligence/packs/index.js.map +1 -0
  162. package/dist/review-intelligence/repair-guidance.d.ts.map +1 -1
  163. package/dist/review-intelligence/repair-guidance.js +46 -0
  164. package/dist/review-intelligence/repair-guidance.js.map +1 -1
  165. package/dist/review-intelligence/types.d.ts +18 -9
  166. package/dist/review-intelligence/types.d.ts.map +1 -1
  167. package/dist/review-intelligence/types.js +9 -1
  168. package/dist/review-intelligence/types.js.map +1 -1
  169. package/dist/templates/claude-md.d.ts.map +1 -1
  170. package/dist/templates/claude-md.js +23 -128
  171. package/dist/templates/claude-md.js.map +1 -1
  172. package/dist/templates/hooks.d.ts.map +1 -1
  173. package/dist/templates/hooks.js +39 -0
  174. package/dist/templates/hooks.js.map +1 -1
  175. package/package.json +9 -9
@@ -0,0 +1,461 @@
1
+ /**
2
+ * codeledger commit-msg — Generate a structured commit message from staged changes.
3
+ *
4
+ * Architecture:
5
+ * 1. collectGitContext() — gather staged diff, file list, branch, recent commits
6
+ * 2. analyzeDiff() — classify change type, infer scope, extract structural changes
7
+ * 3. renderMessage() — build conventional commit message from analysis
8
+ * 4. injectSignature() — optionally append "Generated with CodeLedger AI"
9
+ *
10
+ * Flags:
11
+ * --ticket <id> Ticket/issue reference (or auto-extracted from branch)
12
+ * --notes "..." Extra context to include in body
13
+ * --json Output structured JSON instead of plain text
14
+ * --apply Write message to .git/COMMIT_EDITMSG (for hook integration)
15
+ * --signature on|off Append "Generated with CodeLedger AI" (default: off)
16
+ * --format full|minimal Full message with bullets vs subject-only
17
+ */
18
+ import { execSync } from 'node:child_process';
19
+ import { existsSync, writeFileSync, mkdirSync, chmodSync } from 'node:fs';
20
+ import { join } from 'node:path';
21
+ import { loadIntent } from '../intent/loader.js';
22
+ import { loadProjectConfig } from '../project-config.js';
23
+ // ── 1. Git Context Collection ────────────────────────────────────────────────
24
+ export function collectGitContext(cwd) {
25
+ let diff;
26
+ try {
27
+ diff = execSync('git diff --staged', { cwd, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 });
28
+ }
29
+ catch {
30
+ console.error('Failed to run git diff --staged. Are you in a git repository?');
31
+ process.exit(1);
32
+ }
33
+ if (!diff.trim()) {
34
+ console.error('No staged changes found. Stage files with `git add` first.');
35
+ process.exit(1);
36
+ }
37
+ let stagedFiles;
38
+ try {
39
+ const nameOnly = execSync('git diff --staged --name-only', { cwd, encoding: 'utf-8' });
40
+ stagedFiles = nameOnly.trim().split('\n').filter(Boolean);
41
+ }
42
+ catch {
43
+ stagedFiles = [];
44
+ }
45
+ let branchName = '';
46
+ try {
47
+ branchName = execSync('git rev-parse --abbrev-ref HEAD', { cwd, encoding: 'utf-8' }).trim();
48
+ }
49
+ catch {
50
+ // Not on a branch — ignore
51
+ }
52
+ let recentCommits = [];
53
+ try {
54
+ const log = execSync('git log --oneline -5', { cwd, encoding: 'utf-8' });
55
+ recentCommits = log.trim().split('\n').filter(Boolean);
56
+ }
57
+ catch {
58
+ // No commits yet — ignore
59
+ }
60
+ return { diff, stagedFiles, branchName, recentCommits };
61
+ }
62
+ // ── 2. Diff Analysis ─────────────────────────────────────────────────────────
63
+ const TYPE_SIGNALS = {
64
+ test: {
65
+ patterns: [/\.test\.|\.spec\.|__tests__/],
66
+ dirs: [/^tests?\//],
67
+ },
68
+ docs: {
69
+ patterns: [/\.md$|\.txt$|\.rst$/],
70
+ dirs: [/^docs?\//],
71
+ },
72
+ chore: {
73
+ patterns: [/package\.json$|tsconfig|\.eslint|\.prettier|Dockerfile|\.github\/|\.yml$|\.yaml$/],
74
+ dirs: [/^\.github\/|^scripts?\//],
75
+ },
76
+ };
77
+ function classifyChangeType(files, diffContent) {
78
+ const testSig = TYPE_SIGNALS['test'];
79
+ const docsSig = TYPE_SIGNALS['docs'];
80
+ const choreSig = TYPE_SIGNALS['chore'];
81
+ const allTest = files.length > 0 && files.every((f) => testSig.patterns.some((p) => p.test(f)) ||
82
+ testSig.dirs.some((p) => p.test(f)));
83
+ if (allTest)
84
+ return 'test';
85
+ const allDocs = files.length > 0 && files.every((f) => docsSig.patterns.some((p) => p.test(f)) ||
86
+ docsSig.dirs.some((p) => p.test(f)));
87
+ if (allDocs)
88
+ return 'docs';
89
+ const allChore = files.length > 0 && files.every((f) => choreSig.patterns.some((p) => p.test(f)) ||
90
+ choreSig.dirs.some((p) => p.test(f)));
91
+ if (allChore)
92
+ return 'chore';
93
+ // New files → feat
94
+ if (/^new file mode/m.test(diffContent))
95
+ return 'feat';
96
+ // New exports/functions/classes → feat
97
+ if (/^\+.*export\s+(function|class|const|interface|type)\b/m.test(diffContent))
98
+ return 'feat';
99
+ // Ratio-based: mostly deletions → refactor; mostly additions → feat; mixed → fix
100
+ const addLines = (diffContent.match(/^\+[^+]/gm) || []).length;
101
+ const delLines = (diffContent.match(/^-[^-]/gm) || []).length;
102
+ if (delLines > addLines * 2)
103
+ return 'refactor';
104
+ if (addLines > delLines * 2)
105
+ return 'feat';
106
+ return 'fix';
107
+ }
108
+ export function inferScope(files) {
109
+ if (files.length === 0)
110
+ return '';
111
+ const dirs = files.map((f) => {
112
+ const parts = f.split('/');
113
+ parts.pop();
114
+ return parts;
115
+ });
116
+ if (dirs.length === 0)
117
+ return '';
118
+ const first = dirs[0];
119
+ let commonLen = 0;
120
+ for (let i = 0; i < first.length; i++) {
121
+ if (dirs.every((d) => d[i] === first[i])) {
122
+ commonLen = i + 1;
123
+ }
124
+ else {
125
+ break;
126
+ }
127
+ }
128
+ const commonPath = first.slice(0, commonLen);
129
+ const GENERIC = new Set(['src', 'packages', 'lib', 'dist', 'build']);
130
+ const meaningful = commonPath.filter((p) => !GENERIC.has(p));
131
+ if (meaningful.length > 0) {
132
+ return meaningful[meaningful.length - 1];
133
+ }
134
+ if (commonPath.length > 0) {
135
+ return commonPath[commonPath.length - 1];
136
+ }
137
+ return '';
138
+ }
139
+ function extractSymbols(diffContent) {
140
+ const added = {
141
+ functions: [...diffContent.matchAll(/^\+.*(?:export\s+)?(?:async\s+)?function\s+(\w+)/gm)].map((m) => m[1]),
142
+ classes: [...diffContent.matchAll(/^\+.*(?:export\s+)?class\s+(\w+)/gm)].map((m) => m[1]),
143
+ interfaces: [...diffContent.matchAll(/^\+.*(?:export\s+)?(?:interface|type)\s+(\w+)/gm)].map((m) => m[1]),
144
+ };
145
+ const removed = {
146
+ functions: [...diffContent.matchAll(/^-.*(?:export\s+)?(?:async\s+)?function\s+(\w+)/gm)].map((m) => m[1]),
147
+ classes: [...diffContent.matchAll(/^-.*(?:export\s+)?class\s+(\w+)/gm)].map((m) => m[1]),
148
+ interfaces: [...diffContent.matchAll(/^-.*(?:export\s+)?(?:interface|type)\s+(\w+)/gm)].map((m) => m[1]),
149
+ };
150
+ return { added, removed };
151
+ }
152
+ function extractTicket(branchName, flagTicket) {
153
+ if (flagTicket)
154
+ return flagTicket;
155
+ const match = branchName.match(/([A-Z]+-\d+|\b\d{3,6}\b)/);
156
+ return match ? match[1] : '';
157
+ }
158
+ export function analyzeDiff(ctx, flagTicket) {
159
+ const { diff, stagedFiles, branchName } = ctx;
160
+ const changeType = classifyChangeType(stagedFiles, diff);
161
+ const scope = inferScope(stagedFiles);
162
+ const { added, removed } = extractSymbols(diff);
163
+ const ticket = extractTicket(branchName, flagTicket);
164
+ const addLines = (diff.match(/^\+[^+]/gm) || []).length;
165
+ const delLines = (diff.match(/^-[^-]/gm) || []).length;
166
+ const isTrivial = (addLines + delLines) <= 5 && stagedFiles.length <= 2;
167
+ // Build bullets from structural changes
168
+ const bullets = buildBullets(stagedFiles, added, removed);
169
+ // Generate summary
170
+ const summary = buildSummary(stagedFiles, changeType, scope, added);
171
+ return {
172
+ filesChanged: stagedFiles,
173
+ additions: addLines,
174
+ deletions: delLines,
175
+ changeType,
176
+ scope,
177
+ summary,
178
+ bullets,
179
+ ticket,
180
+ isTrivial,
181
+ addedSymbols: added,
182
+ removedSymbols: removed,
183
+ };
184
+ }
185
+ function buildBullets(files, added, removed) {
186
+ const bullets = [];
187
+ if (added.functions.length > 0 && added.functions.length <= 5) {
188
+ bullets.push(`Add ${added.functions.join(', ')} function${added.functions.length > 1 ? 's' : ''}`);
189
+ }
190
+ else if (added.functions.length > 5) {
191
+ bullets.push(`Add ${added.functions.length} new functions`);
192
+ }
193
+ if (added.classes.length > 0) {
194
+ bullets.push(`Add ${added.classes.join(', ')} class${added.classes.length > 1 ? 'es' : ''}`);
195
+ }
196
+ if (added.interfaces.length > 0 && added.interfaces.length <= 5) {
197
+ bullets.push(`Add ${added.interfaces.join(', ')} type${added.interfaces.length > 1 ? 's' : ''}`);
198
+ }
199
+ if (removed.functions.length > 0 && removed.functions.length <= 5) {
200
+ bullets.push(`Remove ${removed.functions.join(', ')}`);
201
+ }
202
+ // Fall back to file-group descriptions if no structural changes
203
+ if (bullets.length === 0) {
204
+ const dirGroups = new Map();
205
+ for (const f of files) {
206
+ const parts = f.split('/');
207
+ const filename = parts.pop() ?? f;
208
+ const dir = parts.join('/') || '.';
209
+ const group = dirGroups.get(dir);
210
+ if (group) {
211
+ group.push(filename);
212
+ }
213
+ else {
214
+ dirGroups.set(dir, [filename]);
215
+ }
216
+ }
217
+ for (const [dir, fileNames] of dirGroups) {
218
+ if (fileNames.length <= 3) {
219
+ bullets.push(`Update ${fileNames.join(', ')}${dir !== '.' ? ` in ${dir}` : ''}`);
220
+ }
221
+ else {
222
+ bullets.push(`Update ${fileNames.length} files in ${dir}`);
223
+ }
224
+ }
225
+ }
226
+ return bullets;
227
+ }
228
+ function buildSummary(files, changeType, scope, added) {
229
+ let summary;
230
+ if (files.length === 1) {
231
+ const filename = files[0].split('/').pop() ?? files[0];
232
+ const base = filename.replace(/\.\w+$/, '');
233
+ switch (changeType) {
234
+ case 'fix':
235
+ summary = `fix ${base} issue`;
236
+ break;
237
+ case 'feat':
238
+ summary = `add ${added.functions[0] ?? added.classes[0] ?? 'new functionality'}`;
239
+ break;
240
+ case 'refactor':
241
+ summary = `refactor ${base}`;
242
+ break;
243
+ case 'test':
244
+ summary = `add tests for ${scope || base}`;
245
+ break;
246
+ case 'docs':
247
+ summary = `update ${filename}`;
248
+ break;
249
+ case 'chore':
250
+ summary = `update ${filename}`;
251
+ break;
252
+ case 'perf':
253
+ summary = `optimize ${base}`;
254
+ break;
255
+ default: summary = `update ${filename}`;
256
+ }
257
+ }
258
+ else {
259
+ const target = scope || `${files.length} files`;
260
+ switch (changeType) {
261
+ case 'fix':
262
+ summary = `fix issues in ${target}`;
263
+ break;
264
+ case 'feat':
265
+ summary = `add new functionality to ${target}`;
266
+ break;
267
+ case 'refactor':
268
+ summary = `refactor ${target}`;
269
+ break;
270
+ case 'test':
271
+ summary = `add tests for ${target}`;
272
+ break;
273
+ case 'docs':
274
+ summary = `update documentation`;
275
+ break;
276
+ case 'chore':
277
+ summary = `update build/config for ${target}`;
278
+ break;
279
+ case 'perf':
280
+ summary = `optimize ${target}`;
281
+ break;
282
+ default: summary = `update ${target}`;
283
+ }
284
+ }
285
+ // Enforce 72-char limit on subject portion
286
+ const prefixLen = changeType.length + (scope ? scope.length + 2 : 0) + 2;
287
+ const maxSummary = 72 - prefixLen;
288
+ if (summary.length > maxSummary) {
289
+ summary = summary.slice(0, maxSummary - 3) + '...';
290
+ }
291
+ return summary;
292
+ }
293
+ // ── 3. Message Rendering ─────────────────────────────────────────────────────
294
+ export function renderMessage(analysis, opts) {
295
+ const { changeType, scope, summary, bullets, isTrivial } = analysis;
296
+ const parts = [];
297
+ // Subject line
298
+ const scopePart = scope ? `(${scope})` : '';
299
+ parts.push(`${changeType}${scopePart}: ${summary}`);
300
+ // For minimal format, return subject only
301
+ if (opts.format === 'minimal') {
302
+ return parts.join('\n');
303
+ }
304
+ // Body bullets (skip for trivial changes)
305
+ if (bullets.length > 0 && !isTrivial) {
306
+ parts.push('');
307
+ for (const bullet of bullets.slice(0, 8)) {
308
+ parts.push(`* ${bullet}`);
309
+ }
310
+ }
311
+ // Intent context — explain "why" when issue data is available
312
+ if (opts.intent) {
313
+ parts.push('');
314
+ parts.push(`Why: ${opts.intent.goal}`);
315
+ if (opts.intent.source_id) {
316
+ parts.push(`Issue: ${opts.intent.source_id}`);
317
+ }
318
+ }
319
+ // User notes
320
+ if (opts.notes) {
321
+ parts.push('');
322
+ parts.push(opts.notes);
323
+ }
324
+ // Footer
325
+ const footerParts = [];
326
+ if (opts.ticket) {
327
+ footerParts.push(`Refs: ${opts.ticket}`);
328
+ }
329
+ if (!isTrivial && analysis.filesChanged.length > 10) {
330
+ const topDirs = new Set(analysis.filesChanged.map((f) => f.split('/')[0]));
331
+ footerParts.push(`Touches ${analysis.filesChanged.length} files across ${topDirs.size} top-level directories`);
332
+ }
333
+ if (footerParts.length > 0) {
334
+ parts.push('');
335
+ for (const fp of footerParts) {
336
+ parts.push(fp);
337
+ }
338
+ }
339
+ return parts.join('\n');
340
+ }
341
+ // ── 4. Signature Injection ───────────────────────────────────────────────────
342
+ export function injectSignature(message, enabled, isTrivial) {
343
+ if (!enabled || isTrivial)
344
+ return message;
345
+ return message + '\n\nGenerated with CodeLedger AI';
346
+ }
347
+ // ── Main command ─────────────────────────────────────────────────────────────
348
+ export async function runCommitMsg(cwd, flags) {
349
+ // --install-hook: set up prepare-commit-msg git hook (no staged changes needed)
350
+ if (flags['install-hook'] === 'true') {
351
+ installPrepareCommitMsgHook(cwd, flags);
352
+ return;
353
+ }
354
+ // 1. Collect git context
355
+ const ctx = collectGitContext(cwd);
356
+ // 2. Analyze the diff
357
+ const analysis = analyzeDiff(ctx, flags['ticket'] ?? '');
358
+ // 2.5. Load intent (from --issue, --intent-file, or branch inference)
359
+ const projectCfg = loadProjectConfig(cwd);
360
+ const intent = await loadIntent({
361
+ issue: flags['issue'],
362
+ intentFile: flags['intent-file'],
363
+ trackerPrefix: projectCfg.intent.tracker_prefix || undefined,
364
+ });
365
+ // 3. Build options (CLI flags override .codeledger.yml defaults)
366
+ const opts = {
367
+ ticket: analysis.ticket || (intent?.source_id ?? ''),
368
+ notes: flags['notes'] ?? '',
369
+ signature: flags['signature'] !== undefined
370
+ ? flags['signature'] === 'on'
371
+ : projectCfg.commit_msg.signature,
372
+ format: flags['format'] !== undefined
373
+ ? (flags['format'] === 'minimal' ? 'minimal' : 'full')
374
+ : projectCfg.commit_msg.format,
375
+ intent,
376
+ };
377
+ // 4. Render message
378
+ let message = renderMessage(analysis, opts);
379
+ // 5. Inject signature (off by default)
380
+ message = injectSignature(message, opts.signature, analysis.isTrivial);
381
+ // 6. --apply: write to .git/COMMIT_EDITMSG
382
+ if (flags['apply'] === 'true') {
383
+ try {
384
+ const gitDir = execSync('git rev-parse --git-dir', { cwd, encoding: 'utf-8' }).trim();
385
+ const commitEditmsgPath = join(cwd, gitDir, 'COMMIT_EDITMSG');
386
+ writeFileSync(commitEditmsgPath, message + '\n', 'utf-8');
387
+ console.log(`Commit message written to ${commitEditmsgPath}`);
388
+ }
389
+ catch {
390
+ console.error('Failed to write to .git/COMMIT_EDITMSG. Is this a git repository?');
391
+ process.exit(1);
392
+ }
393
+ return;
394
+ }
395
+ // 7. Output
396
+ if (flags['json'] === 'true') {
397
+ console.log(JSON.stringify({
398
+ message,
399
+ analysis,
400
+ recentCommits: ctx.recentCommits,
401
+ branchName: ctx.branchName,
402
+ }, null, 2));
403
+ }
404
+ else {
405
+ console.log(message);
406
+ }
407
+ }
408
+ // ── Hook Installer ───────────────────────────────────────────────────────────
409
+ const HOOK_SCRIPT = `#!/bin/sh
410
+ # prepare-commit-msg hook installed by CodeLedger
411
+ # Generates a conventional commit message from staged changes.
412
+ # Edit the message in your editor after it's generated.
413
+
414
+ COMMIT_MSG_FILE="$1"
415
+ COMMIT_SOURCE="$2"
416
+
417
+ # Only run for normal commits (not merge, squash, or amend)
418
+ if [ -n "$COMMIT_SOURCE" ]; then
419
+ exit 0
420
+ fi
421
+
422
+ # Generate message and write to the commit message file
423
+ npx codeledger commit-msg --apply 2>/dev/null
424
+
425
+ exit 0
426
+ `;
427
+ export function installPrepareCommitMsgHook(cwd, flags) {
428
+ let gitDir;
429
+ try {
430
+ gitDir = execSync('git rev-parse --git-dir', { cwd, encoding: 'utf-8' }).trim();
431
+ }
432
+ catch {
433
+ console.error('Not a git repository. Run this from inside a git repo.');
434
+ process.exit(1);
435
+ }
436
+ const hooksDir = join(cwd, gitDir, 'hooks');
437
+ const hookPath = join(hooksDir, 'prepare-commit-msg');
438
+ if (!existsSync(hooksDir)) {
439
+ mkdirSync(hooksDir, { recursive: true });
440
+ }
441
+ if (existsSync(hookPath) && flags['force'] !== 'true') {
442
+ console.error(`Hook already exists at ${hookPath}`);
443
+ console.error('Use --force to overwrite.');
444
+ process.exit(1);
445
+ }
446
+ // Build hook content with user's flags forwarded
447
+ let hookFlags = '';
448
+ if (flags['signature'] === 'on')
449
+ hookFlags += ' --signature on';
450
+ if (flags['format'] === 'minimal')
451
+ hookFlags += ' --format minimal';
452
+ if (flags['ticket'])
453
+ hookFlags += ` --ticket ${flags['ticket']}`;
454
+ const hookContent = HOOK_SCRIPT.replace('npx codeledger commit-msg --apply', `npx codeledger commit-msg --apply${hookFlags}`);
455
+ writeFileSync(hookPath, hookContent, 'utf-8');
456
+ chmodSync(hookPath, 0o755);
457
+ console.log(`prepare-commit-msg hook installed at ${hookPath}`);
458
+ console.log('The hook will generate a commit message from staged changes.');
459
+ console.log('You can still edit the message in your editor before committing.');
460
+ }
461
+ //# sourceMappingURL=commit-msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-msg.js","sourceRoot":"","sources":["../../src/commands/commit-msg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `codeledger fix [--rule <rule-id>] [--dry-run]`
3
+ *
4
+ * Apply auto-fixes for architectural violations detected by Review Intelligence.
5
+ */
6
+ export declare function runFix(cwd: string, flags: Record<string, string>): Promise<void>;
7
+ //# sourceMappingURL=fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAyGf"}
@@ -0,0 +1,107 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { runReviewIntelligence, DEFAULT_REVIEW_INTELLIGENCE_POLICY, } from '../review-intelligence/index.js';
5
+ import { applyAllFixes, isFixable, getFixableRuleIds } from '../review-intelligence/fixes/index.js';
6
+ /**
7
+ * `codeledger fix [--rule <rule-id>] [--dry-run]`
8
+ *
9
+ * Apply auto-fixes for architectural violations detected by Review Intelligence.
10
+ */
11
+ export async function runFix(cwd, flags) {
12
+ const ruleFilter = flags['rule'];
13
+ const dryRun = flags['dry-run'] === 'true';
14
+ // Load config
15
+ const configPath = join(cwd, '.codeledger', 'config.json');
16
+ if (!existsSync(configPath)) {
17
+ console.error('No .codeledger/config.json found. Run "codeledger init" first.');
18
+ process.exit(2);
19
+ }
20
+ // Get changed files from git
21
+ let files;
22
+ try {
23
+ const gitOutput = execSync('git diff --name-only HEAD~1 HEAD 2>/dev/null || git diff --name-only --cached 2>/dev/null || git ls-files -m', {
24
+ cwd,
25
+ encoding: 'utf-8',
26
+ stdio: ['pipe', 'pipe', 'pipe'],
27
+ }).trim();
28
+ files = gitOutput.split('\n').filter((f) => f.length > 0);
29
+ }
30
+ catch {
31
+ // Fallback: scan all TS/JS files in src
32
+ console.error('Could not determine changed files from git. Scanning all source files.');
33
+ files = [];
34
+ }
35
+ if (files.length === 0) {
36
+ console.log('No changed files detected. Nothing to fix.');
37
+ return;
38
+ }
39
+ // Run review intelligence to find fixable issues
40
+ const result = runReviewIntelligence({
41
+ cwd,
42
+ files,
43
+ policy: DEFAULT_REVIEW_INTELLIGENCE_POLICY,
44
+ explain: false,
45
+ debug: false,
46
+ });
47
+ // Filter to fixable findings
48
+ let fixableFindings = result.findings.filter(isFixable);
49
+ if (ruleFilter) {
50
+ fixableFindings = fixableFindings.filter((f) => f.rule_id === ruleFilter);
51
+ }
52
+ if (fixableFindings.length === 0) {
53
+ console.log('No auto-fixable findings detected.');
54
+ if (result.findings.length > 0) {
55
+ console.log(`(${result.findings.length} finding(s) require manual fix)`);
56
+ console.log(`Auto-fixable rules: ${getFixableRuleIds().join(', ')}`);
57
+ }
58
+ return;
59
+ }
60
+ console.log(`Found ${fixableFindings.length} auto-fixable finding(s)`);
61
+ if (dryRun) {
62
+ console.log('');
63
+ console.log('Dry run — changes will NOT be applied:');
64
+ for (const f of fixableFindings) {
65
+ console.log(` [${f.severity}] ${f.rule_id} — ${f.file}:${f.line} — ${f.title}`);
66
+ }
67
+ return;
68
+ }
69
+ // Group findings by file
70
+ const findingsByFile = new Map();
71
+ for (const f of fixableFindings) {
72
+ const existing = findingsByFile.get(f.file);
73
+ if (existing) {
74
+ existing.push(f);
75
+ }
76
+ else {
77
+ findingsByFile.set(f.file, [f]);
78
+ }
79
+ }
80
+ // Apply fixes per file
81
+ let totalApplied = 0;
82
+ for (const [filePath, fileFindings] of findingsByFile) {
83
+ const fullPath = join(cwd, filePath);
84
+ let content;
85
+ try {
86
+ content = readFileSync(fullPath, 'utf-8');
87
+ }
88
+ catch {
89
+ console.error(` Could not read ${filePath}, skipping.`);
90
+ continue;
91
+ }
92
+ const { newContent, applied } = applyAllFixes(fileFindings, content);
93
+ if (applied.length > 0) {
94
+ writeFileSync(fullPath, newContent);
95
+ for (const fix of applied) {
96
+ console.log(` Fixed: ${fix.rule_id} in ${fix.file} — ${fix.description}`);
97
+ }
98
+ totalApplied += applied.length;
99
+ }
100
+ }
101
+ console.log('');
102
+ console.log(`Applied ${totalApplied} fix(es) across ${findingsByFile.size} file(s).`);
103
+ if (totalApplied > 0) {
104
+ console.log('Review the changes and commit when ready.');
105
+ }
106
+ }
107
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `codeledger graph [--json] [--save]`
3
+ *
4
+ * Build and display the architecture graph showing service relationships,
5
+ * package dependencies, circular dependencies, and boundary violations.
6
+ */
7
+ export declare function runGraph(cwd: string, flags: Record<string, string>): Promise<void>;
8
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -0,0 +1,29 @@
1
+ import { writeFileSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { buildArchitectureGraph, formatGraphOutput, formatGraphJson, } from '../architecture-graph/index.js';
4
+ /**
5
+ * `codeledger graph [--json] [--save]`
6
+ *
7
+ * Build and display the architecture graph showing service relationships,
8
+ * package dependencies, circular dependencies, and boundary violations.
9
+ */
10
+ export async function runGraph(cwd, flags) {
11
+ const jsonOutput = flags['json'] === 'true';
12
+ const shouldSave = flags['save'] === 'true';
13
+ console.log('Building architecture graph...');
14
+ const graph = buildArchitectureGraph(cwd);
15
+ if (jsonOutput) {
16
+ console.log(formatGraphJson(graph));
17
+ }
18
+ else {
19
+ console.log(formatGraphOutput(graph));
20
+ }
21
+ if (shouldSave) {
22
+ const outputDir = join(cwd, '.codeledger');
23
+ mkdirSync(outputDir, { recursive: true });
24
+ const outputPath = join(outputDir, 'architecture-graph.json');
25
+ writeFileSync(outputPath, formatGraphJson(graph) + '\n');
26
+ console.log(`Graph saved to: ${outputPath}`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,GAChB,MAAM,gCAAgC,CAAC;AAExC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,KAA6B;IAE7B,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC3C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;QAC9D,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}