@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,492 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ============================================================================
|
|
5
|
+
# Vector v1 → v2 Migration Tool
|
|
6
|
+
# Converts flat-file .vector/ (manifest + domain files) to vector.json
|
|
7
|
+
# Non-destructive: archives old files to .vector/_v1-archive/
|
|
8
|
+
# ============================================================================
|
|
9
|
+
|
|
10
|
+
VERSION="2.0.0"
|
|
11
|
+
|
|
12
|
+
# Colors
|
|
13
|
+
RED='\033[0;31m'
|
|
14
|
+
GREEN='\033[0;32m'
|
|
15
|
+
YELLOW='\033[1;33m'
|
|
16
|
+
CYAN='\033[0;36m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
print_banner() {
|
|
20
|
+
echo ""
|
|
21
|
+
echo -e "${CYAN}╔══════════════════════════════════════════════════╗${NC}"
|
|
22
|
+
echo -e "${CYAN}║${NC} Vector v1 → v2 Migration Tool ${CYAN}║${NC}"
|
|
23
|
+
echo -e "${CYAN}║${NC} Flat files → vector.json ${CYAN}║${NC}"
|
|
24
|
+
echo -e "${CYAN}╚══════════════════════════════════════════════════╝${NC}"
|
|
25
|
+
echo ""
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
usage() {
|
|
29
|
+
echo "Usage: migrate-v1-to-v2.sh [OPTIONS] [VECTOR_DIR]"
|
|
30
|
+
echo ""
|
|
31
|
+
echo "Arguments:"
|
|
32
|
+
echo " VECTOR_DIR Path to .vector/ directory (default: ./.vector)"
|
|
33
|
+
echo ""
|
|
34
|
+
echo "Options:"
|
|
35
|
+
echo " --dry-run Show what would be done without writing"
|
|
36
|
+
echo " --no-archive Don't archive old files (just generate vector.json)"
|
|
37
|
+
echo " --help, -h Show this help"
|
|
38
|
+
echo ""
|
|
39
|
+
echo "Examples:"
|
|
40
|
+
echo " migrate-v1-to-v2.sh # Migrate ./.vector/"
|
|
41
|
+
echo " migrate-v1-to-v2.sh ~/.accel/vector # Migrate global Vector"
|
|
42
|
+
echo " migrate-v1-to-v2.sh --dry-run ~/.accel/vector # Preview migration"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Parse arguments
|
|
46
|
+
DRY_RUN=false
|
|
47
|
+
NO_ARCHIVE=false
|
|
48
|
+
VECTOR_DIR=""
|
|
49
|
+
|
|
50
|
+
while [[ $# -gt 0 ]]; do
|
|
51
|
+
case "$1" in
|
|
52
|
+
--dry-run)
|
|
53
|
+
DRY_RUN=true
|
|
54
|
+
shift
|
|
55
|
+
;;
|
|
56
|
+
--no-archive)
|
|
57
|
+
NO_ARCHIVE=true
|
|
58
|
+
shift
|
|
59
|
+
;;
|
|
60
|
+
--help|-h)
|
|
61
|
+
usage
|
|
62
|
+
exit 0
|
|
63
|
+
;;
|
|
64
|
+
*)
|
|
65
|
+
VECTOR_DIR="$1"
|
|
66
|
+
shift
|
|
67
|
+
;;
|
|
68
|
+
esac
|
|
69
|
+
done
|
|
70
|
+
|
|
71
|
+
# Default to ./.vector if not specified
|
|
72
|
+
if [[ -z "$VECTOR_DIR" ]]; then
|
|
73
|
+
VECTOR_DIR="./.vector"
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Resolve to absolute path
|
|
77
|
+
VECTOR_DIR="$(cd "$VECTOR_DIR" 2>/dev/null && pwd)" || {
|
|
78
|
+
echo -e "${RED}Error: Directory not found: $VECTOR_DIR${NC}"
|
|
79
|
+
exit 1
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
print_banner
|
|
83
|
+
|
|
84
|
+
# Check prerequisites
|
|
85
|
+
if ! command -v python3 &>/dev/null; then
|
|
86
|
+
echo -e "${RED}Error: python3 is required for migration${NC}"
|
|
87
|
+
exit 1
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# Verify this is a v1 setup
|
|
91
|
+
if [[ -f "$VECTOR_DIR/vector.json" ]]; then
|
|
92
|
+
echo -e "${YELLOW}Warning: vector.json already exists at $VECTOR_DIR/vector.json${NC}"
|
|
93
|
+
echo -e "${YELLOW}This may already be a v2 setup. Continue anyway? (y/N)${NC}"
|
|
94
|
+
read -r confirm
|
|
95
|
+
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
|
|
96
|
+
echo "Aborted."
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
if [[ ! -f "$VECTOR_DIR/manifest" ]]; then
|
|
102
|
+
echo -e "${RED}Error: No manifest file found at $VECTOR_DIR/manifest${NC}"
|
|
103
|
+
echo -e "${RED}This doesn't appear to be a v1 Vector setup.${NC}"
|
|
104
|
+
exit 1
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
echo -e "${GREEN}Found v1 Vector at: $VECTOR_DIR${NC}"
|
|
108
|
+
echo ""
|
|
109
|
+
|
|
110
|
+
# Run the Python migration
|
|
111
|
+
python3 - "$VECTOR_DIR" "$DRY_RUN" "$NO_ARCHIVE" << 'PYTHON_SCRIPT'
|
|
112
|
+
import json
|
|
113
|
+
import os
|
|
114
|
+
import sys
|
|
115
|
+
import shutil
|
|
116
|
+
import re
|
|
117
|
+
from pathlib import Path
|
|
118
|
+
from datetime import datetime
|
|
119
|
+
|
|
120
|
+
vector_dir = Path(sys.argv[1])
|
|
121
|
+
dry_run = sys.argv[2] == "true"
|
|
122
|
+
no_archive = sys.argv[3] == "true"
|
|
123
|
+
|
|
124
|
+
def log(msg, color=""):
|
|
125
|
+
colors = {"green": "\033[0;32m", "yellow": "\033[1;33m", "cyan": "\033[0;36m", "red": "\033[0;31m"}
|
|
126
|
+
nc = "\033[0m"
|
|
127
|
+
prefix = colors.get(color, "")
|
|
128
|
+
print(f"{prefix}{msg}{nc}")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def parse_manifest(filepath):
|
|
132
|
+
"""Parse manifest file into domain configs and global settings."""
|
|
133
|
+
domains = {}
|
|
134
|
+
devmode = False
|
|
135
|
+
post_compact_gate = True
|
|
136
|
+
global_exclude = []
|
|
137
|
+
|
|
138
|
+
with open(filepath, 'r') as f:
|
|
139
|
+
for line in f:
|
|
140
|
+
line = line.strip()
|
|
141
|
+
if not line or line.startswith('#') or '=' not in line:
|
|
142
|
+
continue
|
|
143
|
+
key, value = line.split('=', 1)
|
|
144
|
+
key = key.strip()
|
|
145
|
+
value = value.strip()
|
|
146
|
+
|
|
147
|
+
if key == 'DEVMODE':
|
|
148
|
+
devmode = value.lower() in ('true', 'yes', '1')
|
|
149
|
+
continue
|
|
150
|
+
if key == 'POST_COMPACT_GATE':
|
|
151
|
+
post_compact_gate = value.lower() in ('true', 'yes', '1')
|
|
152
|
+
continue
|
|
153
|
+
if key == 'GLOBAL_EXCLUDE':
|
|
154
|
+
global_exclude = [k.strip() for k in value.split(',') if k.strip()]
|
|
155
|
+
continue
|
|
156
|
+
|
|
157
|
+
# Domain entries: DOMAIN_STATE, DOMAIN_ALWAYS_ON, DOMAIN_RECALL, DOMAIN_EXCLUDE
|
|
158
|
+
for suffix in ['_STATE', '_ALWAYS_ON', '_RECALL', '_EXCLUDE']:
|
|
159
|
+
if key.endswith(suffix):
|
|
160
|
+
domain_name = key[:-len(suffix)]
|
|
161
|
+
if domain_name not in domains:
|
|
162
|
+
domains[domain_name] = {}
|
|
163
|
+
field = suffix[1:].lower()
|
|
164
|
+
domains[domain_name][field] = value
|
|
165
|
+
break
|
|
166
|
+
|
|
167
|
+
return domains, devmode, post_compact_gate, global_exclude
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def parse_domain_rules(filepath, domain_name):
|
|
171
|
+
"""Parse a domain file for rules with metadata."""
|
|
172
|
+
rules = []
|
|
173
|
+
if not filepath.exists():
|
|
174
|
+
return rules
|
|
175
|
+
|
|
176
|
+
with open(filepath, 'r') as f:
|
|
177
|
+
lines = f.readlines()
|
|
178
|
+
|
|
179
|
+
prefix = f"{domain_name}_RULE_"
|
|
180
|
+
pending_meta = {"added": None, "last_reviewed": None, "source": "manual"}
|
|
181
|
+
|
|
182
|
+
for line in lines:
|
|
183
|
+
line = line.strip()
|
|
184
|
+
|
|
185
|
+
# Capture metadata from comments above rules
|
|
186
|
+
if line.startswith('# Rule added:'):
|
|
187
|
+
pending_meta['added'] = line.split(':', 1)[1].strip()
|
|
188
|
+
elif line.startswith('# Last reviewed:'):
|
|
189
|
+
val = line.split(':', 1)[1].strip()
|
|
190
|
+
pending_meta['last_reviewed'] = val if val and val != 'null' else None
|
|
191
|
+
elif line.startswith('# Source:'):
|
|
192
|
+
pending_meta['source'] = line.split(':', 1)[1].strip()
|
|
193
|
+
elif '=' in line and not line.startswith('#'):
|
|
194
|
+
key, value = line.split('=', 1)
|
|
195
|
+
key = key.strip()
|
|
196
|
+
if key.startswith(prefix):
|
|
197
|
+
try:
|
|
198
|
+
rule_id = int(key[len(prefix):])
|
|
199
|
+
except ValueError:
|
|
200
|
+
continue
|
|
201
|
+
rules.append({
|
|
202
|
+
"id": rule_id,
|
|
203
|
+
"text": value.strip(),
|
|
204
|
+
"added": pending_meta.get('added'),
|
|
205
|
+
"last_reviewed": pending_meta.get('last_reviewed'),
|
|
206
|
+
"source": pending_meta.get('source', 'manual')
|
|
207
|
+
})
|
|
208
|
+
pending_meta = {"added": None, "last_reviewed": None, "source": "manual"}
|
|
209
|
+
|
|
210
|
+
rules.sort(key=lambda r: r['id'])
|
|
211
|
+
return rules
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def parse_context_file(filepath):
|
|
215
|
+
"""Parse context file into bracket rules."""
|
|
216
|
+
brackets = {}
|
|
217
|
+
if not filepath.exists():
|
|
218
|
+
return brackets
|
|
219
|
+
|
|
220
|
+
with open(filepath, 'r') as f:
|
|
221
|
+
lines = f.readlines()
|
|
222
|
+
|
|
223
|
+
current_bracket = None
|
|
224
|
+
for line in lines:
|
|
225
|
+
line = line.strip()
|
|
226
|
+
if not line or line.startswith('#') or '=' not in line:
|
|
227
|
+
continue
|
|
228
|
+
key, value = line.split('=', 1)
|
|
229
|
+
key = key.strip()
|
|
230
|
+
value = value.strip()
|
|
231
|
+
|
|
232
|
+
# FRESH_RULES=true/false → bracket enabled flag
|
|
233
|
+
if key.endswith('_RULES') and not key.endswith('_RULE_'):
|
|
234
|
+
bracket_name = key[:-6]
|
|
235
|
+
if bracket_name not in brackets:
|
|
236
|
+
brackets[bracket_name] = {"enabled": True, "rules": []}
|
|
237
|
+
brackets[bracket_name]["enabled"] = value.lower() in ('true', 'yes', '1')
|
|
238
|
+
current_bracket = bracket_name
|
|
239
|
+
continue
|
|
240
|
+
|
|
241
|
+
# FRESH_RULE_1=text → bracket rule
|
|
242
|
+
for bracket_name in ['FRESH', 'MODERATE', 'DEPLETED', 'CRITICAL']:
|
|
243
|
+
rule_prefix = f"{bracket_name}_RULE_"
|
|
244
|
+
if key.startswith(rule_prefix):
|
|
245
|
+
if bracket_name not in brackets:
|
|
246
|
+
brackets[bracket_name] = {"enabled": True, "rules": []}
|
|
247
|
+
brackets[bracket_name]["rules"].append(value)
|
|
248
|
+
break
|
|
249
|
+
|
|
250
|
+
return brackets
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def parse_commands_file(filepath):
|
|
254
|
+
"""Parse commands file into star commands dict."""
|
|
255
|
+
commands = {}
|
|
256
|
+
if not filepath.exists():
|
|
257
|
+
return commands
|
|
258
|
+
|
|
259
|
+
with open(filepath, 'r') as f:
|
|
260
|
+
lines = f.readlines()
|
|
261
|
+
|
|
262
|
+
for line in lines:
|
|
263
|
+
line = line.strip()
|
|
264
|
+
if not line or line.startswith('#') or '=' not in line:
|
|
265
|
+
continue
|
|
266
|
+
key, value = line.split('=', 1)
|
|
267
|
+
key = key.strip()
|
|
268
|
+
value = value.strip()
|
|
269
|
+
|
|
270
|
+
# FOCUS_RULE_0=text → command FOCUS, rule text
|
|
271
|
+
match = re.match(r'^([A-Z_]+)_RULE_\d+$', key)
|
|
272
|
+
if match:
|
|
273
|
+
cmd_name = match.group(1)
|
|
274
|
+
if cmd_name not in commands:
|
|
275
|
+
commands[cmd_name] = []
|
|
276
|
+
commands[cmd_name].append(value)
|
|
277
|
+
|
|
278
|
+
return commands
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def load_decisions(decisions_dir):
|
|
282
|
+
"""Load all decision files from decisions/ directory."""
|
|
283
|
+
domain_decisions = {}
|
|
284
|
+
if not decisions_dir.exists():
|
|
285
|
+
return domain_decisions
|
|
286
|
+
|
|
287
|
+
for filepath in decisions_dir.glob('*.json'):
|
|
288
|
+
domain_name = filepath.stem.upper()
|
|
289
|
+
try:
|
|
290
|
+
with open(filepath, 'r') as f:
|
|
291
|
+
data = json.load(f)
|
|
292
|
+
|
|
293
|
+
active = []
|
|
294
|
+
for d in data.get('decisions', []):
|
|
295
|
+
active.append({
|
|
296
|
+
"id": d.get('id', ''),
|
|
297
|
+
"decision": d.get('decision', ''),
|
|
298
|
+
"rationale": d.get('rationale', ''),
|
|
299
|
+
"date": d.get('date', ''),
|
|
300
|
+
"source": d.get('source', 'manual'),
|
|
301
|
+
"recall": d.get('recall', []),
|
|
302
|
+
"status": "active"
|
|
303
|
+
})
|
|
304
|
+
for d in data.get('archived', []):
|
|
305
|
+
active.append({
|
|
306
|
+
"id": d.get('id', ''),
|
|
307
|
+
"decision": d.get('decision', ''),
|
|
308
|
+
"rationale": d.get('rationale', ''),
|
|
309
|
+
"date": d.get('date', ''),
|
|
310
|
+
"source": d.get('source', 'manual'),
|
|
311
|
+
"recall": d.get('recall', []),
|
|
312
|
+
"status": "archived"
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
if active:
|
|
316
|
+
domain_decisions[domain_name] = active
|
|
317
|
+
|
|
318
|
+
except (json.JSONDecodeError, IOError) as e:
|
|
319
|
+
log(f" Warning: Could not read {filepath}: {e}", "yellow")
|
|
320
|
+
|
|
321
|
+
return domain_decisions
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
# ============================================================================
|
|
325
|
+
# MAIN MIGRATION
|
|
326
|
+
# ============================================================================
|
|
327
|
+
|
|
328
|
+
log("Scanning v1 files...", "cyan")
|
|
329
|
+
|
|
330
|
+
# 1. Parse manifest
|
|
331
|
+
manifest_path = vector_dir / 'manifest'
|
|
332
|
+
domain_configs, devmode, post_compact_gate, global_exclude = parse_manifest(manifest_path)
|
|
333
|
+
log(f" Manifest: {len(domain_configs)} domains, devmode={devmode}")
|
|
334
|
+
|
|
335
|
+
# 2. Parse domain files
|
|
336
|
+
domain_rules = {}
|
|
337
|
+
skip_files = {'manifest', 'context', 'commands', 'vector.json', 'sessions', 'decisions',
|
|
338
|
+
'_v1-archive', 'archive', 'vector-mcp', 'skool', 'psmm.json', 'staging.json'}
|
|
339
|
+
|
|
340
|
+
for item in vector_dir.iterdir():
|
|
341
|
+
if item.is_file() and not item.is_dir() and item.name not in skip_files and not item.name.startswith('.'):
|
|
342
|
+
domain_name = item.name.upper()
|
|
343
|
+
if domain_name.endswith('.JSON') or domain_name.endswith('.ENV') or domain_name.endswith('.MD'):
|
|
344
|
+
continue
|
|
345
|
+
rules = parse_domain_rules(item, domain_name)
|
|
346
|
+
if rules:
|
|
347
|
+
domain_rules[domain_name] = rules
|
|
348
|
+
log(f" Domain {domain_name}: {len(rules)} rules")
|
|
349
|
+
|
|
350
|
+
# Also check for domain names from manifest that might have lowercase files
|
|
351
|
+
for domain_name in domain_configs:
|
|
352
|
+
if domain_name not in domain_rules:
|
|
353
|
+
lower_path = vector_dir / domain_name.lower()
|
|
354
|
+
if lower_path.exists() and lower_path.is_file():
|
|
355
|
+
rules = parse_domain_rules(lower_path, domain_name)
|
|
356
|
+
if rules:
|
|
357
|
+
domain_rules[domain_name] = rules
|
|
358
|
+
log(f" Domain {domain_name}: {len(rules)} rules")
|
|
359
|
+
|
|
360
|
+
# 3. Parse context file
|
|
361
|
+
context_path = vector_dir / 'context'
|
|
362
|
+
context_brackets = parse_context_file(context_path)
|
|
363
|
+
if context_brackets:
|
|
364
|
+
total_rules = sum(len(b['rules']) for b in context_brackets.values())
|
|
365
|
+
log(f" Context: {len(context_brackets)} brackets, {total_rules} rules")
|
|
366
|
+
|
|
367
|
+
# 4. Parse commands file
|
|
368
|
+
commands_path = vector_dir / 'commands'
|
|
369
|
+
commands = parse_commands_file(commands_path)
|
|
370
|
+
if commands:
|
|
371
|
+
total_cmd_rules = sum(len(r) for r in commands.values())
|
|
372
|
+
log(f" Commands: {len(commands)} star commands, {total_cmd_rules} rules")
|
|
373
|
+
|
|
374
|
+
# 5. Load decisions
|
|
375
|
+
decisions_dir = vector_dir / 'decisions'
|
|
376
|
+
domain_decisions = load_decisions(decisions_dir)
|
|
377
|
+
if domain_decisions:
|
|
378
|
+
total_decisions = sum(len(d) for d in domain_decisions.values())
|
|
379
|
+
log(f" Decisions: {len(domain_decisions)} domains, {total_decisions} entries")
|
|
380
|
+
|
|
381
|
+
# 6. Build vector.json
|
|
382
|
+
log("\nBuilding vector.json...", "cyan")
|
|
383
|
+
|
|
384
|
+
vector_json = {
|
|
385
|
+
"version": 1,
|
|
386
|
+
"last_modified": datetime.now().isoformat(),
|
|
387
|
+
"config": {
|
|
388
|
+
"devmode": devmode,
|
|
389
|
+
"post_compact_gate": post_compact_gate,
|
|
390
|
+
"global_exclude": global_exclude,
|
|
391
|
+
"context_brackets": context_brackets if context_brackets else {},
|
|
392
|
+
"commands": commands if commands else {}
|
|
393
|
+
},
|
|
394
|
+
"domains": {},
|
|
395
|
+
"staging": []
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
# Build domain entries
|
|
399
|
+
all_domain_names = set(list(domain_configs.keys()) + list(domain_rules.keys()))
|
|
400
|
+
for domain_name in sorted(all_domain_names):
|
|
401
|
+
config = domain_configs.get(domain_name, {})
|
|
402
|
+
|
|
403
|
+
state_val = config.get('state', 'active')
|
|
404
|
+
state = 'active' if state_val.lower() in ('active', 'true', 'yes', '1') else 'inactive'
|
|
405
|
+
|
|
406
|
+
always_on_val = config.get('always_on', 'false')
|
|
407
|
+
always_on = always_on_val.lower() in ('true', 'yes', '1')
|
|
408
|
+
|
|
409
|
+
recall_val = config.get('recall', '')
|
|
410
|
+
recall = [k.strip() for k in recall_val.split(',') if k.strip()] if recall_val else []
|
|
411
|
+
|
|
412
|
+
exclude_val = config.get('exclude', '')
|
|
413
|
+
exclude = [k.strip() for k in exclude_val.split(',') if k.strip()] if exclude_val else []
|
|
414
|
+
|
|
415
|
+
rules = domain_rules.get(domain_name, [])
|
|
416
|
+
decisions = domain_decisions.get(domain_name, [])
|
|
417
|
+
|
|
418
|
+
vector_json["domains"][domain_name] = {
|
|
419
|
+
"state": state,
|
|
420
|
+
"always_on": always_on,
|
|
421
|
+
"recall": recall,
|
|
422
|
+
"exclude": exclude,
|
|
423
|
+
"rules": rules,
|
|
424
|
+
"decisions": decisions
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
log(f" {domain_name}: {len(rules)} rules, {len(decisions)} decisions, state={state}, always_on={always_on}")
|
|
428
|
+
|
|
429
|
+
# Summary
|
|
430
|
+
total_rules = sum(len(d.get('rules', [])) for d in vector_json['domains'].values())
|
|
431
|
+
total_decisions = sum(len(d.get('decisions', [])) for d in vector_json['domains'].values())
|
|
432
|
+
log(f"\nTotal: {len(vector_json['domains'])} domains, {total_rules} rules, {total_decisions} decisions", "green")
|
|
433
|
+
|
|
434
|
+
if dry_run:
|
|
435
|
+
log("\n[DRY RUN] Would write vector.json with above contents", "yellow")
|
|
436
|
+
log(f"[DRY RUN] Would archive v1 files to {vector_dir}/_v1-archive/", "yellow")
|
|
437
|
+
# Print a preview of the JSON structure (keys only)
|
|
438
|
+
print(json.dumps(vector_json, indent=2)[:2000])
|
|
439
|
+
if len(json.dumps(vector_json)) > 2000:
|
|
440
|
+
print("... (truncated)")
|
|
441
|
+
sys.exit(0)
|
|
442
|
+
|
|
443
|
+
# 7. Archive old files
|
|
444
|
+
if not no_archive:
|
|
445
|
+
archive_dir = vector_dir / '_v1-archive'
|
|
446
|
+
archive_dir.mkdir(exist_ok=True)
|
|
447
|
+
|
|
448
|
+
v1_files = ['manifest', 'context', 'commands']
|
|
449
|
+
# Also archive domain flat files
|
|
450
|
+
for item in vector_dir.iterdir():
|
|
451
|
+
if item.is_file() and item.name not in skip_files and not item.name.startswith('.'):
|
|
452
|
+
if not item.name.endswith('.json') and not item.name.endswith('.env'):
|
|
453
|
+
v1_files.append(item.name)
|
|
454
|
+
|
|
455
|
+
for fname in v1_files:
|
|
456
|
+
src = vector_dir / fname
|
|
457
|
+
if src.exists():
|
|
458
|
+
dst = archive_dir / fname
|
|
459
|
+
shutil.copy2(str(src), str(dst))
|
|
460
|
+
src.unlink()
|
|
461
|
+
log(f" Archived: {fname} → _v1-archive/{fname}")
|
|
462
|
+
|
|
463
|
+
# Archive decisions directory
|
|
464
|
+
if decisions_dir.exists():
|
|
465
|
+
archive_decisions = archive_dir / 'decisions'
|
|
466
|
+
if archive_decisions.exists():
|
|
467
|
+
shutil.rmtree(str(archive_decisions))
|
|
468
|
+
shutil.copytree(str(decisions_dir), str(archive_decisions))
|
|
469
|
+
shutil.rmtree(str(decisions_dir))
|
|
470
|
+
log(f" Archived: decisions/ → _v1-archive/decisions/")
|
|
471
|
+
|
|
472
|
+
# 8. Write vector.json
|
|
473
|
+
output_path = vector_dir / 'vector.json'
|
|
474
|
+
with open(output_path, 'w') as f:
|
|
475
|
+
json.dump(vector_json, f, indent=2)
|
|
476
|
+
|
|
477
|
+
log(f"\n✓ vector.json written to {output_path}", "green")
|
|
478
|
+
log(f" File size: {output_path.stat().st_size:,} bytes", "green")
|
|
479
|
+
|
|
480
|
+
if not no_archive:
|
|
481
|
+
log(f" Old files archived to: {vector_dir}/_v1-archive/", "green")
|
|
482
|
+
|
|
483
|
+
log("\nMigration complete!", "green")
|
|
484
|
+
log("Next steps:", "cyan")
|
|
485
|
+
log(" 1. Update hook path in ~/.claude/settings.json to point to v2 hook")
|
|
486
|
+
log(" 2. Verify Vector loads correctly: start a new Claude Code session")
|
|
487
|
+
log(" 3. If issues: restore from _v1-archive/ and report a bug")
|
|
488
|
+
|
|
489
|
+
PYTHON_SCRIPT
|
|
490
|
+
|
|
491
|
+
echo ""
|
|
492
|
+
echo -e "${GREEN}Done.${NC}"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Vector Help
|
|
2
|
+
|
|
3
|
+
Vector is the **rules engine** module of Accelerate by Acceleration Guy.
|
|
4
|
+
|
|
5
|
+
## How It Works
|
|
6
|
+
|
|
7
|
+
Vector runs automatically on every prompt you send to Claude Code. A Python hook (`vector-hook.py`) reads your rules configuration and injects relevant behavioral rules based on context keywords in your prompt.
|
|
8
|
+
|
|
9
|
+
## Configuration
|
|
10
|
+
|
|
11
|
+
Edit your rules at: `~/.accel/modules/vector/vector.json`
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"domains": {
|
|
16
|
+
"security": {
|
|
17
|
+
"rules": [
|
|
18
|
+
"Always validate input at API boundaries",
|
|
19
|
+
"Never log sensitive data (passwords, tokens, PII)"
|
|
20
|
+
],
|
|
21
|
+
"triggers": ["auth", "security", "password", "token"]
|
|
22
|
+
},
|
|
23
|
+
"testing": {
|
|
24
|
+
"rules": [
|
|
25
|
+
"Write tests before implementation",
|
|
26
|
+
"Include edge cases in test coverage"
|
|
27
|
+
],
|
|
28
|
+
"triggers": ["test", "spec", "coverage"]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
When your prompt contains words matching `triggers`, those `rules` are injected into the session.
|
|
35
|
+
|
|
36
|
+
## Status
|
|
37
|
+
|
|
38
|
+
Vector has no slash commands — it works automatically in the background. To verify it's running, check that `vector-hook.py` is registered in your Claude Code hooks:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
cat ~/.claude/settings.json | grep vector-hook
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Part of Accelerate
|
|
45
|
+
|
|
46
|
+
Run `/accel status` to see all installed modules.
|