@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,5 @@
1
+ import { buildAIAgentPrompt, serializePrompt } from '../planner/plan-prompt-builder.js';
2
+ export function renderPlanPrompt(plan, scan, primarySkill) {
3
+ return `${serializePrompt(buildAIAgentPrompt(plan, scan, primarySkill))}\n`;
4
+ }
5
+ //# sourceMappingURL=plan-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-prompt.js","sourceRoot":"","sources":["../../src/formatters/plan-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAKxF,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,IAAgB,EAAE,YAA+B;IACpG,OAAO,GAAG,eAAe,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RefactorPlan } from '../types/plan.js';
2
+ export interface PlanTerminalOptions {
3
+ color?: boolean;
4
+ }
5
+ export declare function renderPlanTerminal(plan: RefactorPlan, options?: PlanTerminalOptions): string;
@@ -0,0 +1,62 @@
1
+ import chalk from 'chalk';
2
+ export function renderPlanTerminal(plan, options = {}) {
3
+ const color = options.color !== false;
4
+ const heading = color ? chalk.bold : (value) => value;
5
+ const muted = color ? chalk.gray : (value) => value;
6
+ const risk = color ? riskColor(plan.estimatedRisk) : (value) => value;
7
+ const lines = [
8
+ heading('Refactoring plan'),
9
+ plan.summary,
10
+ '',
11
+ `Complexity: ${plan.estimatedComplexity}`,
12
+ `Risk: ${risk(plan.estimatedRisk)}`,
13
+ `Health: ${plan.source.healthLabel}`,
14
+ ''
15
+ ];
16
+ for (const phase of plan.phases) {
17
+ lines.push(heading(phase.name), phase.description);
18
+ for (const step of phase.steps) {
19
+ lines.push(formatStep(step, muted));
20
+ }
21
+ lines.push('');
22
+ }
23
+ if (plan.validationFindings.length > 0) {
24
+ lines.push(heading('Validation findings'));
25
+ for (const finding of plan.validationFindings) {
26
+ const location = finding.stepNumber === null ? 'plan' : `step ${finding.stepNumber}`;
27
+ lines.push(`- ${finding.severity.toUpperCase()} ${location}: ${finding.message}`);
28
+ lines.push(` Suggestion: ${finding.suggestion}`);
29
+ }
30
+ lines.push('');
31
+ }
32
+ if (plan.assumptions.length > 0) {
33
+ lines.push(heading('Assumptions'));
34
+ for (const assumption of plan.assumptions) {
35
+ lines.push(`- ${assumption}`);
36
+ }
37
+ lines.push('');
38
+ }
39
+ lines.push(muted('Export with --format md, --format json, or --format prompt.'));
40
+ return `${lines.join('\n').trimEnd()}\n`;
41
+ }
42
+ function formatStep(step, muted) {
43
+ const source = step.sourceFile ?? 'none';
44
+ const imports = step.importsToUpdate.length > 0 ? step.importsToUpdate.join(', ') : 'none';
45
+ return [
46
+ `${step.stepNumber}. [${step.risk}] ${step.what}`,
47
+ ` ${muted('action')}: ${step.action}`,
48
+ ` ${muted('source')}: ${source}`,
49
+ ` ${muted('target')}: ${step.targetFile}`,
50
+ ` ${muted('why')}: ${step.why}`,
51
+ ` ${muted('dependencies')}: ${step.dependencyNotes}`,
52
+ ` ${muted('imports')}: ${imports}`
53
+ ].join('\n');
54
+ }
55
+ function riskColor(risk) {
56
+ if (risk === 'high')
57
+ return chalk.red;
58
+ if (risk === 'medium')
59
+ return chalk.yellow;
60
+ return chalk.green;
61
+ }
62
+ //# sourceMappingURL=plan-terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-terminal.js","sourceRoot":"","sources":["../../src/formatters/plan-terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ArchitectureSkill } from '../types/skill.js';
2
+ export declare function renderBlueprint(skill: ArchitectureSkill): string;
3
+ export declare function renderBlueprints(skills: ArchitectureSkill[]): string;
@@ -0,0 +1,27 @@
1
+ import { formatAntiPatterns, formatDataFlow, formatSeparationRules, formatStructureEntries } from './template-context.js';
2
+ export function renderBlueprint(skill) {
3
+ const sections = [
4
+ `# ${skill.name} (${skill.id})`,
5
+ '',
6
+ '## Structure',
7
+ '### Required',
8
+ formatStructureEntries(skill.structure.requiredDirs) || '- none',
9
+ '',
10
+ '### Recommended',
11
+ formatStructureEntries(skill.structure.recommendedDirs) || '- none',
12
+ '',
13
+ '## Data Flow',
14
+ formatDataFlow(skill) || '- none',
15
+ '',
16
+ '## Separation Rules',
17
+ formatSeparationRules(skill) || '- none',
18
+ '',
19
+ '## Anti-Patterns',
20
+ formatAntiPatterns(skill) || '- none'
21
+ ];
22
+ return sections.join('\n');
23
+ }
24
+ export function renderBlueprints(skills) {
25
+ return skills.map((skill) => renderBlueprint(skill)).join('\n\n---\n\n');
26
+ }
27
+ //# sourceMappingURL=blueprint-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-renderer.js","sourceRoot":"","sources":["../../src/generators/blueprint-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,QAAQ,GAAG;QACf,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,GAAG;QAC/B,EAAE;QACF,cAAc;QACd,cAAc;QACd,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,QAAQ;QAChE,EAAE;QACF,iBAAiB;QACjB,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,QAAQ;QACnE,EAAE;QACF,cAAc;QACd,cAAc,CAAC,KAAK,CAAC,IAAI,QAAQ;QACjC,EAAE;QACF,qBAAqB;QACrB,qBAAqB,CAAC,KAAK,CAAC,IAAI,QAAQ;QACxC,EAAE;QACF,kBAAkB;QAClB,kBAAkB,CAAC,KAAK,CAAC,IAAI,QAAQ;KACtC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA2B;IAC1D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderedSkillFile } from '../types/generation.js';
2
+ import type { WriterTarget } from './writer-types.js';
3
+ export declare function buildClaudeWriterTargets(files: RenderedSkillFile[]): WriterTarget[];
@@ -0,0 +1,9 @@
1
+ export function buildClaudeWriterTargets(files) {
2
+ return files.map((file) => ({
3
+ name: file.name,
4
+ relativePath: `.claude/skills/${file.name}/SKILL.md`,
5
+ content: file.content,
6
+ mode: 'replace'
7
+ }));
8
+ }
9
+ //# sourceMappingURL=claudeWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeWriter.js","sourceRoot":"","sources":["../../src/generators/claudeWriter.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CAAC,KAA0B;IACjE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,kBAAkB,IAAI,CAAC,IAAI,WAAW;QACpD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderedSkillFile } from '../types/generation.js';
2
+ import type { WriterTarget } from './writer-types.js';
3
+ export declare function buildCopilotWriterTargets(files: RenderedSkillFile[]): WriterTarget[];
@@ -0,0 +1,11 @@
1
+ export function buildCopilotWriterTargets(files) {
2
+ return [
3
+ {
4
+ name: 'copilot-instructions',
5
+ relativePath: '.github/copilot-instructions.md',
6
+ content: files.map((file) => `## ${file.name}\n\n${file.content.trim()}`).join('\n\n'),
7
+ mode: 'append'
8
+ }
9
+ ];
10
+ }
11
+ //# sourceMappingURL=copilotWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilotWriter.js","sourceRoot":"","sources":["../../src/generators/copilotWriter.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,yBAAyB,CAAC,KAA0B;IAClE,OAAO;QACL;YACE,IAAI,EAAE,sBAAsB;YAC5B,YAAY,EAAE,iCAAiC;YAC/C,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACtF,IAAI,EAAE,QAAQ;SACf;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderedSkillFile } from '../types/generation.js';
2
+ import type { WriterTarget } from './writer-types.js';
3
+ export declare function buildCursorWriterTargets(files: RenderedSkillFile[]): WriterTarget[];
@@ -0,0 +1,14 @@
1
+ export function buildCursorWriterTargets(files) {
2
+ return [
3
+ {
4
+ name: 'architect',
5
+ relativePath: '.cursor/rules/architect.mdc',
6
+ content: buildCombinedContent(files),
7
+ mode: 'replace'
8
+ }
9
+ ];
10
+ }
11
+ function buildCombinedContent(files) {
12
+ return files.map((file) => `## ${file.name}\n\n${file.content.trim()}`).join('\n\n');
13
+ }
14
+ //# sourceMappingURL=cursorWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorWriter.js","sourceRoot":"","sources":["../../src/generators/cursorWriter.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CAAC,KAA0B;IACjE,OAAO;QACL;YACE,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,6BAA6B;YAC3C,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC;YACpC,IAAI,EAAE,SAAS;SAChB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA0B;IACtD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderedSkillFile } from '../types/generation.js';
2
+ import type { WriterTarget } from './writer-types.js';
3
+ export declare function buildGenericWriterTargets(files: RenderedSkillFile[]): WriterTarget[];
@@ -0,0 +1,9 @@
1
+ export function buildGenericWriterTargets(files) {
2
+ return files.map((file) => ({
3
+ name: file.name,
4
+ relativePath: `.architect/skills/${file.name}/SKILL.md`,
5
+ content: file.content,
6
+ mode: 'replace'
7
+ }));
8
+ }
9
+ //# sourceMappingURL=genericWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genericWriter.js","sourceRoot":"","sources":["../../src/generators/genericWriter.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,yBAAyB,CAAC,KAA0B;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,qBAAqB,IAAI,CAAC,IAAI,WAAW;QACvD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ScanResult } from '../types/analysis.js';
2
+ import type { RenderedSkillFile, TemplateContext } from '../types/generation.js';
3
+ import type { ArchitectureSkill, StructureEntry } from '../types/skill.js';
4
+ declare const TEMPLATE_NAMES: readonly ["architect-plan", "architect-refactor"];
5
+ type TemplateName = (typeof TEMPLATE_NAMES)[number];
6
+ export declare function renderBundledTemplates(context: TemplateContext): Promise<RenderedSkillFile[]>;
7
+ export declare function loadBundledTemplate(name: TemplateName): Promise<string>;
8
+ export declare function buildTemplateContext(skill: ArchitectureSkill, result: ScanResult): TemplateContext;
9
+ export declare function resolveSkillByReference(reference: string, skills: ArchitectureSkill[]): ArchitectureSkill | undefined;
10
+ export declare function resolveSkillsByReference(references: string[], skills: ArchitectureSkill[]): {
11
+ resolvedSkills: ArchitectureSkill[];
12
+ missingReferences: string[];
13
+ };
14
+ export declare function formatStructureEntries(entries: StructureEntry[]): string;
15
+ export declare function formatDataFlow(skill: ArchitectureSkill): string;
16
+ export declare function formatSeparationRules(skill: ArchitectureSkill): string;
17
+ export declare function formatAntiPatterns(skill: ArchitectureSkill): string;
18
+ export {};
@@ -0,0 +1,126 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { render } from './templateRenderer.js';
5
+ const TEMPLATE_NAMES = ['architect-plan', 'architect-refactor'];
6
+ export async function renderBundledTemplates(context) {
7
+ const templates = await Promise.all(TEMPLATE_NAMES.map(async (name) => ({
8
+ name,
9
+ template: await loadBundledTemplate(name)
10
+ })));
11
+ return templates.map(({ name, template }) => ({
12
+ name,
13
+ content: render(template, context)
14
+ }));
15
+ }
16
+ export async function loadBundledTemplate(name) {
17
+ return fs.readFile(resolveTemplatePath(name), 'utf8');
18
+ }
19
+ export function buildTemplateContext(skill, result) {
20
+ const largestFiles = [...result.files]
21
+ .sort((left, right) => right.loc - left.loc || left.relativePath.localeCompare(right.relativePath))
22
+ .slice(0, 5)
23
+ .map((file) => `- ${file.relativePath} (${file.loc} LOC)`);
24
+ const hubFiles = [...result.dependencyGraph.hotspots]
25
+ .sort((left, right) => right.dependentCount - left.dependentCount || left.relativePath.localeCompare(right.relativePath))
26
+ .slice(0, 5)
27
+ .map((hotspot) => `- ${hotspot.relativePath} (${hotspot.dependentCount} dependents)`);
28
+ const missingDirs = (result.structureComparison?.entries ?? [])
29
+ .filter((entry) => entry.required && entry.status === 'missing')
30
+ .map((entry) => `- ${entry.path}`);
31
+ return {
32
+ skill: {
33
+ id: skill.id,
34
+ name: skill.name,
35
+ structure: {
36
+ required: formatStructureEntries(skill.structure.requiredDirs)
37
+ },
38
+ separation: {
39
+ data_flow: formatDataFlow(skill),
40
+ rules: formatSeparationRules(skill)
41
+ },
42
+ anti_patterns: formatAntiPatterns(skill)
43
+ },
44
+ analysis: {
45
+ largestFiles: largestFiles.join('\n'),
46
+ hubFiles: hubFiles.join('\n'),
47
+ duplicationPercent: `${result.duplication.duplicationPercentage.toFixed(1)}%`,
48
+ missingDirs: missingDirs.join('\n')
49
+ }
50
+ };
51
+ }
52
+ export function resolveSkillByReference(reference, skills) {
53
+ const normalized = reference.trim().toLowerCase();
54
+ return skills.find((skill) => skill.id.toLowerCase() === normalized)
55
+ ?? skills.find((skill) => skill.name.toLowerCase() === normalized);
56
+ }
57
+ export function resolveSkillsByReference(references, skills) {
58
+ const resolvedSkills = [];
59
+ const missingReferences = [];
60
+ const seen = new Set();
61
+ for (const reference of references) {
62
+ const skill = resolveSkillByReference(reference, skills);
63
+ if (!skill) {
64
+ missingReferences.push(reference);
65
+ continue;
66
+ }
67
+ if (!seen.has(skill.id)) {
68
+ resolvedSkills.push(skill);
69
+ seen.add(skill.id);
70
+ }
71
+ }
72
+ return { resolvedSkills, missingReferences };
73
+ }
74
+ export function formatStructureEntries(entries) {
75
+ return entries.map((entry) => `- ${entry.path}: ${entry.purpose}`).join('\n');
76
+ }
77
+ export function formatDataFlow(skill) {
78
+ const dataFlow = skill.patterns.dataFlow;
79
+ if (!dataFlow) {
80
+ return '';
81
+ }
82
+ const lines = [dataFlow.direction];
83
+ for (const rule of dataFlow.rules) {
84
+ lines.push(`- ${rule}`);
85
+ }
86
+ return lines.join('\n');
87
+ }
88
+ export function formatSeparationRules(skill) {
89
+ return skill.separation.rules
90
+ .map((rule) => {
91
+ const lines = [
92
+ `- ${rule.concern} -> ${rule.belongsIn}`,
93
+ ` Rule: ${rule.ruleText}`,
94
+ ' Example:',
95
+ indentBlock(rule.example)
96
+ ];
97
+ return lines.join('\n');
98
+ })
99
+ .join('\n\n');
100
+ }
101
+ export function formatAntiPatterns(skill) {
102
+ return skill.antiPatterns
103
+ .map((pattern) => {
104
+ const lines = [
105
+ `- ${pattern.id} [${pattern.severity}]`,
106
+ ` ${pattern.description}`,
107
+ ' Bad example:',
108
+ indentBlock(pattern.badExample),
109
+ ' Good example:',
110
+ indentBlock(pattern.goodExample)
111
+ ];
112
+ return lines.join('\n');
113
+ })
114
+ .join('\n\n');
115
+ }
116
+ function resolveTemplatePath(name) {
117
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), `../../templates/${name}.md`);
118
+ }
119
+ function indentBlock(value) {
120
+ return value
121
+ .trim()
122
+ .split('\n')
123
+ .map((line) => ` ${line}`)
124
+ .join('\n');
125
+ }
126
+ //# sourceMappingURL=template-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-context.js","sourceRoot":"","sources":["../../src/generators/template-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { TemplateContext } from '../types/generation.js';
2
+ export declare function render(template: string, context: TemplateContext): string;
@@ -0,0 +1,19 @@
1
+ const TOKEN_PATTERN = /{{\s*([\w.]+)\s*}}/g;
2
+ export function render(template, context) {
3
+ return template.replace(TOKEN_PATTERN, (_token, path) => {
4
+ const value = resolvePath(context, path);
5
+ if (value === undefined || value === null) {
6
+ return '';
7
+ }
8
+ return String(value);
9
+ });
10
+ }
11
+ function resolvePath(context, path) {
12
+ return path.split('.').reduce((current, segment) => {
13
+ if (current === null || current === undefined || typeof current !== 'object') {
14
+ return undefined;
15
+ }
16
+ return current[segment];
17
+ }, context);
18
+ }
19
+ //# sourceMappingURL=templateRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateRenderer.js","sourceRoot":"","sources":["../../src/generators/templateRenderer.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C,MAAM,UAAU,MAAM,CAAC,QAAgB,EAAE,OAAwB;IAC/D,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEzC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,OAAwB,EAAE,IAAY;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;QAC1D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAQ,OAAmC,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,EAAE,OAAO,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderedSkillFile } from '../types/generation.js';
2
+ import type { WriterTarget } from './writer-types.js';
3
+ export declare function buildWindsurfWriterTargets(files: RenderedSkillFile[]): WriterTarget[];
@@ -0,0 +1,14 @@
1
+ export function buildWindsurfWriterTargets(files) {
2
+ return [
3
+ {
4
+ name: 'architect',
5
+ relativePath: '.windsurf/rules/architect.md',
6
+ content: buildCombinedContent(files),
7
+ mode: 'replace'
8
+ }
9
+ ];
10
+ }
11
+ function buildCombinedContent(files) {
12
+ return files.map((file) => `## ${file.name}\n\n${file.content.trim()}`).join('\n\n');
13
+ }
14
+ //# sourceMappingURL=windsurfWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurfWriter.js","sourceRoot":"","sources":["../../src/generators/windsurfWriter.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CAAC,KAA0B;IACnE,OAAO;QACL;YACE,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,8BAA8B;YAC5C,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC;YACpC,IAAI,EAAE,SAAS;SAChB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA0B;IACtD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RenderedSkillFile } from '../types/generation.js';
2
+ export type WriterMode = 'replace' | 'append';
3
+ export interface WriterTarget {
4
+ name: string;
5
+ relativePath: string;
6
+ content: string;
7
+ mode: WriterMode;
8
+ }
9
+ export type IntegrationWriter = (files: RenderedSkillFile[]) => WriterTarget[];
10
+ export declare function findExistingWriterTargets(targetDir: string, targets: WriterTarget[]): string[];
11
+ export declare function writeWriterTargets(targetDir: string, targets: WriterTarget[]): Promise<string[]>;
@@ -0,0 +1,40 @@
1
+ import { existsSync } from 'node:fs';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ export function findExistingWriterTargets(targetDir, targets) {
5
+ return targets
6
+ .map((target) => target.relativePath)
7
+ .filter((relativePath) => existsSync(path.join(targetDir, relativePath)));
8
+ }
9
+ export async function writeWriterTargets(targetDir, targets) {
10
+ const written = [];
11
+ for (const target of targets) {
12
+ const destinationPath = path.join(targetDir, target.relativePath);
13
+ await fs.mkdir(path.dirname(destinationPath), { recursive: true });
14
+ if (target.mode === 'append') {
15
+ const existing = await readExisting(destinationPath);
16
+ const content = existing.trim().length > 0 ? `${existing.trimEnd()}\n\n${target.content}` : target.content;
17
+ await fs.writeFile(destinationPath, content, 'utf8');
18
+ }
19
+ else {
20
+ await fs.writeFile(destinationPath, target.content, 'utf8');
21
+ }
22
+ written.push(target.relativePath);
23
+ }
24
+ return written;
25
+ }
26
+ async function readExisting(filePath) {
27
+ try {
28
+ return await fs.readFile(filePath, 'utf8');
29
+ }
30
+ catch (error) {
31
+ if (isNodeError(error) && error.code === 'ENOENT') {
32
+ return '';
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+ function isNodeError(error) {
38
+ return error instanceof Error && 'code' in error;
39
+ }
40
+ //# sourceMappingURL=writer-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-types.js","sourceRoot":"","sources":["../../src/generators/writer-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAe7B,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,OAAuB;IAClF,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;SACpC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,OAAuB;IACjF,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3G,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AACnD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { LLMProvider } from './provider.js';
2
+ export declare class ClaudeProvider implements LLMProvider {
3
+ private readonly model;
4
+ readonly name = "Claude";
5
+ private readonly client;
6
+ constructor(apiKey: string, model: string);
7
+ analyze(prompt: string): Promise<string>;
8
+ }
@@ -0,0 +1,22 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ export class ClaudeProvider {
3
+ model;
4
+ name = 'Claude';
5
+ client;
6
+ constructor(apiKey, model) {
7
+ this.model = model;
8
+ this.client = new Anthropic({ apiKey });
9
+ }
10
+ async analyze(prompt) {
11
+ const response = await this.client.messages.create({
12
+ model: this.model,
13
+ max_tokens: 2000,
14
+ messages: [{ role: 'user', content: prompt }]
15
+ });
16
+ return response.content
17
+ .map((block) => (block.type === 'text' ? block.text : ''))
18
+ .join('')
19
+ .trim();
20
+ }
21
+ }
22
+ //# sourceMappingURL=claude-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-provider.js","sourceRoot":"","sources":["../../src/llm/claude-provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAI1C,MAAM,OAAO,cAAc;IAIoB;IAH7B,IAAI,GAAG,QAAQ,CAAC;IACf,MAAM,CAAY;IAEnC,YAAY,MAAc,EAAmB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QACxD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,OAAO;aACpB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACzD,IAAI,CAAC,EAAE,CAAC;aACR,IAAI,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { FileAnalysis } from '../types/analysis.js';
2
+ import type { ClassificationStatus, ConcernClassification } from '../types/concern.js';
3
+ import type { SkillMatch } from '../types/skill.js';
4
+ import { type ResolveProviderOptions } from './config.js';
5
+ export interface ConcernClassificationResult {
6
+ classifications: ConcernClassification[];
7
+ status: ClassificationStatus;
8
+ }
9
+ export interface ClassifyConcernsOptions extends ResolveProviderOptions {
10
+ projectRoot: string;
11
+ files: FileAnalysis[];
12
+ matchedSkills?: SkillMatch[];
13
+ tokenBudget?: number;
14
+ }
15
+ export declare function classifyConcerns(options: ClassifyConcernsOptions): Promise<ConcernClassificationResult>;
@@ -0,0 +1,61 @@
1
+ import { buildClassificationPrompt, createClassificationRequest } from './prompt-builder.js';
2
+ import { resolveLLMProvider } from './config.js';
3
+ import { parseConcernClassifications } from './response-parser.js';
4
+ export async function classifyConcerns(options) {
5
+ const resolution = resolveLLMProvider(options);
6
+ const warnings = [...resolution.config.warnings];
7
+ const filesWithFunctions = options.files.filter((file) => file.functions.length > 0);
8
+ if (filesWithFunctions.length === 0) {
9
+ return {
10
+ classifications: [],
11
+ status: {
12
+ mode: 'skipped',
13
+ reason: 'No functions were found to classify.',
14
+ warnings
15
+ }
16
+ };
17
+ }
18
+ if (!resolution.provider || !resolution.config.isAvailable) {
19
+ return {
20
+ classifications: [],
21
+ status: {
22
+ mode: 'skipped',
23
+ reason: resolution.config.warnings[0] ?? 'No AI provider configured.',
24
+ warnings
25
+ }
26
+ };
27
+ }
28
+ try {
29
+ const request = createClassificationRequest({
30
+ projectRoot: options.projectRoot,
31
+ files: filesWithFunctions,
32
+ matchedSkills: options.matchedSkills ?? [],
33
+ tokenBudget: options.tokenBudget
34
+ });
35
+ const prompt = buildClassificationPrompt(request);
36
+ const rawResponse = await resolution.provider.analyze(prompt);
37
+ const parsed = parseConcernClassifications(rawResponse, request.files);
38
+ const mode = parsed.warnings.length > 0 ? 'partial' : 'completed';
39
+ return {
40
+ classifications: parsed.classifications,
41
+ status: {
42
+ mode,
43
+ provider: resolution.provider.name,
44
+ reason: mode === 'partial' ? 'Some classification entries were invalid or incomplete.' : undefined,
45
+ warnings: [...warnings, ...parsed.warnings]
46
+ }
47
+ };
48
+ }
49
+ catch (error) {
50
+ return {
51
+ classifications: [],
52
+ status: {
53
+ mode: 'failed',
54
+ provider: resolution.provider.name,
55
+ reason: error instanceof Error ? error.message : 'AI provider failed during concern classification.',
56
+ warnings
57
+ }
58
+ };
59
+ }
60
+ }
61
+ //# sourceMappingURL=concern-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-classifier.js","sourceRoot":"","sources":["../../src/llm/concern-classifier.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAA+B,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAcnE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAgC;IACrE,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,eAAe,EAAE,EAAE;YACnB,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,sCAAsC;gBAC9C,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC3D,OAAO;YACL,eAAe,EAAE,EAAE;YACnB,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,4BAA4B;gBACrE,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,2BAA2B,CAAC;YAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,kBAAkB;YACzB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;YAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,2BAA2B,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;QAElE,OAAO;YACL,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,MAAM,EAAE;gBACN,IAAI;gBACJ,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI;gBAClC,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,yDAAyD,CAAC,CAAC,CAAC,SAAS;gBAClG,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;aAC5C;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,eAAe,EAAE,EAAE;YACnB,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI;gBAClC,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mDAAmD;gBACpG,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { LLMProvider, LLMProviderName, ProviderResolution } from './provider.js';
2
+ export interface ResolveProviderOptions {
3
+ env?: NodeJS.ProcessEnv;
4
+ explicitProvider?: LLMProviderName;
5
+ provider?: LLMProvider | null;
6
+ }
7
+ export declare function resolveLLMProvider(options?: ResolveProviderOptions): ProviderResolution;
8
+ export declare function sanitizeProviderWarning(warning: string): string;
9
+ export declare function parseProviderName(value: string | undefined): LLMProviderName | undefined;
10
+ export declare function parseProviderOption(value: string | undefined): LLMProviderName | undefined;
11
+ export declare function supportedProviderList(): string;