cadr-cli 0.0.1 → 1.9.2

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 (121) hide show
  1. package/dist/adr.d.ts +50 -0
  2. package/dist/adr.d.ts.map +1 -0
  3. package/dist/adr.js +156 -0
  4. package/dist/adr.js.map +1 -0
  5. package/dist/adr.test.d.ts +8 -0
  6. package/dist/adr.test.d.ts.map +1 -0
  7. package/dist/adr.test.js +256 -0
  8. package/dist/adr.test.js.map +1 -0
  9. package/dist/analysis.d.ts +24 -0
  10. package/dist/analysis.d.ts.map +1 -0
  11. package/dist/analysis.js +281 -0
  12. package/dist/analysis.js.map +1 -0
  13. package/dist/analysis.test.d.ts +8 -0
  14. package/dist/analysis.test.d.ts.map +1 -0
  15. package/dist/analysis.test.js +351 -0
  16. package/dist/analysis.test.js.map +1 -0
  17. package/dist/commands/analyze.d.ts +14 -0
  18. package/dist/commands/analyze.d.ts.map +1 -0
  19. package/dist/commands/analyze.js +56 -0
  20. package/dist/commands/analyze.js.map +1 -0
  21. package/dist/commands/init.d.ts +12 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +93 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/init.test.d.ts +2 -0
  26. package/dist/commands/init.test.d.ts.map +1 -0
  27. package/dist/commands/init.test.js +56 -0
  28. package/dist/commands/init.test.js.map +1 -0
  29. package/dist/config.d.ts +40 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +208 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/config.test.d.ts +2 -0
  34. package/dist/config.test.d.ts.map +1 -0
  35. package/dist/config.test.js +97 -0
  36. package/dist/config.test.js.map +1 -0
  37. package/dist/git.d.ts +42 -0
  38. package/dist/git.d.ts.map +1 -1
  39. package/dist/git.js +157 -0
  40. package/dist/git.js.map +1 -1
  41. package/dist/index.d.ts +2 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +78 -62
  44. package/dist/index.js.map +1 -1
  45. package/dist/index.test.d.ts +2 -0
  46. package/dist/index.test.d.ts.map +1 -0
  47. package/dist/index.test.js +51 -0
  48. package/dist/index.test.js.map +1 -0
  49. package/dist/llm.d.ts +73 -0
  50. package/dist/llm.d.ts.map +1 -0
  51. package/dist/llm.js +263 -0
  52. package/dist/llm.js.map +1 -0
  53. package/dist/llm.test.d.ts +2 -0
  54. package/dist/llm.test.d.ts.map +1 -0
  55. package/dist/llm.test.js +592 -0
  56. package/dist/llm.test.js.map +1 -0
  57. package/dist/logger.d.ts.map +1 -1
  58. package/dist/logger.js +5 -3
  59. package/dist/logger.js.map +1 -1
  60. package/dist/logger.test.d.ts +2 -0
  61. package/dist/logger.test.d.ts.map +1 -0
  62. package/dist/logger.test.js +78 -0
  63. package/dist/logger.test.js.map +1 -0
  64. package/dist/prompts.d.ts +49 -0
  65. package/dist/prompts.d.ts.map +1 -0
  66. package/dist/prompts.js +195 -0
  67. package/dist/prompts.js.map +1 -0
  68. package/dist/prompts.test.d.ts +2 -0
  69. package/dist/prompts.test.d.ts.map +1 -0
  70. package/dist/prompts.test.js +427 -0
  71. package/dist/prompts.test.js.map +1 -0
  72. package/dist/providers/gemini.d.ts +3 -0
  73. package/dist/providers/gemini.d.ts.map +1 -0
  74. package/dist/providers/gemini.js +39 -0
  75. package/dist/providers/gemini.js.map +1 -0
  76. package/dist/providers/index.d.ts +2 -0
  77. package/dist/providers/index.d.ts.map +1 -0
  78. package/dist/providers/index.js +6 -0
  79. package/dist/providers/index.js.map +1 -0
  80. package/dist/providers/openai.d.ts +3 -0
  81. package/dist/providers/openai.d.ts.map +1 -0
  82. package/dist/providers/openai.js +25 -0
  83. package/dist/providers/openai.js.map +1 -0
  84. package/dist/providers/registry.d.ts +4 -0
  85. package/dist/providers/registry.d.ts.map +1 -0
  86. package/dist/providers/registry.js +16 -0
  87. package/dist/providers/registry.js.map +1 -0
  88. package/dist/providers/types.d.ts +12 -0
  89. package/dist/providers/types.d.ts.map +1 -0
  90. package/dist/providers/types.js +5 -0
  91. package/dist/providers/types.js.map +1 -0
  92. package/dist/version.test.d.ts +3 -0
  93. package/dist/version.test.d.ts.map +1 -0
  94. package/dist/version.test.js +25 -0
  95. package/dist/version.test.js.map +1 -0
  96. package/package.json +14 -5
  97. package/src/adr.test.ts +278 -0
  98. package/src/adr.ts +136 -0
  99. package/src/analysis.test.ts +396 -0
  100. package/src/analysis.ts +262 -0
  101. package/src/commands/analyze.ts +56 -0
  102. package/src/commands/init.test.ts +27 -0
  103. package/src/commands/init.ts +99 -0
  104. package/src/config.test.ts +79 -0
  105. package/src/config.ts +214 -0
  106. package/src/git.ts +240 -0
  107. package/src/index.test.ts +59 -0
  108. package/src/index.ts +80 -60
  109. package/src/llm.test.ts +701 -0
  110. package/src/llm.ts +344 -0
  111. package/src/logger.test.ts +90 -0
  112. package/src/logger.ts +6 -3
  113. package/src/prompts.test.ts +515 -0
  114. package/src/prompts.ts +174 -0
  115. package/src/providers/gemini.ts +41 -0
  116. package/src/providers/index.ts +1 -0
  117. package/src/providers/openai.ts +22 -0
  118. package/src/providers/registry.ts +16 -0
  119. package/src/providers/types.ts +14 -0
  120. package/src/version.test.ts +29 -0
  121. package/bin/cadr.js +0 -16
