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.
- package/dist/adr.d.ts +50 -0
- package/dist/adr.d.ts.map +1 -0
- package/dist/adr.js +156 -0
- package/dist/adr.js.map +1 -0
- package/dist/adr.test.d.ts +8 -0
- package/dist/adr.test.d.ts.map +1 -0
- package/dist/adr.test.js +256 -0
- package/dist/adr.test.js.map +1 -0
- package/dist/analysis.d.ts +24 -0
- package/dist/analysis.d.ts.map +1 -0
- package/dist/analysis.js +281 -0
- package/dist/analysis.js.map +1 -0
- package/dist/analysis.test.d.ts +8 -0
- package/dist/analysis.test.d.ts.map +1 -0
- package/dist/analysis.test.js +351 -0
- package/dist/analysis.test.js.map +1 -0
- package/dist/commands/analyze.d.ts +14 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +56 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +93 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +56 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +97 -0
- package/dist/config.test.js.map +1 -0
- package/dist/git.d.ts +42 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +157 -0
- package/dist/git.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -62
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +51 -0
- package/dist/index.test.js.map +1 -0
- package/dist/llm.d.ts +73 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +263 -0
- package/dist/llm.js.map +1 -0
- package/dist/llm.test.d.ts +2 -0
- package/dist/llm.test.d.ts.map +1 -0
- package/dist/llm.test.js +592 -0
- package/dist/llm.test.js.map +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +5 -3
- package/dist/logger.js.map +1 -1
- package/dist/logger.test.d.ts +2 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +78 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/prompts.d.ts +49 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +195 -0
- package/dist/prompts.js.map +1 -0
- package/dist/prompts.test.d.ts +2 -0
- package/dist/prompts.test.d.ts.map +1 -0
- package/dist/prompts.test.js +427 -0
- package/dist/prompts.test.js.map +1 -0
- package/dist/providers/gemini.d.ts +3 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +39 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +25 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +4 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +16 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +12 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +5 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/version.test.d.ts +3 -0
- package/dist/version.test.d.ts.map +1 -0
- package/dist/version.test.js +25 -0
- package/dist/version.test.js.map +1 -0
- package/package.json +14 -5
- package/src/adr.test.ts +278 -0
- package/src/adr.ts +136 -0
- package/src/analysis.test.ts +396 -0
- package/src/analysis.ts +262 -0
- package/src/commands/analyze.ts +56 -0
- package/src/commands/init.test.ts +27 -0
- package/src/commands/init.ts +99 -0
- package/src/config.test.ts +79 -0
- package/src/config.ts +214 -0
- package/src/git.ts +240 -0
- package/src/index.test.ts +59 -0
- package/src/index.ts +80 -60
- package/src/llm.test.ts +701 -0
- package/src/llm.ts +344 -0
- package/src/logger.test.ts +90 -0
- package/src/logger.ts +6 -3
- package/src/prompts.test.ts +515 -0
- package/src/prompts.ts +174 -0
- package/src/providers/gemini.ts +41 -0
- package/src/providers/index.ts +1 -0
- package/src/providers/openai.ts +22 -0
- package/src/providers/registry.ts +16 -0
- package/src/providers/types.ts +14 -0
- package/src/version.test.ts +29 -0
- 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
|
package/dist/adr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../src/adr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adr.test.d.ts","sourceRoot":"","sources":["../src/adr.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/adr.test.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|