@levironexe/architect 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CONTRIBUTING.md +55 -0
  3. package/README.md +341 -0
  4. package/dist/analyzers/ast-parser.d.ts +3 -0
  5. package/dist/analyzers/ast-parser.js +305 -0
  6. package/dist/analyzers/ast-parser.js.map +1 -0
  7. package/dist/analyzers/dependency-graph.d.ts +2 -0
  8. package/dist/analyzers/dependency-graph.js +67 -0
  9. package/dist/analyzers/dependency-graph.js.map +1 -0
  10. package/dist/analyzers/duplication.d.ts +2 -0
  11. package/dist/analyzers/duplication.js +56 -0
  12. package/dist/analyzers/duplication.js.map +1 -0
  13. package/dist/analyzers/file-walker.d.ts +3 -0
  14. package/dist/analyzers/file-walker.js +80 -0
  15. package/dist/analyzers/file-walker.js.map +1 -0
  16. package/dist/cli/context-runner.d.ts +1 -0
  17. package/dist/cli/context-runner.js +16 -0
  18. package/dist/cli/context-runner.js.map +1 -0
  19. package/dist/cli/index.d.ts +24 -0
  20. package/dist/cli/index.js +217 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/init-runner.d.ts +25 -0
  23. package/dist/cli/init-runner.js +152 -0
  24. package/dist/cli/init-runner.js.map +1 -0
  25. package/dist/cli/scan-runner.d.ts +8 -0
  26. package/dist/cli/scan-runner.js +133 -0
  27. package/dist/cli/scan-runner.js.map +1 -0
  28. package/dist/formatters/plan-json.d.ts +2 -0
  29. package/dist/formatters/plan-json.js +4 -0
  30. package/dist/formatters/plan-json.js.map +1 -0
  31. package/dist/formatters/plan-markdown.d.ts +2 -0
  32. package/dist/formatters/plan-markdown.js +42 -0
  33. package/dist/formatters/plan-markdown.js.map +1 -0
  34. package/dist/formatters/plan-prompt.d.ts +4 -0
  35. package/dist/formatters/plan-prompt.js +5 -0
  36. package/dist/formatters/plan-prompt.js.map +1 -0
  37. package/dist/formatters/plan-terminal.d.ts +5 -0
  38. package/dist/formatters/plan-terminal.js +62 -0
  39. package/dist/formatters/plan-terminal.js.map +1 -0
  40. package/dist/generators/blueprint-renderer.d.ts +3 -0
  41. package/dist/generators/blueprint-renderer.js +27 -0
  42. package/dist/generators/blueprint-renderer.js.map +1 -0
  43. package/dist/generators/claudeWriter.d.ts +3 -0
  44. package/dist/generators/claudeWriter.js +9 -0
  45. package/dist/generators/claudeWriter.js.map +1 -0
  46. package/dist/generators/copilotWriter.d.ts +3 -0
  47. package/dist/generators/copilotWriter.js +11 -0
  48. package/dist/generators/copilotWriter.js.map +1 -0
  49. package/dist/generators/cursorWriter.d.ts +3 -0
  50. package/dist/generators/cursorWriter.js +14 -0
  51. package/dist/generators/cursorWriter.js.map +1 -0
  52. package/dist/generators/genericWriter.d.ts +3 -0
  53. package/dist/generators/genericWriter.js +9 -0
  54. package/dist/generators/genericWriter.js.map +1 -0
  55. package/dist/generators/template-context.d.ts +18 -0
  56. package/dist/generators/template-context.js +126 -0
  57. package/dist/generators/template-context.js.map +1 -0
  58. package/dist/generators/templateRenderer.d.ts +2 -0
  59. package/dist/generators/templateRenderer.js +19 -0
  60. package/dist/generators/templateRenderer.js.map +1 -0
  61. package/dist/generators/windsurfWriter.d.ts +3 -0
  62. package/dist/generators/windsurfWriter.js +14 -0
  63. package/dist/generators/windsurfWriter.js.map +1 -0
  64. package/dist/generators/writer-types.d.ts +11 -0
  65. package/dist/generators/writer-types.js +40 -0
  66. package/dist/generators/writer-types.js.map +1 -0
  67. package/dist/llm/claude-provider.d.ts +8 -0
  68. package/dist/llm/claude-provider.js +22 -0
  69. package/dist/llm/claude-provider.js.map +1 -0
  70. package/dist/llm/concern-classifier.d.ts +15 -0
  71. package/dist/llm/concern-classifier.js +61 -0
  72. package/dist/llm/concern-classifier.js.map +1 -0
  73. package/dist/llm/config.d.ts +11 -0
  74. package/dist/llm/config.js +120 -0
  75. package/dist/llm/config.js.map +1 -0
  76. package/dist/llm/ollama-provider.d.ts +8 -0
  77. package/dist/llm/ollama-provider.js +27 -0
  78. package/dist/llm/ollama-provider.js.map +1 -0
  79. package/dist/llm/openai-provider.d.ts +8 -0
  80. package/dist/llm/openai-provider.js +19 -0
  81. package/dist/llm/openai-provider.js.map +1 -0
  82. package/dist/llm/prompt-builder.d.ts +12 -0
  83. package/dist/llm/prompt-builder.js +132 -0
  84. package/dist/llm/prompt-builder.js.map +1 -0
  85. package/dist/llm/provider.d.ts +17 -0
  86. package/dist/llm/provider.js +2 -0
  87. package/dist/llm/provider.js.map +1 -0
  88. package/dist/llm/response-parser.d.ts +6 -0
  89. package/dist/llm/response-parser.js +128 -0
  90. package/dist/llm/response-parser.js.map +1 -0
  91. package/dist/planner/plan-generator.d.ts +7 -0
  92. package/dist/planner/plan-generator.js +275 -0
  93. package/dist/planner/plan-generator.js.map +1 -0
  94. package/dist/planner/plan-prompt-builder.d.ts +9 -0
  95. package/dist/planner/plan-prompt-builder.js +92 -0
  96. package/dist/planner/plan-prompt-builder.js.map +1 -0
  97. package/dist/planner/plan-response-parser.d.ts +7 -0
  98. package/dist/planner/plan-response-parser.js +21 -0
  99. package/dist/planner/plan-response-parser.js.map +1 -0
  100. package/dist/planner/plan-validator.d.ts +3 -0
  101. package/dist/planner/plan-validator.js +49 -0
  102. package/dist/planner/plan-validator.js.map +1 -0
  103. package/dist/reporters/scan-json.d.ts +13 -0
  104. package/dist/reporters/scan-json.js +26 -0
  105. package/dist/reporters/scan-json.js.map +1 -0
  106. package/dist/reporters/terminal.d.ts +6 -0
  107. package/dist/reporters/terminal.js +224 -0
  108. package/dist/reporters/terminal.js.map +1 -0
  109. package/dist/scoring/consistency-score.d.ts +3 -0
  110. package/dist/scoring/consistency-score.js +23 -0
  111. package/dist/scoring/consistency-score.js.map +1 -0
  112. package/dist/scoring/duplication-score.d.ts +3 -0
  113. package/dist/scoring/duplication-score.js +16 -0
  114. package/dist/scoring/duplication-score.js.map +1 -0
  115. package/dist/scoring/health-score.d.ts +4 -0
  116. package/dist/scoring/health-score.js +20 -0
  117. package/dist/scoring/health-score.js.map +1 -0
  118. package/dist/scoring/issue-builder.d.ts +4 -0
  119. package/dist/scoring/issue-builder.js +62 -0
  120. package/dist/scoring/issue-builder.js.map +1 -0
  121. package/dist/scoring/modularity-score.d.ts +3 -0
  122. package/dist/scoring/modularity-score.js +56 -0
  123. package/dist/scoring/modularity-score.js.map +1 -0
  124. package/dist/scoring/pattern-analysis.d.ts +3 -0
  125. package/dist/scoring/pattern-analysis.js +74 -0
  126. package/dist/scoring/pattern-analysis.js.map +1 -0
  127. package/dist/scoring/separation-score.d.ts +3 -0
  128. package/dist/scoring/separation-score.js +35 -0
  129. package/dist/scoring/separation-score.js.map +1 -0
  130. package/dist/skills/detector.d.ts +4 -0
  131. package/dist/skills/detector.js +104 -0
  132. package/dist/skills/detector.js.map +1 -0
  133. package/dist/skills/lister.d.ts +9 -0
  134. package/dist/skills/lister.js +35 -0
  135. package/dist/skills/lister.js.map +1 -0
  136. package/dist/skills/loader.d.ts +6 -0
  137. package/dist/skills/loader.js +76 -0
  138. package/dist/skills/loader.js.map +1 -0
  139. package/dist/skills/structure-check.d.ts +2 -0
  140. package/dist/skills/structure-check.js +37 -0
  141. package/dist/skills/structure-check.js.map +1 -0
  142. package/dist/skills/validator.d.ts +6 -0
  143. package/dist/skills/validator.js +229 -0
  144. package/dist/skills/validator.js.map +1 -0
  145. package/dist/types/analysis.d.ts +130 -0
  146. package/dist/types/analysis.js +41 -0
  147. package/dist/types/analysis.js.map +1 -0
  148. package/dist/types/concern.d.ts +48 -0
  149. package/dist/types/concern.js +16 -0
  150. package/dist/types/concern.js.map +1 -0
  151. package/dist/types/generation.d.ts +32 -0
  152. package/dist/types/generation.js +2 -0
  153. package/dist/types/generation.js.map +1 -0
  154. package/dist/types/issue.d.ts +12 -0
  155. package/dist/types/issue.js +2 -0
  156. package/dist/types/issue.js.map +1 -0
  157. package/dist/types/pattern.d.ts +15 -0
  158. package/dist/types/pattern.js +2 -0
  159. package/dist/types/pattern.js.map +1 -0
  160. package/dist/types/plan.d.ts +56 -0
  161. package/dist/types/plan.js +2 -0
  162. package/dist/types/plan.js.map +1 -0
  163. package/dist/types/scan-output.d.ts +84 -0
  164. package/dist/types/scan-output.js +2 -0
  165. package/dist/types/scan-output.js.map +1 -0
  166. package/dist/types/scoring.d.ts +15 -0
  167. package/dist/types/scoring.js +2 -0
  168. package/dist/types/scoring.js.map +1 -0
  169. package/dist/types/skill.d.ts +97 -0
  170. package/dist/types/skill.js +2 -0
  171. package/dist/types/skill.js.map +1 -0
  172. package/dist/utils/agent-detector.d.ts +2 -0
  173. package/dist/utils/agent-detector.js +22 -0
  174. package/dist/utils/agent-detector.js.map +1 -0
  175. package/dist/utils/interactive.d.ts +6 -0
  176. package/dist/utils/interactive.js +15 -0
  177. package/dist/utils/interactive.js.map +1 -0
  178. package/dist/utils/path.d.ts +5 -0
  179. package/dist/utils/path.js +31 -0
  180. package/dist/utils/path.js.map +1 -0
  181. package/dist/utils/progress.d.ts +17 -0
  182. package/dist/utils/progress.js +48 -0
  183. package/dist/utils/progress.js.map +1 -0
  184. package/dist/utils/thresholds.d.ts +6 -0
  185. package/dist/utils/thresholds.js +48 -0
  186. package/dist/utils/thresholds.js.map +1 -0
  187. package/package.json +63 -0
  188. package/skills/meta/general-js.skill.yaml +131 -0
  189. package/skills/patterns/clerk-auth.skill.yaml +349 -0
  190. package/skills/patterns/docker-deploy.skill.yaml +214 -0
  191. package/skills/patterns/drizzle.skill.yaml +277 -0
  192. package/skills/patterns/mongoose.skill.yaml +290 -0
  193. package/skills/patterns/nextauth.skill.yaml +308 -0
  194. package/skills/patterns/playwright-e2e.skill.yaml +265 -0
  195. package/skills/patterns/prisma.skill.yaml +255 -0
  196. package/skills/patterns/s3-storage.skill.yaml +235 -0
  197. package/skills/patterns/selenium-e2e.skill.yaml +276 -0
  198. package/skills/patterns/supabase-auth.skill.yaml +298 -0
  199. package/skills/patterns/supabase.skill.yaml +304 -0
  200. package/skills/patterns/vercel-deploy.skill.yaml +219 -0
  201. package/skills/patterns/vitest-testing.skill.yaml +262 -0
  202. package/skills/stacks/express-api.skill.yaml +155 -0
  203. package/skills/stacks/fastify-api.skill.yaml +119 -0
  204. package/skills/stacks/hono-api.skill.yaml +130 -0
  205. package/skills/stacks/nestjs.skill.yaml +135 -0
  206. package/skills/stacks/nextjs-app-router.skill.yaml +176 -0
  207. package/skills/stacks/react-spa.skill.yaml +153 -0
  208. package/skills/stacks/vue-nuxt.skill.yaml +115 -0
  209. package/templates/architect-plan.md +139 -0
  210. package/templates/architect-refactor.md +119 -0
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+ import { Command, CommanderError } from 'commander';
3
+ import { existsSync } from 'node:fs';
4
+ import { realpathSync } from 'node:fs';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { renderScanJson } from '../reporters/scan-json.js';
7
+ import { renderScanReport } from '../reporters/terminal.js';
8
+ import { runContextCommand } from './context-runner.js';
9
+ import { runInitCommand } from './init-runner.js';
10
+ import { runProjectScan } from './scan-runner.js';
11
+ import { listSkillsWithActiveStatus, renderSkillList } from '../skills/lister.js';
12
+ import { isInteractiveTerminal, promptForDirectory } from '../utils/interactive.js';
13
+ import { parseThresholdOption, ThresholdParseError } from '../utils/thresholds.js';
14
+ export { runProjectScan } from './scan-runner.js';
15
+ const CLI_NAME = 'architect';
16
+ const CLI_VERSION = '0.1.0';
17
+ export function createProgram(onScan, onContext, onInit, onSkillList = executeSkillList) {
18
+ const program = new Command();
19
+ program
20
+ .name(CLI_NAME)
21
+ .description('Scan JavaScript and TypeScript projects for structural health signals.')
22
+ .version(CLI_VERSION);
23
+ program
24
+ .command('scan')
25
+ .description('Discover project files and report metrics')
26
+ .argument('[directory]', 'Directory to scan; prompts interactively when omitted')
27
+ .option('--no-color', 'Disable ANSI color output')
28
+ .option('--json', 'Emit machine-readable JSON output')
29
+ .option('--verbose', 'Emit detailed scan diagnostics')
30
+ .option('--threshold <values>', 'Customize thresholds, for example: loc=300,complexity=15')
31
+ .exitOverride()
32
+ .action(async (directory, options) => {
33
+ await onScan(directory, options);
34
+ });
35
+ program
36
+ .command('context')
37
+ .description('Print the full architecture blueprint for one or more skills')
38
+ .requiredOption('--techstack <stacks...>', 'One or more skill IDs or display names to render')
39
+ .exitOverride()
40
+ .action(async (options) => {
41
+ await onContext(options);
42
+ });
43
+ program
44
+ .command('init')
45
+ .description('Generate coding-agent guidance files for a project')
46
+ .argument('<directory>', 'Directory to initialize')
47
+ .option('--skill <id>', 'Override automatic skill detection')
48
+ .option('--integration <agent>', 'Override automatic agent detection')
49
+ .option('--update', 'Overwrite existing Architect guidance files')
50
+ .exitOverride()
51
+ .action(async (directory, options) => {
52
+ await onInit(directory, options);
53
+ });
54
+ const skillCmd = program.command('skill').description('Manage Architect skills').exitOverride();
55
+ skillCmd
56
+ .command('list')
57
+ .description('List all available skills, marking which are active in the current directory')
58
+ .exitOverride()
59
+ .action(async () => {
60
+ await onSkillList();
61
+ });
62
+ return program;
63
+ }
64
+ export async function runCli(argv) {
65
+ let commandExitCode = 0;
66
+ const program = createProgram(async (directory, options) => {
67
+ commandExitCode = await executeScan(directory, options);
68
+ return commandExitCode;
69
+ }, async (options) => {
70
+ commandExitCode = await executeContext(options);
71
+ return commandExitCode;
72
+ }, async (directory, options) => {
73
+ commandExitCode = await executeInit(directory, options);
74
+ return commandExitCode;
75
+ }, async () => {
76
+ commandExitCode = await executeSkillList();
77
+ return commandExitCode;
78
+ });
79
+ program.exitOverride();
80
+ try {
81
+ await program.parseAsync(argv, { from: 'user' });
82
+ return commandExitCode;
83
+ }
84
+ catch (error) {
85
+ if (error instanceof CommanderError) {
86
+ if (error.code === 'commander.helpDisplayed' || error.code === 'commander.version') {
87
+ return 0;
88
+ }
89
+ return error.exitCode;
90
+ }
91
+ throw error;
92
+ }
93
+ }
94
+ export async function executeScan(directory, options = {}) {
95
+ const targetDirectory = await resolveScanTarget(directory, options);
96
+ if (!targetDirectory) {
97
+ return 3;
98
+ }
99
+ if (!existsSync(targetDirectory)) {
100
+ process.stderr.write(`Target directory does not exist: ${targetDirectory}\nCheck the path and run architect scan <directory>.\n`);
101
+ return 3;
102
+ }
103
+ const thresholds = parseScanThresholds(options);
104
+ if (!thresholds) {
105
+ return 3;
106
+ }
107
+ try {
108
+ const result = await runProjectScan(targetDirectory, { ...options, thresholds });
109
+ if (options.json) {
110
+ process.stdout.write(renderScanJson({
111
+ result,
112
+ targetDir: result.summary.targetDir,
113
+ verbose: options.verbose === true,
114
+ durationMs: result.summary.scanDurationMs,
115
+ warnings: result.warnings ?? [],
116
+ diagnostics: result.diagnostics ?? []
117
+ }));
118
+ }
119
+ else {
120
+ renderScanReport(result, { color: options.color !== false && options.noColor !== true, verbose: options.verbose === true });
121
+ }
122
+ return 0;
123
+ }
124
+ catch (error) {
125
+ if (error instanceof Error) {
126
+ process.stderr.write(`${error.message}\n`);
127
+ return 3;
128
+ }
129
+ throw error;
130
+ }
131
+ }
132
+ export async function executeContext(options) {
133
+ try {
134
+ const output = await runContextCommand(options.techstack ?? []);
135
+ process.stdout.write(`${output}\n`);
136
+ return 0;
137
+ }
138
+ catch (error) {
139
+ if (error instanceof Error) {
140
+ process.stderr.write(`${error.message}\n`);
141
+ return 3;
142
+ }
143
+ throw error;
144
+ }
145
+ }
146
+ export async function executeInit(directory, options = {}) {
147
+ if (!existsSync(directory)) {
148
+ process.stderr.write(`Target directory does not exist: ${directory}\nCheck the path and run architect init <directory>.\n`);
149
+ return 3;
150
+ }
151
+ try {
152
+ const summary = await runInitCommand(directory, options);
153
+ process.stdout.write(`Initialized ${summary.integration} guidance with skill ${summary.skillId}\n`);
154
+ if (summary.filesWritten.length > 0) {
155
+ process.stdout.write(`Files written:\n${summary.filesWritten.map((file) => `- ${file}`).join('\n')}\n`);
156
+ }
157
+ if (summary.filesSkipped.length > 0) {
158
+ process.stdout.write(`Files skipped:\n${summary.filesSkipped.map((file) => `- ${file}`).join('\n')}\n`);
159
+ }
160
+ for (const warning of summary.warnings) {
161
+ process.stderr.write(`${warning}\n`);
162
+ }
163
+ return 0;
164
+ }
165
+ catch (error) {
166
+ if (error instanceof Error) {
167
+ process.stderr.write(`${error.message}\n`);
168
+ return 3;
169
+ }
170
+ throw error;
171
+ }
172
+ }
173
+ export async function executeSkillList() {
174
+ try {
175
+ const checks = await listSkillsWithActiveStatus(process.cwd());
176
+ process.stdout.write(renderSkillList(checks));
177
+ return 0;
178
+ }
179
+ catch (error) {
180
+ if (error instanceof Error) {
181
+ process.stderr.write(`${error.message}\n`);
182
+ return 3;
183
+ }
184
+ throw error;
185
+ }
186
+ }
187
+ async function resolveScanTarget(directory, options) {
188
+ if (directory) {
189
+ return directory;
190
+ }
191
+ if (options.json || !isInteractiveTerminal()) {
192
+ process.stderr.write('Target directory required. Pass a directory, for example: architect scan .\n');
193
+ return null;
194
+ }
195
+ return promptForDirectory();
196
+ }
197
+ function parseScanThresholds(options) {
198
+ try {
199
+ return parseThresholdOption(options.threshold);
200
+ }
201
+ catch (error) {
202
+ if (error instanceof ThresholdParseError) {
203
+ process.stderr.write(`${error.message}\n`);
204
+ return null;
205
+ }
206
+ throw error;
207
+ }
208
+ }
209
+ async function main() {
210
+ const exitCode = await runCli(process.argv.slice(2));
211
+ process.exitCode = exitCode;
212
+ }
213
+ const executedFilePath = fileURLToPath(import.meta.url);
214
+ if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(executedFilePath)) {
215
+ void main();
216
+ }
217
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { AgentType } from '../utils/agent-detector.js';
2
+ import { type Ora } from 'ora';
3
+ import { runProjectScan, type ProjectScanOptions } from './scan-runner.js';
4
+ import { renderBundledTemplates } from '../generators/template-context.js';
5
+ import { type IntegrationWriter } from '../generators/writer-types.js';
6
+ import type { InitSummary } from '../types/generation.js';
7
+ import { loadSkills } from '../skills/loader.js';
8
+ export interface InitCommandOptions extends ProjectScanOptions {
9
+ skill?: string;
10
+ integration?: AgentType;
11
+ update?: boolean;
12
+ }
13
+ interface InitRunnerDependencies {
14
+ confirmOverwrite?: (message: string) => Promise<boolean>;
15
+ detectAgent?: (dir: string) => AgentType;
16
+ promptAgent?: () => Promise<AgentType>;
17
+ interactiveCheck?: () => boolean;
18
+ loadSkills?: typeof loadSkills;
19
+ runProjectScan?: typeof runProjectScan;
20
+ renderBundledTemplates?: typeof renderBundledTemplates;
21
+ writers?: Record<AgentType, IntegrationWriter>;
22
+ createSpinner?: (text: string) => Pick<Ora, 'start' | 'stop'>;
23
+ }
24
+ export declare function runInitCommand(directory: string, options?: InitCommandOptions, dependencies?: InitRunnerDependencies): Promise<InitSummary>;
25
+ export {};
@@ -0,0 +1,152 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { confirm, select } from '@inquirer/prompts';
4
+ import ora from 'ora';
5
+ import { runProjectScan } from './scan-runner.js';
6
+ import { buildClaudeWriterTargets } from '../generators/claudeWriter.js';
7
+ import { buildCopilotWriterTargets } from '../generators/copilotWriter.js';
8
+ import { buildGenericWriterTargets } from '../generators/genericWriter.js';
9
+ import { buildTemplateContext, renderBundledTemplates, resolveSkillByReference } from '../generators/template-context.js';
10
+ import { buildWindsurfWriterTargets } from '../generators/windsurfWriter.js';
11
+ import { buildCursorWriterTargets } from '../generators/cursorWriter.js';
12
+ import { findExistingWriterTargets, writeWriterTargets } from '../generators/writer-types.js';
13
+ import { loadSkills } from '../skills/loader.js';
14
+ import { detectAgent } from '../utils/agent-detector.js';
15
+ import { isInteractiveTerminal } from '../utils/interactive.js';
16
+ import { ensureDirectoryPath } from '../utils/path.js';
17
+ const WRITERS = {
18
+ claude: buildClaudeWriterTargets,
19
+ cursor: buildCursorWriterTargets,
20
+ windsurf: buildWindsurfWriterTargets,
21
+ copilot: buildCopilotWriterTargets,
22
+ generic: buildGenericWriterTargets
23
+ };
24
+ export async function runInitCommand(directory, options = {}, dependencies = {}) {
25
+ const targetDirectory = ensureDirectoryPath(directory);
26
+ const scanRunner = dependencies.runProjectScan ?? runProjectScan;
27
+ const skillLoader = dependencies.loadSkills ?? loadSkills;
28
+ const renderTemplates = dependencies.renderBundledTemplates ?? renderBundledTemplates;
29
+ const detectAgentForDirectory = dependencies.detectAgent ?? detectAgent;
30
+ const confirmOverwrite = dependencies.confirmOverwrite ?? defaultConfirmOverwrite;
31
+ const isInteractive = dependencies.interactiveCheck ?? (() => isInteractiveTerminal());
32
+ const writers = dependencies.writers ?? WRITERS;
33
+ const createSpinner = dependencies.createSpinner ?? ((text) => ora(text));
34
+ const promptAgent = dependencies.promptAgent ?? defaultPromptAgent;
35
+ const warnings = [];
36
+ if (!existsSync(join(targetDirectory, 'package.json'))) {
37
+ process.stderr.write('No package.json found. Continuing with file-pattern detection only.\n');
38
+ }
39
+ const fileCount = estimateFileCount(targetDirectory);
40
+ const spinner = fileCount > 500 ? createSpinner(`Scanning ${fileCount}+ files…`).start() : null;
41
+ let result;
42
+ try {
43
+ result = await scanRunner(targetDirectory, options);
44
+ }
45
+ finally {
46
+ spinner?.stop();
47
+ }
48
+ if (result.summary.totalFiles === 0) {
49
+ throw new Error('No source files found. Point architect at a JS/TS project root.');
50
+ }
51
+ const { skills } = await skillLoader();
52
+ const selectedSkill = resolveSelectedSkill(options.skill, result, skills);
53
+ if (!selectedSkill) {
54
+ if (options.skill) {
55
+ throw new Error(`Unknown architecture skill: ${options.skill}`);
56
+ }
57
+ throw new Error('Could not detect stack. Override with --skill <id>.');
58
+ }
59
+ let integration = options.integration ?? detectAgentForDirectory(targetDirectory);
60
+ if (!options.integration && integration === 'generic') {
61
+ if (isInteractive()) {
62
+ integration = await promptAgent();
63
+ }
64
+ else {
65
+ warnings.push('No known agent integration detected; using generic output.');
66
+ }
67
+ }
68
+ const context = buildTemplateContext(selectedSkill, result);
69
+ const renderedFiles = await renderTemplates(context);
70
+ const writer = writers[integration];
71
+ const targets = writer(renderedFiles);
72
+ const existingTargets = findExistingWriterTargets(targetDirectory, targets);
73
+ if (existingTargets.length > 0 && options.update !== true) {
74
+ if (!isInteractive()) {
75
+ throw new Error(`Architect guidance files already exist: ${existingTargets.join(', ')}\nRe-run with --update to overwrite them.`);
76
+ }
77
+ const confirmed = await confirmOverwrite(`Architect guidance already exists. Overwrite ${existingTargets.length} file(s)?`);
78
+ if (!confirmed) {
79
+ return {
80
+ targetDir: targetDirectory,
81
+ skillId: selectedSkill.id,
82
+ integration,
83
+ filesWritten: [],
84
+ filesSkipped: existingTargets,
85
+ warnings: [...warnings, 'Overwrite declined; no files were changed.']
86
+ };
87
+ }
88
+ }
89
+ const filesWritten = await writeWriterTargets(targetDirectory, targets);
90
+ return {
91
+ targetDir: targetDirectory,
92
+ skillId: selectedSkill.id,
93
+ integration,
94
+ filesWritten,
95
+ filesSkipped: [],
96
+ warnings
97
+ };
98
+ }
99
+ function resolveSelectedSkill(override, result, skills) {
100
+ if (override) {
101
+ return resolveSkillByReference(override, skills);
102
+ }
103
+ return result.matchedSkills?.find((match) => match.primary)?.skill;
104
+ }
105
+ async function defaultConfirmOverwrite(message) {
106
+ return confirm({
107
+ message,
108
+ default: false
109
+ });
110
+ }
111
+ async function defaultPromptAgent() {
112
+ return select({
113
+ message: 'Which coding agent are you using?',
114
+ choices: [
115
+ { name: 'Claude Code → .claude/skills/', value: 'claude' },
116
+ { name: 'Cursor → .cursor/rules/', value: 'cursor' },
117
+ { name: 'Windsurf → .windsurf/rules/', value: 'windsurf' },
118
+ { name: 'GitHub Copilot → .github/copilot-instructions.md', value: 'copilot' },
119
+ { name: 'Other / plain Markdown → .architect/skills/', value: 'generic' }
120
+ ]
121
+ });
122
+ }
123
+ const IGNORED_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage', '.turbo']);
124
+ function estimateFileCount(dir, depthLimit = 4, countLimit = 600) {
125
+ let count = 0;
126
+ function walk(current, depth) {
127
+ if (count >= countLimit)
128
+ return;
129
+ let entries;
130
+ try {
131
+ entries = readdirSync(current, { withFileTypes: true });
132
+ }
133
+ catch {
134
+ return;
135
+ }
136
+ for (const entry of entries) {
137
+ if (count >= countLimit)
138
+ return;
139
+ if (entry.isDirectory()) {
140
+ if (!IGNORED_DIRS.has(entry.name) && depth < depthLimit) {
141
+ walk(join(current, entry.name), depth + 1);
142
+ }
143
+ }
144
+ else {
145
+ count++;
146
+ }
147
+ }
148
+ }
149
+ walk(dir, 0);
150
+ return count;
151
+ }
152
+ //# sourceMappingURL=init-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-runner.js","sourceRoot":"","sources":["../../src/cli/init-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ScanResult } from '../types/analysis.js';
2
+ import type { ScanThresholds } from '../types/scan-output.js';
3
+ export type ProjectScanOptions = {
4
+ json?: boolean;
5
+ verbose?: boolean;
6
+ thresholds?: ScanThresholds;
7
+ };
8
+ export declare function runProjectScan(directory: string, options?: ProjectScanOptions): Promise<ScanResult>;
@@ -0,0 +1,133 @@
1
+ import { analyzeFile } from '../analyzers/ast-parser.js';
2
+ import { analyzeDependencyGraph } from '../analyzers/dependency-graph.js';
3
+ import { analyzeDuplication } from '../analyzers/duplication.js';
4
+ import { discoverFiles, discoverSkippedInputs } from '../analyzers/file-walker.js';
5
+ import { buildIssues, createReportGuidance } from '../scoring/issue-builder.js';
6
+ import { calculateHealthScore } from '../scoring/health-score.js';
7
+ import { scoreDuplication } from '../scoring/duplication-score.js';
8
+ import { scoreModularity } from '../scoring/modularity-score.js';
9
+ import { collectProjectCharacteristics, detectSkills } from '../skills/detector.js';
10
+ import { loadSkills } from '../skills/loader.js';
11
+ import { compareStructure } from '../skills/structure-check.js';
12
+ import { createEmptySummary } from '../types/analysis.js';
13
+ import { ensureDirectoryPath } from '../utils/path.js';
14
+ import { createProgressDiagnostics, createThresholdDiagnostics } from '../utils/progress.js';
15
+ import { DEFAULT_SCAN_THRESHOLDS } from '../utils/thresholds.js';
16
+ export async function runProjectScan(directory, options = {}) {
17
+ const targetDirectory = ensureDirectoryPath(directory);
18
+ const startedAt = Date.now();
19
+ const thresholds = options.thresholds ?? DEFAULT_SCAN_THRESHOLDS;
20
+ const discoveredFiles = await discoverFiles(targetDirectory);
21
+ const skippedInputs = await discoverSkippedInputs(targetDirectory);
22
+ const analysis = await analyzeFiles(discoveredFiles, targetDirectory, thresholds);
23
+ const dependencyGraph = await analyzeDependencyGraph(targetDirectory, analysis.files, analysis.parseErrors);
24
+ const duplication = await analyzeDuplication(targetDirectory, analysis.files, analysis.parseErrors);
25
+ const result = buildScanResult(targetDirectory, analysis.files, analysis.parseErrors, dependencyGraph, duplication, Date.now() - startedAt);
26
+ result.skippedInputs = skippedInputs;
27
+ result.diagnostics = createInitialDiagnostics(thresholds, discoveredFiles.length, options.verbose === true, skippedInputs);
28
+ await attachSkillContext(result, targetDirectory, discoveredFiles, analysis.files);
29
+ attachScoresAndGuidance(result, analysis.files, duplication);
30
+ result.warnings = buildScanWarnings(result);
31
+ result.diagnostics = [...(result.diagnostics ?? []), ...buildScanDiagnostics(result)];
32
+ return result;
33
+ }
34
+ async function analyzeFiles(filePaths, targetDirectory, thresholds) {
35
+ const files = [];
36
+ const parseErrors = [];
37
+ for (const filePath of filePaths) {
38
+ try {
39
+ files.push(await analyzeFile(filePath, targetDirectory, thresholds));
40
+ }
41
+ catch (error) {
42
+ parseErrors.push({
43
+ path: filePath,
44
+ relativePath: filePath.replace(`${targetDirectory}/`, ''),
45
+ error: error instanceof Error ? error.message : 'Unknown parse error'
46
+ });
47
+ }
48
+ }
49
+ return { files, parseErrors };
50
+ }
51
+ function createInitialDiagnostics(thresholds, fileCount, verbose, skippedInputs) {
52
+ const diagnostics = [
53
+ ...createThresholdDiagnostics(thresholds.locThreshold, thresholds.complexityThreshold),
54
+ ...createProgressDiagnostics(fileCount, verbose)
55
+ ];
56
+ if (skippedInputs.length > 0) {
57
+ diagnostics.push({
58
+ phase: 'discovery',
59
+ message: `${skippedInputs.length} unsupported or ignored input(s) were skipped.`,
60
+ details: {
61
+ skippedCount: skippedInputs.length,
62
+ reasons: skippedInputs.reduce((counts, input) => {
63
+ counts[input.reason] = (counts[input.reason] ?? 0) + 1;
64
+ return counts;
65
+ }, {})
66
+ }
67
+ });
68
+ }
69
+ return diagnostics;
70
+ }
71
+ async function attachSkillContext(result, targetDirectory, discoveredFiles, files) {
72
+ const skillLoadResult = await loadSkills();
73
+ const characteristics = await collectProjectCharacteristics(targetDirectory, discoveredFiles, files);
74
+ const matchedSkills = detectSkills(characteristics, skillLoadResult.skills);
75
+ result.skillLoadWarnings = skillLoadResult.warnings;
76
+ result.matchedSkills = matchedSkills;
77
+ result.structureComparison = await compareStructure(targetDirectory, matchedSkills);
78
+ }
79
+ function attachScoresAndGuidance(result, files, duplication) {
80
+ const modularityScore = scoreModularity(files);
81
+ const duplicationScore = scoreDuplication(duplication);
82
+ result.scores = calculateHealthScore(modularityScore, duplicationScore);
83
+ result.issues = buildIssues(result);
84
+ result.guidance = createReportGuidance(result);
85
+ }
86
+ function buildScanWarnings(result) {
87
+ const warnings = [
88
+ ...result.parseErrors.map((error) => ({
89
+ code: 'parse_error',
90
+ path: error.relativePath,
91
+ message: `Failed to parse ${error.relativePath}: ${error.error}`
92
+ })),
93
+ ...(result.skillLoadWarnings ?? []).map((warning) => ({
94
+ code: 'invalid_skill',
95
+ path: warning.file,
96
+ message: warning.message
97
+ }))
98
+ ];
99
+ if ((result.dependencyGraph.isPartial || result.duplication.isPartial) && result.summary.skippedFiles > 0) {
100
+ warnings.push({
101
+ code: 'partial_analysis',
102
+ message: `Dependency and duplication findings may be partial because ${result.summary.skippedFiles} file(s) were skipped.`
103
+ });
104
+ }
105
+ return warnings;
106
+ }
107
+ function buildScanDiagnostics(result) {
108
+ const diagnostics = [];
109
+ if (result.scores?.overall !== undefined && result.scores.overall <= 0) {
110
+ diagnostics.push({
111
+ phase: 'scoring',
112
+ message: 'Health score could not be computed.',
113
+ details: {}
114
+ });
115
+ }
116
+ return diagnostics;
117
+ }
118
+ function buildScanResult(targetDirectory, files, parseErrors, dependencyGraph, duplication, scanDurationMs) {
119
+ const summary = createEmptySummary(targetDirectory);
120
+ summary.totalFiles = files.length;
121
+ summary.skippedFiles = parseErrors.length;
122
+ summary.totalLoc = files.reduce((total, file) => total + file.loc, 0);
123
+ summary.totalLines = files.reduce((total, file) => total + file.totalLines, 0);
124
+ summary.flaggedFiles = files.filter((file) => file.isOversized).length;
125
+ summary.flaggedFunctions = files.reduce((total, file) => total + file.functions.filter((item) => item.isFlagged).length, 0);
126
+ summary.dependencyHotspots = dependencyGraph.hotspots.length;
127
+ summary.circularDependencies = dependencyGraph.circularDependencies.length;
128
+ summary.duplicateFindings = duplication.findings.length;
129
+ summary.duplicatedLines = duplication.duplicatedLines;
130
+ summary.scanDurationMs = scanDurationMs;
131
+ return { summary, files, parseErrors, dependencyGraph, duplication };
132
+ }
133
+ //# sourceMappingURL=scan-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-runner.js","sourceRoot":"","sources":["../../src/cli/scan-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { RefactorPlan } from '../types/plan.js';
2
+ export declare function renderPlanJson(plan: RefactorPlan): string;
@@ -0,0 +1,4 @@
1
+ export function renderPlanJson(plan) {
2
+ return `${JSON.stringify(plan, null, 2)}\n`;
3
+ }
4
+ //# sourceMappingURL=plan-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-json.js","sourceRoot":"","sources":["../../src/formatters/plan-json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { RefactorPlan } from '../types/plan.js';
2
+ export declare function renderPlanMarkdown(plan: RefactorPlan): string;
@@ -0,0 +1,42 @@
1
+ export function renderPlanMarkdown(plan) {
2
+ const lines = [
3
+ '# Refactoring Plan',
4
+ '',
5
+ plan.summary,
6
+ '',
7
+ `- Complexity: ${plan.estimatedComplexity}`,
8
+ `- Risk: ${plan.estimatedRisk}`,
9
+ `- Health: ${plan.source.healthLabel}`,
10
+ `- Issues considered: ${plan.source.issueCount}`,
11
+ ''
12
+ ];
13
+ for (const phase of plan.phases) {
14
+ lines.push(`## ${phase.name}`, '', phase.description, '');
15
+ for (const step of phase.steps) {
16
+ lines.push(formatStep(step));
17
+ }
18
+ lines.push('');
19
+ }
20
+ if (plan.validationFindings.length > 0) {
21
+ lines.push('## Validation Findings', '');
22
+ for (const finding of plan.validationFindings) {
23
+ const step = finding.stepNumber === null ? 'plan' : `step ${finding.stepNumber}`;
24
+ lines.push(`- **${finding.severity}** (${step}): ${finding.message} ${finding.suggestion}`);
25
+ }
26
+ lines.push('');
27
+ }
28
+ if (plan.assumptions.length > 0) {
29
+ lines.push('## Assumptions', '');
30
+ for (const assumption of plan.assumptions) {
31
+ lines.push(`- ${assumption}`);
32
+ }
33
+ lines.push('');
34
+ }
35
+ return `${lines.join('\n').trimEnd()}\n`;
36
+ }
37
+ function formatStep(step) {
38
+ const source = step.sourceFile ?? 'none';
39
+ const imports = step.importsToUpdate.length > 0 ? step.importsToUpdate.join(', ') : 'none';
40
+ return `- [ ] **${step.stepNumber}. ${step.action}** ${step.what}\n - Source: ${source}\n - Target: ${step.targetFile}\n - Why: ${step.why}\n - Dependency notes: ${step.dependencyNotes}\n - Imports to update: ${imports}\n - Risk: ${step.risk}`;
41
+ }
42
+ //# sourceMappingURL=plan-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-markdown.js","sourceRoot":"","sources":["../../src/formatters/plan-markdown.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,MAAM,KAAK,GAAa;QACtB,oBAAoB;QACpB,EAAE;QACF,IAAI,CAAC,OAAO;QACZ,EAAE;QACF,iBAAiB,IAAI,CAAC,mBAAmB,EAAE;QAC3C,WAAW,IAAI,CAAC,aAAa,EAAE;QAC/B,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QACtC,wBAAwB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QAChD,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;YACjF,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,QAAQ,OAAO,IAAI,MAAM,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,IAAkB;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,OAAO,WAAW,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,iBAAiB,MAAM,iBAAiB,IAAI,CAAC,UAAU,cAAc,IAAI,CAAC,GAAG,2BAA2B,IAAI,CAAC,eAAe,4BAA4B,OAAO,eAAe,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5P,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScanResult } from '../types/analysis.js';
2
+ import type { RefactorPlan } from '../types/plan.js';
3
+ import type { SkillMatch } from '../types/skill.js';
4
+ export declare function renderPlanPrompt(plan: RefactorPlan, scan: ScanResult, primarySkill: SkillMatch | null): string;