@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,130 @@
1
+ export declare const DEFAULT_LOC_THRESHOLD = 300;
2
+ export declare const DEFAULT_COMPLEXITY_THRESHOLD = 15;
3
+ export declare const SUPPORTED_EXTENSIONS: readonly [".js", ".jsx", ".ts", ".tsx"];
4
+ export declare const ALWAYS_EXCLUDED_DIRS: readonly ["node_modules", ".git", "dist", "build"];
5
+ export type SupportedExtension = (typeof SUPPORTED_EXTENSIONS)[number];
6
+ export interface FunctionInfo {
7
+ name: string;
8
+ paramCount: number;
9
+ startLine: number;
10
+ endLine: number;
11
+ loc: number;
12
+ complexity: number;
13
+ isFlagged: boolean;
14
+ }
15
+ export interface ClassInfo {
16
+ name: string;
17
+ startLine: number;
18
+ endLine: number;
19
+ methodCount: number;
20
+ }
21
+ export interface ImportInfo {
22
+ source: string;
23
+ isRelative: boolean;
24
+ isBuiltin: boolean;
25
+ specifiers: string[];
26
+ }
27
+ export interface ExportInfo {
28
+ name: string;
29
+ kind: 'named' | 'default' | 'all';
30
+ }
31
+ export interface FileAnalysis {
32
+ path: string;
33
+ relativePath: string;
34
+ loc: number;
35
+ blankLines: number;
36
+ commentLines: number;
37
+ totalLines: number;
38
+ functions: FunctionInfo[];
39
+ classes: ClassInfo[];
40
+ imports: ImportInfo[];
41
+ exports: ExportInfo[];
42
+ isOversized: boolean;
43
+ hasCriticalComplexity: boolean;
44
+ parseError: string | null;
45
+ }
46
+ export interface ParseError {
47
+ path: string;
48
+ relativePath: string;
49
+ error: string;
50
+ }
51
+ export interface DependencyNode {
52
+ path: string;
53
+ relativePath: string;
54
+ imports: string[];
55
+ importedBy: string[];
56
+ }
57
+ export interface CircularDependencyChain {
58
+ files: string[];
59
+ }
60
+ export interface DependencyHotspot {
61
+ relativePath: string;
62
+ dependentCount: number;
63
+ }
64
+ export interface DependencyGraphSummary {
65
+ nodes: DependencyNode[];
66
+ circularDependencies: CircularDependencyChain[];
67
+ hotspots: DependencyHotspot[];
68
+ unreferencedFiles: string[];
69
+ isPartial: boolean;
70
+ }
71
+ export interface DuplicationOccurrence {
72
+ relativePath: string;
73
+ startLine: number;
74
+ endLine: number;
75
+ }
76
+ export interface DuplicationFinding {
77
+ occurrences: DuplicationOccurrence[];
78
+ duplicatedLines: number;
79
+ similarity: number | null;
80
+ }
81
+ export interface DuplicationSummary {
82
+ findings: DuplicationFinding[];
83
+ duplicatedLines: number;
84
+ duplicationPercentage: number;
85
+ isPartial: boolean;
86
+ }
87
+ export interface ScanSummary {
88
+ targetDir: string;
89
+ totalFiles: number;
90
+ skippedFiles: number;
91
+ totalLoc: number;
92
+ totalLines: number;
93
+ flaggedFiles: number;
94
+ flaggedFunctions: number;
95
+ dependencyHotspots: number;
96
+ circularDependencies: number;
97
+ duplicateFindings: number;
98
+ duplicatedLines: number;
99
+ scanDurationMs: number;
100
+ }
101
+ import type { ScoreBreakdown } from './scoring.js';
102
+ import type { SkillMatch, SkillWarning, StructureComparison } from './skill.js';
103
+ import type { ReportGuidance, ReportIssue } from './issue.js';
104
+ import type { ScanDiagnostic, ScanWarning, SkippedInput } from './scan-output.js';
105
+ export interface ScanResult {
106
+ summary: ScanSummary;
107
+ files: FileAnalysis[];
108
+ parseErrors: ParseError[];
109
+ dependencyGraph: DependencyGraphSummary;
110
+ duplication: DuplicationSummary;
111
+ skillLoadWarnings?: SkillWarning[];
112
+ matchedSkills?: SkillMatch[];
113
+ structureComparison?: StructureComparison | null;
114
+ scores?: ScoreBreakdown;
115
+ issues?: ReportIssue[];
116
+ guidance?: ReportGuidance;
117
+ warnings?: ScanWarning[];
118
+ diagnostics?: ScanDiagnostic[];
119
+ skippedInputs?: SkippedInput[];
120
+ }
121
+ export interface ScanOptions {
122
+ cwd?: string;
123
+ color?: boolean;
124
+ locThreshold?: number;
125
+ complexityThreshold?: number;
126
+ }
127
+ export declare function createEmptySummary(targetDir: string): ScanSummary;
128
+ export declare function createEmptyDependencyGraphSummary(isPartial?: boolean): DependencyGraphSummary;
129
+ export declare function createEmptyDuplicationSummary(isPartial?: boolean): DuplicationSummary;
130
+ export declare function isSupportedExtension(filePath: string): boolean;
@@ -0,0 +1,41 @@
1
+ export const DEFAULT_LOC_THRESHOLD = 300;
2
+ export const DEFAULT_COMPLEXITY_THRESHOLD = 15;
3
+ export const SUPPORTED_EXTENSIONS = ['.js', '.jsx', '.ts', '.tsx'];
4
+ export const ALWAYS_EXCLUDED_DIRS = ['node_modules', '.git', 'dist', 'build'];
5
+ export function createEmptySummary(targetDir) {
6
+ return {
7
+ targetDir,
8
+ totalFiles: 0,
9
+ skippedFiles: 0,
10
+ totalLoc: 0,
11
+ totalLines: 0,
12
+ flaggedFiles: 0,
13
+ flaggedFunctions: 0,
14
+ dependencyHotspots: 0,
15
+ circularDependencies: 0,
16
+ duplicateFindings: 0,
17
+ duplicatedLines: 0,
18
+ scanDurationMs: 0
19
+ };
20
+ }
21
+ export function createEmptyDependencyGraphSummary(isPartial = false) {
22
+ return {
23
+ nodes: [],
24
+ circularDependencies: [],
25
+ hotspots: [],
26
+ unreferencedFiles: [],
27
+ isPartial
28
+ };
29
+ }
30
+ export function createEmptyDuplicationSummary(isPartial = false) {
31
+ return {
32
+ findings: [],
33
+ duplicatedLines: 0,
34
+ duplicationPercentage: 0,
35
+ isPartial
36
+ };
37
+ }
38
+ export function isSupportedExtension(filePath) {
39
+ return SUPPORTED_EXTENSIONS.some((extension) => filePath.endsWith(extension));
40
+ }
41
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/types/analysis.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AA8IvF,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO;QACL,SAAS;QACT,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,kBAAkB,EAAE,CAAC;QACrB,oBAAoB,EAAE,CAAC;QACvB,iBAAiB,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,SAAS,GAAG,KAAK;IACjE,OAAO;QACL,KAAK,EAAE,EAAE;QACT,oBAAoB,EAAE,EAAE;QACxB,QAAQ,EAAE,EAAE;QACZ,iBAAiB,EAAE,EAAE;QACrB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,SAAS,GAAG,KAAK;IAC7D,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,CAAC;QAClB,qBAAqB,EAAE,CAAC;QACxB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { ImportInfo } from './analysis.js';
2
+ import type { SeparationRule } from './skill.js';
3
+ export declare const CONCERN_TYPES: readonly ["routing", "business_logic", "data_access", "validation", "middleware", "ui_component", "utility", "configuration", "test", "unclassified"];
4
+ export type ConcernType = (typeof CONCERN_TYPES)[number];
5
+ export type ClassificationMode = 'completed' | 'skipped' | 'partial' | 'failed';
6
+ export interface FunctionSignatureSummary {
7
+ name: string;
8
+ paramCount: number;
9
+ startLine: number;
10
+ endLine: number;
11
+ }
12
+ export interface FileClassificationInput {
13
+ relativePath: string;
14
+ imports: ImportInfo[];
15
+ functions: FunctionSignatureSummary[];
16
+ }
17
+ export interface ClassificationSkillContext {
18
+ id: string;
19
+ name: string;
20
+ separationRules: SeparationRule[];
21
+ }
22
+ export interface ClassificationRequest {
23
+ projectRoot: string;
24
+ skill: ClassificationSkillContext | null;
25
+ files: FileClassificationInput[];
26
+ tokenBudget: number;
27
+ }
28
+ export interface FunctionConcernClassification {
29
+ name: string;
30
+ concern: ConcernType;
31
+ confidence: number;
32
+ isMisplaced: boolean;
33
+ reason?: string;
34
+ }
35
+ export interface ConcernClassification {
36
+ file: string;
37
+ functions: FunctionConcernClassification[];
38
+ dominantConcern: ConcernType;
39
+ mixedConcerns: boolean;
40
+ warnings: string[];
41
+ }
42
+ export interface ClassificationStatus {
43
+ mode: ClassificationMode;
44
+ provider?: string;
45
+ reason?: string;
46
+ warnings: string[];
47
+ }
48
+ export declare function isConcernType(value: string): value is ConcernType;
@@ -0,0 +1,16 @@
1
+ export const CONCERN_TYPES = [
2
+ 'routing',
3
+ 'business_logic',
4
+ 'data_access',
5
+ 'validation',
6
+ 'middleware',
7
+ 'ui_component',
8
+ 'utility',
9
+ 'configuration',
10
+ 'test',
11
+ 'unclassified'
12
+ ];
13
+ export function isConcernType(value) {
14
+ return CONCERN_TYPES.includes(value);
15
+ }
16
+ //# sourceMappingURL=concern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern.js","sourceRoot":"","sources":["../../src/types/concern.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,SAAS;IACT,eAAe;IACf,MAAM;IACN,cAAc;CACN,CAAC;AAsDX,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAoB,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,32 @@
1
+ export interface TemplateContext {
2
+ skill: {
3
+ id: string;
4
+ name: string;
5
+ structure: {
6
+ required: string;
7
+ };
8
+ separation: {
9
+ data_flow: string;
10
+ rules: string;
11
+ };
12
+ anti_patterns: string;
13
+ };
14
+ analysis: {
15
+ largestFiles: string;
16
+ hubFiles: string;
17
+ duplicationPercent: string;
18
+ missingDirs: string;
19
+ };
20
+ }
21
+ export interface RenderedSkillFile {
22
+ name: string;
23
+ content: string;
24
+ }
25
+ export interface InitSummary {
26
+ targetDir: string;
27
+ skillId: string;
28
+ integration: string;
29
+ filesWritten: string[];
30
+ filesSkipped: string[];
31
+ warnings: string[];
32
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/types/generation.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export type IssueSeverity = 'critical' | 'warning' | 'info';
2
+ export interface ReportIssue {
3
+ severity: IssueSeverity;
4
+ category: string;
5
+ location?: string;
6
+ message: string;
7
+ suggestion: string;
8
+ }
9
+ export interface ReportGuidance {
10
+ message: string;
11
+ command?: string;
12
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/types/issue.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { ConcernType } from './concern.js';
2
+ export type PatternConfidence = 'high' | 'medium' | 'low' | 'insufficient';
3
+ export interface PatternDeviation {
4
+ location: string;
5
+ pattern: string;
6
+ expectedPattern: string;
7
+ }
8
+ export interface PatternFinding {
9
+ concern: ConcernType;
10
+ dominantPattern: string | null;
11
+ patternCount: number;
12
+ deviations: PatternDeviation[];
13
+ confidence: PatternConfidence;
14
+ reason: string;
15
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/types/pattern.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import type { ScanResult } from './analysis.js';
2
+ import type { SkillMatch } from './skill.js';
3
+ export type PlanRisk = 'low' | 'medium' | 'high';
4
+ export type PlanComplexity = 'low' | 'medium' | 'high';
5
+ export type RefactorAction = 'create_dir' | 'extract' | 'move' | 'consolidate' | 'delete' | 'update_imports';
6
+ export type PlanValidationSeverity = 'warning' | 'error';
7
+ export type PlanOutputFormat = 'terminal' | 'md' | 'json' | 'prompt';
8
+ export interface RefactorPlan {
9
+ summary: string;
10
+ estimatedComplexity: PlanComplexity;
11
+ estimatedRisk: PlanRisk;
12
+ phases: PlanPhase[];
13
+ validationFindings: PlanValidationFinding[];
14
+ assumptions: string[];
15
+ source: {
16
+ targetDir: string;
17
+ primarySkillId: string | null;
18
+ healthLabel: string;
19
+ issueCount: number;
20
+ };
21
+ }
22
+ export interface PlanPhase {
23
+ name: string;
24
+ description: string;
25
+ steps: RefactorStep[];
26
+ }
27
+ export interface RefactorStep {
28
+ stepNumber: number;
29
+ action: RefactorAction;
30
+ sourceFile: string | null;
31
+ targetFile: string;
32
+ what: string;
33
+ why: string;
34
+ lineRange: string | null;
35
+ importsToUpdate: string[];
36
+ dependencyNotes: string;
37
+ risk: PlanRisk;
38
+ confidence: 'low' | 'medium' | 'high';
39
+ }
40
+ export interface PlanValidationFinding {
41
+ severity: PlanValidationSeverity;
42
+ stepNumber: number | null;
43
+ message: string;
44
+ suggestion: string;
45
+ }
46
+ export interface PlanGenerationContext {
47
+ scan: ScanResult;
48
+ primarySkill: SkillMatch | null;
49
+ }
50
+ export interface AIAgentPrompt {
51
+ projectContext: string;
52
+ skillBlueprint: string;
53
+ plan: string;
54
+ constraints: string[];
55
+ budgetStatus: 'within_budget' | 'trimmed';
56
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/types/plan.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import type { ScanResult } from './analysis.js';
2
+ export type ScanRunStatus = 'success' | 'partial' | 'failed';
3
+ export type ScanOutputMode = 'terminal' | 'json';
4
+ export type SkippedInputReason = 'unsupported_type' | 'binary' | 'parse_error' | 'ignored' | 'unreadable' | 'outside_target';
5
+ export type QualityObservationType = 'bug' | 'threshold_tuning' | 'message_tuning' | 'plan_quality' | 'note';
6
+ export type QualityObservationSeverity = 'low' | 'medium' | 'high';
7
+ export interface ScanThresholds {
8
+ locThreshold: number;
9
+ complexityThreshold: number;
10
+ }
11
+ export interface ThresholdConfiguration extends ScanThresholds {
12
+ source: 'default' | 'cli';
13
+ }
14
+ export interface ScanWarning {
15
+ code: string;
16
+ message: string;
17
+ path?: string;
18
+ }
19
+ export interface ScanDiagnostic {
20
+ phase: string;
21
+ message: string;
22
+ details?: Record<string, unknown>;
23
+ }
24
+ export interface SkippedInput {
25
+ path: string;
26
+ reason: SkippedInputReason;
27
+ message: string;
28
+ affectsConfidence: boolean;
29
+ }
30
+ export interface ScanRun {
31
+ targetDir: string;
32
+ status: ScanRunStatus;
33
+ outputMode: ScanOutputMode;
34
+ verbose: boolean;
35
+ startedAt: string;
36
+ durationMs: number;
37
+ warnings: ScanWarning[];
38
+ diagnostics: ScanDiagnostic[];
39
+ result: ScanResult | null;
40
+ }
41
+ export interface MetricsOnlyResult {
42
+ availableDimensions: string[];
43
+ unavailableDimensions: Array<{
44
+ id: string;
45
+ reason: string;
46
+ }>;
47
+ healthState: string;
48
+ classificationStatus: string;
49
+ }
50
+ export interface MachineReadableScanOutput {
51
+ schemaVersion: '1.0';
52
+ command: {
53
+ name: 'scan';
54
+ targetDir: string;
55
+ verbose: boolean;
56
+ };
57
+ run: {
58
+ status: ScanRunStatus;
59
+ durationMs: number;
60
+ outputMode: 'json';
61
+ };
62
+ result: ScanResult | null;
63
+ warnings: ScanWarning[];
64
+ diagnostics: ScanDiagnostic[];
65
+ error?: {
66
+ message: string;
67
+ correctiveAction: string;
68
+ };
69
+ }
70
+ export interface IntegrationSample {
71
+ name: string;
72
+ category: string;
73
+ source: string;
74
+ commandsRun: string[];
75
+ outcome: 'pass' | 'partial' | 'blocked';
76
+ observations: QualityObservation[];
77
+ }
78
+ export interface QualityObservation {
79
+ sampleName: string;
80
+ type: QualityObservationType;
81
+ severity: QualityObservationSeverity;
82
+ description: string;
83
+ followUp: string;
84
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scan-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-output.js","sourceRoot":"","sources":["../../src/types/scan-output.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export type ScoreLabel = 'healthy' | 'warning' | 'critical';
2
+ export type HealthLabel = ScoreLabel | 'unavailable';
3
+ export type ScoreDimensionId = 'modularity' | 'duplication';
4
+ export interface DimensionScore {
5
+ score: number;
6
+ weight: number;
7
+ label: ScoreLabel;
8
+ reasons: string[];
9
+ }
10
+ export interface ScoreBreakdown {
11
+ modularity: DimensionScore;
12
+ duplication: DimensionScore;
13
+ overall: number;
14
+ label: HealthLabel;
15
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/types/scoring.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ export declare const SUPPORTED_SKILL_SCHEMA_VERSION = "2.0.0";
2
+ export type SkillCategory = 'stack' | 'pattern' | 'meta';
3
+ export type SkillConfidence = 'high' | 'medium' | 'low';
4
+ export type IssueSeverity = 'info' | 'warning' | 'critical';
5
+ export interface ArchitectureSkill {
6
+ schemaVersion: string;
7
+ id: string;
8
+ name: string;
9
+ version: string;
10
+ description: string;
11
+ category: SkillCategory;
12
+ language: string;
13
+ frameworks: string[];
14
+ detection: DetectionRules;
15
+ structure: TargetStructure;
16
+ separation: SeparationRules;
17
+ patterns: PatternRules;
18
+ antiPatterns: AntiPattern[];
19
+ }
20
+ export interface DetectionRules {
21
+ dependencies?: {
22
+ any?: string[];
23
+ all?: string[];
24
+ none?: string[];
25
+ };
26
+ files?: string[];
27
+ sourceIndicators?: string[];
28
+ }
29
+ export interface TargetStructure {
30
+ requiredDirs: StructureEntry[];
31
+ recommendedDirs: StructureEntry[];
32
+ }
33
+ export interface StructureEntry {
34
+ path: string;
35
+ purpose: string;
36
+ }
37
+ export interface SeparationRules {
38
+ rules: SeparationRule[];
39
+ }
40
+ export interface SeparationRule {
41
+ concern: string;
42
+ belongsIn: string;
43
+ ruleText: string;
44
+ example: string;
45
+ indicators?: string[];
46
+ antiIndicators?: string[];
47
+ }
48
+ export interface PatternRules {
49
+ naming?: Record<string, string>;
50
+ dataFlow?: {
51
+ direction: string;
52
+ rules: string[];
53
+ };
54
+ errorHandling?: {
55
+ recommended: string;
56
+ };
57
+ custom?: Record<string, unknown>;
58
+ }
59
+ export interface AntiPattern {
60
+ id: string;
61
+ severity: IssueSeverity;
62
+ description: string;
63
+ badExample: string;
64
+ goodExample: string;
65
+ }
66
+ export interface SkillWarning {
67
+ file: string;
68
+ message: string;
69
+ }
70
+ export interface SkillLoadResult {
71
+ skills: ArchitectureSkill[];
72
+ warnings: SkillWarning[];
73
+ }
74
+ export interface ProjectCharacteristics {
75
+ rootDir: string;
76
+ dependencies: Set<string>;
77
+ files: string[];
78
+ sourceText: string;
79
+ }
80
+ export interface SkillMatch {
81
+ skill: ArchitectureSkill;
82
+ confidence: SkillConfidence;
83
+ score: number;
84
+ reasons: string[];
85
+ primary: boolean;
86
+ }
87
+ export interface StructureComparison {
88
+ skillId: string;
89
+ entries: StructureComparisonEntry[];
90
+ isAvailable: boolean;
91
+ }
92
+ export interface StructureComparisonEntry {
93
+ path: string;
94
+ purpose: string;
95
+ required: boolean;
96
+ status: 'present' | 'missing';
97
+ }
@@ -0,0 +1,2 @@
1
+ export const SUPPORTED_SKILL_SCHEMA_VERSION = '2.0.0';
2
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/types/skill.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type AgentType = 'claude' | 'cursor' | 'windsurf' | 'copilot' | 'generic';
2
+ export declare function detectAgent(dir: string): AgentType;
@@ -0,0 +1,22 @@
1
+ import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ const AGENT_DIRS = [
4
+ { dir: '.claude', agent: 'claude' },
5
+ { dir: '.cursor', agent: 'cursor' },
6
+ { dir: '.windsurf', agent: 'windsurf' },
7
+ { dir: '.github', agent: 'copilot' }
8
+ ];
9
+ export function detectAgent(dir) {
10
+ try {
11
+ for (const { dir: agentDir, agent } of AGENT_DIRS) {
12
+ if (existsSync(path.join(dir, agentDir))) {
13
+ return agent;
14
+ }
15
+ }
16
+ }
17
+ catch {
18
+ // fs errors return generic
19
+ }
20
+ return 'generic';
21
+ }
22
+ //# sourceMappingURL=agent-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-detector.js","sourceRoot":"","sources":["../../src/utils/agent-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,GAA6C;IAC3D,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;CACrC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;YAClD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface InteractiveStreams {
2
+ stdin?: NodeJS.ReadStream;
3
+ stdout?: NodeJS.WriteStream;
4
+ }
5
+ export declare function isInteractiveTerminal(streams?: InteractiveStreams): boolean;
6
+ export declare function promptForDirectory(message?: string): Promise<string>;
@@ -0,0 +1,15 @@
1
+ import { input } from '@inquirer/prompts';
2
+ export function isInteractiveTerminal(streams = {}) {
3
+ const stdin = streams.stdin ?? process.stdin;
4
+ const stdout = streams.stdout ?? process.stdout;
5
+ return stdin.isTTY === true && stdout.isTTY === true;
6
+ }
7
+ export async function promptForDirectory(message = 'Directory to scan:') {
8
+ const answer = await input({
9
+ message,
10
+ default: '.',
11
+ required: true
12
+ });
13
+ return answer.trim();
14
+ }
15
+ //# sourceMappingURL=interactive.js.map