@accelerationguy/accel 1.0.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/CLAUDE.md +19 -0
- package/LICENSE +33 -0
- package/README.md +275 -0
- package/bin/install.js +661 -0
- package/docs/getting-started.md +164 -0
- package/docs/module-guide.md +139 -0
- package/modules/drive/LICENSE +21 -0
- package/modules/drive/PAUL-VS-GSD.md +171 -0
- package/modules/drive/README.md +555 -0
- package/modules/drive/assets/terminal.svg +67 -0
- package/modules/drive/bin/install.js +210 -0
- package/modules/drive/integration.js +76 -0
- package/modules/drive/package.json +38 -0
- package/modules/drive/src/commands/add-phase.md +36 -0
- package/modules/drive/src/commands/apply.md +83 -0
- package/modules/drive/src/commands/assumptions.md +37 -0
- package/modules/drive/src/commands/audit.md +57 -0
- package/modules/drive/src/commands/complete-milestone.md +36 -0
- package/modules/drive/src/commands/config.md +175 -0
- package/modules/drive/src/commands/consider-issues.md +41 -0
- package/modules/drive/src/commands/discover.md +48 -0
- package/modules/drive/src/commands/discuss-milestone.md +33 -0
- package/modules/drive/src/commands/discuss.md +34 -0
- package/modules/drive/src/commands/flows.md +73 -0
- package/modules/drive/src/commands/handoff.md +201 -0
- package/modules/drive/src/commands/help.md +525 -0
- package/modules/drive/src/commands/init.md +54 -0
- package/modules/drive/src/commands/map-codebase.md +34 -0
- package/modules/drive/src/commands/milestone.md +34 -0
- package/modules/drive/src/commands/pause.md +44 -0
- package/modules/drive/src/commands/plan-fix.md +216 -0
- package/modules/drive/src/commands/plan.md +36 -0
- package/modules/drive/src/commands/progress.md +138 -0
- package/modules/drive/src/commands/register.md +29 -0
- package/modules/drive/src/commands/remove-phase.md +37 -0
- package/modules/drive/src/commands/research-phase.md +209 -0
- package/modules/drive/src/commands/research.md +47 -0
- package/modules/drive/src/commands/resume.md +49 -0
- package/modules/drive/src/commands/status.md +78 -0
- package/modules/drive/src/commands/unify.md +87 -0
- package/modules/drive/src/commands/verify.md +60 -0
- package/modules/drive/src/references/checkpoints.md +234 -0
- package/modules/drive/src/references/context-management.md +219 -0
- package/modules/drive/src/references/git-strategy.md +206 -0
- package/modules/drive/src/references/loop-phases.md +254 -0
- package/modules/drive/src/references/plan-format.md +263 -0
- package/modules/drive/src/references/quality-principles.md +152 -0
- package/modules/drive/src/references/research-quality-control.md +247 -0
- package/modules/drive/src/references/sonarqube-integration.md +244 -0
- package/modules/drive/src/references/specialized-workflow-integration.md +186 -0
- package/modules/drive/src/references/subagent-criteria.md +179 -0
- package/modules/drive/src/references/tdd.md +219 -0
- package/modules/drive/src/references/work-units.md +161 -0
- package/modules/drive/src/rules/commands.md +108 -0
- package/modules/drive/src/rules/references.md +107 -0
- package/modules/drive/src/rules/style.md +123 -0
- package/modules/drive/src/rules/templates.md +51 -0
- package/modules/drive/src/rules/workflows.md +133 -0
- package/modules/drive/src/templates/CONTEXT.md +88 -0
- package/modules/drive/src/templates/DEBUG.md +164 -0
- package/modules/drive/src/templates/DISCOVERY.md +148 -0
- package/modules/drive/src/templates/HANDOFF.md +77 -0
- package/modules/drive/src/templates/ISSUES.md +93 -0
- package/modules/drive/src/templates/MILESTONES.md +167 -0
- package/modules/drive/src/templates/PLAN.md +328 -0
- package/modules/drive/src/templates/PROJECT.md +219 -0
- package/modules/drive/src/templates/RESEARCH.md +130 -0
- package/modules/drive/src/templates/ROADMAP.md +328 -0
- package/modules/drive/src/templates/SPECIAL-FLOWS.md +70 -0
- package/modules/drive/src/templates/STATE.md +210 -0
- package/modules/drive/src/templates/SUMMARY.md +221 -0
- package/modules/drive/src/templates/UAT-ISSUES.md +139 -0
- package/modules/drive/src/templates/codebase/architecture.md +259 -0
- package/modules/drive/src/templates/codebase/concerns.md +329 -0
- package/modules/drive/src/templates/codebase/conventions.md +311 -0
- package/modules/drive/src/templates/codebase/integrations.md +284 -0
- package/modules/drive/src/templates/codebase/stack.md +190 -0
- package/modules/drive/src/templates/codebase/structure.md +287 -0
- package/modules/drive/src/templates/codebase/testing.md +484 -0
- package/modules/drive/src/templates/config.md +181 -0
- package/modules/drive/src/templates/milestone-archive.md +236 -0
- package/modules/drive/src/templates/milestone-context.md +190 -0
- package/modules/drive/src/templates/paul-json.md +147 -0
- package/modules/drive/src/vector-config/PAUL +26 -0
- package/modules/drive/src/vector-config/PAUL.manifest +11 -0
- package/modules/drive/src/workflows/apply-phase.md +393 -0
- package/modules/drive/src/workflows/audit-plan.md +344 -0
- package/modules/drive/src/workflows/complete-milestone.md +479 -0
- package/modules/drive/src/workflows/configure-special-flows.md +283 -0
- package/modules/drive/src/workflows/consider-issues.md +172 -0
- package/modules/drive/src/workflows/create-milestone.md +268 -0
- package/modules/drive/src/workflows/debug.md +292 -0
- package/modules/drive/src/workflows/discovery.md +187 -0
- package/modules/drive/src/workflows/discuss-milestone.md +245 -0
- package/modules/drive/src/workflows/discuss-phase.md +231 -0
- package/modules/drive/src/workflows/init-project.md +698 -0
- package/modules/drive/src/workflows/map-codebase.md +459 -0
- package/modules/drive/src/workflows/pause-work.md +259 -0
- package/modules/drive/src/workflows/phase-assumptions.md +181 -0
- package/modules/drive/src/workflows/plan-phase.md +385 -0
- package/modules/drive/src/workflows/quality-gate.md +263 -0
- package/modules/drive/src/workflows/register-manifest.md +107 -0
- package/modules/drive/src/workflows/research.md +241 -0
- package/modules/drive/src/workflows/resume-project.md +200 -0
- package/modules/drive/src/workflows/roadmap-management.md +334 -0
- package/modules/drive/src/workflows/transition-phase.md +368 -0
- package/modules/drive/src/workflows/unify-phase.md +290 -0
- package/modules/drive/src/workflows/verify-work.md +241 -0
- package/modules/forge/README.md +281 -0
- package/modules/forge/bin/install.js +200 -0
- package/modules/forge/package.json +32 -0
- package/modules/forge/skillsmith/rules/checklists-rules.md +42 -0
- package/modules/forge/skillsmith/rules/context-rules.md +43 -0
- package/modules/forge/skillsmith/rules/entry-point-rules.md +44 -0
- package/modules/forge/skillsmith/rules/frameworks-rules.md +43 -0
- package/modules/forge/skillsmith/rules/tasks-rules.md +52 -0
- package/modules/forge/skillsmith/rules/templates-rules.md +43 -0
- package/modules/forge/skillsmith/skillsmith.md +82 -0
- package/modules/forge/skillsmith/tasks/audit.md +277 -0
- package/modules/forge/skillsmith/tasks/discover.md +145 -0
- package/modules/forge/skillsmith/tasks/distill.md +276 -0
- package/modules/forge/skillsmith/tasks/scaffold.md +349 -0
- package/modules/forge/specs/checklists.md +193 -0
- package/modules/forge/specs/context.md +223 -0
- package/modules/forge/specs/entry-point.md +320 -0
- package/modules/forge/specs/frameworks.md +228 -0
- package/modules/forge/specs/rules.md +245 -0
- package/modules/forge/specs/tasks.md +344 -0
- package/modules/forge/specs/templates.md +335 -0
- package/modules/forge/terminal.svg +70 -0
- package/modules/ignition/README.md +245 -0
- package/modules/ignition/bin/install.js +184 -0
- package/modules/ignition/checklists/planning-quality.md +55 -0
- package/modules/ignition/data/application/config.md +21 -0
- package/modules/ignition/data/application/guide.md +51 -0
- package/modules/ignition/data/application/skill-loadout.md +11 -0
- package/modules/ignition/data/campaign/config.md +18 -0
- package/modules/ignition/data/campaign/guide.md +36 -0
- package/modules/ignition/data/campaign/skill-loadout.md +10 -0
- package/modules/ignition/data/client/config.md +18 -0
- package/modules/ignition/data/client/guide.md +36 -0
- package/modules/ignition/data/client/skill-loadout.md +11 -0
- package/modules/ignition/data/utility/config.md +18 -0
- package/modules/ignition/data/utility/guide.md +31 -0
- package/modules/ignition/data/utility/skill-loadout.md +8 -0
- package/modules/ignition/data/workflow/config.md +19 -0
- package/modules/ignition/data/workflow/guide.md +41 -0
- package/modules/ignition/data/workflow/skill-loadout.md +10 -0
- package/modules/ignition/integration.js +54 -0
- package/modules/ignition/package.json +35 -0
- package/modules/ignition/seed.md +81 -0
- package/modules/ignition/tasks/add-type.md +164 -0
- package/modules/ignition/tasks/graduate.md +182 -0
- package/modules/ignition/tasks/ideate.md +221 -0
- package/modules/ignition/tasks/launch.md +137 -0
- package/modules/ignition/tasks/status.md +71 -0
- package/modules/ignition/templates/planning-application.md +193 -0
- package/modules/ignition/templates/planning-campaign.md +138 -0
- package/modules/ignition/templates/planning-client.md +149 -0
- package/modules/ignition/templates/planning-utility.md +112 -0
- package/modules/ignition/templates/planning-workflow.md +125 -0
- package/modules/ignition/terminal.svg +74 -0
- package/modules/mission-control/CONTEXT-CONTINUITY-SPEC.md +293 -0
- package/modules/mission-control/CONTEXT-ENGINEERING-GUIDE.md +282 -0
- package/modules/mission-control/README.md +91 -0
- package/modules/mission-control/assets/terminal.svg +80 -0
- package/modules/mission-control/examples/entities.example.json +133 -0
- package/modules/mission-control/examples/projects.example.json +318 -0
- package/modules/mission-control/examples/state.example.json +183 -0
- package/modules/mission-control/examples/vector.example.json +245 -0
- package/modules/mission-control/mission-control/checklists/install-verification.md +46 -0
- package/modules/mission-control/mission-control/frameworks/framework-registry.md +83 -0
- package/modules/mission-control/mission-control/mission-control.md +83 -0
- package/modules/mission-control/mission-control/tasks/insights.md +73 -0
- package/modules/mission-control/mission-control/tasks/install.md +194 -0
- package/modules/mission-control/mission-control/tasks/status.md +125 -0
- package/modules/mission-control/schemas/entities.schema.json +89 -0
- package/modules/mission-control/schemas/projects.schema.json +221 -0
- package/modules/mission-control/schemas/state.schema.json +108 -0
- package/modules/mission-control/schemas/vector.schema.json +200 -0
- package/modules/momentum/README.md +678 -0
- package/modules/momentum/bin/install.js +563 -0
- package/modules/momentum/integration.js +131 -0
- package/modules/momentum/package.json +42 -0
- package/modules/momentum/schemas/entities.schema.json +89 -0
- package/modules/momentum/schemas/projects.schema.json +221 -0
- package/modules/momentum/schemas/state.schema.json +108 -0
- package/modules/momentum/src/commands/audit-claude-md.md +31 -0
- package/modules/momentum/src/commands/audit.md +33 -0
- package/modules/momentum/src/commands/groom.md +35 -0
- package/modules/momentum/src/commands/history.md +27 -0
- package/modules/momentum/src/commands/pulse.md +33 -0
- package/modules/momentum/src/commands/scaffold.md +33 -0
- package/modules/momentum/src/commands/status.md +28 -0
- package/modules/momentum/src/commands/surface-convert.md +35 -0
- package/modules/momentum/src/commands/surface-create.md +34 -0
- package/modules/momentum/src/commands/surface-list.md +27 -0
- package/modules/momentum/src/commands/vector-hygiene.md +33 -0
- package/modules/momentum/src/framework/context/momentum-principles.md +71 -0
- package/modules/momentum/src/framework/frameworks/audit-strategies.md +53 -0
- package/modules/momentum/src/framework/frameworks/satellite-registration.md +44 -0
- package/modules/momentum/src/framework/tasks/audit-claude-md.md +68 -0
- package/modules/momentum/src/framework/tasks/audit.md +64 -0
- package/modules/momentum/src/framework/tasks/groom.md +164 -0
- package/modules/momentum/src/framework/tasks/history.md +34 -0
- package/modules/momentum/src/framework/tasks/pulse.md +83 -0
- package/modules/momentum/src/framework/tasks/scaffold.md +202 -0
- package/modules/momentum/src/framework/tasks/status.md +35 -0
- package/modules/momentum/src/framework/tasks/surface-convert.md +143 -0
- package/modules/momentum/src/framework/tasks/surface-create.md +184 -0
- package/modules/momentum/src/framework/tasks/surface-list.md +42 -0
- package/modules/momentum/src/framework/tasks/vector-hygiene.md +160 -0
- package/modules/momentum/src/framework/templates/workspace-json.md +96 -0
- package/modules/momentum/src/hooks/_template.py +129 -0
- package/modules/momentum/src/hooks/active-hook.py +178 -0
- package/modules/momentum/src/hooks/backlog-hook.py +115 -0
- package/modules/momentum/src/hooks/mission-control-insights.py +169 -0
- package/modules/momentum/src/hooks/momentum-pulse-check.py +351 -0
- package/modules/momentum/src/hooks/operator.py +53 -0
- package/modules/momentum/src/hooks/psmm-injector.py +67 -0
- package/modules/momentum/src/hooks/satellite-detection.py +248 -0
- package/modules/momentum/src/packages/momentum-mcp/index.js +119 -0
- package/modules/momentum/src/packages/momentum-mcp/package.json +10 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/entities.js +226 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/operator.js +106 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/projects.js +322 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/psmm.js +206 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/state.js +199 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/surfaces.js +404 -0
- package/modules/momentum/src/skill/momentum.md +111 -0
- package/modules/momentum/src/tasks/groom.md +164 -0
- package/modules/momentum/src/templates/operator.json +66 -0
- package/modules/momentum/src/templates/workspace.json +111 -0
- package/modules/momentum/terminal.svg +77 -0
- package/modules/radar/README.md +1552 -0
- package/modules/radar/commands/audit.md +233 -0
- package/modules/radar/commands/guardrails.md +194 -0
- package/modules/radar/commands/init.md +207 -0
- package/modules/radar/commands/playbook.md +176 -0
- package/modules/radar/commands/remediate.md +156 -0
- package/modules/radar/commands/report.md +172 -0
- package/modules/radar/commands/resume.md +176 -0
- package/modules/radar/commands/status.md +148 -0
- package/modules/radar/commands/transform.md +205 -0
- package/modules/radar/commands/validate.md +177 -0
- package/modules/radar/docs/ARCHITECTURE.md +336 -0
- package/modules/radar/docs/GETTING-STARTED.md +287 -0
- package/modules/radar/docs/standards/agents.md +197 -0
- package/modules/radar/docs/standards/commands.md +250 -0
- package/modules/radar/docs/standards/domains.md +191 -0
- package/modules/radar/docs/standards/personas.md +211 -0
- package/modules/radar/docs/standards/rules.md +218 -0
- package/modules/radar/docs/standards/runtime.md +445 -0
- package/modules/radar/docs/standards/schemas.md +269 -0
- package/modules/radar/docs/standards/tools.md +273 -0
- package/modules/radar/docs/standards/workflows.md +254 -0
- package/modules/radar/docs/terminal.svg +72 -0
- package/modules/radar/docs/validation/convention-compliance-report.md +183 -0
- package/modules/radar/docs/validation/cross-reference-report.md +195 -0
- package/modules/radar/docs/validation/validation-summary.md +118 -0
- package/modules/radar/docs/validation/version-manifest.yaml +363 -0
- package/modules/radar/install.sh +711 -0
- package/modules/radar/integration.js +53 -0
- package/modules/radar/src/core/agents/architect.md +25 -0
- package/modules/radar/src/core/agents/compliance-officer.md +25 -0
- package/modules/radar/src/core/agents/data-engineer.md +25 -0
- package/modules/radar/src/core/agents/devils-advocate.md +22 -0
- package/modules/radar/src/core/agents/performance-engineer.md +25 -0
- package/modules/radar/src/core/agents/principal-engineer.md +23 -0
- package/modules/radar/src/core/agents/reality-gap-analyst.md +22 -0
- package/modules/radar/src/core/agents/security-engineer.md +25 -0
- package/modules/radar/src/core/agents/senior-app-engineer.md +25 -0
- package/modules/radar/src/core/agents/sre.md +25 -0
- package/modules/radar/src/core/agents/staff-engineer.md +23 -0
- package/modules/radar/src/core/agents/test-engineer.md +25 -0
- package/modules/radar/src/core/personas/architect.md +111 -0
- package/modules/radar/src/core/personas/compliance-officer.md +104 -0
- package/modules/radar/src/core/personas/data-engineer.md +113 -0
- package/modules/radar/src/core/personas/devils-advocate.md +105 -0
- package/modules/radar/src/core/personas/performance-engineer.md +119 -0
- package/modules/radar/src/core/personas/principal-engineer.md +119 -0
- package/modules/radar/src/core/personas/reality-gap-analyst.md +111 -0
- package/modules/radar/src/core/personas/security-engineer.md +108 -0
- package/modules/radar/src/core/personas/senior-app-engineer.md +111 -0
- package/modules/radar/src/core/personas/sre.md +117 -0
- package/modules/radar/src/core/personas/staff-engineer.md +109 -0
- package/modules/radar/src/core/personas/test-engineer.md +109 -0
- package/modules/radar/src/core/workflows/disagreement-resolution.md +183 -0
- package/modules/radar/src/core/workflows/phase-0-context.md +148 -0
- package/modules/radar/src/core/workflows/phase-1-reconnaissance.md +169 -0
- package/modules/radar/src/core/workflows/phase-2-domain-audits.md +190 -0
- package/modules/radar/src/core/workflows/phase-3-cross-domain.md +177 -0
- package/modules/radar/src/core/workflows/phase-4-adversarial-review.md +165 -0
- package/modules/radar/src/core/workflows/phase-5-report.md +189 -0
- package/modules/radar/src/core/workflows/phase-checkpoint.md +222 -0
- package/modules/radar/src/core/workflows/session-handoff.md +152 -0
- package/modules/radar/src/domains/00-context.md +201 -0
- package/modules/radar/src/domains/01-architecture.md +248 -0
- package/modules/radar/src/domains/02-data.md +224 -0
- package/modules/radar/src/domains/03-correctness.md +230 -0
- package/modules/radar/src/domains/04-security.md +274 -0
- package/modules/radar/src/domains/05-compliance.md +228 -0
- package/modules/radar/src/domains/06-testing.md +228 -0
- package/modules/radar/src/domains/07-reliability.md +246 -0
- package/modules/radar/src/domains/08-performance.md +247 -0
- package/modules/radar/src/domains/09-maintainability.md +271 -0
- package/modules/radar/src/domains/10-operability.md +250 -0
- package/modules/radar/src/domains/11-change-risk.md +246 -0
- package/modules/radar/src/domains/12-team-risk.md +221 -0
- package/modules/radar/src/domains/13-risk-synthesis.md +202 -0
- package/modules/radar/src/rules/agent-boundaries.md +78 -0
- package/modules/radar/src/rules/disagreement-protocol.md +76 -0
- package/modules/radar/src/rules/epistemic-hygiene.md +78 -0
- package/modules/radar/src/schemas/confidence.md +185 -0
- package/modules/radar/src/schemas/disagreement.md +238 -0
- package/modules/radar/src/schemas/finding.md +287 -0
- package/modules/radar/src/schemas/report-section.md +150 -0
- package/modules/radar/src/schemas/signal.md +108 -0
- package/modules/radar/src/tools/checkov.md +463 -0
- package/modules/radar/src/tools/git-history.md +581 -0
- package/modules/radar/src/tools/gitleaks.md +447 -0
- package/modules/radar/src/tools/grype.md +611 -0
- package/modules/radar/src/tools/semgrep.md +378 -0
- package/modules/radar/src/tools/sonarqube.md +550 -0
- package/modules/radar/src/tools/syft.md +539 -0
- package/modules/radar/src/tools/trivy.md +439 -0
- package/modules/radar/src/transform/agents/change-risk-modeler.md +24 -0
- package/modules/radar/src/transform/agents/execution-validator.md +24 -0
- package/modules/radar/src/transform/agents/guardrail-generator.md +24 -0
- package/modules/radar/src/transform/agents/pedagogy-agent.md +24 -0
- package/modules/radar/src/transform/agents/remediation-architect.md +24 -0
- package/modules/radar/src/transform/personas/change-risk-modeler.md +95 -0
- package/modules/radar/src/transform/personas/execution-validator.md +95 -0
- package/modules/radar/src/transform/personas/guardrail-generator.md +103 -0
- package/modules/radar/src/transform/personas/pedagogy-agent.md +105 -0
- package/modules/radar/src/transform/personas/remediation-architect.md +95 -0
- package/modules/radar/src/transform/rules/change-risk-rules.md +87 -0
- package/modules/radar/src/transform/rules/safety-governance.md +87 -0
- package/modules/radar/src/transform/schemas/change-risk.md +139 -0
- package/modules/radar/src/transform/schemas/intervention-level.md +207 -0
- package/modules/radar/src/transform/schemas/playbook.md +205 -0
- package/modules/radar/src/transform/schemas/verification-plan.md +134 -0
- package/modules/radar/src/transform/workflows/phase-6-remediation.md +148 -0
- package/modules/radar/src/transform/workflows/phase-7-risk-validation.md +161 -0
- package/modules/radar/src/transform/workflows/phase-8-execution-planning.md +159 -0
- package/modules/radar/src/transform/workflows/transform-safety.md +158 -0
- package/modules/vector/.vector-template/sessions/.gitkeep +0 -0
- package/modules/vector/.vector-template/vector.json +72 -0
- package/modules/vector/AUDIT-CLAUDEMD.md +154 -0
- package/modules/vector/INSTALL.md +185 -0
- package/modules/vector/LICENSE +21 -0
- package/modules/vector/README.md +409 -0
- package/modules/vector/VECTOR-BLOCK.md +57 -0
- package/modules/vector/assets/terminal.svg +68 -0
- package/modules/vector/bin/install.js +455 -0
- package/modules/vector/bin/migrate-v1-to-v2.sh +492 -0
- package/modules/vector/commands/help.md +46 -0
- package/modules/vector/hooks/vector-hook.py +775 -0
- package/modules/vector/mcp/index.js +118 -0
- package/modules/vector/mcp/package.json +10 -0
- package/modules/vector/mcp/tools/decisions.js +269 -0
- package/modules/vector/mcp/tools/domains.js +361 -0
- package/modules/vector/mcp/tools/staging.js +252 -0
- package/modules/vector/mcp/tools/vector-json.js +647 -0
- package/modules/vector/package.json +38 -0
- package/modules/vector/schemas/vector.schema.json +237 -0
- package/package.json +39 -0
- package/shared/branding/branding.js +70 -0
- package/shared/config/defaults.json +59 -0
- package/shared/events/README.md +175 -0
- package/shared/events/event-bus.js +134 -0
- package/shared/events/event_bus.py +255 -0
- package/shared/events/integrations.js +161 -0
- package/shared/events/schemas/audit-complete.schema.json +21 -0
- package/shared/events/schemas/phase-progress.schema.json +23 -0
- package/shared/events/schemas/plan-created.schema.json +21 -0
|
@@ -0,0 +1,711 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ════════════════════════════════════════
|
|
5
|
+
# Radar Install Script
|
|
6
|
+
# ════════════════════════════════════════
|
|
7
|
+
#
|
|
8
|
+
# Two install modes:
|
|
9
|
+
# Remote: curl -sSL https://raw.githubusercontent.com/OWNER/radar/main/install.sh | bash
|
|
10
|
+
# Local: bash install.sh (from cloned repo)
|
|
11
|
+
#
|
|
12
|
+
# Installs Radar framework, commands, and OSS analysis tools.
|
|
13
|
+
|
|
14
|
+
# ── Configuration ─────────────────────
|
|
15
|
+
|
|
16
|
+
RADAR_REPO="accelerationguy/accelerate"
|
|
17
|
+
RADAR_BRANCH="main"
|
|
18
|
+
RADAR_HOME="$HOME/.accel/radar"
|
|
19
|
+
RADAR_COMMANDS="$HOME/.claude/commands/radar"
|
|
20
|
+
RADAR_VERSION="0.2.0"
|
|
21
|
+
|
|
22
|
+
# ── Color helpers ──────────────────────
|
|
23
|
+
|
|
24
|
+
GREEN='\033[0;32m'
|
|
25
|
+
YELLOW='\033[1;33m'
|
|
26
|
+
RED='\033[0;31m'
|
|
27
|
+
BOLD='\033[1m'
|
|
28
|
+
DIM='\033[2m'
|
|
29
|
+
NC='\033[0m'
|
|
30
|
+
|
|
31
|
+
info() { echo -e "${GREEN}✓${NC} $1"; }
|
|
32
|
+
warn() { echo -e "${YELLOW}⚠${NC} $1"; }
|
|
33
|
+
err() { echo -e "${RED}✗${NC} $1"; }
|
|
34
|
+
bold() { echo -e "${BOLD}$1${NC}"; }
|
|
35
|
+
dim() { echo -e "${DIM}$1${NC}"; }
|
|
36
|
+
header() {
|
|
37
|
+
echo ""
|
|
38
|
+
echo -e "${BOLD}════════════════════════════════════════${NC}"
|
|
39
|
+
echo -e "${BOLD} $1${NC}"
|
|
40
|
+
echo -e "${BOLD}════════════════════════════════════════${NC}"
|
|
41
|
+
echo ""
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
prompt_yn() {
|
|
45
|
+
local msg="$1"
|
|
46
|
+
local default="${2:-n}"
|
|
47
|
+
local reply
|
|
48
|
+
if [[ "$default" == "y" ]]; then
|
|
49
|
+
read -rp "$msg [Y/n]: " reply < /dev/tty
|
|
50
|
+
reply="${reply:-y}"
|
|
51
|
+
else
|
|
52
|
+
read -rp "$msg [y/N]: " reply < /dev/tty
|
|
53
|
+
reply="${reply:-n}"
|
|
54
|
+
fi
|
|
55
|
+
[[ "$reply" =~ ^[Yy]$ ]]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# Track tool install results
|
|
59
|
+
declare -a TOOLS_INSTALLED=()
|
|
60
|
+
declare -a TOOLS_SKIPPED=()
|
|
61
|
+
declare -a TOOLS_FAILED=()
|
|
62
|
+
SONARQUBE_MODE=""
|
|
63
|
+
|
|
64
|
+
# ── Detect install mode ───────────────
|
|
65
|
+
|
|
66
|
+
# RADAR_SOURCE will point to the directory containing src/ and commands/
|
|
67
|
+
RADAR_SOURCE=""
|
|
68
|
+
CLEANUP_DIR=""
|
|
69
|
+
|
|
70
|
+
detect_mode() {
|
|
71
|
+
# Check if running from a cloned repo (src/ and commands/ exist relative to script)
|
|
72
|
+
local script_dir
|
|
73
|
+
# When piped via curl|bash, BASH_SOURCE[0] is empty or "bash"
|
|
74
|
+
if [[ -n "${BASH_SOURCE[0]:-}" ]] && [[ "${BASH_SOURCE[0]}" != "bash" ]]; then
|
|
75
|
+
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
76
|
+
if [[ -d "$script_dir/src" ]] && [[ -d "$script_dir/commands" ]]; then
|
|
77
|
+
RADAR_SOURCE="$script_dir"
|
|
78
|
+
info "Local repo detected — installing from $script_dir"
|
|
79
|
+
return
|
|
80
|
+
fi
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Remote mode — download from GitHub
|
|
84
|
+
echo "Downloading Radar v${RADAR_VERSION} from GitHub..."
|
|
85
|
+
echo ""
|
|
86
|
+
|
|
87
|
+
if ! command -v curl &>/dev/null; then
|
|
88
|
+
err "curl is required but not found."
|
|
89
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
local tmp_dir
|
|
93
|
+
tmp_dir="$(mktemp -d)"
|
|
94
|
+
CLEANUP_DIR="$tmp_dir"
|
|
95
|
+
|
|
96
|
+
local tarball_url="https://github.com/${RADAR_REPO}/archive/refs/heads/${RADAR_BRANCH}.tar.gz"
|
|
97
|
+
|
|
98
|
+
if ! curl -sSL "$tarball_url" | tar xz -C "$tmp_dir" 2>/dev/null; then
|
|
99
|
+
err "Failed to download Radar from GitHub."
|
|
100
|
+
echo " URL: $tarball_url"
|
|
101
|
+
echo ""
|
|
102
|
+
echo " Alternatives:"
|
|
103
|
+
echo " git clone https://github.com/${RADAR_REPO}.git && cd accelerate && bash modules/radar/install.sh"
|
|
104
|
+
rm -rf "$tmp_dir"
|
|
105
|
+
exit 1
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
# tar extracts to {repo}-{branch}/ directory
|
|
109
|
+
local extracted_dir
|
|
110
|
+
extracted_dir="$(ls -d "$tmp_dir"/*/ 2>/dev/null | head -1)"
|
|
111
|
+
|
|
112
|
+
if [[ -z "$extracted_dir" ]] || [[ ! -d "$extracted_dir/src" ]]; then
|
|
113
|
+
err "Download succeeded but expected files not found."
|
|
114
|
+
rm -rf "$tmp_dir"
|
|
115
|
+
exit 1
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
RADAR_SOURCE="$extracted_dir"
|
|
119
|
+
info "Downloaded Radar v${RADAR_VERSION}"
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
cleanup() {
|
|
123
|
+
if [[ -n "$CLEANUP_DIR" ]] && [[ -d "$CLEANUP_DIR" ]]; then
|
|
124
|
+
rm -rf "$CLEANUP_DIR"
|
|
125
|
+
fi
|
|
126
|
+
}
|
|
127
|
+
trap cleanup EXIT
|
|
128
|
+
|
|
129
|
+
# ── 1. Pre-flight checks ──────────────
|
|
130
|
+
|
|
131
|
+
header "Radar Installer v${RADAR_VERSION}"
|
|
132
|
+
|
|
133
|
+
echo "This script installs the Radar codebase auditing framework."
|
|
134
|
+
echo ""
|
|
135
|
+
|
|
136
|
+
# Check Claude Code directory
|
|
137
|
+
if [[ ! -d "$HOME/.claude" ]]; then
|
|
138
|
+
err "~/.claude/ directory not found."
|
|
139
|
+
echo " Claude Code must be installed first."
|
|
140
|
+
echo " Visit: https://claude.ai/code"
|
|
141
|
+
exit 1
|
|
142
|
+
fi
|
|
143
|
+
info "Claude Code directory found"
|
|
144
|
+
|
|
145
|
+
# Detect local vs remote and set RADAR_SOURCE
|
|
146
|
+
detect_mode
|
|
147
|
+
|
|
148
|
+
# Verify source has what we need
|
|
149
|
+
if [[ ! -d "$RADAR_SOURCE/src" ]] || [[ ! -d "$RADAR_SOURCE/commands" ]]; then
|
|
150
|
+
err "Radar source missing src/ or commands/ directory."
|
|
151
|
+
exit 1
|
|
152
|
+
fi
|
|
153
|
+
info "Radar source verified"
|
|
154
|
+
|
|
155
|
+
# Check for existing installation
|
|
156
|
+
SKIP_FRAMEWORK=false
|
|
157
|
+
SKIP_COMMANDS=false
|
|
158
|
+
if [[ -d "$RADAR_HOME" ]] || [[ -d "$RADAR_COMMANDS" ]]; then
|
|
159
|
+
echo ""
|
|
160
|
+
warn "Existing Radar installation detected."
|
|
161
|
+
[[ -d "$RADAR_HOME" ]] && dim " Framework: $RADAR_HOME"
|
|
162
|
+
[[ -d "$RADAR_COMMANDS" ]] && dim " Commands: $RADAR_COMMANDS"
|
|
163
|
+
echo ""
|
|
164
|
+
bold " What would you like to do?"
|
|
165
|
+
echo ""
|
|
166
|
+
echo " [1] Update everything (framework + commands + tool setup)"
|
|
167
|
+
echo " [2] Just run tool setup (skip framework/commands)"
|
|
168
|
+
echo " [3] Cancel"
|
|
169
|
+
echo ""
|
|
170
|
+
read -rp " Choose [1/2/3]: " reinstall_choice < /dev/tty
|
|
171
|
+
case "$reinstall_choice" in
|
|
172
|
+
1)
|
|
173
|
+
echo ""
|
|
174
|
+
info "Updating framework and commands, then running tool setup."
|
|
175
|
+
;;
|
|
176
|
+
2)
|
|
177
|
+
SKIP_FRAMEWORK=true
|
|
178
|
+
SKIP_COMMANDS=true
|
|
179
|
+
echo ""
|
|
180
|
+
info "Skipping framework/commands — jumping to tool setup."
|
|
181
|
+
;;
|
|
182
|
+
*)
|
|
183
|
+
echo "Installation cancelled."
|
|
184
|
+
exit 0
|
|
185
|
+
;;
|
|
186
|
+
esac
|
|
187
|
+
echo ""
|
|
188
|
+
fi
|
|
189
|
+
|
|
190
|
+
# ── 2. Framework installation ─────────
|
|
191
|
+
|
|
192
|
+
if [[ "$SKIP_FRAMEWORK" == "false" ]]; then
|
|
193
|
+
header "Installing Framework"
|
|
194
|
+
|
|
195
|
+
mkdir -p "$RADAR_HOME"
|
|
196
|
+
cp -r "$RADAR_SOURCE/src/"* "$RADAR_HOME/"
|
|
197
|
+
|
|
198
|
+
FRAMEWORK_COUNT=$(find "$RADAR_HOME" -type f | wc -l | tr -d ' ')
|
|
199
|
+
info "Copied $FRAMEWORK_COUNT framework files to ~/.accel/radar/"
|
|
200
|
+
else
|
|
201
|
+
FRAMEWORK_COUNT=$(find "$RADAR_HOME" -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
# ── 3. Commands installation ──────────
|
|
205
|
+
|
|
206
|
+
if [[ "$SKIP_COMMANDS" == "false" ]]; then
|
|
207
|
+
header "Installing Commands"
|
|
208
|
+
|
|
209
|
+
mkdir -p "$RADAR_COMMANDS"
|
|
210
|
+
cp "$RADAR_SOURCE/commands/"*.md "$RADAR_COMMANDS/"
|
|
211
|
+
|
|
212
|
+
COMMAND_COUNT=$(find "$RADAR_COMMANDS" -name "*.md" -type f | wc -l | tr -d ' ')
|
|
213
|
+
info "Installed $COMMAND_COUNT slash commands to ~/.claude/commands/radar/"
|
|
214
|
+
dim " Commands available: /radar:audit, /radar:resume, /radar:status, /radar:report"
|
|
215
|
+
dim " Transform: /radar:transform, /radar:remediate, /radar:playbook, /radar:guardrails"
|
|
216
|
+
else
|
|
217
|
+
COMMAND_COUNT=$(find "$RADAR_COMMANDS" -name "*.md" -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
# ── 4. Tool installation (interactive) ─
|
|
221
|
+
|
|
222
|
+
header "Tool Installation"
|
|
223
|
+
|
|
224
|
+
echo "Radar uses 7 OSS analysis tools for comprehensive auditing."
|
|
225
|
+
echo "Each tool is optional — install what you need now, add more later."
|
|
226
|
+
echo ""
|
|
227
|
+
info "git-history uses built-in git commands — always available."
|
|
228
|
+
echo ""
|
|
229
|
+
echo "────────────────────────────────────────"
|
|
230
|
+
echo ""
|
|
231
|
+
|
|
232
|
+
# ── Helper: try install methods in order ──
|
|
233
|
+
|
|
234
|
+
try_install() {
|
|
235
|
+
local name="$1"
|
|
236
|
+
shift
|
|
237
|
+
local methods=("$@")
|
|
238
|
+
|
|
239
|
+
for method in "${methods[@]}"; do
|
|
240
|
+
local cmd="${method%%:*}"
|
|
241
|
+
local install_cmd="${method#*:}"
|
|
242
|
+
|
|
243
|
+
if command -v "$cmd" &>/dev/null; then
|
|
244
|
+
echo " Installing via $cmd..."
|
|
245
|
+
local output
|
|
246
|
+
if output=$(eval "$install_cmd" 2>&1); then
|
|
247
|
+
echo "$output" | tail -3
|
|
248
|
+
return 0
|
|
249
|
+
else
|
|
250
|
+
echo "$output" | tail -3
|
|
251
|
+
warn " $cmd install failed, trying next method..."
|
|
252
|
+
fi
|
|
253
|
+
fi
|
|
254
|
+
done
|
|
255
|
+
|
|
256
|
+
err " No suitable install method found for $name."
|
|
257
|
+
echo " Try: pipx, brew, or check the tool's documentation."
|
|
258
|
+
return 1
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
# ── SonarQube (special handling) ──
|
|
262
|
+
|
|
263
|
+
# Scanner CLI installer (shared by Docker and Cloud paths)
|
|
264
|
+
install_sonar_scanner() {
|
|
265
|
+
echo " Installing sonar-scanner CLI..."
|
|
266
|
+
if command -v npm &>/dev/null; then
|
|
267
|
+
if npm install -g sonar-scanner 2>&1 | tail -2; then
|
|
268
|
+
info "sonar-scanner installed via npm"
|
|
269
|
+
return 0
|
|
270
|
+
fi
|
|
271
|
+
fi
|
|
272
|
+
if command -v brew &>/dev/null; then
|
|
273
|
+
if brew install sonar-scanner 2>&1 | tail -2; then
|
|
274
|
+
info "sonar-scanner installed via brew"
|
|
275
|
+
return 0
|
|
276
|
+
fi
|
|
277
|
+
fi
|
|
278
|
+
err "Failed to install sonar-scanner CLI. Need npm or brew."
|
|
279
|
+
return 1
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
# Server choice — extracted so "changed mind" path can skip the disclaimer
|
|
283
|
+
sonarqube_server_choice() {
|
|
284
|
+
bold " SonarQube server options:"
|
|
285
|
+
echo ""
|
|
286
|
+
echo " [1] Docker (local)"
|
|
287
|
+
echo " Runs sonarqube:community on localhost:9000"
|
|
288
|
+
echo " Requires Docker installed and running"
|
|
289
|
+
echo " ~800MB image download"
|
|
290
|
+
echo " Server must be running during audits"
|
|
291
|
+
echo ""
|
|
292
|
+
echo " [2] SonarQube Cloud"
|
|
293
|
+
echo " Uses sonarcloud.io (free for public repos)"
|
|
294
|
+
echo " Requires account + authentication token"
|
|
295
|
+
echo " No local server needed"
|
|
296
|
+
echo " Token configuration guided after install"
|
|
297
|
+
echo ""
|
|
298
|
+
|
|
299
|
+
local choice
|
|
300
|
+
read -rp " Choose [1/2]: " choice < /dev/tty
|
|
301
|
+
|
|
302
|
+
case "$choice" in
|
|
303
|
+
1)
|
|
304
|
+
SONARQUBE_MODE="docker"
|
|
305
|
+
echo ""
|
|
306
|
+
if ! command -v docker &>/dev/null; then
|
|
307
|
+
err "Docker not found. Install Docker first, then re-run install.sh."
|
|
308
|
+
TOOLS_FAILED+=("sonarqube")
|
|
309
|
+
return
|
|
310
|
+
fi
|
|
311
|
+
if ! docker info &>/dev/null 2>&1; then
|
|
312
|
+
err "Docker daemon not running. Start Docker, then re-run install.sh."
|
|
313
|
+
TOOLS_FAILED+=("sonarqube")
|
|
314
|
+
return
|
|
315
|
+
fi
|
|
316
|
+
|
|
317
|
+
echo " Pulling SonarQube Community image..."
|
|
318
|
+
if ! docker pull sonarqube:community; then
|
|
319
|
+
err "Failed to pull SonarQube image."
|
|
320
|
+
TOOLS_FAILED+=("sonarqube")
|
|
321
|
+
return
|
|
322
|
+
fi
|
|
323
|
+
info "SonarQube server image pulled"
|
|
324
|
+
|
|
325
|
+
if ! install_sonar_scanner; then
|
|
326
|
+
TOOLS_FAILED+=("sonarqube")
|
|
327
|
+
return
|
|
328
|
+
fi
|
|
329
|
+
|
|
330
|
+
echo ""
|
|
331
|
+
info "SonarQube (Docker local) installed"
|
|
332
|
+
dim " Start server: docker run -d --name sonarqube -p 9000:9000 sonarqube:community"
|
|
333
|
+
dim " Server must be running before Radar audit."
|
|
334
|
+
dim " Default credentials: admin / admin"
|
|
335
|
+
dim " Dashboard: http://localhost:9000"
|
|
336
|
+
TOOLS_INSTALLED+=("sonarqube")
|
|
337
|
+
;;
|
|
338
|
+
2)
|
|
339
|
+
SONARQUBE_MODE="cloud"
|
|
340
|
+
echo ""
|
|
341
|
+
if ! install_sonar_scanner; then
|
|
342
|
+
TOOLS_FAILED+=("sonarqube")
|
|
343
|
+
return
|
|
344
|
+
fi
|
|
345
|
+
|
|
346
|
+
echo ""
|
|
347
|
+
info "SonarQube (Cloud) — scanner CLI installed"
|
|
348
|
+
echo ""
|
|
349
|
+
bold " To configure SonarQube Cloud:"
|
|
350
|
+
echo " 1. Create account at https://sonarcloud.io"
|
|
351
|
+
echo " 2. Generate token at https://sonarcloud.io/account/security"
|
|
352
|
+
echo " 3. Set environment variable: export SONAR_TOKEN=your-token"
|
|
353
|
+
echo " 4. Create sonar-project.properties in your target project"
|
|
354
|
+
dim " Run /radar:validate after setup to verify connection."
|
|
355
|
+
TOOLS_INSTALLED+=("sonarqube")
|
|
356
|
+
;;
|
|
357
|
+
*)
|
|
358
|
+
warn "Invalid choice. Skipping SonarQube."
|
|
359
|
+
TOOLS_SKIPPED+=("sonarqube")
|
|
360
|
+
;;
|
|
361
|
+
esac
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
# Main SonarQube flow — disclaimer + install or skip-with-confirmation
|
|
365
|
+
install_sonarqube() {
|
|
366
|
+
# Detect existing SonarQube setup
|
|
367
|
+
local has_scanner=false
|
|
368
|
+
local has_server=false
|
|
369
|
+
# Check for scanner: native CLI or Docker scanner image
|
|
370
|
+
if command -v sonar-scanner &>/dev/null; then
|
|
371
|
+
has_scanner=true
|
|
372
|
+
elif docker image inspect sonarsource/sonar-scanner-cli &>/dev/null 2>&1; then
|
|
373
|
+
has_scanner=true
|
|
374
|
+
fi
|
|
375
|
+
# Check for SonarQube server: Docker container or reachable on localhost:9000
|
|
376
|
+
if docker ps 2>/dev/null | grep -q sonarqube; then
|
|
377
|
+
has_server=true
|
|
378
|
+
elif curl -sf http://localhost:9000/api/system/status &>/dev/null; then
|
|
379
|
+
has_server=true
|
|
380
|
+
fi
|
|
381
|
+
|
|
382
|
+
if [[ "$has_scanner" == "true" ]] && [[ "$has_server" == "true" ]]; then
|
|
383
|
+
info "SonarQube — already installed (scanner + server detected)"
|
|
384
|
+
TOOLS_INSTALLED+=("sonarqube")
|
|
385
|
+
return
|
|
386
|
+
elif [[ "$has_server" == "true" ]] && [[ "$has_scanner" == "false" ]]; then
|
|
387
|
+
echo ""
|
|
388
|
+
info "SonarQube server detected (Docker or localhost:9000)"
|
|
389
|
+
warn "Scanner CLI not found — needed to send code to the server."
|
|
390
|
+
echo ""
|
|
391
|
+
if prompt_yn " Install sonar-scanner CLI?"; then
|
|
392
|
+
echo ""
|
|
393
|
+
if install_sonar_scanner; then
|
|
394
|
+
info "SonarQube ready (server detected + scanner installed)"
|
|
395
|
+
TOOLS_INSTALLED+=("sonarqube")
|
|
396
|
+
else
|
|
397
|
+
TOOLS_FAILED+=("sonarqube")
|
|
398
|
+
fi
|
|
399
|
+
return
|
|
400
|
+
else
|
|
401
|
+
warn "SonarQube server found but scanner CLI missing. Install later or run /radar:validate."
|
|
402
|
+
TOOLS_SKIPPED+=("sonarqube")
|
|
403
|
+
return
|
|
404
|
+
fi
|
|
405
|
+
elif [[ "$has_scanner" == "true" ]] && [[ "$has_server" == "false" ]]; then
|
|
406
|
+
echo ""
|
|
407
|
+
info "sonar-scanner CLI found, but no SonarQube server detected."
|
|
408
|
+
dim " If your server is on a different host/port, Radar can still use it."
|
|
409
|
+
dim " Configure in sonar-project.properties when you run /radar:init."
|
|
410
|
+
TOOLS_INSTALLED+=("sonarqube")
|
|
411
|
+
return
|
|
412
|
+
fi
|
|
413
|
+
|
|
414
|
+
echo -e "${BOLD}┌─────────────────────────────────────────────────────┐${NC}"
|
|
415
|
+
echo -e "${BOLD}│ SONARQUBE — Important Context │${NC}"
|
|
416
|
+
echo -e "${BOLD}│${NC} ${BOLD}│${NC}"
|
|
417
|
+
echo -e "${BOLD}│${NC} Unlike other Radar tools, SonarQube requires TWO ${BOLD}│${NC}"
|
|
418
|
+
echo -e "${BOLD}│${NC} components: ${BOLD}│${NC}"
|
|
419
|
+
echo -e "${BOLD}│${NC} ${BOLD}│${NC}"
|
|
420
|
+
echo -e "${BOLD}│${NC} 1. ${BOLD}Scanner CLI${NC} — analyzes your code ${BOLD}│${NC}"
|
|
421
|
+
echo -e "${BOLD}│${NC} 2. ${BOLD}Server${NC} — stores rules, runs analysis, serves ${BOLD}│${NC}"
|
|
422
|
+
echo -e "${BOLD}│${NC} results via API ${BOLD}│${NC}"
|
|
423
|
+
echo -e "${BOLD}│${NC} ${BOLD}│${NC}"
|
|
424
|
+
echo -e "${BOLD}│${NC} The scanner ${RED}CANNOT${NC} work without a server. ${BOLD}│${NC}"
|
|
425
|
+
echo -e "${BOLD}│${NC} Server options: Docker (local) or SonarQube Cloud. ${BOLD}│${NC}"
|
|
426
|
+
echo -e "${BOLD}│${NC} ${BOLD}│${NC}"
|
|
427
|
+
echo -e "${BOLD}│${NC} SonarQube uniquely provides: ${BOLD}│${NC}"
|
|
428
|
+
echo -e "${BOLD}│${NC} ${GREEN}•${NC} Code complexity metrics (cyclomatic, cognitive) ${BOLD}│${NC}"
|
|
429
|
+
echo -e "${BOLD}│${NC} ${GREEN}•${NC} Duplication detection ${BOLD}│${NC}"
|
|
430
|
+
echo -e "${BOLD}│${NC} ${GREEN}•${NC} Code smell classification ${BOLD}│${NC}"
|
|
431
|
+
echo -e "${BOLD}│${NC} ${GREEN}•${NC} Quality gate enforcement ${BOLD}│${NC}"
|
|
432
|
+
echo -e "${BOLD}│${NC} ${GREEN}•${NC} Technical debt estimation ${BOLD}│${NC}"
|
|
433
|
+
echo -e "${BOLD}│${NC} ${BOLD}│${NC}"
|
|
434
|
+
echo -e "${BOLD}│${NC} These are ${YELLOW}NOT covered${NC} by any other Radar tool. ${BOLD}│${NC}"
|
|
435
|
+
echo -e "${BOLD}│${NC} Semgrep covers security/correctness overlap, but ${BOLD}│${NC}"
|
|
436
|
+
echo -e "${BOLD}│${NC} NOT complexity, duplication, or debt metrics. ${BOLD}│${NC}"
|
|
437
|
+
echo -e "${BOLD}└─────────────────────────────────────────────────────┘${NC}"
|
|
438
|
+
echo ""
|
|
439
|
+
|
|
440
|
+
if prompt_yn "Install SonarQube?"; then
|
|
441
|
+
echo ""
|
|
442
|
+
sonarqube_server_choice
|
|
443
|
+
else
|
|
444
|
+
echo ""
|
|
445
|
+
echo -e " ${YELLOW}⚠ Skipping SonarQube means Radar loses:${NC}"
|
|
446
|
+
echo " • Code complexity analysis (cyclomatic, cognitive)"
|
|
447
|
+
echo " • Duplication detection across codebase"
|
|
448
|
+
echo " • Code smell classification and debt estimation"
|
|
449
|
+
echo " • Quality gate enforcement"
|
|
450
|
+
echo ""
|
|
451
|
+
echo " Domains 01 (Architecture), 03 (Correctness), 06 (Testing),"
|
|
452
|
+
echo " 09 (Maintainability) will have REDUCED signal coverage."
|
|
453
|
+
echo " Semgrep still covers security and pattern-based analysis."
|
|
454
|
+
echo ""
|
|
455
|
+
dim " You can install SonarQube later by re-running install.sh."
|
|
456
|
+
echo ""
|
|
457
|
+
|
|
458
|
+
if prompt_yn " Are you sure you want to skip SonarQube?"; then
|
|
459
|
+
TOOLS_SKIPPED+=("sonarqube")
|
|
460
|
+
dim " SonarQube skipped."
|
|
461
|
+
else
|
|
462
|
+
echo ""
|
|
463
|
+
echo " OK — let's set up SonarQube."
|
|
464
|
+
echo ""
|
|
465
|
+
sonarqube_server_choice
|
|
466
|
+
fi
|
|
467
|
+
fi
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
# ── Standard tool installer ──
|
|
471
|
+
|
|
472
|
+
install_tool() {
|
|
473
|
+
local name="$1"
|
|
474
|
+
local description="$2"
|
|
475
|
+
shift 2
|
|
476
|
+
local methods=("$@")
|
|
477
|
+
|
|
478
|
+
echo ""
|
|
479
|
+
bold " $name"
|
|
480
|
+
dim " $description"
|
|
481
|
+
echo ""
|
|
482
|
+
|
|
483
|
+
# Auto-skip if already installed
|
|
484
|
+
if command -v "$name" &>/dev/null; then
|
|
485
|
+
info "$name — already installed ($(command -v "$name"))"
|
|
486
|
+
TOOLS_INSTALLED+=("$name")
|
|
487
|
+
return
|
|
488
|
+
fi
|
|
489
|
+
|
|
490
|
+
if prompt_yn " Install $name?"; then
|
|
491
|
+
echo ""
|
|
492
|
+
if try_install "$name" "${methods[@]}"; then
|
|
493
|
+
info "$name installed"
|
|
494
|
+
TOOLS_INSTALLED+=("$name")
|
|
495
|
+
else
|
|
496
|
+
TOOLS_FAILED+=("$name")
|
|
497
|
+
fi
|
|
498
|
+
else
|
|
499
|
+
TOOLS_SKIPPED+=("$name")
|
|
500
|
+
dim " $name skipped."
|
|
501
|
+
fi
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
# ── Gitleaks installer (dynamic version + platform detection) ──
|
|
505
|
+
|
|
506
|
+
install_gitleaks() {
|
|
507
|
+
ensure_local_bin
|
|
508
|
+
local version
|
|
509
|
+
version=$(curl -sI "https://github.com/gitleaks/gitleaks/releases/latest" | grep -i "^location:" | grep -oP 'v\K[0-9.]+')
|
|
510
|
+
if [[ -z "$version" ]]; then
|
|
511
|
+
err "Could not detect latest gitleaks version."
|
|
512
|
+
return 1
|
|
513
|
+
fi
|
|
514
|
+
local os="linux"
|
|
515
|
+
local arch="x64"
|
|
516
|
+
if [[ "$(uname -s)" == "Darwin" ]]; then os="darwin"; fi
|
|
517
|
+
if [[ "$(uname -m)" == "arm64" ]] || [[ "$(uname -m)" == "aarch64" ]]; then arch="arm64"; fi
|
|
518
|
+
|
|
519
|
+
local url="https://github.com/gitleaks/gitleaks/releases/download/v${version}/gitleaks_${version}_${os}_${arch}.tar.gz"
|
|
520
|
+
echo " Downloading gitleaks v${version}..."
|
|
521
|
+
if curl -sSfL "$url" -o /tmp/gitleaks.tar.gz && tar xzf /tmp/gitleaks.tar.gz -C "$LOCAL_BIN" gitleaks; then
|
|
522
|
+
rm -f /tmp/gitleaks.tar.gz
|
|
523
|
+
return 0
|
|
524
|
+
fi
|
|
525
|
+
rm -f /tmp/gitleaks.tar.gz
|
|
526
|
+
return 1
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
# ── Run tool installations ──
|
|
530
|
+
|
|
531
|
+
install_sonarqube
|
|
532
|
+
|
|
533
|
+
echo ""
|
|
534
|
+
echo "────────────────────────────────────────"
|
|
535
|
+
|
|
536
|
+
# ── Helper: install Python CLI tool via venv ──
|
|
537
|
+
# Creates ~/.local/share/radar/venvs/{tool}/ with isolated Python env
|
|
538
|
+
# Symlinks the binary to ~/.local/bin/{tool}
|
|
539
|
+
# Works on any system with python3 — no pip, pipx, or special flags needed
|
|
540
|
+
|
|
541
|
+
RADAR_VENVS="$HOME/.local/share/radar/venvs"
|
|
542
|
+
LOCAL_BIN="$HOME/.local/bin"
|
|
543
|
+
|
|
544
|
+
ensure_local_bin() {
|
|
545
|
+
mkdir -p "$LOCAL_BIN"
|
|
546
|
+
if [[ ":$PATH:" != *":$LOCAL_BIN:"* ]]; then
|
|
547
|
+
export PATH="$LOCAL_BIN:$PATH"
|
|
548
|
+
fi
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
install_python_tool() {
|
|
552
|
+
local tool="$1"
|
|
553
|
+
ensure_local_bin
|
|
554
|
+
mkdir -p "$RADAR_VENVS"
|
|
555
|
+
|
|
556
|
+
echo " Creating isolated Python environment..."
|
|
557
|
+
if ! python3 -m venv "$RADAR_VENVS/$tool" 2>&1; then
|
|
558
|
+
err "Failed to create venv. Is python3-venv installed?"
|
|
559
|
+
echo " Try: sudo apt install python3-venv"
|
|
560
|
+
return 1
|
|
561
|
+
fi
|
|
562
|
+
|
|
563
|
+
echo " Installing $tool (this may take a moment)..."
|
|
564
|
+
if "$RADAR_VENVS/$tool/bin/pip" install "$tool" 2>&1 | tail -3; then
|
|
565
|
+
# Symlink the binary to ~/.local/bin
|
|
566
|
+
ln -sf "$RADAR_VENVS/$tool/bin/$tool" "$LOCAL_BIN/$tool"
|
|
567
|
+
if command -v "$tool" &>/dev/null; then
|
|
568
|
+
return 0
|
|
569
|
+
fi
|
|
570
|
+
fi
|
|
571
|
+
|
|
572
|
+
err "Failed to install $tool in venv."
|
|
573
|
+
rm -rf "$RADAR_VENVS/$tool"
|
|
574
|
+
return 1
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
install_tool "semgrep" \
|
|
578
|
+
"Static analysis — security, correctness, code quality patterns (6 domains)" \
|
|
579
|
+
"python3:install_python_tool semgrep" \
|
|
580
|
+
"brew:brew install semgrep"
|
|
581
|
+
|
|
582
|
+
echo ""
|
|
583
|
+
echo "────────────────────────────────────────"
|
|
584
|
+
|
|
585
|
+
install_tool "trivy" \
|
|
586
|
+
"Vulnerability scanner — OS packages, dependencies, containers, IaC (2 domains)" \
|
|
587
|
+
"curl:ensure_local_bin && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b $LOCAL_BIN" \
|
|
588
|
+
"brew:brew install trivy"
|
|
589
|
+
|
|
590
|
+
echo ""
|
|
591
|
+
echo "────────────────────────────────────────"
|
|
592
|
+
|
|
593
|
+
install_tool "gitleaks" \
|
|
594
|
+
"Secrets detection — API keys, tokens, passwords in code and history (2 domains)" \
|
|
595
|
+
"curl:install_gitleaks" \
|
|
596
|
+
"brew:brew install gitleaks" \
|
|
597
|
+
"go:go install github.com/gitleaks/gitleaks/v8@latest"
|
|
598
|
+
|
|
599
|
+
echo ""
|
|
600
|
+
echo "────────────────────────────────────────"
|
|
601
|
+
|
|
602
|
+
install_tool "checkov" \
|
|
603
|
+
"Infrastructure-as-Code scanner — Terraform, CloudFormation, K8s (2 domains)" \
|
|
604
|
+
"python3:install_python_tool checkov" \
|
|
605
|
+
"brew:brew install checkov"
|
|
606
|
+
|
|
607
|
+
echo ""
|
|
608
|
+
echo "────────────────────────────────────────"
|
|
609
|
+
|
|
610
|
+
install_tool "syft" \
|
|
611
|
+
"SBOM generator — software bill of materials for dependency inventory (2 domains)" \
|
|
612
|
+
"curl:ensure_local_bin && curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b $LOCAL_BIN" \
|
|
613
|
+
"brew:brew install syft"
|
|
614
|
+
|
|
615
|
+
echo ""
|
|
616
|
+
echo "────────────────────────────────────────"
|
|
617
|
+
|
|
618
|
+
install_tool "grype" \
|
|
619
|
+
"Vulnerability scanner — CVE matching against SBOM inventory (2 domains)" \
|
|
620
|
+
"curl:ensure_local_bin && curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b $LOCAL_BIN" \
|
|
621
|
+
"brew:brew install grype"
|
|
622
|
+
|
|
623
|
+
# ── 5. Post-install verification ──────
|
|
624
|
+
|
|
625
|
+
header "Verification"
|
|
626
|
+
|
|
627
|
+
declare -a VERIFY_PASS=()
|
|
628
|
+
declare -a VERIFY_FAIL=()
|
|
629
|
+
|
|
630
|
+
verify_tool() {
|
|
631
|
+
local name="$1"
|
|
632
|
+
local cmd="$2"
|
|
633
|
+
|
|
634
|
+
if eval "$cmd" &>/dev/null 2>&1; then
|
|
635
|
+
info "$name — verified"
|
|
636
|
+
VERIFY_PASS+=("$name")
|
|
637
|
+
else
|
|
638
|
+
err "$name — verification failed"
|
|
639
|
+
VERIFY_FAIL+=("$name")
|
|
640
|
+
fi
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
# Always verify git
|
|
644
|
+
verify_tool "git-history" "git --version"
|
|
645
|
+
|
|
646
|
+
# Verify installed tools
|
|
647
|
+
for tool in "${TOOLS_INSTALLED[@]}"; do
|
|
648
|
+
case "$tool" in
|
|
649
|
+
sonarqube)
|
|
650
|
+
if command -v sonar-scanner &>/dev/null; then
|
|
651
|
+
verify_tool "sonar-scanner" "sonar-scanner --version"
|
|
652
|
+
elif docker image inspect sonarsource/sonar-scanner-cli &>/dev/null 2>&1; then
|
|
653
|
+
verify_tool "sonar-scanner" "docker image inspect sonarsource/sonar-scanner-cli"
|
|
654
|
+
else
|
|
655
|
+
verify_tool "sonar-scanner" "false"
|
|
656
|
+
fi
|
|
657
|
+
if [[ "$SONARQUBE_MODE" == "docker" ]]; then
|
|
658
|
+
verify_tool "sonarqube-server" "docker image inspect sonarqube:community"
|
|
659
|
+
fi
|
|
660
|
+
;;
|
|
661
|
+
semgrep) verify_tool "semgrep" "semgrep --version" ;;
|
|
662
|
+
trivy) verify_tool "trivy" "trivy --version" ;;
|
|
663
|
+
gitleaks) verify_tool "gitleaks" "gitleaks version" ;;
|
|
664
|
+
checkov) verify_tool "checkov" "checkov --version" ;;
|
|
665
|
+
syft) verify_tool "syft" "syft version" ;;
|
|
666
|
+
grype) verify_tool "grype" "grype version" ;;
|
|
667
|
+
esac
|
|
668
|
+
done
|
|
669
|
+
|
|
670
|
+
# ── 6. Summary ────────────────────────
|
|
671
|
+
|
|
672
|
+
header "Radar Installation Complete"
|
|
673
|
+
|
|
674
|
+
echo -e " ${BOLD}Framework:${NC} ~/.accel/radar/ ($FRAMEWORK_COUNT files)"
|
|
675
|
+
echo -e " ${BOLD}Commands:${NC} ~/.claude/commands/radar/ ($COMMAND_COUNT commands)"
|
|
676
|
+
echo ""
|
|
677
|
+
echo -e " ${BOLD}Tools:${NC}"
|
|
678
|
+
|
|
679
|
+
# Show all tools with status
|
|
680
|
+
show_tool_status() {
|
|
681
|
+
local name="$1"
|
|
682
|
+
if printf '%s\n' "${TOOLS_INSTALLED[@]}" | grep -qx "$name" 2>/dev/null; then
|
|
683
|
+
echo -e " ${GREEN}✓${NC} $name (installed)"
|
|
684
|
+
elif printf '%s\n' "${TOOLS_FAILED[@]}" | grep -qx "$name" 2>/dev/null; then
|
|
685
|
+
echo -e " ${RED}✗${NC} $name (failed)"
|
|
686
|
+
elif printf '%s\n' "${TOOLS_SKIPPED[@]}" | grep -qx "$name" 2>/dev/null; then
|
|
687
|
+
echo -e " ${DIM}–${NC} $name (skipped)"
|
|
688
|
+
fi
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
show_tool_status "sonarqube"
|
|
692
|
+
show_tool_status "semgrep"
|
|
693
|
+
show_tool_status "trivy"
|
|
694
|
+
show_tool_status "gitleaks"
|
|
695
|
+
show_tool_status "checkov"
|
|
696
|
+
show_tool_status "syft"
|
|
697
|
+
show_tool_status "grype"
|
|
698
|
+
echo -e " ${GREEN}✓${NC} git-history (built-in)"
|
|
699
|
+
|
|
700
|
+
echo ""
|
|
701
|
+
echo " Installed: ${#TOOLS_INSTALLED[@]}/7 Skipped: ${#TOOLS_SKIPPED[@]}/7 Failed: ${#TOOLS_FAILED[@]}/7"
|
|
702
|
+
|
|
703
|
+
if [[ ${#VERIFY_FAIL[@]} -gt 0 ]]; then
|
|
704
|
+
echo ""
|
|
705
|
+
warn "Some verifications failed. Run /radar:validate for troubleshooting."
|
|
706
|
+
fi
|
|
707
|
+
|
|
708
|
+
echo ""
|
|
709
|
+
echo -e " ${BOLD}Next:${NC} Run /radar:init in your target project to start auditing."
|
|
710
|
+
echo ""
|
|
711
|
+
echo "════════════════════════════════════════"
|