@girardelli/architect 1.2.1 → 2.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 (63) hide show
  1. package/README.md +111 -112
  2. package/dist/agent-generator.d.ts +95 -0
  3. package/dist/agent-generator.d.ts.map +1 -0
  4. package/dist/agent-generator.js +1295 -0
  5. package/dist/agent-generator.js.map +1 -0
  6. package/dist/cli.js +76 -2
  7. package/dist/cli.js.map +1 -1
  8. package/dist/html-reporter.d.ts +26 -4
  9. package/dist/html-reporter.d.ts.map +1 -1
  10. package/dist/html-reporter.js +832 -33
  11. package/dist/html-reporter.js.map +1 -1
  12. package/dist/index.d.ts +26 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +85 -8
  15. package/dist/index.js.map +1 -1
  16. package/dist/refactor-engine.d.ts +18 -0
  17. package/dist/refactor-engine.d.ts.map +1 -0
  18. package/dist/refactor-engine.js +86 -0
  19. package/dist/refactor-engine.js.map +1 -0
  20. package/dist/refactor-reporter.d.ts +20 -0
  21. package/dist/refactor-reporter.d.ts.map +1 -0
  22. package/dist/refactor-reporter.js +389 -0
  23. package/dist/refactor-reporter.js.map +1 -0
  24. package/dist/rules/barrel-optimizer.d.ts +13 -0
  25. package/dist/rules/barrel-optimizer.d.ts.map +1 -0
  26. package/dist/rules/barrel-optimizer.js +77 -0
  27. package/dist/rules/barrel-optimizer.js.map +1 -0
  28. package/dist/rules/dead-code-detector.d.ts +21 -0
  29. package/dist/rules/dead-code-detector.d.ts.map +1 -0
  30. package/dist/rules/dead-code-detector.js +117 -0
  31. package/dist/rules/dead-code-detector.js.map +1 -0
  32. package/dist/rules/hub-splitter.d.ts +13 -0
  33. package/dist/rules/hub-splitter.d.ts.map +1 -0
  34. package/dist/rules/hub-splitter.js +110 -0
  35. package/dist/rules/hub-splitter.js.map +1 -0
  36. package/dist/rules/import-organizer.d.ts +13 -0
  37. package/dist/rules/import-organizer.d.ts.map +1 -0
  38. package/dist/rules/import-organizer.js +85 -0
  39. package/dist/rules/import-organizer.js.map +1 -0
  40. package/dist/rules/module-grouper.d.ts +13 -0
  41. package/dist/rules/module-grouper.d.ts.map +1 -0
  42. package/dist/rules/module-grouper.js +110 -0
  43. package/dist/rules/module-grouper.js.map +1 -0
  44. package/dist/scorer.d.ts +12 -0
  45. package/dist/scorer.d.ts.map +1 -1
  46. package/dist/scorer.js +61 -17
  47. package/dist/scorer.js.map +1 -1
  48. package/dist/types.d.ts +51 -0
  49. package/dist/types.d.ts.map +1 -1
  50. package/package.json +1 -1
  51. package/src/agent-generator.ts +1401 -0
  52. package/src/cli.ts +83 -2
  53. package/src/html-reporter.ts +872 -35
  54. package/src/index.ts +108 -9
  55. package/src/refactor-engine.ts +117 -0
  56. package/src/refactor-reporter.ts +408 -0
  57. package/src/rules/barrel-optimizer.ts +97 -0
  58. package/src/rules/dead-code-detector.ts +132 -0
  59. package/src/rules/hub-splitter.ts +123 -0
  60. package/src/rules/import-organizer.ts +98 -0
  61. package/src/rules/module-grouper.ts +124 -0
  62. package/src/scorer.ts +63 -17
  63. package/src/types.ts +52 -0
package/src/cli.ts CHANGED
@@ -16,6 +16,7 @@
16
16
  import { architect } from './index.js';
17
17
  import { ReportGenerator } from './reporter.js';
18
18
  import { HtmlReportGenerator } from './html-reporter.js';
19
+ import { RefactorReportGenerator } from './refactor-reporter.js';
19
20
  import { writeFileSync } from 'fs';
20
21
  import { resolve, basename } from 'path';
21
22
 
@@ -48,6 +49,8 @@ Usage:
48
49
 
49
50
  Commands:
50
51
  analyze Full architecture analysis (default)
52
+ refactor Generate refactoring plan with actionable steps
53
+ agents Generate/audit .agent/ directory with AI agents
51
54
  diagram Generate architecture diagram only
52
55
  score Calculate quality score only
53
56
  anti-patterns Detect anti-patterns only