package/dist/adr.d.ts ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ADR File Management Module
3
+ *
4
+ * Handles creation and management of Architectural Decision Record files.
5
+ * Follows MADR (Markdown Architectural Decision Records) format.
6
+ */
7
+ /**
8
+ * Default ADR directory relative to project root
9
+ */
10
+ export declare const DEFAULT_ADR_DIR = "docs/adr";
11
+ /**
12
+ * Convert a title to a filename-safe slug
13
+ * Example: "Use PostgreSQL for Storage" -> "use-postgresql-for-storage"
14
+ */
15
+ export declare function titleToSlug(title: string): string;
16
+ /**
17
+ * Get the next ADR number by scanning existing ADR files
18
+ *
19
+ * @param adrDir - Directory containing ADR files
20
+ * @returns Next available ADR number (e.g., 1, 2, 3...)
21
+ */
22
+ export declare function getNextADRNumber(adrDir: string): number;
23
+ /**
24
+ * Ensure ADR directory exists, create if it doesn't
25
+ *
26
+ * @param adrDir - Directory path to ensure exists
27
+ */
28
+ export declare function ensureADRDirectory(adrDir: string): void;
29
+ /**
30
+ * Generate ADR filename from number and title
31
+ *
32
+ * @param number - ADR number (will be zero-padded to 4 digits)
33
+ * @param title - ADR title (will be converted to slug)
34
+ * @returns Filename like "0001-use-postgresql-for-storage.md"
35
+ */
36
+ export declare function generateADRFilename(number: number, title: string): string;
37
+ /**
38
+ * Save ADR content to file
39
+ *
40
+ * @param content - Full markdown content of the ADR
41
+ * @param title - Title extracted from ADR content
42
+ * @param adrDir - Directory to save ADR in (defaults to docs/adr)
43
+ * @returns Object with success status, file path, and any error
44
+ */
45
+ export declare function saveADR(content: string, title: string, adrDir?: string): {
46
+ success: boolean;
47
+ filePath?: string;
48
+ error?: string;
49
+ };
50
+ //# sourceMappingURL=adr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.d.ts","sourceRoot":"","sources":["../src/adr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BvD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKvD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAwB,GAC/B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmCzD"}
package/dist/adr.js ADDED
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * ADR File Management Module
4
+ *
5
+ * Handles creation and management of Architectural Decision Record files.
6
+ * Follows MADR (Markdown Architectural Decision Records) format.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.DEFAULT_ADR_DIR = void 0;
43
+ exports.titleToSlug = titleToSlug;
44
+ exports.getNextADRNumber = getNextADRNumber;
45
+ exports.ensureADRDirectory = ensureADRDirectory;
46
+ exports.generateADRFilename = generateADRFilename;
47
+ exports.saveADR = saveADR;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const logger_1 = require("./logger");
51
+ /**
52
+ * Default ADR directory relative to project root
53
+ */
54
+ exports.DEFAULT_ADR_DIR = 'docs/adr';
55
+ /**
56
+ * Convert a title to a filename-safe slug
57
+ * Example: "Use PostgreSQL for Storage" -> "use-postgresql-for-storage"
58
+ */
59
+ function titleToSlug(title) {
60
+ return title
61
+ .toLowerCase()
62
+ .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with hyphens
63
+ .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens
64
+ }
65
+ /**
66
+ * Get the next ADR number by scanning existing ADR files
67
+ *
68
+ * @param adrDir - Directory containing ADR files
69
+ * @returns Next available ADR number (e.g., 1, 2, 3...)
70
+ */
71
+ function getNextADRNumber(adrDir) {
72
+ try {
73
+ if (!fs.existsSync(adrDir)) {
74
+ return 1; // First ADR
75
+ }
76
+ const files = fs.readdirSync(adrDir);
77
+ const adrNumbers = [];
78
+ // Extract numbers from existing ADR files (format: 0001-title.md)
79
+ for (const file of files) {
80
+ const match = file.match(/^(\d{4})-/);
81
+ if (match) {
82
+ adrNumbers.push(parseInt(match[1], 10));
83
+ }
84
+ }
85
+ if (adrNumbers.length === 0) {
86
+ return 1;
87
+ }
88
+ // Return next number after the highest existing number
89
+ return Math.max(...adrNumbers) + 1;
90
+ }
91
+ catch (error) {
92
+ logger_1.loggerInstance.warn('Failed to scan existing ADRs, defaulting to 1', { error, adrDir });
93
+ return 1;
94
+ }
95
+ }
96
+ /**
97
+ * Ensure ADR directory exists, create if it doesn't
98
+ *
99
+ * @param adrDir - Directory path to ensure exists
100
+ */
101
+ function ensureADRDirectory(adrDir) {
102
+ if (!fs.existsSync(adrDir)) {
103
+ logger_1.loggerInstance.info('Creating ADR directory', { adrDir });
104
+ fs.mkdirSync(adrDir, { recursive: true });
105
+ }
106
+ }
107
+ /**
108
+ * Generate ADR filename from number and title
109
+ *
110
+ * @param number - ADR number (will be zero-padded to 4 digits)
111
+ * @param title - ADR title (will be converted to slug)
112
+ * @returns Filename like "0001-use-postgresql-for-storage.md"
113
+ */
114
+ function generateADRFilename(number, title) {
115
+ const paddedNumber = String(number).padStart(4, '0');
116
+ const slug = titleToSlug(title);
117
+ return `${paddedNumber}-${slug}.md`;
118
+ }
119
+ /**
120
+ * Save ADR content to file
121
+ *
122
+ * @param content - Full markdown content of the ADR
123
+ * @param title - Title extracted from ADR content
124
+ * @param adrDir - Directory to save ADR in (defaults to docs/adr)
125
+ * @returns Object with success status, file path, and any error
126
+ */
127
+ function saveADR(content, title, adrDir = exports.DEFAULT_ADR_DIR) {
128
+ try {
129
+ // Ensure directory exists
130
+ ensureADRDirectory(adrDir);
131
+ // Get next ADR number
132
+ const adrNumber = getNextADRNumber(adrDir);
133
+ // Generate filename
134
+ const filename = generateADRFilename(adrNumber, title);
135
+ const filePath = path.join(adrDir, filename);
136
+ // Check if file already exists (shouldn't happen, but safety check)
137
+ if (fs.existsSync(filePath)) {
138
+ logger_1.loggerInstance.warn('ADR file already exists, using alternative name', { filePath });
139
+ const alternativeFilename = generateADRFilename(adrNumber + 1, title);
140
+ const alternativeFilePath = path.join(adrDir, alternativeFilename);
141
+ fs.writeFileSync(alternativeFilePath, content, 'utf-8');
142
+ logger_1.loggerInstance.info('ADR saved successfully', { filePath: alternativeFilePath });
143
+ return { success: true, filePath: alternativeFilePath };
144
+ }
145
+ // Write ADR content to file
146
+ fs.writeFileSync(filePath, content, 'utf-8');
147
+ logger_1.loggerInstance.info('ADR saved successfully', { filePath, adrNumber });
148
+ return { success: true, filePath };
149
+ }
150
+ catch (error) {
151
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
152
+ logger_1.loggerInstance.error('Failed to save ADR', { error, adrDir });
153
+ return { success: false, error: errorMessage };
154
+ }
155
+ }
156
+ //# sourceMappingURL=adr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.js","sourceRoot":"","sources":["../src/adr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ADR File Management Module Tests
3
+ *
4
+ * Tests for ADR file creation, numbering, and management.
5
+ * Following TDD: These tests are written BEFORE implementation.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=adr.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.test.d.ts","sourceRoot":"","sources":["../src/adr.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ /**
3
+ * ADR File Management Module Tests
4
+ *
5
+ * Tests for ADR file creation, numbering, and management.
6
+ * Following TDD: These tests are written BEFORE implementation.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const adr_1 = require("./adr");
45
+ describe('ADR Module', () => {
46
+ const testDir = path.join(__dirname, '../test-adrs');
47
+ beforeEach(() => {
48
+ // Clean up test directory before each test
49
+ if (fs.existsSync(testDir)) {
50
+ fs.rmSync(testDir, { recursive: true, force: true });
51
+ }
52
+ });
53
+ afterEach(() => {
54
+ // Clean up test directory after each test
55
+ if (fs.existsSync(testDir)) {
56
+ fs.rmSync(testDir, { recursive: true, force: true });
57
+ }
58
+ });
59
+ describe('titleToSlug', () => {
60
+ it('converts title to lowercase slug', () => {
61
+ expect((0, adr_1.titleToSlug)('Use PostgreSQL for Storage')).toBe('use-postgresql-for-storage');
62
+ });
63
+ it('replaces spaces with hyphens', () => {
64
+ expect((0, adr_1.titleToSlug)('My Great Decision')).toBe('my-great-decision');
65
+ });
66
+ it('handles special characters', () => {
67
+ expect((0, adr_1.titleToSlug)('API v2.0: New Endpoints!')).toBe('api-v2-0-new-endpoints');
68
+ });
69
+ it('removes leading and trailing hyphens', () => {
70
+ expect((0, adr_1.titleToSlug)('---Test Title---')).toBe('test-title');
71
+ });
72
+ it('handles multiple consecutive spaces', () => {
73
+ expect((0, adr_1.titleToSlug)('Too Many Spaces')).toBe('too-many-spaces');
74
+ });
75
+ it('handles empty string', () => {
76
+ expect((0, adr_1.titleToSlug)('')).toBe('');
77
+ });
78
+ it('handles only special characters', () => {
79
+ expect((0, adr_1.titleToSlug)('!!!')).toBe('');
80
+ });
81
+ });
82
+ describe('generateADRFilename', () => {
83
+ it('generates properly formatted filename', () => {
84
+ expect((0, adr_1.generateADRFilename)(1, 'Use PostgreSQL')).toBe('0001-use-postgresql.md');
85
+ });
86
+ it('pads numbers with zeros to 4 digits', () => {
87
+ expect((0, adr_1.generateADRFilename)(42, 'Test Decision')).toBe('0042-test-decision.md');
88
+ });
89
+ it('handles three-digit numbers', () => {
90
+ expect((0, adr_1.generateADRFilename)(123, 'Another Decision')).toBe('0123-another-decision.md');
91
+ });
92
+ it('handles four-digit numbers', () => {
93
+ expect((0, adr_1.generateADRFilename)(9999, 'Max Decision')).toBe('9999-max-decision.md');
94
+ });
95
+ it('handles titles with special characters', () => {
96
+ expect((0, adr_1.generateADRFilename)(5, 'Switch to React v18!')).toBe('0005-switch-to-react-v18.md');
97
+ });
98
+ });
99
+ describe('getNextADRNumber', () => {
100
+ it('returns 1 for non-existent directory', () => {
101
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(1);
102
+ });
103
+ it('returns 1 for empty directory', () => {
104
+ fs.mkdirSync(testDir, { recursive: true });
105
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(1);
106
+ });
107
+ it('returns next number after existing ADRs', () => {
108
+ fs.mkdirSync(testDir, { recursive: true });
109
+ fs.writeFileSync(path.join(testDir, '0001-first.md'), '# First');
110
+ fs.writeFileSync(path.join(testDir, '0002-second.md'), '# Second');
111
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(3);
112
+ });
113
+ it('handles non-sequential numbers correctly', () => {
114
+ fs.mkdirSync(testDir, { recursive: true });
115
+ fs.writeFileSync(path.join(testDir, '0001-first.md'), '# First');
116
+ fs.writeFileSync(path.join(testDir, '0005-fifth.md'), '# Fifth');
117
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(6);
118
+ });
119
+ it('ignores files without number prefix', () => {
120
+ fs.mkdirSync(testDir, { recursive: true });
121
+ fs.writeFileSync(path.join(testDir, '0001-first.md'), '# First');
122
+ fs.writeFileSync(path.join(testDir, 'README.md'), '# README');
123
+ fs.writeFileSync(path.join(testDir, 'template.md'), '# Template');
124
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(2);
125
+ });
126
+ it('ignores files with incorrect number format', () => {
127
+ fs.mkdirSync(testDir, { recursive: true });
128
+ fs.writeFileSync(path.join(testDir, '0001-first.md'), '# First');
129
+ fs.writeFileSync(path.join(testDir, '1-wrong.md'), '# Wrong');
130
+ fs.writeFileSync(path.join(testDir, '00002-also-wrong.md'), '# Also Wrong');
131
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(2);
132
+ });
133
+ it('handles directory with only non-ADR files', () => {
134
+ fs.mkdirSync(testDir, { recursive: true });
135
+ fs.writeFileSync(path.join(testDir, 'README.md'), '# README');
136
+ expect((0, adr_1.getNextADRNumber)(testDir)).toBe(1);
137
+ });
138
+ });
139
+ describe('ensureADRDirectory', () => {
140
+ it('creates directory if it does not exist', () => {
141
+ (0, adr_1.ensureADRDirectory)(testDir);
142
+ expect(fs.existsSync(testDir)).toBe(true);
143
+ expect(fs.statSync(testDir).isDirectory()).toBe(true);
144
+ });
145
+ it('creates nested directories recursively', () => {
146
+ const nestedDir = path.join(testDir, 'nested', 'path');
147
+ (0, adr_1.ensureADRDirectory)(nestedDir);
148
+ expect(fs.existsSync(nestedDir)).toBe(true);
149
+ expect(fs.statSync(nestedDir).isDirectory()).toBe(true);
150
+ });
151
+ it('does not error if directory already exists', () => {
152
+ fs.mkdirSync(testDir, { recursive: true });
153
+ expect(() => (0, adr_1.ensureADRDirectory)(testDir)).not.toThrow();
154
+ expect(fs.existsSync(testDir)).toBe(true);
155
+ });
156
+ it('can be called multiple times safely', () => {
157
+ (0, adr_1.ensureADRDirectory)(testDir);
158
+ (0, adr_1.ensureADRDirectory)(testDir);
159
+ (0, adr_1.ensureADRDirectory)(testDir);
160
+ expect(fs.existsSync(testDir)).toBe(true);
161
+ });
162
+ });
163
+ describe('saveADR', () => {
164
+ it('saves ADR with correct filename in specified directory', () => {
165
+ const content = '# Use PostgreSQL\n\n* Status: accepted\n\nContent here';
166
+ const result = (0, adr_1.saveADR)(content, 'Use PostgreSQL', testDir);
167
+ expect(result.success).toBe(true);
168
+ expect(result.filePath).toBe(path.join(testDir, '0001-use-postgresql.md'));
169
+ expect(result.error).toBeUndefined();
170
+ expect(fs.existsSync(result.filePath)).toBe(true);
171
+ });
172
+ it('creates directory automatically if it does not exist', () => {
173
+ const content = '# Test ADR\n\nContent';
174
+ const result = (0, adr_1.saveADR)(content, 'Test ADR', testDir);
175
+ expect(fs.existsSync(testDir)).toBe(true);
176
+ expect(result.success).toBe(true);
177
+ });
178
+ it('increments number for multiple ADRs', () => {
179
+ const result1 = (0, adr_1.saveADR)('# First\n\nFirst ADR', 'First', testDir);
180
+ const result2 = (0, adr_1.saveADR)('# Second\n\nSecond ADR', 'Second', testDir);
181
+ const result3 = (0, adr_1.saveADR)('# Third\n\nThird ADR', 'Third', testDir);
182
+ expect(result1.filePath).toContain('0001-first.md');
183
+ expect(result2.filePath).toContain('0002-second.md');
184
+ expect(result3.filePath).toContain('0003-third.md');
185
+ expect(fs.existsSync(result1.filePath)).toBe(true);
186
+ expect(fs.existsSync(result2.filePath)).toBe(true);
187
+ expect(fs.existsSync(result3.filePath)).toBe(true);
188
+ });
189
+ it('saves correct content to file', () => {
190
+ const content = '# My Decision\n\n* Status: accepted\n* Date: 2025-10-21\n\n## Context\n\nSome context here.';
191
+ const result = (0, adr_1.saveADR)(content, 'My Decision', testDir);
192
+ const savedContent = fs.readFileSync(result.filePath, 'utf-8');
193
+ expect(savedContent).toBe(content);
194
+ });
195
+ it('uses default directory when not specified', () => {
196
+ // Clean up default directory
197
+ const defaultPath = path.join(process.cwd(), adr_1.DEFAULT_ADR_DIR);
198
+ if (fs.existsSync(defaultPath)) {
199
+ fs.rmSync(defaultPath, { recursive: true, force: true });
200
+ }
201
+ const content = '# Default Location\n\nContent';
202
+ const result = (0, adr_1.saveADR)(content, 'Default Location');
203
+ expect(result.success).toBe(true);
204
+ expect(result.filePath).toContain(adr_1.DEFAULT_ADR_DIR);
205
+ // Cleanup
206
+ if (fs.existsSync(defaultPath)) {
207
+ fs.rmSync(defaultPath, { recursive: true, force: true });
208
+ }
209
+ });
210
+ it('handles file write errors gracefully', () => {
211
+ // Create a read-only directory to trigger write error
212
+ fs.mkdirSync(testDir, { recursive: true });
213
+ // Make directory read-only (if not Windows)
214
+ if (process.platform !== 'win32') {
215
+ fs.chmodSync(testDir, 0o444);
216
+ const content = '# Test\n\nContent';
217
+ const result = (0, adr_1.saveADR)(content, 'Test', testDir);
218
+ expect(result.success).toBe(false);
219
+ expect(result.error).toBeDefined();
220
+ expect(result.filePath).toBeUndefined();
221
+ // Restore permissions for cleanup
222
+ fs.chmodSync(testDir, 0o755);
223
+ }
224
+ else {
225
+ // On Windows, just verify error handling structure exists
226
+ // Skip actual permission test as Windows permissions work differently
227
+ const content = '# Test\n\nContent';
228
+ const result = (0, adr_1.saveADR)(content, 'Test', testDir);
229
+ // Should succeed on Windows since we can't easily simulate permission errors
230
+ expect(result).toHaveProperty('success');
231
+ expect(typeof result.success).toBe('boolean');
232
+ }
233
+ });
234
+ it('handles long titles correctly', () => {
235
+ const longTitle = 'This is a very long title that should still work correctly when converted to a filename slug';
236
+ const content = `# ${longTitle}\n\nContent`;
237
+ const result = (0, adr_1.saveADR)(content, longTitle, testDir);
238
+ expect(result.success).toBe(true);
239
+ expect(result.filePath).toContain('0001-this-is-a-very-long-title');
240
+ });
241
+ it('handles titles with unicode characters', () => {
242
+ const content = '# Decision with émojis 🚀\n\nContent';
243
+ const result = (0, adr_1.saveADR)(content, 'Decision with émojis 🚀', testDir);
244
+ expect(result.success).toBe(true);
245
+ // Should strip unicode to safe characters
246
+ expect(result.filePath).toMatch(/0001-.+\.md$/);
247
+ });
248
+ });
249
+ describe('DEFAULT_ADR_DIR constant', () => {
250
+ it('is defined and has expected value', () => {
251
+ expect(adr_1.DEFAULT_ADR_DIR).toBeDefined();
252
+ expect(adr_1.DEFAULT_ADR_DIR).toBe('docs/adr');
253
+ });
254
+ });
255
+ });
256
+ //# sourceMappingURL=adr.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.test.js","sourceRoot":"","sources":["../src/adr.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,+BAOe;AAEf,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAErD,UAAU,CAAC,GAAG,EAAE;QACd,2CAA2C;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,0CAA0C;QAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,IAAA,iBAAW,EAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,IAAA,iBAAW,EAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,IAAA,iBAAW,EAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,IAAA,iBAAW,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,IAAA,iBAAW,EAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,CAAC,IAAA,iBAAW,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,IAAA,iBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,IAAA,yBAAmB,EAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,IAAA,yBAAmB,EAAC,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,CAAC,IAAA,yBAAmB,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,IAAA,yBAAmB,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,IAAA,yBAAmB,EAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;YACnE,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;YAClE,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,cAAc,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAA,sBAAgB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACvD,IAAA,wBAAkB,EAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;YAC5B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;YAC5B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,OAAO,GAAG,wDAAwD,CAAC;YACzE,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAE3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACxC,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAErD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,IAAA,aAAO,EAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,IAAA,aAAO,EAAC,wBAAwB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,IAAA,aAAO,EAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAElE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACrD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAEpD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,OAAO,GAAG,6FAA6F,CAAC;YAC9G,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAExD,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,QAAS,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,6BAA6B;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAe,CAAC,CAAC;YAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,OAAO,GAAG,+BAA+B,CAAC;YAChD,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qBAAe,CAAC,CAAC;YAEnD,UAAU;YACV,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,sDAAsD;YACtD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,4CAA4C;YAC5C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAE7B,MAAM,OAAO,GAAG,mBAAmB,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;gBAExC,kCAAkC;gBAClC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,0DAA0D;gBAC1D,sEAAsE;gBACtE,MAAM,OAAO,GAAG,mBAAmB,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEjD,6EAA6E;gBAC7E,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBACzC,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,SAAS,GAAG,8FAA8F,CAAC;YACjH,MAAM,OAAO,GAAG,KAAK,SAAS,aAAa,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,OAAO,GAAG,sCAAsC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAA,aAAO,EAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;YAEpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,0CAA0C;YAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,qBAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,qBAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Analysis Orchestration Module
3
+ *
4
+ * Coordinates the complete analysis flow: config loading, git operations,
5
+ * prompt formatting, LLM analysis, and result display.
6
+ * Implements fail-open principle per constitution requirements.
7
+ */
8
+ import { DiffOptions } from './git';
9
+ /**
10
+ * Run complete analysis workflow
11
+ *
12
+ * This function orchestrates the entire analysis process:
13
+ * 1. Load configuration
14
+ * 2. Get changed files and diff based on options
15
+ * 3. Format LLM prompt
16
+ * 4. Call LLM for analysis
17
+ * 5. Display results
18
+ *
19
+ * Follows fail-open principle: always exits cleanly, never throws.
20
+ *
21
+ * @param diffOptions - Options specifying which changes to analyze (defaults to all uncommitted)
22
+ */
23
+ export declare function runAnalysis(diffOptions?: DiffOptions): Promise<void>;
24
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAA4B,WAAW,EAAY,MAAM,OAAO,CAAC;AAOxE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAAC,WAAW,GAAE,WAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsO3F"}