@aionlabsai/aion 0.2.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.
- package/README.md +41 -0
- package/dist/agents/base-agent.d.ts +27 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +97 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/developer.d.ts +21 -0
- package/dist/agents/developer.d.ts.map +1 -0
- package/dist/agents/developer.js +51 -0
- package/dist/agents/developer.js.map +1 -0
- package/dist/agents/explain-agent.d.ts +17 -0
- package/dist/agents/explain-agent.d.ts.map +1 -0
- package/dist/agents/explain-agent.js +30 -0
- package/dist/agents/explain-agent.js.map +1 -0
- package/dist/agents/graph-agent.d.ts +21 -0
- package/dist/agents/graph-agent.d.ts.map +1 -0
- package/dist/agents/graph-agent.js +57 -0
- package/dist/agents/graph-agent.js.map +1 -0
- package/dist/agents/investigator.d.ts +21 -0
- package/dist/agents/investigator.d.ts.map +1 -0
- package/dist/agents/investigator.js +48 -0
- package/dist/agents/investigator.js.map +1 -0
- package/dist/agents/planner.d.ts +19 -0
- package/dist/agents/planner.d.ts.map +1 -0
- package/dist/agents/planner.js +43 -0
- package/dist/agents/planner.js.map +1 -0
- package/dist/agents/planner.test.d.ts +2 -0
- package/dist/agents/planner.test.d.ts.map +1 -0
- package/dist/agents/planner.test.js +21 -0
- package/dist/agents/planner.test.js.map +1 -0
- package/dist/agents/qa.d.ts +18 -0
- package/dist/agents/qa.d.ts.map +1 -0
- package/dist/agents/qa.js +44 -0
- package/dist/agents/qa.js.map +1 -0
- package/dist/agents/reviewer.d.ts +19 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/reviewer.js +47 -0
- package/dist/agents/reviewer.js.map +1 -0
- package/dist/agents/scanner.d.ts +19 -0
- package/dist/agents/scanner.d.ts.map +1 -0
- package/dist/agents/scanner.js +30 -0
- package/dist/agents/scanner.js.map +1 -0
- package/dist/agents/synthesizer.d.ts +16 -0
- package/dist/agents/synthesizer.d.ts.map +1 -0
- package/dist/agents/synthesizer.js +97 -0
- package/dist/agents/synthesizer.js.map +1 -0
- package/dist/agents/tests-agent.d.ts +17 -0
- package/dist/agents/tests-agent.d.ts.map +1 -0
- package/dist/agents/tests-agent.js +36 -0
- package/dist/agents/tests-agent.js.map +1 -0
- package/dist/cli/classifier.d.ts +8 -0
- package/dist/cli/classifier.d.ts.map +1 -0
- package/dist/cli/classifier.js +60 -0
- package/dist/cli/classifier.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +22 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +3 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +189 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/churn.d.ts +3 -0
- package/dist/cli/commands/churn.d.ts.map +1 -0
- package/dist/cli/commands/churn.js +76 -0
- package/dist/cli/commands/churn.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +3 -0
- package/dist/cli/commands/explain.d.ts.map +1 -0
- package/dist/cli/commands/explain.js +115 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/fix.d.ts +3 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +22 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +3 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +311 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/health.d.ts +3 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +106 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +3 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +199 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/patterns.d.ts +3 -0
- package/dist/cli/commands/patterns.d.ts.map +1 -0
- package/dist/cli/commands/patterns.js +79 -0
- package/dist/cli/commands/patterns.js.map +1 -0
- package/dist/cli/commands/report.d.ts +3 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +408 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/review.d.ts +3 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +21 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +129 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/interactive.d.ts +3 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +115 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/menu.d.ts +2 -0
- package/dist/cli/menu.d.ts.map +1 -0
- package/dist/cli/menu.js +208 -0
- package/dist/cli/menu.js.map +1 -0
- package/dist/cli/runtime-options.d.ts +19 -0
- package/dist/cli/runtime-options.d.ts.map +1 -0
- package/dist/cli/runtime-options.js +56 -0
- package/dist/cli/runtime-options.js.map +1 -0
- package/dist/cli/tui.d.ts +11 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +162 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/ui/renderer.d.ts +15 -0
- package/dist/cli/ui/renderer.d.ts.map +1 -0
- package/dist/cli/ui/renderer.js +129 -0
- package/dist/cli/ui/renderer.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +26 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +71 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/cost-tracker.test.d.ts +2 -0
- package/dist/core/cost-tracker.test.d.ts.map +1 -0
- package/dist/core/cost-tracker.test.js +36 -0
- package/dist/core/cost-tracker.test.js.map +1 -0
- package/dist/core/orchestrator.d.ts +46 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +67 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/pipeline-context.d.ts +18 -0
- package/dist/core/pipeline-context.d.ts.map +1 -0
- package/dist/core/pipeline-context.js +30 -0
- package/dist/core/pipeline-context.js.map +1 -0
- package/dist/core/pipelines/analyze-pipeline.d.ts +4 -0
- package/dist/core/pipelines/analyze-pipeline.d.ts.map +1 -0
- package/dist/core/pipelines/analyze-pipeline.js +69 -0
- package/dist/core/pipelines/analyze-pipeline.js.map +1 -0
- package/dist/core/pipelines/audit-fix-pipeline.d.ts +24 -0
- package/dist/core/pipelines/audit-fix-pipeline.d.ts.map +1 -0
- package/dist/core/pipelines/audit-fix-pipeline.js +79 -0
- package/dist/core/pipelines/audit-fix-pipeline.js.map +1 -0
- package/dist/core/pipelines/audit-pipeline.d.ts +33 -0
- package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -0
- package/dist/core/pipelines/audit-pipeline.js +353 -0
- package/dist/core/pipelines/audit-pipeline.js.map +1 -0
- package/dist/core/pipelines/audit-pipeline.test.d.ts +2 -0
- package/dist/core/pipelines/audit-pipeline.test.d.ts.map +1 -0
- package/dist/core/pipelines/audit-pipeline.test.js +135 -0
- package/dist/core/pipelines/audit-pipeline.test.js.map +1 -0
- package/dist/core/pipelines/fix-pipeline.d.ts +9 -0
- package/dist/core/pipelines/fix-pipeline.d.ts.map +1 -0
- package/dist/core/pipelines/fix-pipeline.js +151 -0
- package/dist/core/pipelines/fix-pipeline.js.map +1 -0
- package/dist/core/pipelines/review-pipeline.d.ts +4 -0
- package/dist/core/pipelines/review-pipeline.d.ts.map +1 -0
- package/dist/core/pipelines/review-pipeline.js +65 -0
- package/dist/core/pipelines/review-pipeline.js.map +1 -0
- package/dist/core/repo-context.d.ts +2 -0
- package/dist/core/repo-context.d.ts.map +1 -0
- package/dist/core/repo-context.js +12 -0
- package/dist/core/repo-context.js.map +1 -0
- package/dist/core/repo-context.test.d.ts +2 -0
- package/dist/core/repo-context.test.d.ts.map +1 -0
- package/dist/core/repo-context.test.js +40 -0
- package/dist/core/repo-context.test.js.map +1 -0
- package/dist/core/runtime-policy.d.ts +35 -0
- package/dist/core/runtime-policy.d.ts.map +1 -0
- package/dist/core/runtime-policy.js +37 -0
- package/dist/core/runtime-policy.js.map +1 -0
- package/dist/core/runtime-policy.test.d.ts +2 -0
- package/dist/core/runtime-policy.test.d.ts.map +1 -0
- package/dist/core/runtime-policy.test.js +27 -0
- package/dist/core/runtime-policy.test.js.map +1 -0
- package/dist/core/state-machine.d.ts +17 -0
- package/dist/core/state-machine.d.ts.map +1 -0
- package/dist/core/state-machine.js +45 -0
- package/dist/core/state-machine.js.map +1 -0
- package/dist/core/task.d.ts +29 -0
- package/dist/core/task.d.ts.map +1 -0
- package/dist/core/task.js +2 -0
- package/dist/core/task.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/bm25.d.ts +30 -0
- package/dist/infra/bm25.d.ts.map +1 -0
- package/dist/infra/bm25.js +69 -0
- package/dist/infra/bm25.js.map +1 -0
- package/dist/infra/bm25.test.d.ts +2 -0
- package/dist/infra/bm25.test.d.ts.map +1 -0
- package/dist/infra/bm25.test.js +17 -0
- package/dist/infra/bm25.test.js.map +1 -0
- package/dist/infra/chunker.d.ts +20 -0
- package/dist/infra/chunker.d.ts.map +1 -0
- package/dist/infra/chunker.js +165 -0
- package/dist/infra/chunker.js.map +1 -0
- package/dist/infra/chunker.test.d.ts +2 -0
- package/dist/infra/chunker.test.d.ts.map +1 -0
- package/dist/infra/chunker.test.js +33 -0
- package/dist/infra/chunker.test.js.map +1 -0
- package/dist/infra/code-metrics.d.ts +39 -0
- package/dist/infra/code-metrics.d.ts.map +1 -0
- package/dist/infra/code-metrics.js +222 -0
- package/dist/infra/code-metrics.js.map +1 -0
- package/dist/infra/db/database.d.ts +4 -0
- package/dist/infra/db/database.d.ts.map +1 -0
- package/dist/infra/db/database.js +25 -0
- package/dist/infra/db/database.js.map +1 -0
- package/dist/infra/db/evidence-repo.d.ts +4 -0
- package/dist/infra/db/evidence-repo.d.ts.map +1 -0
- package/dist/infra/db/evidence-repo.js +8 -0
- package/dist/infra/db/evidence-repo.js.map +1 -0
- package/dist/infra/db/migrations.d.ts +2 -0
- package/dist/infra/db/migrations.d.ts.map +1 -0
- package/dist/infra/db/migrations.js +10 -0
- package/dist/infra/db/migrations.js.map +1 -0
- package/dist/infra/db/store.d.ts +12 -0
- package/dist/infra/db/store.d.ts.map +1 -0
- package/dist/infra/db/store.js +73 -0
- package/dist/infra/db/store.js.map +1 -0
- package/dist/infra/db/task-repo.d.ts +8 -0
- package/dist/infra/db/task-repo.d.ts.map +1 -0
- package/dist/infra/db/task-repo.js +19 -0
- package/dist/infra/db/task-repo.js.map +1 -0
- package/dist/infra/dep-graph-python.d.ts +3 -0
- package/dist/infra/dep-graph-python.d.ts.map +1 -0
- package/dist/infra/dep-graph-python.js +154 -0
- package/dist/infra/dep-graph-python.js.map +1 -0
- package/dist/infra/dep-graph.d.ts +20 -0
- package/dist/infra/dep-graph.d.ts.map +1 -0
- package/dist/infra/dep-graph.js +102 -0
- package/dist/infra/dep-graph.js.map +1 -0
- package/dist/infra/embeddings.d.ts +19 -0
- package/dist/infra/embeddings.d.ts.map +1 -0
- package/dist/infra/embeddings.js +110 -0
- package/dist/infra/embeddings.js.map +1 -0
- package/dist/infra/evidence-gate.d.ts +11 -0
- package/dist/infra/evidence-gate.d.ts.map +1 -0
- package/dist/infra/evidence-gate.js +21 -0
- package/dist/infra/evidence-gate.js.map +1 -0
- package/dist/infra/evidence-gate.test.d.ts +2 -0
- package/dist/infra/evidence-gate.test.d.ts.map +1 -0
- package/dist/infra/evidence-gate.test.js +36 -0
- package/dist/infra/evidence-gate.test.js.map +1 -0
- package/dist/infra/git-analysis.d.ts +26 -0
- package/dist/infra/git-analysis.d.ts.map +1 -0
- package/dist/infra/git-analysis.js +102 -0
- package/dist/infra/git-analysis.js.map +1 -0
- package/dist/infra/health-score.d.ts +31 -0
- package/dist/infra/health-score.d.ts.map +1 -0
- package/dist/infra/health-score.js +136 -0
- package/dist/infra/health-score.js.map +1 -0
- package/dist/infra/knowledge.d.ts +15 -0
- package/dist/infra/knowledge.d.ts.map +1 -0
- package/dist/infra/knowledge.js +124 -0
- package/dist/infra/knowledge.js.map +1 -0
- package/dist/infra/lang-detect.d.ts +14 -0
- package/dist/infra/lang-detect.d.ts.map +1 -0
- package/dist/infra/lang-detect.js +135 -0
- package/dist/infra/lang-detect.js.map +1 -0
- package/dist/infra/local-qa.d.ts +6 -0
- package/dist/infra/local-qa.d.ts.map +1 -0
- package/dist/infra/local-qa.js +66 -0
- package/dist/infra/local-qa.js.map +1 -0
- package/dist/infra/pattern-detect.d.ts +30 -0
- package/dist/infra/pattern-detect.d.ts.map +1 -0
- package/dist/infra/pattern-detect.js +250 -0
- package/dist/infra/pattern-detect.js.map +1 -0
- package/dist/infra/persona-presets.d.ts +29 -0
- package/dist/infra/persona-presets.d.ts.map +1 -0
- package/dist/infra/persona-presets.js +110 -0
- package/dist/infra/persona-presets.js.map +1 -0
- package/dist/infra/repo-index.d.ts +50 -0
- package/dist/infra/repo-index.d.ts.map +1 -0
- package/dist/infra/repo-index.js +228 -0
- package/dist/infra/repo-index.js.map +1 -0
- package/dist/infra/repo-index.test.d.ts +2 -0
- package/dist/infra/repo-index.test.d.ts.map +1 -0
- package/dist/infra/repo-index.test.js +53 -0
- package/dist/infra/repo-index.test.js.map +1 -0
- package/dist/infra/repo-query.d.ts +11 -0
- package/dist/infra/repo-query.d.ts.map +1 -0
- package/dist/infra/repo-query.js +67 -0
- package/dist/infra/repo-query.js.map +1 -0
- package/dist/infra/repo-query.test.d.ts +2 -0
- package/dist/infra/repo-query.test.d.ts.map +1 -0
- package/dist/infra/repo-query.test.js +34 -0
- package/dist/infra/repo-query.test.js.map +1 -0
- package/dist/infra/sbom.d.ts +16 -0
- package/dist/infra/sbom.d.ts.map +1 -0
- package/dist/infra/sbom.js +111 -0
- package/dist/infra/sbom.js.map +1 -0
- package/dist/infra/semgrep.d.ts +10 -0
- package/dist/infra/semgrep.d.ts.map +1 -0
- package/dist/infra/semgrep.js +122 -0
- package/dist/infra/semgrep.js.map +1 -0
- package/dist/infra/semgrep.test.d.ts +2 -0
- package/dist/infra/semgrep.test.d.ts.map +1 -0
- package/dist/infra/semgrep.test.js +39 -0
- package/dist/infra/semgrep.test.js.map +1 -0
- package/dist/infra/tmux.d.ts +9 -0
- package/dist/infra/tmux.d.ts.map +1 -0
- package/dist/infra/tmux.js +42 -0
- package/dist/infra/tmux.js.map +1 -0
- package/dist/infra/worktree.d.ts +9 -0
- package/dist/infra/worktree.d.ts.map +1 -0
- package/dist/infra/worktree.js +51 -0
- package/dist/infra/worktree.js.map +1 -0
- package/dist/prompts/developer.d.ts +2 -0
- package/dist/prompts/developer.d.ts.map +1 -0
- package/dist/prompts/developer.js +36 -0
- package/dist/prompts/developer.js.map +1 -0
- package/dist/prompts/explain.d.ts +3 -0
- package/dist/prompts/explain.d.ts.map +1 -0
- package/dist/prompts/explain.js +38 -0
- package/dist/prompts/explain.js.map +1 -0
- package/dist/prompts/investigator.d.ts +3 -0
- package/dist/prompts/investigator.d.ts.map +1 -0
- package/dist/prompts/investigator.js +46 -0
- package/dist/prompts/investigator.js.map +1 -0
- package/dist/prompts/planner.d.ts +2 -0
- package/dist/prompts/planner.d.ts.map +1 -0
- package/dist/prompts/planner.js +37 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/qa.d.ts +2 -0
- package/dist/prompts/qa.d.ts.map +1 -0
- package/dist/prompts/qa.js +37 -0
- package/dist/prompts/qa.js.map +1 -0
- package/dist/prompts/reviewer.d.ts +2 -0
- package/dist/prompts/reviewer.d.ts.map +1 -0
- package/dist/prompts/reviewer.js +36 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/prompts/scanner-domains-infra.d.ts +48 -0
- package/dist/prompts/scanner-domains-infra.d.ts.map +1 -0
- package/dist/prompts/scanner-domains-infra.js +141 -0
- package/dist/prompts/scanner-domains-infra.js.map +1 -0
- package/dist/prompts/scanner.d.ts +10 -0
- package/dist/prompts/scanner.d.ts.map +1 -0
- package/dist/prompts/scanner.js +185 -0
- package/dist/prompts/scanner.js.map +1 -0
- package/dist/prompts/synthesizer.d.ts +2 -0
- package/dist/prompts/synthesizer.d.ts.map +1 -0
- package/dist/prompts/synthesizer.js +36 -0
- package/dist/prompts/synthesizer.js.map +1 -0
- package/dist/providers/cli-provider.d.ts +16 -0
- package/dist/providers/cli-provider.d.ts.map +1 -0
- package/dist/providers/cli-provider.js +145 -0
- package/dist/providers/cli-provider.js.map +1 -0
- package/dist/providers/openrouter-provider.d.ts +8 -0
- package/dist/providers/openrouter-provider.d.ts.map +1 -0
- package/dist/providers/openrouter-provider.js +86 -0
- package/dist/providers/openrouter-provider.js.map +1 -0
- package/dist/providers/sdk-provider.d.ts +6 -0
- package/dist/providers/sdk-provider.d.ts.map +1 -0
- package/dist/providers/sdk-provider.js +0 -0
- package/dist/providers/sdk-provider.js.map +1 -0
- package/dist/providers/types.d.ts +13 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/schemas/audit.d.ts +278 -0
- package/dist/schemas/audit.d.ts.map +1 -0
- package/dist/schemas/audit.js +37 -0
- package/dist/schemas/audit.js.map +1 -0
- package/dist/schemas/audit.test.d.ts +2 -0
- package/dist/schemas/audit.test.d.ts.map +1 -0
- package/dist/schemas/audit.test.js +41 -0
- package/dist/schemas/audit.test.js.map +1 -0
- package/dist/schemas/evidence.d.ts +48 -0
- package/dist/schemas/evidence.d.ts.map +1 -0
- package/dist/schemas/evidence.js +17 -0
- package/dist/schemas/evidence.js.map +1 -0
- package/dist/schemas/patch.d.ts +25 -0
- package/dist/schemas/patch.d.ts.map +1 -0
- package/dist/schemas/patch.js +10 -0
- package/dist/schemas/patch.js.map +1 -0
- package/dist/schemas/plan.d.ts +69 -0
- package/dist/schemas/plan.d.ts.map +1 -0
- package/dist/schemas/plan.js +17 -0
- package/dist/schemas/plan.js.map +1 -0
- package/dist/schemas/qa.d.ts +28 -0
- package/dist/schemas/qa.d.ts.map +1 -0
- package/dist/schemas/qa.js +11 -0
- package/dist/schemas/qa.js.map +1 -0
- package/dist/schemas/review.d.ts +71 -0
- package/dist/schemas/review.d.ts.map +1 -0
- package/dist/schemas/review.js +16 -0
- package/dist/schemas/review.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync, existsSync, readdirSync, readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { spawnSync } from 'child_process';
|
|
4
|
+
import { GraphAgent } from '../../agents/graph-agent.js';
|
|
5
|
+
import { buildChurnReport } from '../../infra/git-analysis.js';
|
|
6
|
+
import { detectPatterns } from '../../infra/pattern-detect.js';
|
|
7
|
+
import { computeHealthScore } from '../../infra/health-score.js';
|
|
8
|
+
import { measureCognitiveLoad, buildApiMap, auditEnvVars, scanCurrentSecrets } from '../../infra/code-metrics.js';
|
|
9
|
+
import { buildSbom } from '../../infra/sbom.js';
|
|
10
|
+
function esc(s) {
|
|
11
|
+
return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
12
|
+
}
|
|
13
|
+
function loadLatestAudit(cwd) {
|
|
14
|
+
const dir = join(cwd, '.ai-runtime', 'reports');
|
|
15
|
+
if (!existsSync(dir))
|
|
16
|
+
return null;
|
|
17
|
+
try {
|
|
18
|
+
const files = readdirSync(dir).filter((f) => f.startsWith('audit-') && f.endsWith('.json')).sort().reverse();
|
|
19
|
+
if (!files[0])
|
|
20
|
+
return null;
|
|
21
|
+
return JSON.parse(readFileSync(join(dir, files[0]), 'utf8'));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function renderReport(data) {
|
|
28
|
+
const { projectName, health, audit, churn, patterns, cognitive } = data;
|
|
29
|
+
const gradeColor = { A: '#3fb950', B: '#3fb950', C: '#e3b341', D: '#f85149', F: '#f85149' }[health.grade] ?? '#8b949e';
|
|
30
|
+
const findingRows = (audit?.findings ?? []).slice(0, 50).map((f) => {
|
|
31
|
+
const sevColor = { critical: '#f85149', high: '#e3b341', medium: '#79c0ff', low: '#8b949e', info: '#484f58' }[f.severity] ?? '#8b949e';
|
|
32
|
+
return `<tr>
|
|
33
|
+
<td><span class="badge" style="background:${sevColor}20;color:${sevColor}">${esc(f.severity)}</span></td>
|
|
34
|
+
<td class="mono">${esc(f.file)}${f.line ? ':' + f.line : ''}</td>
|
|
35
|
+
<td>${esc(f.category)}</td>
|
|
36
|
+
<td>${esc(f.finding)}</td>
|
|
37
|
+
</tr>`;
|
|
38
|
+
}).join('');
|
|
39
|
+
const churnRows = churn.churn.slice(0, 20).map((c) => {
|
|
40
|
+
const riskColor = { critical: '#f85149', high: '#e3b341', medium: '#79c0ff', low: '#484f58' }[c.risk] ?? '#484f58';
|
|
41
|
+
return `<tr>
|
|
42
|
+
<td class="mono">${esc(c.file)}</td>
|
|
43
|
+
<td style="color:${riskColor}">${c.commits}</td>
|
|
44
|
+
<td>${c.authors}</td>
|
|
45
|
+
<td><span class="badge" style="background:${riskColor}20;color:${riskColor}">${c.risk}</span></td>
|
|
46
|
+
</tr>`;
|
|
47
|
+
}).join('');
|
|
48
|
+
const patternRows = patterns.detected.map((p) => `<tr>
|
|
49
|
+
<td><strong>${esc(p.pattern)}</strong></td>
|
|
50
|
+
<td>${esc(p.category)}</td>
|
|
51
|
+
<td><span class="badge ${p.confidence}">${p.confidence}</span></td>
|
|
52
|
+
<td>${p.evidence.filter(Boolean).map((e) => esc(e)).join('<br>')}</td>
|
|
53
|
+
</tr>`).join('');
|
|
54
|
+
const antiRows = patterns.antiPatterns.map((a) => `<tr>
|
|
55
|
+
<td style="color:#f85149"><strong>${esc(a.name)}</strong></td>
|
|
56
|
+
<td>${esc(a.severity)}</td>
|
|
57
|
+
<td>${esc(a.description)}</td>
|
|
58
|
+
<td>${a.evidence.slice(0, 2).map((e) => esc(e)).join('<br>')}</td>
|
|
59
|
+
</tr>`).join('');
|
|
60
|
+
const cogRows = cognitive.slice(0, 15).map((c) => `<tr>
|
|
61
|
+
<td class="mono">${esc(c.file)}</td>
|
|
62
|
+
<td style="color:${c.score >= 40 ? '#f85149' : c.score >= 20 ? '#e3b341' : '#3fb950'}">${c.score}</td>
|
|
63
|
+
<td>${c.maxNesting}</td>
|
|
64
|
+
<td>${c.longFunctions}</td>
|
|
65
|
+
<td>${c.loc}</td>
|
|
66
|
+
</tr>`).join('');
|
|
67
|
+
const dimBars = health.dimensions.map((d) => {
|
|
68
|
+
const pct = d.score;
|
|
69
|
+
const color = pct >= 80 ? '#3fb950' : pct >= 60 ? '#e3b341' : '#f85149';
|
|
70
|
+
return `<div class="dim-row">
|
|
71
|
+
<div class="dim-name">${esc(d.name)}</div>
|
|
72
|
+
<div class="dim-bar-wrap"><div class="dim-bar" style="width:${pct}%;background:${color}"></div></div>
|
|
73
|
+
<div class="dim-score" style="color:${color}">${pct}</div>
|
|
74
|
+
<div class="dim-detail">${esc(d.detail)}</div>
|
|
75
|
+
</div>`;
|
|
76
|
+
}).join('');
|
|
77
|
+
return `<!DOCTYPE html>
|
|
78
|
+
<html lang="en">
|
|
79
|
+
<head>
|
|
80
|
+
<meta charset="UTF-8">
|
|
81
|
+
<title>${esc(projectName)} — Project Report</title>
|
|
82
|
+
<style>
|
|
83
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
84
|
+
body{background:#0d1117;color:#e6edf3;font-family:-apple-system,BlinkMacSystemFont,sans-serif;font-size:14px;line-height:1.6}
|
|
85
|
+
a{color:#79c0ff;text-decoration:none}.mono{font-family:monospace;font-size:12px}
|
|
86
|
+
nav{background:#161b22;border-bottom:1px solid #30363d;padding:12px 24px;display:flex;gap:20px;position:sticky;top:0;z-index:100}
|
|
87
|
+
nav a{color:#8b949e;font-size:13px}nav a:hover{color:#e6edf3}
|
|
88
|
+
.container{max-width:1200px;margin:0 auto;padding:24px}
|
|
89
|
+
h1{font-size:24px;margin-bottom:4px}h2{font-size:18px;margin:32px 0 16px;color:#79c0ff;border-bottom:1px solid #21262d;padding-bottom:8px}
|
|
90
|
+
h3{font-size:14px;color:#8b949e;margin-bottom:12px}
|
|
91
|
+
.header{background:#161b22;border:1px solid #30363d;border-radius:12px;padding:24px;margin-bottom:24px;display:flex;justify-content:space-between;align-items:center}
|
|
92
|
+
.score-big{font-size:64px;font-weight:bold;color:${gradeColor};line-height:1}
|
|
93
|
+
.score-grade{font-size:32px;color:${gradeColor};margin-left:8px}
|
|
94
|
+
.meta{color:#8b949e;font-size:13px;margin-top:4px}
|
|
95
|
+
.dim-row{display:grid;grid-template-columns:140px 1fr 40px 1fr;gap:12px;align-items:center;margin:6px 0}
|
|
96
|
+
.dim-name{font-size:13px;color:#8b949e}.dim-bar-wrap{background:#21262d;border-radius:4px;height:8px}
|
|
97
|
+
.dim-bar{height:8px;border-radius:4px;transition:width 0.3s}.dim-score{font-size:13px;font-weight:bold;text-align:right}
|
|
98
|
+
.dim-detail{font-size:11px;color:#484f58}
|
|
99
|
+
table{width:100%;border-collapse:collapse;font-size:13px}
|
|
100
|
+
th{text-align:left;padding:8px 12px;border-bottom:2px solid #30363d;color:#8b949e;font-weight:600}
|
|
101
|
+
td{padding:8px 12px;border-bottom:1px solid #21262d;vertical-align:top}
|
|
102
|
+
tr:hover td{background:#161b22}.badge{display:inline-block;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}
|
|
103
|
+
.badge.high{background:#3fb95020;color:#3fb950}.badge.medium{background:#e3b34120;color:#e3b341}.badge.low{background:#48495820;color:#8b949e}
|
|
104
|
+
.risk-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:24px}
|
|
105
|
+
.risk-card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px}
|
|
106
|
+
.risk-card .num{font-size:32px;font-weight:bold}.risk-card .label{color:#8b949e;font-size:12px}
|
|
107
|
+
.rec-card{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px;margin-bottom:12px}
|
|
108
|
+
.rec-card h4{color:#79c0ff;margin-bottom:6px}.rec-card ul{margin-left:16px;color:#8b949e;font-size:13px}
|
|
109
|
+
.section{margin-bottom:40px}
|
|
110
|
+
</style>
|
|
111
|
+
</head>
|
|
112
|
+
<body>
|
|
113
|
+
<nav>
|
|
114
|
+
<a href="#health">Health</a>
|
|
115
|
+
<a href="#audit">Audit</a>
|
|
116
|
+
<a href="#patterns">Patterns</a>
|
|
117
|
+
<a href="#churn">Churn</a>
|
|
118
|
+
<a href="#cognitive">Complexity</a>
|
|
119
|
+
${data.graphExists ? '<a href="graph.html">Graph →</a>' : ''}
|
|
120
|
+
</nav>
|
|
121
|
+
<div class="container">
|
|
122
|
+
<div class="header">
|
|
123
|
+
<div>
|
|
124
|
+
<h1>${esc(projectName)}</h1>
|
|
125
|
+
<div class="meta">Generated ${esc(data.generatedAt)} · ${audit ? audit.totalFiles + ' files audited' : 'no audit data'}</div>
|
|
126
|
+
</div>
|
|
127
|
+
<div style="text-align:right">
|
|
128
|
+
<span class="score-big">${health.total}</span><span class="score-grade">${health.grade}</span>
|
|
129
|
+
<div class="meta">Health Score / 100</div>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="section" id="health">
|
|
134
|
+
<h2>Health Dimensions</h2>
|
|
135
|
+
${dimBars}
|
|
136
|
+
${health.topRisks.length > 0 ? `<div style="margin-top:16px">${health.topRisks.map((r) => `<div style="color:#f85149;font-size:13px;margin:4px 0">✗ ${esc(r)}</div>`).join('')}</div>` : ''}
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
${audit ? `<div class="section" id="audit">
|
|
140
|
+
<h2>Audit Findings</h2>
|
|
141
|
+
<div class="risk-grid">
|
|
142
|
+
<div class="risk-card"><div class="num" style="color:#f85149">${audit.criticalCount}</div><div class="label">Critical</div></div>
|
|
143
|
+
<div class="risk-card"><div class="num" style="color:#e3b341">${audit.highCount}</div><div class="label">High</div></div>
|
|
144
|
+
<div class="risk-card"><div class="num">${audit.findings.length}</div><div class="label">Total Findings</div></div>
|
|
145
|
+
</div>
|
|
146
|
+
<p style="color:#8b949e;margin-bottom:16px;font-size:13px">${esc(audit.summary)}</p>
|
|
147
|
+
<table><tr><th>Severity</th><th>Location</th><th>Category</th><th>Finding</th></tr>${findingRows}</table>
|
|
148
|
+
${audit.findings.length > 50 ? `<p style="color:#8b949e;font-size:12px;margin-top:8px">Showing 50 of ${audit.findings.length} findings</p>` : ''}
|
|
149
|
+
</div>` : ''}
|
|
150
|
+
|
|
151
|
+
<div class="section" id="patterns">
|
|
152
|
+
<h2>Architecture Patterns</h2>
|
|
153
|
+
${patterns.detected.length > 0 ? `<h3>Detected</h3><table><tr><th>Pattern</th><th>Category</th><th>Confidence</th><th>Evidence</th></tr>${patternRows}</table>` : ''}
|
|
154
|
+
${patterns.antiPatterns.length > 0 ? `<h3 style="margin-top:20px">Anti-Patterns</h3><table><tr><th>Name</th><th>Severity</th><th>Description</th><th>Evidence</th></tr>${antiRows}</table>` : ''}
|
|
155
|
+
${patterns.recommendations.length > 0 ? `<h3 style="margin-top:20px">Recommendations</h3>${patterns.recommendations.map((r) => `<div class="rec-card"><h4>${esc(r.pattern)}</h4><p style="color:#8b949e;font-size:13px;margin-bottom:8px">${esc(r.reason)}</p><ul>${r.fixes.map((f) => `<li>${esc(f)}</li>`).join('')}</ul></div>`).join('')}` : ''}
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
${churn.churn.length > 0 ? `<div class="section" id="churn">
|
|
159
|
+
<h2>Git Churn (last ${churn.periodDays} days)</h2>
|
|
160
|
+
<p style="color:#8b949e;font-size:13px;margin-bottom:16px">${churn.totalCommits} total commits</p>
|
|
161
|
+
<table><tr><th>File</th><th>Commits</th><th>Authors</th><th>Risk</th></tr>${churnRows}</table>
|
|
162
|
+
</div>` : ''}
|
|
163
|
+
|
|
164
|
+
${cognitive.length > 0 ? `<div class="section" id="cognitive">
|
|
165
|
+
<h2>Cognitive Load</h2>
|
|
166
|
+
<table><tr><th>File</th><th>Score</th><th>Max Nesting</th><th>Long Functions</th><th>LOC</th></tr>${cogRows}</table>
|
|
167
|
+
</div>` : ''}
|
|
168
|
+
|
|
169
|
+
</div>
|
|
170
|
+
</body>
|
|
171
|
+
</html>`;
|
|
172
|
+
}
|
|
173
|
+
function renderMarkdown(data) {
|
|
174
|
+
const { projectName, health, audit, churn, patterns, cognitive, hotspots, apiEndpoints, envAudit, secrets, sbom } = data;
|
|
175
|
+
const lines = [];
|
|
176
|
+
lines.push(`# ${projectName} — AI Analysis Context`);
|
|
177
|
+
lines.push(`> Generated: ${data.generatedAt} · Use this document to ask an AI for refactoring, architecture, and improvement recommendations.`);
|
|
178
|
+
lines.push('');
|
|
179
|
+
// Health
|
|
180
|
+
lines.push(`## Health Score: ${health.total}/100 (${health.grade})`);
|
|
181
|
+
lines.push('');
|
|
182
|
+
lines.push('| Dimension | Score | Detail |');
|
|
183
|
+
lines.push('|---|---|---|');
|
|
184
|
+
health.dimensions.forEach((d) => lines.push(`| ${d.name} | ${d.score}/100 | ${d.detail} |`));
|
|
185
|
+
lines.push('');
|
|
186
|
+
if (health.topRisks.length > 0) {
|
|
187
|
+
lines.push('**Top risks:**');
|
|
188
|
+
health.topRisks.forEach((r) => lines.push(`- ${r}`));
|
|
189
|
+
lines.push('');
|
|
190
|
+
}
|
|
191
|
+
// Project overview
|
|
192
|
+
lines.push('## Project Overview');
|
|
193
|
+
lines.push(`- **Files:** ${data.totalFiles} | **Symbols:** ${data.totalSymbols}`);
|
|
194
|
+
lines.push(`- **Dependency cycles:** ${data.cycles}`);
|
|
195
|
+
lines.push(`- **Git commits (90d):** ${churn.totalCommits}`);
|
|
196
|
+
lines.push('');
|
|
197
|
+
// Architecture patterns
|
|
198
|
+
lines.push('## Architecture Patterns');
|
|
199
|
+
lines.push('');
|
|
200
|
+
lines.push('### Detected');
|
|
201
|
+
patterns.detected.forEach((p) => {
|
|
202
|
+
lines.push(`- **${p.pattern}** [${p.category}] (${p.confidence} confidence): ${p.evidence.filter(Boolean).join(', ')}`);
|
|
203
|
+
});
|
|
204
|
+
lines.push('');
|
|
205
|
+
if (patterns.antiPatterns.length > 0) {
|
|
206
|
+
lines.push('### Anti-Patterns');
|
|
207
|
+
patterns.antiPatterns.forEach((a) => {
|
|
208
|
+
lines.push(`- **${a.name}** [${a.severity}]: ${a.description}`);
|
|
209
|
+
a.evidence.slice(0, 2).forEach((e) => lines.push(` - \`${e}\``));
|
|
210
|
+
});
|
|
211
|
+
lines.push('');
|
|
212
|
+
}
|
|
213
|
+
if (patterns.recommendations.length > 0) {
|
|
214
|
+
lines.push('### Recommendations');
|
|
215
|
+
patterns.recommendations.forEach((r) => {
|
|
216
|
+
lines.push(`- **${r.pattern}** [${r.priority} priority]: ${r.reason}`);
|
|
217
|
+
r.fixes.forEach((f) => lines.push(` - ${f}`));
|
|
218
|
+
});
|
|
219
|
+
lines.push('');
|
|
220
|
+
}
|
|
221
|
+
// Hotspots
|
|
222
|
+
if (hotspots.length > 0) {
|
|
223
|
+
lines.push('## Hotspot Files (Highest Coupling)');
|
|
224
|
+
lines.push('');
|
|
225
|
+
lines.push('| File | FanIn | FanOut | Risk |');
|
|
226
|
+
lines.push('|---|---|---|---|');
|
|
227
|
+
hotspots.slice(0, 10).forEach((h) => {
|
|
228
|
+
const risk = h.fanIn >= 30 ? 'CRITICAL' : h.fanIn >= 15 ? 'HIGH' : 'MEDIUM';
|
|
229
|
+
lines.push(`| \`${h.file}\` | ${h.fanIn} | ${h.fanOut} | ${risk} |`);
|
|
230
|
+
});
|
|
231
|
+
lines.push('');
|
|
232
|
+
}
|
|
233
|
+
// Audit findings
|
|
234
|
+
if (audit) {
|
|
235
|
+
lines.push('## Audit Findings');
|
|
236
|
+
lines.push(`**${audit.criticalCount} critical · ${audit.highCount} high · ${audit.findings.length} total**`);
|
|
237
|
+
lines.push('');
|
|
238
|
+
lines.push(audit.summary);
|
|
239
|
+
lines.push('');
|
|
240
|
+
const critical = audit.findings.filter((f) => f.severity === 'critical');
|
|
241
|
+
const high = audit.findings.filter((f) => f.severity === 'high');
|
|
242
|
+
if (critical.length > 0) {
|
|
243
|
+
lines.push('### Critical Findings');
|
|
244
|
+
critical.forEach((f) => {
|
|
245
|
+
const persona = f.persona ? ` (persona: ${f.persona})` : '';
|
|
246
|
+
lines.push(`- \`${f.file}${f.line ? ':' + f.line : ''}\` [${f.category}]${persona} ${f.finding}`);
|
|
247
|
+
lines.push(` → ${f.recommendation}`);
|
|
248
|
+
});
|
|
249
|
+
lines.push('');
|
|
250
|
+
}
|
|
251
|
+
if (high.length > 0) {
|
|
252
|
+
lines.push('### High Findings');
|
|
253
|
+
high.slice(0, 15).forEach((f) => {
|
|
254
|
+
const persona = f.persona ? ` (persona: ${f.persona})` : '';
|
|
255
|
+
lines.push(`- \`${f.file}${f.line ? ':' + f.line : ''}\` [${f.category}]${persona} ${f.finding}`);
|
|
256
|
+
lines.push(` → ${f.recommendation}`);
|
|
257
|
+
});
|
|
258
|
+
lines.push('');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Churn
|
|
262
|
+
if (churn.churn.length > 0) {
|
|
263
|
+
lines.push('## Git Churn (90 days)');
|
|
264
|
+
lines.push('');
|
|
265
|
+
lines.push('| File | Commits | Authors | Risk |');
|
|
266
|
+
lines.push('|---|---|---|---|');
|
|
267
|
+
churn.churn.slice(0, 15).forEach((c) => lines.push(`| \`${c.file}\` | ${c.commits} | ${c.authors} | ${c.risk} |`));
|
|
268
|
+
lines.push('');
|
|
269
|
+
const intersection = churn.busFactor
|
|
270
|
+
.filter((b) => b.risk === 'critical')
|
|
271
|
+
.filter((b) => churn.churn.find((c) => c.file === b.file && (c.risk === 'critical' || c.risk === 'high')));
|
|
272
|
+
if (intersection.length > 0) {
|
|
273
|
+
lines.push('### High Risk: High Churn + Single Author');
|
|
274
|
+
intersection.forEach((b) => lines.push(`- \`${b.file}\` — ${b.primaryPercent}% commits by one author`));
|
|
275
|
+
lines.push('');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// API Map (no-auth endpoints)
|
|
279
|
+
const noAuthEndpoints = apiEndpoints.filter((e) => !e.hasAuth);
|
|
280
|
+
if (noAuthEndpoints.length > 0) {
|
|
281
|
+
lines.push('## Unprotected API Endpoints');
|
|
282
|
+
lines.push('');
|
|
283
|
+
noAuthEndpoints.forEach((e) => {
|
|
284
|
+
lines.push(`- \`${e.method} ${e.path}\` — \`${e.file}:${e.line}\``);
|
|
285
|
+
});
|
|
286
|
+
lines.push('');
|
|
287
|
+
}
|
|
288
|
+
// Undocumented env vars
|
|
289
|
+
if (envAudit.undocumented.length > 0) {
|
|
290
|
+
lines.push('## Undocumented Environment Variables');
|
|
291
|
+
lines.push(`${envAudit.undocumented.length} variables used in code but not in .env.example:`);
|
|
292
|
+
lines.push('');
|
|
293
|
+
envAudit.undocumented.slice(0, 20).forEach((v) => lines.push(`- \`${v}\``));
|
|
294
|
+
lines.push('');
|
|
295
|
+
}
|
|
296
|
+
// Secrets
|
|
297
|
+
if (secrets.length > 0) {
|
|
298
|
+
lines.push('## Hardcoded Secrets Detected');
|
|
299
|
+
secrets.forEach((s) => lines.push(`- \`${s.file}:${s.line}\` [${s.pattern}]`));
|
|
300
|
+
lines.push('');
|
|
301
|
+
}
|
|
302
|
+
// Cognitive load
|
|
303
|
+
if (cognitive.length > 0) {
|
|
304
|
+
lines.push('## High Cognitive Load Files');
|
|
305
|
+
lines.push('');
|
|
306
|
+
lines.push('| File | Score | Max Nesting | Long Functions | LOC |');
|
|
307
|
+
lines.push('|---|---|---|---|---|');
|
|
308
|
+
cognitive.slice(0, 10).forEach((c) => lines.push(`| \`${c.file}\` | ${c.score} | ${c.maxNesting} | ${c.longFunctions} | ${c.loc} |`));
|
|
309
|
+
lines.push('');
|
|
310
|
+
}
|
|
311
|
+
// SBOM unpinned
|
|
312
|
+
if (sbom.unpinned.length > 0) {
|
|
313
|
+
lines.push('## Unpinned Dependencies (Supply Chain Risk)');
|
|
314
|
+
sbom.unpinned.slice(0, 20).forEach((p) => lines.push(`- \`${p.lang}\` \`${p.name}\` ${p.version}`));
|
|
315
|
+
lines.push('');
|
|
316
|
+
}
|
|
317
|
+
// AI prompt footer
|
|
318
|
+
lines.push('---');
|
|
319
|
+
lines.push('## Suggested AI Prompts');
|
|
320
|
+
lines.push('');
|
|
321
|
+
lines.push('Copy this document and use with any of these prompts:');
|
|
322
|
+
lines.push('');
|
|
323
|
+
lines.push('- *"Based on this analysis, create a prioritized refactoring roadmap with effort estimates"*');
|
|
324
|
+
lines.push('- *"Propose a migration plan from the current architecture to Clean Architecture + Repository Pattern"*');
|
|
325
|
+
lines.push('- *"Which critical findings should be fixed first and why? Write the fixes."*');
|
|
326
|
+
lines.push('- *"Identify which hotspot files should be split and how"*');
|
|
327
|
+
lines.push('- *"What tests should be written first given the 7% test coverage and these hotspots?"*');
|
|
328
|
+
return lines.join('\n');
|
|
329
|
+
}
|
|
330
|
+
export function registerReport(program) {
|
|
331
|
+
program
|
|
332
|
+
.command('report')
|
|
333
|
+
.description('Generate full HTML + Markdown project report')
|
|
334
|
+
.option('--no-open', 'generate without opening browser')
|
|
335
|
+
.option('--md', 'generate only Markdown (AI-ready context file)')
|
|
336
|
+
.option('--days <n>', 'git lookback for churn analysis', '90')
|
|
337
|
+
.action(async (options) => {
|
|
338
|
+
const cwd = process.cwd();
|
|
339
|
+
const days = parseInt(options.days, 10) || 90;
|
|
340
|
+
const projectName = cwd.split('/').pop() ?? 'project';
|
|
341
|
+
console.log(`Building report for ${projectName}…`);
|
|
342
|
+
const graph = new GraphAgent(cwd);
|
|
343
|
+
const index = await graph.ensureIndex();
|
|
344
|
+
let hotspots = [];
|
|
345
|
+
try {
|
|
346
|
+
const { detectLang } = await import('../../infra/lang-detect.js');
|
|
347
|
+
const { buildDepGraph } = await import('../../infra/dep-graph.js');
|
|
348
|
+
const { buildPythonDepGraph } = await import('../../infra/dep-graph-python.js');
|
|
349
|
+
const lang = detectLang(cwd);
|
|
350
|
+
const dep = lang.lang === 'python' ? buildPythonDepGraph(cwd) : buildDepGraph(cwd);
|
|
351
|
+
hotspots = dep.hotspots;
|
|
352
|
+
}
|
|
353
|
+
catch { /* best-effort */ }
|
|
354
|
+
const audit = loadLatestAudit(cwd);
|
|
355
|
+
const churn = buildChurnReport(cwd, hotspots.map((h) => h.file), days);
|
|
356
|
+
const patterns = detectPatterns(cwd, hotspots);
|
|
357
|
+
const cognitive = measureCognitiveLoad(cwd, 30);
|
|
358
|
+
const apiEndpoints = buildApiMap(cwd);
|
|
359
|
+
const envAudit = auditEnvVars(cwd);
|
|
360
|
+
const secrets = scanCurrentSecrets(cwd);
|
|
361
|
+
const sbom = buildSbom(cwd);
|
|
362
|
+
let cycles = 0;
|
|
363
|
+
try {
|
|
364
|
+
const { detectLang } = await import('../../infra/lang-detect.js');
|
|
365
|
+
const { buildDepGraph } = await import('../../infra/dep-graph.js');
|
|
366
|
+
const { buildPythonDepGraph } = await import('../../infra/dep-graph-python.js');
|
|
367
|
+
const lang = detectLang(cwd);
|
|
368
|
+
const dep = lang.lang === 'python' ? buildPythonDepGraph(cwd) : buildDepGraph(cwd);
|
|
369
|
+
cycles = dep.cycles.length;
|
|
370
|
+
}
|
|
371
|
+
catch { /* best-effort */ }
|
|
372
|
+
const health = computeHealthScore({
|
|
373
|
+
totalFiles: index.stats.files, totalSymbols: index.stats.symbols,
|
|
374
|
+
cycles, hotspots: hotspots.length,
|
|
375
|
+
testFileRatio: index.files.filter((f) => f.isTest).length / Math.max(index.files.length, 1),
|
|
376
|
+
churn: churn.churn, busFactor: churn.busFactor, cognitiveLoad: cognitive,
|
|
377
|
+
patterns, auditCriticals: audit?.criticalCount, auditHighs: audit?.highCount,
|
|
378
|
+
});
|
|
379
|
+
const outDir = join(cwd, '.ai-runtime');
|
|
380
|
+
mkdirSync(outDir, { recursive: true });
|
|
381
|
+
const generatedAt = new Date().toLocaleString();
|
|
382
|
+
const mdData = { projectName, health, audit, churn, patterns, cognitive, generatedAt,
|
|
383
|
+
totalFiles: index.stats.files, totalSymbols: index.stats.symbols, cycles,
|
|
384
|
+
hotspots, apiEndpoints, envAudit, secrets, sbom };
|
|
385
|
+
// Always generate markdown
|
|
386
|
+
const md = renderMarkdown(mdData);
|
|
387
|
+
const mdFile = join(outDir, 'context.md');
|
|
388
|
+
writeFileSync(mdFile, md, 'utf8');
|
|
389
|
+
console.log(`Markdown: ${mdFile}`);
|
|
390
|
+
if (!options.md) {
|
|
391
|
+
const graphExists = existsSync(join(outDir, 'graph.html'));
|
|
392
|
+
const html = renderReport({ projectName, health, audit, churn, patterns, cognitive, graphExists, generatedAt });
|
|
393
|
+
const outFile = join(outDir, 'report.html');
|
|
394
|
+
writeFileSync(outFile, html, 'utf8');
|
|
395
|
+
console.log(`HTML: ${outFile}`);
|
|
396
|
+
if (options.open !== false) {
|
|
397
|
+
const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
|
|
398
|
+
const args = process.platform === 'win32' ? ['/c', 'start', '', outFile] : [outFile];
|
|
399
|
+
spawnSync(opener, args, { stdio: 'ignore', timeout: 5000 });
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
console.log(` Health: ${health.badge}`);
|
|
403
|
+
if (audit)
|
|
404
|
+
console.log(` Findings: ${audit.criticalCount} critical, ${audit.highCount} high`);
|
|
405
|
+
console.log(` Size: ~${Math.round(md.length / 1000)}k chars (~${Math.round(md.length / 4)} tokens)`);
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBrD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Orchestrator } from '../../core/orchestrator.js';
|
|
2
|
+
import { Renderer } from '../ui/renderer.js';
|
|
3
|
+
import { addRuntimeOptions, toRuntimePolicyInput } from '../runtime-options.js';
|
|
4
|
+
export function registerReview(program) {
|
|
5
|
+
addRuntimeOptions(program
|
|
6
|
+
.command('review <target>')
|
|
7
|
+
.description('Review a diff or file path for bugs, regressions, and edge cases'))
|
|
8
|
+
.action(async (target, options) => {
|
|
9
|
+
const renderer = new Renderer();
|
|
10
|
+
const orch = new Orchestrator(process.cwd(), toRuntimePolicyInput(options));
|
|
11
|
+
orch.on('state:change', ({ state }) => renderer.showState(state));
|
|
12
|
+
orch.on('agent:start', ({ agentName }) => renderer.agentStart(agentName));
|
|
13
|
+
orch.on('agent:output', ({ agentName, text }) => renderer.agentChunk(agentName, text));
|
|
14
|
+
orch.on('agent:done', ({ agentName, durationMs }) => renderer.agentDone(agentName, durationMs));
|
|
15
|
+
orch.on('error', ({ message }) => renderer.showError(message));
|
|
16
|
+
const result = await orch.runReviewPipeline(target);
|
|
17
|
+
renderer.showResult(result);
|
|
18
|
+
process.exit(result.state === 'REVIEWED' ? 0 : 1);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAA0B,MAAM,uBAAuB,CAAC;AAExG,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,iBAAiB,CAAC,OAAO;SACtB,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,kEAAkE,CAAC,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAA0B,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmJnD"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { buildApiMap, auditEnvVars, measureCognitiveLoad, scanCurrentSecrets } from '../../infra/code-metrics.js';
|
|
3
|
+
import { buildSbom } from '../../infra/sbom.js';
|
|
4
|
+
export function registerScan(program) {
|
|
5
|
+
const scan = program
|
|
6
|
+
.command('scan')
|
|
7
|
+
.description('Zero-token code scans: api-map, env-audit, cognitive-load, secrets, sbom');
|
|
8
|
+
// ── api-map ────────────────────────────────────────────────────────────────
|
|
9
|
+
scan
|
|
10
|
+
.command('api-map')
|
|
11
|
+
.description('Extract all API endpoints with auth and rate-limit status')
|
|
12
|
+
.action(() => {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
console.log(chalk.bold.cyan('\nAPI Map\n'));
|
|
15
|
+
const endpoints = buildApiMap(cwd);
|
|
16
|
+
if (endpoints.length === 0) {
|
|
17
|
+
console.log(chalk.yellow('No API endpoints detected. Supports FastAPI, Flask, Django, Express.'));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const noAuth = endpoints.filter((e) => !e.hasAuth);
|
|
21
|
+
const noRateLimit = endpoints.filter((e) => !e.hasRateLimit);
|
|
22
|
+
endpoints.forEach((ep) => {
|
|
23
|
+
const authIcon = ep.hasAuth ? chalk.green('🔒') : chalk.red('🔓');
|
|
24
|
+
const rlIcon = ep.hasRateLimit ? chalk.green('⏱') : chalk.gray(' ');
|
|
25
|
+
console.log(` ${authIcon}${rlIcon} ` +
|
|
26
|
+
chalk.bold(ep.method.padEnd(7)) +
|
|
27
|
+
chalk.cyan(ep.path.padEnd(40)) +
|
|
28
|
+
chalk.dim(`${ep.file}:${ep.line}`));
|
|
29
|
+
});
|
|
30
|
+
console.log(chalk.bold(`\nSummary: ${endpoints.length} endpoints`));
|
|
31
|
+
if (noAuth.length > 0)
|
|
32
|
+
console.log(chalk.red(` 🔓 ${noAuth.length} without auth`));
|
|
33
|
+
if (noRateLimit.length > 0)
|
|
34
|
+
console.log(chalk.yellow(` ⏱ ${noRateLimit.length} without rate limiting`));
|
|
35
|
+
});
|
|
36
|
+
// ── env-audit ──────────────────────────────────────────────────────────────
|
|
37
|
+
scan
|
|
38
|
+
.command('env-audit')
|
|
39
|
+
.description('Find all environment variables used and check if they are documented')
|
|
40
|
+
.action(() => {
|
|
41
|
+
const cwd = process.cwd();
|
|
42
|
+
console.log(chalk.bold.cyan('\nEnvironment Variables Audit\n'));
|
|
43
|
+
const result = auditEnvVars(cwd);
|
|
44
|
+
if (result.vars.length === 0) {
|
|
45
|
+
console.log(chalk.yellow('No environment variables detected.'));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (!result.envExampleExists) {
|
|
49
|
+
console.log(chalk.red('⚠ No .env.example / .env.sample found — new developers cannot know required variables\n'));
|
|
50
|
+
}
|
|
51
|
+
result.vars.forEach((v) => {
|
|
52
|
+
const icon = v.documented ? chalk.green('✓') : chalk.red('✗');
|
|
53
|
+
console.log(` ${icon} ${chalk.bold(v.name.padEnd(35))} ${chalk.dim(`${v.file}:${v.line}`)}`);
|
|
54
|
+
});
|
|
55
|
+
console.log(chalk.bold(`\nSummary: ${result.vars.length} env vars`));
|
|
56
|
+
if (result.undocumented.length > 0) {
|
|
57
|
+
console.log(chalk.red(` ${result.undocumented.length} undocumented: ${result.undocumented.slice(0, 5).join(', ')}${result.undocumented.length > 5 ? '...' : ''}`));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// ── cognitive-load ─────────────────────────────────────────────────────────
|
|
61
|
+
scan
|
|
62
|
+
.command('cognitive-load')
|
|
63
|
+
.description('Measure cognitive difficulty per file: nesting, magic numbers, long functions')
|
|
64
|
+
.option('--top <n>', 'number of files to show', '20')
|
|
65
|
+
.action((options) => {
|
|
66
|
+
const cwd = process.cwd();
|
|
67
|
+
const top = parseInt(options.top, 10) || 20;
|
|
68
|
+
console.log(chalk.bold.cyan('\nCognitive Load Analysis\n'));
|
|
69
|
+
const entries = measureCognitiveLoad(cwd, top);
|
|
70
|
+
if (entries.length === 0) {
|
|
71
|
+
console.log(chalk.yellow('No source files found.'));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
entries.forEach((e) => {
|
|
75
|
+
const scoreColor = e.score >= 40 ? chalk.red : e.score >= 20 ? chalk.yellow : chalk.green;
|
|
76
|
+
console.log(scoreColor(` ${e.score.toString().padStart(3)}`) +
|
|
77
|
+
chalk.gray(` nest:${e.maxNesting} fn:${e.longFunctions} magic:${e.magicNumbers} loc:${e.loc} `) +
|
|
78
|
+
chalk.white(e.file));
|
|
79
|
+
});
|
|
80
|
+
const avgScore = Math.round(entries.reduce((s, e) => s + e.score, 0) / entries.length);
|
|
81
|
+
console.log(chalk.bold(`\nAvg score: ${avgScore} · Top ${entries.length} files shown`));
|
|
82
|
+
console.log(chalk.dim('Score = nesting×3 + long-functions×5 + magic-numbers/3 + long-lines penalty'));
|
|
83
|
+
});
|
|
84
|
+
// ── secrets ────────────────────────────────────────────────────────────────
|
|
85
|
+
scan
|
|
86
|
+
.command('secrets')
|
|
87
|
+
.description('Scan current files for hardcoded secrets and credentials')
|
|
88
|
+
.action(() => {
|
|
89
|
+
const cwd = process.cwd();
|
|
90
|
+
console.log(chalk.bold.cyan('\nSecrets Scan (current files)\n'));
|
|
91
|
+
const hits = scanCurrentSecrets(cwd);
|
|
92
|
+
if (hits.length === 0) {
|
|
93
|
+
console.log(chalk.green('✓ No hardcoded secrets detected in current files'));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
console.log(chalk.red(`⚠ ${hits.length} potential secret(s) found:\n`));
|
|
97
|
+
hits.forEach((h) => {
|
|
98
|
+
console.log(chalk.bold(` ${h.file}:${h.line}`) + chalk.red(` [${h.pattern}]`));
|
|
99
|
+
console.log(chalk.dim(` ${h.preview}`));
|
|
100
|
+
});
|
|
101
|
+
console.log(chalk.yellow('\nNote: also check git history for previously committed secrets'));
|
|
102
|
+
});
|
|
103
|
+
// ── sbom ───────────────────────────────────────────────────────────────────
|
|
104
|
+
scan
|
|
105
|
+
.command('sbom')
|
|
106
|
+
.description('Software Bill of Materials: all dependencies with versions and pin status')
|
|
107
|
+
.option('--unpinned-only', 'show only unpinned dependencies')
|
|
108
|
+
.action((options) => {
|
|
109
|
+
const cwd = process.cwd();
|
|
110
|
+
console.log(chalk.bold.cyan('\nSoftware Bill of Materials\n'));
|
|
111
|
+
const report = buildSbom(cwd);
|
|
112
|
+
if (report.packages.length === 0) {
|
|
113
|
+
console.log(chalk.yellow('No package files found (requirements.txt, package.json, go.mod, Cargo.toml)'));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const packages = options.unpinnedOnly ? report.unpinned : report.packages;
|
|
117
|
+
packages.slice(0, 60).forEach((p) => {
|
|
118
|
+
const icon = p.pinned ? chalk.green('✓') : chalk.red('!');
|
|
119
|
+
console.log(` ${icon} ${chalk.gray(p.lang.padEnd(8))} ${chalk.white(p.name.padEnd(30))} ${chalk.dim(p.version)}`);
|
|
120
|
+
});
|
|
121
|
+
if (packages.length > 60)
|
|
122
|
+
console.log(chalk.dim(` ... and ${packages.length - 60} more`));
|
|
123
|
+
console.log(chalk.bold(`\nTotal: ${report.totalCount} packages`));
|
|
124
|
+
if (report.unpinned.length > 0) {
|
|
125
|
+
console.log(chalk.yellow(` ${report.unpinned.length} unpinned (supply chain risk)`));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"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"}
|