@@ -85,16 +88,20 @@ async function main(): Promise<void> {
85
88
  switch (options.command) {
86
89
  case 'analyze': {
87
90
  const report = await architect.analyze(options.path);
91
+ const plan = architect.refactor(report, options.path);
92
+ const agentSuggestion = architect.suggestAgents(report, plan, options.path);
88
93
  const projectName = report.projectInfo.name || basename(options.path);
89
94
 
90
95
  if (options.format === 'html') {
91
96
  const htmlGenerator = new HtmlReportGenerator();
92
- const html = htmlGenerator.generateHtml(report);
97
+ const html = htmlGenerator.generateHtml(report, plan, agentSuggestion);
93
98
  const outputPath = options.output || `architect-report-${projectName}.html`;
94
99
  writeFileSync(outputPath, html);
95
100
  console.log(`āœ… HTML report saved to: ${outputPath}`);
96
101
  console.log(`šŸ“Š Score: ${report.score.overall}/100`);
97
102
  console.log(`āš ļø Anti-patterns: ${report.antiPatterns.length}`);
103
+ console.log(`šŸ”§ Refactoring steps: ${plan.steps.length}`);
104
+ console.log(`šŸ¤– Suggested agents: ${agentSuggestion.suggestedAgents.length}`);
98
105
  } else if (options.format === 'markdown') {
99
106
  const mdGenerator = new ReportGenerator();
100
107
  const markdown = mdGenerator.generateMarkdownReport(report);
@@ -103,7 +110,7 @@ async function main(): Promise<void> {
103
110
  console.log(`āœ… Markdown report saved to: ${outputPath}`);
104
111
  } else {
105
112
  const outputPath = options.output || `architect-report-${projectName}.json`;
106
- writeFileSync(outputPath, JSON.stringify(report, null, 2));
113
+ writeFileSync(outputPath, JSON.stringify({ report, plan, agentSuggestion }, null, 2));
107
114
  console.log(`āœ… JSON report saved to: ${outputPath}`);
108
115
  }
109
116
 
@@ -117,6 +124,80 @@ async function main(): Promise<void> {
117
124
  console.log(`└─ Layering: ${report.score.breakdown.layering}`);
118
125
  console.log(`\nšŸ“ Files: ${report.projectInfo.totalFiles} | šŸ“ Lines: ${report.projectInfo.totalLines.toLocaleString()}`);
119
126
  console.log(`āš ļø Anti-patterns: ${report.antiPatterns.length}`);
127
+ console.log(`šŸ¤– Agents: ${agentSuggestion.suggestedAgents.length} suggested | ${agentSuggestion.hasExistingAgents ? 'Existing .agent/ audited' : 'No .agent/ found'}`);
128
+ break;
129
+ }
130
+
131
+ case 'refactor': {
132
+ const report = await architect.analyze(options.path);
133
+ const plan = architect.refactor(report, options.path);
134
+ const projectName = report.projectInfo.name || basename(options.path);
135
+
136
+ if (options.format === 'json') {
137
+ const outputPath = options.output || `refactor-plan-${projectName}.json`;
138
+ writeFileSync(outputPath, JSON.stringify(plan, null, 2));
139
+ console.log(`āœ… JSON refactoring plan saved to: ${outputPath}`);
140
+ } else {
141
+ const refactorReporter = new RefactorReportGenerator();
142
+ const html = refactorReporter.generateHtml(plan);
143
+ const outputPath = options.output || `refactor-plan-${projectName}.html`;
144
+ writeFileSync(outputPath, html);
145
+ console.log(`āœ… Refactoring plan saved to: ${outputPath}`);
146
+ }
147
+
148
+ console.log(`\n═══════════════════════════════════════`);
149
+ console.log(` REFACTORING PLAN`);
150
+ console.log(`═══════════════════════════════════════`);
151
+ console.log(`ā”œā”€ Steps: ${plan.steps.length}`);
152
+ console.log(`ā”œā”€ Operations: ${plan.totalOperations}`);
153
+ console.log(`ā”œā”€ Tier 1: ${plan.tier1Steps} (rule-based)`);
154
+ console.log(`ā”œā”€ Tier 2: ${plan.tier2Steps} (AST-based)`);
155
+ console.log(`ā”œā”€ Current: ${plan.currentScore.overall}/100`);
156
+ console.log(`└─ Estimated: ${plan.estimatedScoreAfter.overall}/100 (+${plan.estimatedScoreAfter.overall - plan.currentScore.overall})`);
157
+ break;
158
+ }
159
+
160
+ case 'agents': {
161
+ const report = await architect.analyze(options.path);
162
+ const plan = architect.refactor(report, options.path);
163
+ const outputDir = options.output || undefined;
164
+ const result = architect.agents(report, plan, options.path, outputDir);
165
+
166
+ console.log(`\n═══════════════════════════════════════`);
167
+ console.log(` šŸ¤– AGENT SYSTEM`);
168
+ console.log(`═══════════════════════════════════════`);
169
+
170
+ if (result.generated.length > 0) {
171
+ console.log(`\nāœ… Generated ${result.generated.length} files:`);
172
+ for (const file of result.generated) {
173
+ console.log(` šŸ“„ ${file}`);
174
+ }
175
+ }
176
+
177
+ if (result.audit.length > 0) {
178
+ const missing = result.audit.filter(f => f.type === 'MISSING');
179
+ const improvements = result.audit.filter(f => f.type === 'IMPROVEMENT');
180
+ const ok = result.audit.filter(f => f.type === 'OK');
181
+
182
+ if (ok.length > 0) {
183
+ console.log(`\nāœ… ${ok.length} checks passed`);
184
+ }
185
+ if (missing.length > 0) {
186
+ console.log(`\nāŒ ${missing.length} missing (auto-generated):`);
187
+ for (const f of missing) {
188
+ console.log(` šŸ“„ ${f.file} — ${f.description}`);
189
+ }
190
+ }
191
+ if (improvements.length > 0) {
192
+ console.log(`\nšŸ’” ${improvements.length} improvement suggestions:`);
193
+ for (const f of improvements) {
194
+ console.log(` ⚔ ${f.description}`);
195
+ if (f.suggestion) console.log(` → ${f.suggestion}`);
196
+ }
197
+ }
198
+ }
199
+
200
+ console.log(`\nšŸ“Š Score: ${report.score.overall}/100`);
120
201
  break;
121
202
  }
122
203