@hanzlaa/rcode 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +120 -0
- package/CLAUDE.md +120 -0
- package/CONTRIBUTING.md +298 -0
- package/README.md +436 -0
- package/cli/config.js +142 -0
- package/cli/context.js +213 -0
- package/cli/dashboard.js +38 -0
- package/cli/digest.js +66 -0
- package/cli/doctor.js +283 -0
- package/cli/github-sync.js +1016 -0
- package/cli/index.js +113 -0
- package/cli/install.js +946 -0
- package/cli/lib/config.cjs +334 -0
- package/cli/lib/fsutil.cjs +76 -0
- package/cli/lib/github.cjs +365 -0
- package/cli/lib/manifest.cjs +240 -0
- package/cli/lib/memory-bank.cjs +348 -0
- package/cli/lib/model-profiles.cjs +169 -0
- package/cli/lib/prompts.cjs +355 -0
- package/cli/postinstall.js +32 -0
- package/cli/set-mode.js +94 -0
- package/cli/set-profile.js +80 -0
- package/cli/show-model.js +82 -0
- package/cli/team.js +35 -0
- package/cli/tiers.js +49 -0
- package/cli/uninstall.js +600 -0
- package/cli/update.js +373 -0
- package/package.json +60 -0
- package/rihal/agents/rihal-advisor-researcher.md +116 -0
- package/rihal/agents/rihal-ahmed.md +66 -0
- package/rihal/agents/rihal-architect.md +79 -0
- package/rihal/agents/rihal-assumptions-analyzer.md +117 -0
- package/rihal/agents/rihal-code-fixer.md +74 -0
- package/rihal/agents/rihal-code-reviewer.md +75 -0
- package/rihal/agents/rihal-codebase-mapper.md +170 -0
- package/rihal/agents/rihal-debugger.md +140 -0
- package/rihal/agents/rihal-deviation-analyzer.md +74 -0
- package/rihal/agents/rihal-docs-auditor.md +77 -0
- package/rihal/agents/rihal-edge-case-hunter.md +75 -0
- package/rihal/agents/rihal-executor.md +113 -0
- package/rihal/agents/rihal-fatima.md +68 -0
- package/rihal/agents/rihal-haitham.md +75 -0
- package/rihal/agents/rihal-hanzla.md +59 -0
- package/rihal/agents/rihal-hussain-pm.md +82 -0
- package/rihal/agents/rihal-integration-checker.md +455 -0
- package/rihal/agents/rihal-khalid.md +59 -0
- package/rihal/agents/rihal-layla.md +57 -0
- package/rihal/agents/rihal-mariam.md +58 -0
- package/rihal/agents/rihal-nasser.md +57 -0
- package/rihal/agents/rihal-noor.md +60 -0
- package/rihal/agents/rihal-nyquist-auditor.md +182 -0
- package/rihal/agents/rihal-omar.md +57 -0
- package/rihal/agents/rihal-phase-researcher.md +84 -0
- package/rihal/agents/rihal-planner.md +176 -0
- package/rihal/agents/rihal-profiler.md +74 -0
- package/rihal/agents/rihal-project-researcher.md +80 -0
- package/rihal/agents/rihal-remediation-planner.md +78 -0
- package/rihal/agents/rihal-research-synthesizer.md +253 -0
- package/rihal/agents/rihal-roadmapper.md +73 -0
- package/rihal/agents/rihal-sadiq.md +72 -0
- package/rihal/agents/rihal-security-adversary.md +82 -0
- package/rihal/agents/rihal-security-auditor.md +78 -0
- package/rihal/agents/rihal-sprint-checker.md +124 -0
- package/rihal/agents/rihal-tech-writer.md +80 -0
- package/rihal/agents/rihal-ui-auditor.md +81 -0
- package/rihal/agents/rihal-ui-designer.md +6 -0
- package/rihal/agents/rihal-ux-designer.md +83 -0
- package/rihal/agents/rihal-verifier.md +124 -0
- package/rihal/agents/rihal-waleed.md +60 -0
- package/rihal/agents/rihal-yousef.md +78 -0
- package/rihal/agents/rihal-zahra.md +62 -0
- package/rihal/agents/rihal-zayd.md +78 -0
- package/rihal/agents/rules/codebase-mapper/detailed-guide.md +615 -0
- package/rihal/agents/rules/debugger/checkpoint-recovery.md +272 -0
- package/rihal/agents/rules/debugger/debug-session-state.md +261 -0
- package/rihal/agents/rules/debugger/hypothesis-templates.md +330 -0
- package/rihal/agents/rules/debugger/investigation-protocol.md +298 -0
- package/rihal/agents/rules/debugger/scientific-method.md +317 -0
- package/rihal/agents/rules/executor/authentication-gates.md +202 -0
- package/rihal/agents/rules/executor/deviation-rules.md +191 -0
- package/rihal/agents/rules/executor/execution-flow.md +116 -0
- package/rihal/agents/rules/executor/self-check.md +241 -0
- package/rihal/agents/rules/executor/stub-detection.md +267 -0
- package/rihal/agents/rules/executor/summary-creation.md +76 -0
- package/rihal/agents/rules/executor/task-commit-protocol.md +283 -0
- package/rihal/agents/rules/executor/tdd-flow.md +294 -0
- package/rihal/agents/rules/phase-researcher/detailed-guide.md +628 -0
- package/rihal/agents/rules/planner/common-patterns.md +373 -0
- package/rihal/agents/rules/planner/dependency-analysis.md +195 -0
- package/rihal/agents/rules/planner/goal-backward-thinking.md +220 -0
- package/rihal/agents/rules/planner/sprint-verification.md +202 -0
- package/rihal/agents/rules/planner/task-templates.md +296 -0
- package/rihal/agents/rules/project-researcher/detailed-guide.md +589 -0
- package/rihal/agents/rules/roadmapper/detailed-guide.md +620 -0
- package/rihal/agents/rules/sprint-checker/dimensions.md +414 -0
- package/rihal/agents/rules/sprint-checker/process.md +377 -0
- package/rihal/agents/rules/verifier/anti-patterns.md +94 -0
- package/rihal/agents/rules/verifier/artifact-verification.md +69 -0
- package/rihal/agents/rules/verifier/behavioral-spot-checks.md +49 -0
- package/rihal/agents/rules/verifier/context-loading.md +84 -0
- package/rihal/agents/rules/verifier/data-flow-trace.md +65 -0
- package/rihal/agents/rules/verifier/gap-output.md +51 -0
- package/rihal/agents/rules/verifier/key-links.md +56 -0
- package/rihal/agents/rules/verifier/requirements-coverage.md +28 -0
- package/rihal/agents/rules/verifier/verification-report.md +131 -0
- package/rihal/bin/lib/code-references.cjs +196 -0
- package/rihal/bin/lib/config.cjs +146 -0
- package/rihal/bin/lib/council-panel.cjs +501 -0
- package/rihal/bin/lib/roadmap.cjs +256 -0
- package/rihal/bin/lib/verify.cjs +118 -0
- package/rihal/bin/rihal-hooks.cjs +204 -0
- package/rihal/bin/rihal-tools.cjs +3554 -0
- package/rihal/brain/README.md +38 -0
- package/rihal/brain/best-practices/no-autonomous-bypass.md +37 -0
- package/rihal/brain/best-practices/research-citation-rule.md +39 -0
- package/rihal/brain/best-practices/state-sync-rule.md +43 -0
- package/rihal/brain/sources.yaml +59 -0
- package/rihal/commands/add-phase.md +18 -0
- package/rihal/commands/add-tests.md +18 -0
- package/rihal/commands/add-todo.md +8 -0
- package/rihal/commands/analyze-dependencies.md +11 -0
- package/rihal/commands/audit-fix.md +14 -0
- package/rihal/commands/audit-milestone.md +12 -0
- package/rihal/commands/audit-uat.md +18 -0
- package/rihal/commands/autonomous.md +19 -0
- package/rihal/commands/brainstorm.md +11 -0
- package/rihal/commands/chain.md +8 -0
- package/rihal/commands/check-implementation-readiness.md +8 -0
- package/rihal/commands/check-todos.md +18 -0
- package/rihal/commands/cleanup.md +18 -0
- package/rihal/commands/code-review-fix.md +14 -0
- package/rihal/commands/code-review.md +14 -0
- package/rihal/commands/complete-milestone.md +12 -0
- package/rihal/commands/config.md +8 -0
- package/rihal/commands/correct-course.md +8 -0
- package/rihal/commands/council.md +25 -0
- package/rihal/commands/create-epics-and-stories.md +8 -0
- package/rihal/commands/create-story.md +8 -0
- package/rihal/commands/dashboard.md +10 -0
- package/rihal/commands/debug.md +8 -0
- package/rihal/commands/decisions.md +10 -0
- package/rihal/commands/dev-story.md +8 -0
- package/rihal/commands/diff.md +10 -0
- package/rihal/commands/discuss-phase-power.md +11 -0
- package/rihal/commands/discuss-phase.md +19 -0
- package/rihal/commands/discuss.md +23 -0
- package/rihal/commands/do.md +22 -0
- package/rihal/commands/docs-update.md +14 -0
- package/rihal/commands/document-project.md +8 -0
- package/rihal/commands/enable-hooks.md +11 -0
- package/rihal/commands/execute-sprint.md +13 -0
- package/rihal/commands/execute.md +19 -0
- package/rihal/commands/explore.md +14 -0
- package/rihal/commands/export-to-github.md +11 -0
- package/rihal/commands/forensics.md +11 -0
- package/rihal/commands/from-template.md +11 -0
- package/rihal/commands/health.md +10 -0
- package/rihal/commands/help.md +8 -0
- package/rihal/commands/import.md +12 -0
- package/rihal/commands/inbox.md +12 -0
- package/rihal/commands/init.md +14 -0
- package/rihal/commands/insert-phase.md +11 -0
- package/rihal/commands/install.md +10 -0
- package/rihal/commands/karpathy-audit.md +12 -0
- package/rihal/commands/list-plans.md +11 -0
- package/rihal/commands/list-workspaces.md +10 -0
- package/rihal/commands/map-codebase.md +14 -0
- package/rihal/commands/milestone-summary.md +11 -0
- package/rihal/commands/new-milestone.md +12 -0
- package/rihal/commands/new-project-research.md +11 -0
- package/rihal/commands/new-project-roadmap.md +11 -0
- package/rihal/commands/new-project.md +13 -0
- package/rihal/commands/new-workspace.md +12 -0
- package/rihal/commands/next.md +19 -0
- package/rihal/commands/note.md +12 -0
- package/rihal/commands/notify-test.md +10 -0
- package/rihal/commands/pause-work.md +8 -0
- package/rihal/commands/plan-milestone-gaps.md +18 -0
- package/rihal/commands/plan.md +19 -0
- package/rihal/commands/plant-seed.md +18 -0
- package/rihal/commands/pr-branch.md +18 -0
- package/rihal/commands/profile-user.md +8 -0
- package/rihal/commands/progress.md +19 -0
- package/rihal/commands/quick.md +14 -0
- package/rihal/commands/remove-phase.md +18 -0
- package/rihal/commands/remove-workspace.md +11 -0
- package/rihal/commands/replay.md +11 -0
- package/rihal/commands/report.md +10 -0
- package/rihal/commands/rerun.md +11 -0
- package/rihal/commands/research-phase.md +18 -0
- package/rihal/commands/resume-work.md +8 -0
- package/rihal/commands/review-adversarial.md +8 -0
- package/rihal/commands/review-edge-case-hunter.md +8 -0
- package/rihal/commands/review.md +18 -0
- package/rihal/commands/scan.md +14 -0
- package/rihal/commands/secure-phase.md +14 -0
- package/rihal/commands/session-report.md +10 -0
- package/rihal/commands/settings.md +8 -0
- package/rihal/commands/ship.md +18 -0
- package/rihal/commands/show.md +10 -0
- package/rihal/commands/sprint-planning.md +20 -0
- package/rihal/commands/sprint-status.md +21 -0
- package/rihal/commands/stats.md +10 -0
- package/rihal/commands/status.md +21 -0
- package/rihal/commands/ui-phase.md +8 -0
- package/rihal/commands/ui-review.md +8 -0
- package/rihal/commands/undo.md +14 -0
- package/rihal/commands/update.md +11 -0
- package/rihal/commands/validate-phase.md +18 -0
- package/rihal/commands/verify-phase.md +18 -0
- package/rihal/commands/verify-work.md +19 -0
- package/rihal/commands/why.md +10 -0
- package/rihal/commands/workstream.md +11 -0
- package/rihal/config/model-profiles.json +226 -0
- package/rihal/config/model-profiles.schema.json +36 -0
- package/rihal/config.yaml +39 -0
- package/rihal/digests/README.md +50 -0
- package/rihal/digests/fatima.md +24 -0
- package/rihal/digests/hussain-pm.md +24 -0
- package/rihal/digests/mariam.md +24 -0
- package/rihal/digests/sadiq.md +24 -0
- package/rihal/digests/waleed.md +24 -0
- package/rihal/modules/core.yaml +101 -0
- package/rihal/modules/discovery.yaml +50 -0
- package/rihal/modules/execution.yaml +66 -0
- package/rihal/references/brain-methods.csv +9 -0
- package/rihal/references/checklist-architect.md +146 -0
- package/rihal/references/checklist-change.md +136 -0
- package/rihal/references/checklist-pm.md +154 -0
- package/rihal/references/checklist-po-master.md +100 -0
- package/rihal/references/checklist-story-dod.md +75 -0
- package/rihal/references/checklist-story-draft.md +53 -0
- package/rihal/references/checkpoints-index.md +53 -0
- package/rihal/references/checkpoints.md +778 -0
- package/rihal/references/codebase-grounding.md +76 -0
- package/rihal/references/command-redirect-format.md +62 -0
- package/rihal/references/commit-conventions.md +125 -0
- package/rihal/references/common-bug-patterns-index.md +44 -0
- package/rihal/references/common-bug-patterns.md +621 -0
- package/rihal/references/context-budget.md +104 -0
- package/rihal/references/continuation-format.md +249 -0
- package/rihal/references/council-protocol.md +91 -0
- package/rihal/references/domain-probes.md +213 -0
- package/rihal/references/elicitation-methods.csv +16 -0
- package/rihal/references/execution-protocol.md +155 -0
- package/rihal/references/gate-prompts.md +212 -0
- package/rihal/references/gates.md +127 -0
- package/rihal/references/git-integration.md +159 -0
- package/rihal/references/git-planning-commit.md +185 -0
- package/rihal/references/karpathy-guidelines.md +79 -0
- package/rihal/references/model-profiles.md +90 -0
- package/rihal/references/no-unauthorized-git-ops.md +73 -0
- package/rihal/references/output-format.md +319 -0
- package/rihal/references/output-realism.md +52 -0
- package/rihal/references/project-types.yaml +270 -0
- package/rihal/references/questioning.md +163 -0
- package/rihal/references/response-style.md +81 -0
- package/rihal/references/state-schema.md +366 -0
- package/rihal/references/tdd.md +263 -0
- package/rihal/references/thinking-models-debug.md +126 -0
- package/rihal/references/thinking-models-planning.md +127 -0
- package/rihal/references/ui-brand.md +254 -0
- package/rihal/references/verification-patterns-index.md +76 -0
- package/rihal/references/verification-patterns.md +612 -0
- package/rihal/references/workstream-flag.md +166 -0
- package/rihal/skills/SKILLS_INDEX.md +114 -0
- package/rihal/skills/_shared/no-autonomous-bypass.md +37 -0
- package/rihal/skills/_shared/research-citation-rule.md +39 -0
- package/rihal/skills/_shared/state-sync-rule.md +43 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/SKILL.md +31 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-01-init.md +137 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/research.template.md +29 -0
- package/rihal/skills/actions/1-analysis/research/rihal-domain-research/workflow.md +49 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/SKILL.md +30 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/research.template.md +29 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-01-init.md +184 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-02-customer-behavior.md +239 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-04-customer-decisions.md +261 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-06-research-completion.md +478 -0
- package/rihal/skills/actions/1-analysis/research/rihal-market-research/workflow.md +49 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/SKILL.md +31 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/research.template.md +29 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-01-init.md +137 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-02-technical-overview.md +239 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-05-implementation-research.md +233 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
- package/rihal/skills/actions/1-analysis/research/rihal-technical-research/workflow.md +50 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/SKILL.md +30 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/checklist.md +245 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/documentation-requirements.csv +12 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/instructions.md +128 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/templates/deep-dive-template.md +345 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/templates/index-template.md +169 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/templates/project-overview-template.md +103 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/templates/project-scan-report-schema.json +160 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/templates/source-tree-template.md +135 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/workflow.md +27 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/deep-dive-instructions.md +299 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/deep-dive-workflow.md +34 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/full-scan-instructions.md +1107 -0
- package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/full-scan-workflow.md +34 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/SKILL.md +120 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/agents/artifact-analyzer.md +60 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/agents/web-researcher.md +49 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/assets/prfaq-template.md +62 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/references/customer-faq.md +55 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/references/internal-faq.md +51 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/references/press-release.md +60 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/references/verdict.md +79 -0
- package/rihal/skills/actions/1-analysis/rihal-prfaq/rihal-manifest.json +16 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/SKILL.md +112 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/artifact-analyzer.md +60 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/opportunity-reviewer.md +44 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/skeptic-reviewer.md +44 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/web-researcher.md +49 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/contextual-discovery.md +57 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/draft-and-review.md +86 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/finalize.md +75 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/guided-elicitation.md +70 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/resources/brief-template.md +60 -0
- package/rihal/skills/actions/1-analysis/rihal-product-brief/rihal-manifest.json +17 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/SKILL.md +30 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/templates/epics-template.md +61 -0
- package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/workflow.md +54 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/SKILL.md +39 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/README.md +30 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-01-init.md +62 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-02-outcomes.md +64 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-03-sequencing.md +65 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-04-windows.md +60 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-05-kill-criteria.md +59 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-06-phase-stubs.md +56 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-07-backlog.md +44 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-08-write-roadmap.md +58 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-09-state-sync.md +62 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-10-complete.md +56 -0
- package/rihal/skills/actions/2-plan/rihal-create-milestone/workflow.md +93 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/SKILL.md +40 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/data/domain-complexity.csv +15 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/data/prd-purpose.md +197 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/data/project-types.csv +11 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-01-init.md +178 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-01b-continue.md +161 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-02-discovery.md +208 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-02b-vision.md +142 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-02c-executive-summary.md +158 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-03-success.md +214 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-04-journeys.md +201 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-05-domain.md +194 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-06-innovation.md +211 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-07-project-type.md +222 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-08-scoping.md +216 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-09-functional.md +219 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-10-nonfunctional.md +230 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-11-polish.md +221 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-12-complete.md +115 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/templates/prd-template.md +10 -0
- package/rihal/skills/actions/2-plan/rihal-create-prd/workflow.md +64 -0
- package/rihal/skills/actions/2-plan/rihal-create-story/SKILL.md +31 -0
- package/rihal/skills/actions/2-plan/rihal-create-story/checklist.md +357 -0
- package/rihal/skills/actions/2-plan/rihal-create-story/discover-inputs.md +88 -0
- package/rihal/skills/actions/2-plan/rihal-create-story/template.md +49 -0
- package/rihal/skills/actions/2-plan/rihal-create-story/workflow.md +380 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/SKILL.md +31 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-01-init.md +135 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-01b-continue.md +127 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-02-discovery.md +190 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-03-core-experience.md +217 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-04-emotional-response.md +220 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-05-inspiration.md +235 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-06-design-system.md +253 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-07-defining-experience.md +255 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-08-visual-foundation.md +225 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-09-design-directions.md +225 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-10-user-journeys.md +242 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-11-component-strategy.md +249 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-12-ux-patterns.md +238 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-14-complete.md +171 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/ux-design-template.md +13 -0
- package/rihal/skills/actions/2-plan/rihal-create-ux-design/workflow.md +36 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/SKILL.md +30 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-01-discovery.md +242 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-02-review.md +245 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-03-edit.md +250 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-04-complete.md +165 -0
- package/rihal/skills/actions/2-plan/rihal-edit-prd/workflow.md +63 -0
- package/rihal/skills/actions/2-plan/rihal-frontend-design/SKILL.md +169 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/SKILL.md +29 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/data/domain-complexity.csv +15 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/data/prd-purpose.md +197 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/data/project-types.csv +11 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-01-discovery.md +221 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
- package/rihal/skills/actions/2-plan/rihal-validate-prd/workflow.md +62 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/SKILL.md +30 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/workflow.md +49 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/SKILL.md +32 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/architecture-decision-template.md +12 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/data/domain-complexity.csv +13 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/data/project-types.csv +7 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-01-init.md +153 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-01b-continue.md +173 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-02-context.md +224 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-03-starter.md +329 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-04-decisions.md +318 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-05-patterns.md +359 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-06-structure.md +379 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-07-validation.md +359 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-08-complete.md +76 -0
- package/rihal/skills/actions/3-solutioning/rihal-create-architecture/workflow.md +38 -0
- package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/SKILL.md +31 -0
- package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/project-context-template.md +21 -0
- package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/steps/step-01-discover.md +186 -0
- package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/steps/step-02-generate.md +321 -0
- package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/steps/step-03-complete.md +278 -0
- package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/workflow.md +43 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/SKILL.md +48 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/generate-trail.md +38 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-01-orientation.md +105 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-04-testing.md +74 -0
- package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-05-wrapup.md +24 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/SKILL.md +31 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-01-gather-context.md +62 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-02-review.md +34 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-03-triage.md +49 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-04-present.md +129 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/workflow.md +55 -0
- package/rihal/skills/actions/4-implementation/rihal-correct-course/SKILL.md +29 -0
- package/rihal/skills/actions/4-implementation/rihal-correct-course/checklist.md +288 -0
- package/rihal/skills/actions/4-implementation/rihal-correct-course/workflow.md +267 -0
- package/rihal/skills/actions/4-implementation/rihal-dev-story/SKILL.md +36 -0
- package/rihal/skills/actions/4-implementation/rihal-dev-story/checklist.md +80 -0
- package/rihal/skills/actions/4-implementation/rihal-dev-story/workflow.md +450 -0
- package/rihal/skills/actions/4-implementation/rihal-qa-generate-e2e-tests/SKILL.md +31 -0
- package/rihal/skills/actions/4-implementation/rihal-qa-generate-e2e-tests/checklist.md +33 -0
- package/rihal/skills/actions/4-implementation/rihal-qa-generate-e2e-tests/workflow.md +136 -0
- package/rihal/skills/actions/4-implementation/rihal-retrospective/SKILL.md +30 -0
- package/rihal/skills/actions/4-implementation/rihal-retrospective/workflow.md +1479 -0
- package/rihal/skills/actions/4-implementation/rihal-scaffold-project/SKILL.md +77 -0
- package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-01-target.md +17 -0
- package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-02-safety.md +35 -0
- package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-03-clone.md +50 -0
- package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-04-post-setup.md +44 -0
- package/rihal/skills/actions/4-implementation/rihal-sprint-planning/SKILL.md +35 -0
- package/rihal/skills/actions/4-implementation/rihal-sprint-planning/checklist.md +43 -0
- package/rihal/skills/actions/4-implementation/rihal-sprint-planning/sprint-status-template.yaml +56 -0
- package/rihal/skills/actions/4-implementation/rihal-sprint-planning/workflow.md +284 -0
- package/rihal/skills/actions/4-implementation/rihal-sprint-status/SKILL.md +30 -0
- package/rihal/skills/actions/4-implementation/rihal-sprint-status/workflow.md +261 -0
- package/rihal/skills/agents/ahmed-hassani-director/SKILL.md +121 -0
- package/rihal/skills/agents/fatima-qa/SKILL.md +106 -0
- package/rihal/skills/agents/fatima-qa/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/haitham-frontend/SKILL.md +120 -0
- package/rihal/skills/agents/hanzla-engineer/SKILL.md +109 -0
- package/rihal/skills/agents/hanzla-engineer/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/hussain-pm/SKILL.md +107 -0
- package/rihal/skills/agents/hussain-pm/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/hussain-sm/SKILL.md +104 -0
- package/rihal/skills/agents/hussain-sm/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/layla-designer/SKILL.md +96 -0
- package/rihal/skills/agents/layla-designer/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/majlis-council/SKILL.md +179 -0
- package/rihal/skills/agents/mariam-marketing/SKILL.md +133 -0
- package/rihal/skills/agents/nasser-eng-manager/SKILL.md +125 -0
- package/rihal/skills/agents/noor-writer/SKILL.md +104 -0
- package/rihal/skills/agents/noor-writer/explain-concept.md +20 -0
- package/rihal/skills/agents/noor-writer/mermaid-gen.md +20 -0
- package/rihal/skills/agents/noor-writer/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/noor-writer/validate-doc.md +19 -0
- package/rihal/skills/agents/noor-writer/write-document.md +20 -0
- package/rihal/skills/agents/raees-orchestrator/SKILL.md +154 -0
- package/rihal/skills/agents/sadiq-analyst/SKILL.md +106 -0
- package/rihal/skills/agents/sadiq-analyst/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/waleed-architect/SKILL.md +106 -0
- package/rihal/skills/agents/waleed-architect/skill-manifest.yaml +11 -0
- package/rihal/skills/agents/yousef-backend/SKILL.md +136 -0
- package/rihal/skills/agents/zahra-branding/SKILL.md +141 -0
- package/rihal/skills/agents/zayd-ml/SKILL.md +124 -0
- package/rihal/skills/core/module-help.csv +11 -0
- package/rihal/skills/core/module.yaml +25 -0
- package/rihal/skills/core/rihal-advanced-elicitation/SKILL.md +155 -0
- package/rihal/skills/core/rihal-advanced-elicitation/methods.csv +51 -0
- package/rihal/skills/core/rihal-advanced-elicitation/rihal-advanced-elicitation/SKILL.md +148 -0
- package/rihal/skills/core/rihal-advanced-elicitation/rihal-advanced-elicitation/methods.csv +51 -0
- package/rihal/skills/core/rihal-brainstorming/SKILL.md +82 -0
- package/rihal/skills/core/rihal-brainstorming/brain-methods.csv +62 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-01-session-setup.md +214 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-01b-continue.md +124 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-02a-user-selected.md +229 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-02b-ai-recommended.md +239 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-02c-random-selection.md +211 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-02d-progressive-flow.md +266 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-03-technique-execution.md +401 -0
- package/rihal/skills/core/rihal-brainstorming/steps/step-04-idea-organization.md +305 -0
- package/rihal/skills/core/rihal-brainstorming/template.md +15 -0
- package/rihal/skills/core/rihal-brainstorming/workflow.md +53 -0
- package/rihal/skills/core/rihal-clone-website/SKILL.md +395 -0
- package/rihal/skills/core/rihal-distillator/SKILL.md +205 -0
- package/rihal/skills/core/rihal-distillator/agents/distillate-compressor.md +116 -0
- package/rihal/skills/core/rihal-distillator/agents/round-trip-reconstructor.md +68 -0
- package/rihal/skills/core/rihal-distillator/resources/compression-rules.md +51 -0
- package/rihal/skills/core/rihal-distillator/resources/distillate-format-reference.md +227 -0
- package/rihal/skills/core/rihal-distillator/resources/splitting-strategy.md +78 -0
- package/rihal/skills/core/rihal-distillator/scripts/analyze_sources.py +300 -0
- package/rihal/skills/core/rihal-distillator/scripts/tests/test_analyze_sources.py +204 -0
- package/rihal/skills/core/rihal-editorial-review-prose/SKILL.md +108 -0
- package/rihal/skills/core/rihal-editorial-review-structure/SKILL.md +193 -0
- package/rihal/skills/core/rihal-help/SKILL.md +91 -0
- package/rihal/skills/core/rihal-index-docs/SKILL.md +80 -0
- package/rihal/skills/core/rihal-init/SKILL.md +119 -0
- package/rihal/skills/core/rihal-init/resources/core-module.yaml +25 -0
- package/rihal/skills/core/rihal-init/scripts/rihal_init.py +593 -0
- package/rihal/skills/core/rihal-init/scripts/tests/test_rihal_init.py +329 -0
- package/rihal/skills/core/rihal-party-mode/SKILL.md +77 -0
- package/rihal/skills/core/rihal-party-mode/steps/step-01-agent-loading.md +138 -0
- package/rihal/skills/core/rihal-party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/rihal/skills/core/rihal-party-mode/steps/step-03-graceful-exit.md +167 -0
- package/rihal/skills/core/rihal-party-mode/workflow.md +190 -0
- package/rihal/skills/core/rihal-review-adversarial-general/SKILL.md +55 -0
- package/rihal/skills/core/rihal-review-edge-case-hunter/SKILL.md +81 -0
- package/rihal/skills/core/rihal-shard-doc/SKILL.md +119 -0
- package/rihal/skills/core/rihal-shard-doc/rihal-shard-doc/SKILL.md +122 -0
- package/rihal/team.yaml +343 -0
- package/rihal/templates/UI-SPEC.md +127 -0
- package/rihal/templates/documentation-requirements.csv +11 -0
- package/rihal/templates/github/bug-template.md +53 -0
- package/rihal/templates/github/epic-template.md +57 -0
- package/rihal/templates/github/feature-template.md +55 -0
- package/rihal/templates/github/task-template.md +52 -0
- package/rihal/templates/milestone.md +147 -0
- package/rihal/templates/projects/api-backend/PROJECT.md +37 -0
- package/rihal/templates/projects/api-backend/REQUIREMENTS.md +38 -0
- package/rihal/templates/projects/api-backend/ROADMAP.md +92 -0
- package/rihal/templates/projects/api-backend/template.yaml +17 -0
- package/rihal/templates/projects/mobile-app/PROJECT.md +37 -0
- package/rihal/templates/projects/mobile-app/REQUIREMENTS.md +32 -0
- package/rihal/templates/projects/mobile-app/ROADMAP.md +93 -0
- package/rihal/templates/projects/mobile-app/template.yaml +17 -0
- package/rihal/templates/projects/saas-b2b/PROJECT.md +40 -0
- package/rihal/templates/projects/saas-b2b/REQUIREMENTS.md +38 -0
- package/rihal/templates/projects/saas-b2b/ROADMAP.md +95 -0
- package/rihal/templates/projects/saas-b2b/template.yaml +18 -0
- package/rihal/templates/settings-hooks.json +36 -0
- package/rihal/templates/sprint.md +70 -0
- package/rihal/workflows/add-phase.md +112 -0
- package/rihal/workflows/add-tests.md +351 -0
- package/rihal/workflows/add-todo.md +181 -0
- package/rihal/workflows/analyze-dependencies.md +138 -0
- package/rihal/workflows/audit-fix.md +190 -0
- package/rihal/workflows/audit-milestone.md +155 -0
- package/rihal/workflows/audit-uat.md +109 -0
- package/rihal/workflows/autonomous.md +992 -0
- package/rihal/workflows/brainstorm.md +203 -0
- package/rihal/workflows/chain.md +188 -0
- package/rihal/workflows/check-implementation-readiness.md +193 -0
- package/rihal/workflows/check-todos.md +177 -0
- package/rihal/workflows/cleanup.md +152 -0
- package/rihal/workflows/code-review-fix.md +529 -0
- package/rihal/workflows/code-review.md +566 -0
- package/rihal/workflows/complete-milestone.md +836 -0
- package/rihal/workflows/config.md +105 -0
- package/rihal/workflows/correct-course.md +190 -0
- package/rihal/workflows/council.md +565 -0
- package/rihal/workflows/create-epics-and-stories.md +373 -0
- package/rihal/workflows/create-story.md +297 -0
- package/rihal/workflows/dashboard.md +102 -0
- package/rihal/workflows/debug.md +256 -0
- package/rihal/workflows/decisions.md +107 -0
- package/rihal/workflows/dev-story.md +432 -0
- package/rihal/workflows/diff.md +74 -0
- package/rihal/workflows/discuss-phase-power.md +325 -0
- package/rihal/workflows/discuss-phase.md +1201 -0
- package/rihal/workflows/discuss.md +227 -0
- package/rihal/workflows/do.md +175 -0
- package/rihal/workflows/docs-update.md +261 -0
- package/rihal/workflows/document-project.md +180 -0
- package/rihal/workflows/enable-hooks.md +102 -0
- package/rihal/workflows/execute-sprint.md +514 -0
- package/rihal/workflows/execute.md +1478 -0
- package/rihal/workflows/explore.md +171 -0
- package/rihal/workflows/export-to-github.md +174 -0
- package/rihal/workflows/forensics.md +201 -0
- package/rihal/workflows/from-template.md +173 -0
- package/rihal/workflows/health.md +194 -0
- package/rihal/workflows/help.md +318 -0
- package/rihal/workflows/import.md +306 -0
- package/rihal/workflows/inbox.md +418 -0
- package/rihal/workflows/init.md +245 -0
- package/rihal/workflows/insert-phase.md +116 -0
- package/rihal/workflows/install.md +85 -0
- package/rihal/workflows/karpathy-audit.md +409 -0
- package/rihal/workflows/list-plans.md +146 -0
- package/rihal/workflows/list-workspaces.md +115 -0
- package/rihal/workflows/map-codebase.md +449 -0
- package/rihal/workflows/milestone-summary.md +206 -0
- package/rihal/workflows/new-milestone.md +616 -0
- package/rihal/workflows/new-project-research.md +262 -0
- package/rihal/workflows/new-project-roadmap.md +446 -0
- package/rihal/workflows/new-project.md +1503 -0
- package/rihal/workflows/new-workspace.md +167 -0
- package/rihal/workflows/next.md +162 -0
- package/rihal/workflows/note.md +156 -0
- package/rihal/workflows/notify-test.md +113 -0
- package/rihal/workflows/pause-work.md +243 -0
- package/rihal/workflows/plan-milestone-gaps.md +273 -0
- package/rihal/workflows/plan.md +1262 -0
- package/rihal/workflows/plant-seed.md +169 -0
- package/rihal/workflows/pr-branch.md +129 -0
- package/rihal/workflows/profile-user.md +162 -0
- package/rihal/workflows/progress.md +184 -0
- package/rihal/workflows/quick.md +105 -0
- package/rihal/workflows/remove-phase.md +155 -0
- package/rihal/workflows/remove-workspace.md +158 -0
- package/rihal/workflows/replay.md +160 -0
- package/rihal/workflows/rerun.md +77 -0
- package/rihal/workflows/research-phase.md +82 -0
- package/rihal/workflows/resume-work.md +326 -0
- package/rihal/workflows/review-adversarial.md +180 -0
- package/rihal/workflows/review-edge-case-hunter.md +214 -0
- package/rihal/workflows/review.md +281 -0
- package/rihal/workflows/scan.md +135 -0
- package/rihal/workflows/secure-phase.md +196 -0
- package/rihal/workflows/session-report.md +187 -0
- package/rihal/workflows/settings.md +185 -0
- package/rihal/workflows/ship.md +237 -0
- package/rihal/workflows/show.md +63 -0
- package/rihal/workflows/sprint-planning.md +166 -0
- package/rihal/workflows/sprint-status.md +124 -0
- package/rihal/workflows/stats.md +141 -0
- package/rihal/workflows/status.md +116 -0
- package/rihal/workflows/ui-phase.md +148 -0
- package/rihal/workflows/ui-review.md +130 -0
- package/rihal/workflows/undo.md +426 -0
- package/rihal/workflows/update.md +185 -0
- package/rihal/workflows/validate-phase.md +174 -0
- package/rihal/workflows/verify-phase.md +375 -0
- package/rihal/workflows/verify-work.md +717 -0
- package/rihal/workflows/why.md +130 -0
- package/rihal/workflows/workstream.md +197 -0
- package/server/dashboard.js +632 -0
package/cli/install.js
ADDED
|
@@ -0,0 +1,946 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/install.js — Rihal v2 file-shipping installer (prototype)
|
|
3
|
+
*
|
|
4
|
+
* Compared to the v1 `cli/init.js` (2918 lines of inline string templates),
|
|
5
|
+
* this installer copies real files from the package's `rihal/` directory
|
|
6
|
+
* into a target project. The same file-shipping pattern (no npm deps).
|
|
7
|
+
*
|
|
8
|
+
* Target layout in the user's project:
|
|
9
|
+
*
|
|
10
|
+
* .rihal/
|
|
11
|
+
* _config/
|
|
12
|
+
* manifest.yaml (version + install date + installed modules)
|
|
13
|
+
* agent-manifest.csv (auto-generated from rihal/agents/*.md frontmatter)
|
|
14
|
+
* files-manifest.csv (SHA256 hashes for update/doctor)
|
|
15
|
+
* config.yaml (user_name, project_name, language, mode)
|
|
16
|
+
* workflows/
|
|
17
|
+
* council.md
|
|
18
|
+
* references/
|
|
19
|
+
* council-protocol.md
|
|
20
|
+
* commit-conventions.md
|
|
21
|
+
* bin/
|
|
22
|
+
* rihal-tools.cjs
|
|
23
|
+
* lib/council-panel.cjs
|
|
24
|
+
* .claude/
|
|
25
|
+
* agents/
|
|
26
|
+
* rihal-sadiq.md
|
|
27
|
+
* rihal-waleed.md
|
|
28
|
+
* rihal-fatima.md
|
|
29
|
+
* commands/
|
|
30
|
+
* rihal/
|
|
31
|
+
* council.md
|
|
32
|
+
* .planning/
|
|
33
|
+
* council-sessions/ (empty dir, populated on first council run)
|
|
34
|
+
*
|
|
35
|
+
* Zero external dependencies. Pure Node stdlib.
|
|
36
|
+
*
|
|
37
|
+
* Usage:
|
|
38
|
+
* node cli/install.js [target-project-dir]
|
|
39
|
+
* node cli/install.js --help
|
|
40
|
+
*
|
|
41
|
+
* Flags:
|
|
42
|
+
* --force overwrite existing files without prompting
|
|
43
|
+
* --yes non-interactive, accept defaults
|
|
44
|
+
* --user <name> set user_name in config.yaml (default: $USER)
|
|
45
|
+
* --project <name> set project_name in config.yaml (default: basename of target)
|
|
46
|
+
* --language <lang> set communication_language (default: English)
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
const fs = require('fs');
|
|
50
|
+
const path = require('path');
|
|
51
|
+
const crypto = require('crypto');
|
|
52
|
+
const os = require('os');
|
|
53
|
+
|
|
54
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '..');
|
|
55
|
+
const SOURCE_ROOT = path.join(PACKAGE_ROOT, 'rihal');
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Parse command-line args into a normalized options object.
|
|
59
|
+
*/
|
|
60
|
+
function parseArgs(argv) {
|
|
61
|
+
const opts = {
|
|
62
|
+
target: process.cwd(),
|
|
63
|
+
targetProvided: false,
|
|
64
|
+
force: false,
|
|
65
|
+
reset: false,
|
|
66
|
+
yes: false,
|
|
67
|
+
userName: os.userInfo().username || 'User',
|
|
68
|
+
projectName: null,
|
|
69
|
+
language: 'English',
|
|
70
|
+
mode: 'guided',
|
|
71
|
+
ide: 'claude', // claude, cursor, gemini (copilot = TODO)
|
|
72
|
+
help: false,
|
|
73
|
+
modules: [], // --module core --module execution or empty = all
|
|
74
|
+
};
|
|
75
|
+
const positional = [];
|
|
76
|
+
for (let i = 0; i < argv.length; i++) {
|
|
77
|
+
const arg = argv[i];
|
|
78
|
+
if (arg === '--help' || arg === '-h') opts.help = true;
|
|
79
|
+
else if (arg === '--force') opts.force = true;
|
|
80
|
+
else if (arg === '--reset') opts.reset = true;
|
|
81
|
+
else if (arg === '--yes' || arg === '-y') opts.yes = true;
|
|
82
|
+
else if (arg === '--user') opts.userName = argv[++i];
|
|
83
|
+
else if (arg === '--project') opts.projectName = argv[++i];
|
|
84
|
+
else if (arg === '--language') opts.language = argv[++i];
|
|
85
|
+
else if (arg === '--mode') opts.mode = argv[++i];
|
|
86
|
+
else if (arg === '--ide') opts.ide = argv[++i];
|
|
87
|
+
else if (arg === '--module') opts.modules.push(argv[++i]);
|
|
88
|
+
else if (!arg.startsWith('--')) positional.push(arg);
|
|
89
|
+
}
|
|
90
|
+
if (positional[0]) {
|
|
91
|
+
opts.target = path.resolve(positional[0]);
|
|
92
|
+
opts.targetProvided = true;
|
|
93
|
+
}
|
|
94
|
+
if (!opts.projectName) opts.projectName = path.basename(opts.target);
|
|
95
|
+
return opts;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function printHelp() {
|
|
99
|
+
console.log(`
|
|
100
|
+
Rihal Code installer
|
|
101
|
+
|
|
102
|
+
Usage:
|
|
103
|
+
node cli/install.js [target-dir]
|
|
104
|
+
|
|
105
|
+
Options:
|
|
106
|
+
--force overwrite existing files without prompting
|
|
107
|
+
--reset with --force, also delete config.yaml and state.json to re-init
|
|
108
|
+
--yes non-interactive, accept defaults
|
|
109
|
+
--user <name> set user_name in config.yaml (default: $USER)
|
|
110
|
+
--project <name> set project_name (default: basename of target-dir)
|
|
111
|
+
--language <lang> set communication_language (default: English)
|
|
112
|
+
--mode <guided|yolo> default mode (default: guided)
|
|
113
|
+
--ide <name> target IDE (claude, cursor, gemini; default: claude)
|
|
114
|
+
--help this text
|
|
115
|
+
|
|
116
|
+
Installs (IDE-specific):
|
|
117
|
+
claude: target/.rihal/ config, workflows, references, bin
|
|
118
|
+
target/.claude/agents/ first-class Rihal subagents
|
|
119
|
+
target/.claude/commands/rihal/ slash commands
|
|
120
|
+
cursor: target/.cursor/rules/rihal/ Cursor-specific rules + agents
|
|
121
|
+
gemini: target/.gemini/rihal/ Gemini CLI commands + agents
|
|
122
|
+
target/.planning/ artifact output dir (all IDEs)
|
|
123
|
+
`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Get install paths for the target IDE.
|
|
128
|
+
* Returns { agentsDir, commandsDir, workflowsDir, referencesDir, binDir }
|
|
129
|
+
*/
|
|
130
|
+
function getPathsForIde(ide, target) {
|
|
131
|
+
switch (ide) {
|
|
132
|
+
case 'claude':
|
|
133
|
+
return {
|
|
134
|
+
agentsDir: path.join(target, '.claude', 'agents'),
|
|
135
|
+
commandsDir: path.join(target, '.claude', 'commands', 'rihal'),
|
|
136
|
+
workflowsDir: path.join(target, '.rihal', 'workflows'),
|
|
137
|
+
referencesDir: path.join(target, '.rihal', 'references'),
|
|
138
|
+
binDir: path.join(target, '.rihal', 'bin'),
|
|
139
|
+
};
|
|
140
|
+
case 'cursor':
|
|
141
|
+
return {
|
|
142
|
+
agentsDir: path.join(target, '.cursor', 'rules', 'rihal', 'agents'),
|
|
143
|
+
commandsDir: path.join(target, '.cursor', 'rules', 'rihal', 'commands'),
|
|
144
|
+
workflowsDir: path.join(target, '.rihal', 'workflows'),
|
|
145
|
+
referencesDir: path.join(target, '.rihal', 'references'),
|
|
146
|
+
binDir: path.join(target, '.rihal', 'bin'),
|
|
147
|
+
};
|
|
148
|
+
case 'gemini':
|
|
149
|
+
return {
|
|
150
|
+
agentsDir: path.join(target, '.gemini', 'rihal', 'agents'),
|
|
151
|
+
commandsDir: path.join(target, '.gemini', 'rihal', 'commands'),
|
|
152
|
+
workflowsDir: path.join(target, '.rihal', 'workflows'),
|
|
153
|
+
referencesDir: path.join(target, '.rihal', 'references'),
|
|
154
|
+
binDir: path.join(target, '.rihal', 'bin'),
|
|
155
|
+
};
|
|
156
|
+
default:
|
|
157
|
+
throw new Error(`Unknown IDE: ${ide}. Supported: claude, cursor, gemini`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Recursively walk a directory and return absolute file paths.
|
|
163
|
+
*/
|
|
164
|
+
function walkFiles(dir) {
|
|
165
|
+
const out = [];
|
|
166
|
+
if (!fs.existsSync(dir)) return out;
|
|
167
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
168
|
+
const full = path.join(dir, entry.name);
|
|
169
|
+
if (entry.isDirectory()) out.push(...walkFiles(full));
|
|
170
|
+
else if (entry.isFile()) out.push(full);
|
|
171
|
+
}
|
|
172
|
+
return out;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function sha256(buffer) {
|
|
176
|
+
return crypto.createHash('sha256').update(buffer).digest('hex');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function ensureDir(dir) {
|
|
180
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Recursive directory copy (pure Node stdlib, no deps).
|
|
185
|
+
*/
|
|
186
|
+
function copyDirRecursive(source, dest) {
|
|
187
|
+
if (!fs.existsSync(source)) return;
|
|
188
|
+
if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true });
|
|
189
|
+
for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
|
|
190
|
+
const srcPath = path.join(source, entry.name);
|
|
191
|
+
const destPath = path.join(dest, entry.name);
|
|
192
|
+
if (entry.isDirectory()) copyDirRecursive(srcPath, destPath);
|
|
193
|
+
else if (entry.isFile()) fs.copyFileSync(srcPath, destPath);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Seed .planning/ with starter ROADMAP.md + STATE.md + PROJECT.md so
|
|
199
|
+
* workflows work immediately after install. User can /rihal:sprint-planning
|
|
200
|
+
* on a fresh install without manual setup.
|
|
201
|
+
*
|
|
202
|
+
* Only seeds if .planning/ROADMAP.md doesn't already exist (preserves user data).
|
|
203
|
+
*/
|
|
204
|
+
function seedStarterPlanning(target, projectName) {
|
|
205
|
+
const planningDir = path.join(target, '.planning');
|
|
206
|
+
const roadmapPath = path.join(planningDir, 'ROADMAP.md');
|
|
207
|
+
const statePath = path.join(planningDir, 'STATE.md');
|
|
208
|
+
const projectPath = path.join(planningDir, 'PROJECT.md');
|
|
209
|
+
|
|
210
|
+
if (fs.existsSync(roadmapPath)) return false; // preserve existing
|
|
211
|
+
|
|
212
|
+
fs.mkdirSync(planningDir, { recursive: true });
|
|
213
|
+
|
|
214
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
215
|
+
const name = projectName || path.basename(target);
|
|
216
|
+
|
|
217
|
+
fs.writeFileSync(projectPath,
|
|
218
|
+
`# ${name}\n\n` +
|
|
219
|
+
`**One-line:** Describe what this project is in one sentence.\n\n` +
|
|
220
|
+
`## Vision\n\n` +
|
|
221
|
+
`What this project delivers and who it serves.\n\n` +
|
|
222
|
+
`## Stack\n\n` +
|
|
223
|
+
`- Language/framework\n- Key dependencies\n- Deployment target\n`
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
fs.writeFileSync(roadmapPath,
|
|
227
|
+
`# ${name} — Roadmap\n\n` +
|
|
228
|
+
`**Milestone: M1 — Initial Delivery** (v1.0)\n` +
|
|
229
|
+
`Started: ${today} · Current\n\n` +
|
|
230
|
+
`---\n\n` +
|
|
231
|
+
`## Phase 01 — Setup & Scaffolding\n\n` +
|
|
232
|
+
`**Goal:** Lay the foundation. Replace this with your first phase when ready.\n\n` +
|
|
233
|
+
`**Status:** Planned\n\n` +
|
|
234
|
+
`**Acceptance:** Working dev environment; first feature in progress.\n\n` +
|
|
235
|
+
`---\n\n` +
|
|
236
|
+
`## Backlog\n\n` +
|
|
237
|
+
`Ideas and future phases go here.\n`
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
fs.writeFileSync(statePath,
|
|
241
|
+
`# ${name} — State\n\n` +
|
|
242
|
+
`**Last updated:** ${today}\n` +
|
|
243
|
+
`**Milestone:** M1 — Initial Delivery\n` +
|
|
244
|
+
`**Current phase:** 01 — Setup & Scaffolding\n` +
|
|
245
|
+
`**Branch:** main\n\n` +
|
|
246
|
+
`---\n\n` +
|
|
247
|
+
`## Decisions\n\n_None yet._\n\n` +
|
|
248
|
+
`## Blockers\n\n_None._\n\n` +
|
|
249
|
+
`## Next Action\n\nSay "plan a sprint" or run \`/rihal:sprint-planning\` to break Phase 01 into stories.\n`
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
// Also pre-seed .rihal/state.json with Phase 01 so sprint tools work
|
|
253
|
+
// immediately (otherwise auto-init in rihal-tools.cjs creates state with
|
|
254
|
+
// empty phases[], requiring manual set-phase before sprint add).
|
|
255
|
+
const rihalStateJson = path.join(target, '.rihal', 'state.json');
|
|
256
|
+
if (!fs.existsSync(rihalStateJson)) {
|
|
257
|
+
const now = new Date().toISOString();
|
|
258
|
+
const state = {
|
|
259
|
+
version: '1',
|
|
260
|
+
project: name,
|
|
261
|
+
created: now,
|
|
262
|
+
updated: now,
|
|
263
|
+
current_phase: '01',
|
|
264
|
+
current_plan: 0,
|
|
265
|
+
current_sprint: null,
|
|
266
|
+
milestone: 'M1 — Initial Delivery',
|
|
267
|
+
phases: [
|
|
268
|
+
{ id: '01', name: 'Setup & Scaffolding', status: 'planned' }
|
|
269
|
+
],
|
|
270
|
+
executions: [],
|
|
271
|
+
decisions: [],
|
|
272
|
+
blockers: [],
|
|
273
|
+
council_sessions: [],
|
|
274
|
+
chains: [],
|
|
275
|
+
workstreams: [],
|
|
276
|
+
active_workstream: null,
|
|
277
|
+
last_session: null,
|
|
278
|
+
velocity_history: [],
|
|
279
|
+
};
|
|
280
|
+
fs.mkdirSync(path.dirname(rihalStateJson), { recursive: true });
|
|
281
|
+
fs.writeFileSync(rihalStateJson, JSON.stringify(state, null, 2) + '\n');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Install v1-style skills into the target project.
|
|
289
|
+
*
|
|
290
|
+
* User-facing skills → .claude/skills/rihal-{name} (phrase-activated, visible as slash commands)
|
|
291
|
+
* Internal skills → .rihal/skills/rihal-{name} (utility libs called by other skills, NOT in
|
|
292
|
+
* .claude/skills/ so they don't pollute the menu)
|
|
293
|
+
*
|
|
294
|
+
* A skill is marked internal by adding `internal: true` to its SKILL.md frontmatter.
|
|
295
|
+
*/
|
|
296
|
+
function installSkills(packageRoot, target) {
|
|
297
|
+
const skillsSource = path.join(packageRoot, 'rihal/skills');
|
|
298
|
+
const skillsDest = path.join(target, '.claude/skills');
|
|
299
|
+
const internalDest = path.join(target, '.rihal/skills');
|
|
300
|
+
|
|
301
|
+
if (!fs.existsSync(skillsSource)) return 0;
|
|
302
|
+
fs.mkdirSync(skillsDest, { recursive: true });
|
|
303
|
+
fs.mkdirSync(internalDest, { recursive: true });
|
|
304
|
+
|
|
305
|
+
let count = 0;
|
|
306
|
+
|
|
307
|
+
function isInternalSkill(skillDir) {
|
|
308
|
+
const skillMd = path.join(skillDir, 'SKILL.md');
|
|
309
|
+
if (!fs.existsSync(skillMd)) return false;
|
|
310
|
+
const text = fs.readFileSync(skillMd, 'utf8');
|
|
311
|
+
return /^internal:\s*true\s*$/m.test(text);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function walkForSkills(dir) {
|
|
315
|
+
if (!fs.existsSync(dir)) return;
|
|
316
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
317
|
+
if (!entry.isDirectory()) continue;
|
|
318
|
+
const src = path.join(dir, entry.name);
|
|
319
|
+
const hasSkillMd = fs.existsSync(path.join(src, 'SKILL.md'));
|
|
320
|
+
if (hasSkillMd) {
|
|
321
|
+
const destName = entry.name.startsWith('rihal-')
|
|
322
|
+
? entry.name
|
|
323
|
+
: `rihal-${entry.name}`;
|
|
324
|
+
const dest = isInternalSkill(src)
|
|
325
|
+
? path.join(internalDest, destName) // internal → .rihal/skills/
|
|
326
|
+
: path.join(skillsDest, destName); // user-facing → .claude/skills/
|
|
327
|
+
copyDirRecursive(src, dest);
|
|
328
|
+
count++;
|
|
329
|
+
} else {
|
|
330
|
+
walkForSkills(src);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
for (const bucket of ['agents', 'actions', 'core']) {
|
|
336
|
+
walkForSkills(path.join(skillsSource, bucket));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return count;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Parse YAML frontmatter from a markdown file. Returns { frontmatter, body }.
|
|
344
|
+
* Minimal subset — supports `key: value` and quoted strings only. Good
|
|
345
|
+
* enough for our agent and command files.
|
|
346
|
+
*/
|
|
347
|
+
function parseFrontmatter(text) {
|
|
348
|
+
if (!text.startsWith('---\n')) return { frontmatter: {}, body: text };
|
|
349
|
+
const end = text.indexOf('\n---\n', 4);
|
|
350
|
+
if (end === -1) return { frontmatter: {}, body: text };
|
|
351
|
+
const block = text.slice(4, end);
|
|
352
|
+
const body = text.slice(end + 5);
|
|
353
|
+
const fm = {};
|
|
354
|
+
for (const raw of block.split('\n')) {
|
|
355
|
+
const line = raw.replace(/^#.*$/, '').trimEnd();
|
|
356
|
+
if (!line) continue;
|
|
357
|
+
const colonAt = line.indexOf(':');
|
|
358
|
+
if (colonAt === -1) continue;
|
|
359
|
+
const key = line.slice(0, colonAt).trim();
|
|
360
|
+
let val = line.slice(colonAt + 1).trim();
|
|
361
|
+
if (!key || !val) continue;
|
|
362
|
+
if (val.startsWith('"') && val.endsWith('"')) val = val.slice(1, -1);
|
|
363
|
+
if (val.startsWith("'") && val.endsWith("'")) val = val.slice(1, -1);
|
|
364
|
+
fm[key] = val;
|
|
365
|
+
}
|
|
366
|
+
return { frontmatter: fm, body };
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Build the list of (sourcePath, targetRelativePath) install pairs. Each
|
|
371
|
+
* entry describes one file we will copy and where it lands in the target
|
|
372
|
+
* project. Returning the list up-front lets us do a dry-run or hash-check
|
|
373
|
+
* pass before touching the disk.
|
|
374
|
+
*
|
|
375
|
+
* For cursor IDE, converts command files from .md to .mdc format.
|
|
376
|
+
*/
|
|
377
|
+
function buildInstallPlan(ide = 'claude', target = process.cwd()) {
|
|
378
|
+
const plan = [];
|
|
379
|
+
const paths = getPathsForIde(ide, target);
|
|
380
|
+
|
|
381
|
+
// Compute relative paths from target root
|
|
382
|
+
const relWorkflows = path.relative(target, paths.workflowsDir);
|
|
383
|
+
const relReferences = path.relative(target, paths.referencesDir);
|
|
384
|
+
const relBin = path.relative(target, paths.binDir);
|
|
385
|
+
const relAgents = path.relative(target, paths.agentsDir);
|
|
386
|
+
const relCommands = path.relative(target, paths.commandsDir);
|
|
387
|
+
|
|
388
|
+
// .rihal/workflows/
|
|
389
|
+
for (const f of walkFiles(path.join(SOURCE_ROOT, 'workflows'))) {
|
|
390
|
+
const rel = path.relative(path.join(SOURCE_ROOT, 'workflows'), f);
|
|
391
|
+
plan.push({ src: f, rel: path.join(relWorkflows, rel) });
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// .rihal/references/
|
|
395
|
+
for (const f of walkFiles(path.join(SOURCE_ROOT, 'references'))) {
|
|
396
|
+
const rel = path.relative(path.join(SOURCE_ROOT, 'references'), f);
|
|
397
|
+
plan.push({ src: f, rel: path.join(relReferences, rel) });
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// .rihal/bin/
|
|
401
|
+
for (const f of walkFiles(path.join(SOURCE_ROOT, 'bin'))) {
|
|
402
|
+
const rel = path.relative(path.join(SOURCE_ROOT, 'bin'), f);
|
|
403
|
+
plan.push({ src: f, rel: path.join(relBin, rel), executable: f.endsWith('.cjs') });
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// .rihal/templates/projects/ — starter templates consumed by /rihal:from-template
|
|
407
|
+
const projectTemplatesSrc = path.join(SOURCE_ROOT, 'templates', 'projects');
|
|
408
|
+
const relProjectTemplates = path.relative(target, path.join(target, '.rihal', 'templates', 'projects'));
|
|
409
|
+
for (const f of walkFiles(projectTemplatesSrc)) {
|
|
410
|
+
const rel = path.relative(projectTemplatesSrc, f);
|
|
411
|
+
plan.push({ src: f, rel: path.join(relProjectTemplates, rel) });
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Agents — IDE-specific
|
|
415
|
+
for (const f of walkFiles(path.join(SOURCE_ROOT, 'agents'))) {
|
|
416
|
+
const rel = path.relative(path.join(SOURCE_ROOT, 'agents'), f);
|
|
417
|
+
const ext = ide === 'cursor' ? '.mdc' : '.md';
|
|
418
|
+
const outName = path.basename(f, '.md') + ext;
|
|
419
|
+
plan.push({ src: f, rel: path.join(relAgents, path.dirname(rel), outName), ide, cursor: ide === 'cursor' });
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Commands — IDE-specific
|
|
423
|
+
for (const f of walkFiles(path.join(SOURCE_ROOT, 'commands'))) {
|
|
424
|
+
const rel = path.relative(path.join(SOURCE_ROOT, 'commands'), f);
|
|
425
|
+
const ext = ide === 'cursor' ? '.mdc' : '.md';
|
|
426
|
+
const outName = path.basename(f, '.md') + ext;
|
|
427
|
+
plan.push({ src: f, rel: path.join(relCommands, path.dirname(rel), outName), ide, cursor: ide === 'cursor' });
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Agent rules (on-demand reference files) — copied to .rihal/agents-rules/
|
|
431
|
+
const agentRulesDir = path.join(target, '.rihal', 'agents-rules');
|
|
432
|
+
for (const f of walkFiles(path.join(SOURCE_ROOT, 'agents', 'rules'))) {
|
|
433
|
+
const rel = path.relative(path.join(SOURCE_ROOT, 'agents', 'rules'), f);
|
|
434
|
+
plan.push({ src: f, rel: path.join('.rihal', 'agents-rules', rel) });
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return plan;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Parse a module YAML manifest (rihal/modules/{name}.yaml).
|
|
442
|
+
* Returns { name, requires[], agents[], workflows[], commands[], references[] }.
|
|
443
|
+
*/
|
|
444
|
+
function readModuleManifest(moduleName) {
|
|
445
|
+
const modPath = path.join(SOURCE_ROOT, 'modules', `${moduleName}.yaml`);
|
|
446
|
+
if (!fs.existsSync(modPath)) return null;
|
|
447
|
+
const text = fs.readFileSync(modPath, 'utf8');
|
|
448
|
+
const mod = { name: moduleName, requires: [], agents: [], workflows: [], commands: [], references: [] };
|
|
449
|
+
let currentKey = null;
|
|
450
|
+
for (const raw of text.split('\n')) {
|
|
451
|
+
const line = raw.replace(/#.*$/, '').trimEnd();
|
|
452
|
+
if (!line.trim()) continue;
|
|
453
|
+
// Top-level key detection
|
|
454
|
+
const keyMatch = line.match(/^(\w+):/);
|
|
455
|
+
if (keyMatch && !line.startsWith(' ') && !line.startsWith('-')) {
|
|
456
|
+
const key = keyMatch[1];
|
|
457
|
+
const val = line.slice(line.indexOf(':') + 1).trim();
|
|
458
|
+
if (['agents', 'workflows', 'commands', 'references', 'requires'].includes(key)) {
|
|
459
|
+
currentKey = key;
|
|
460
|
+
if (val && val !== '[]') {
|
|
461
|
+
// inline single value
|
|
462
|
+
mod[key] = val.replace(/^\[|\]$/g, '').split(',').map((s) => s.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
|
|
463
|
+
}
|
|
464
|
+
} else {
|
|
465
|
+
currentKey = null;
|
|
466
|
+
if (key === 'name') mod.name = val.replace(/^["']|["']$/g, '');
|
|
467
|
+
}
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
// List item under current key
|
|
471
|
+
if (currentKey && line.trim().startsWith('-')) {
|
|
472
|
+
const item = line.trim().slice(1).trim().replace(/^["']|["']$/g, '');
|
|
473
|
+
if (item) mod[currentKey].push(item);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return mod;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* List available module names by scanning rihal/modules/*.yaml
|
|
481
|
+
*/
|
|
482
|
+
function listAvailableModules() {
|
|
483
|
+
const modulesDir = path.join(SOURCE_ROOT, 'modules');
|
|
484
|
+
if (!fs.existsSync(modulesDir)) return [];
|
|
485
|
+
return fs.readdirSync(modulesDir)
|
|
486
|
+
.filter((f) => f.endsWith('.yaml'))
|
|
487
|
+
.map((f) => f.replace('.yaml', ''));
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Filter an install plan to only files belonging to specified modules.
|
|
492
|
+
* If moduleNames is empty, returns the full plan (backward compatible).
|
|
493
|
+
*/
|
|
494
|
+
function filterPlanByModules(plan, moduleNames) {
|
|
495
|
+
if (moduleNames.length === 0) return plan; // no filter = install everything
|
|
496
|
+
const allowed = new Set();
|
|
497
|
+
for (const modName of moduleNames) {
|
|
498
|
+
const mod = readModuleManifest(modName);
|
|
499
|
+
if (!mod) { console.warn(` ⚠ Unknown module: ${modName}`); continue; }
|
|
500
|
+
for (const a of mod.agents) allowed.add(path.join('.claude', 'agents', a));
|
|
501
|
+
for (const w of mod.workflows) allowed.add(path.join('.rihal', 'workflows', w));
|
|
502
|
+
for (const c of mod.commands) allowed.add(path.join('.claude', 'commands', 'rihal', c));
|
|
503
|
+
for (const r of mod.references) allowed.add(path.join('.rihal', 'references', r));
|
|
504
|
+
}
|
|
505
|
+
// Always include bin/ (shared infrastructure, not module-specific)
|
|
506
|
+
return plan.filter((entry) => {
|
|
507
|
+
if (entry.rel.startsWith(path.join('.rihal', 'bin'))) return true;
|
|
508
|
+
return allowed.has(entry.rel);
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Auto-generate agent-manifest.csv from the installed agent files'
|
|
514
|
+
* frontmatter. Columns: id, file, name, description, color.
|
|
515
|
+
*
|
|
516
|
+
* The `id` column strips the `rihal-` prefix so workflow code can match
|
|
517
|
+
* against the council-panel scorer's AGENT_IDS (which use bare names).
|
|
518
|
+
*/
|
|
519
|
+
function generateAgentManifest(plan, target) {
|
|
520
|
+
const rows = [['id', 'file', 'name', 'description', 'color']];
|
|
521
|
+
const seen = new Set(); // Track IDs already added to avoid duplicates
|
|
522
|
+
|
|
523
|
+
for (const entry of plan) {
|
|
524
|
+
if (!entry.rel.startsWith(path.join('.claude', 'agents'))) continue;
|
|
525
|
+
if (!entry.rel.match(/^\.claude[\/\\]agents[\/\\][^\/\\]+\.md$/)) continue;
|
|
526
|
+
const filePath = path.join(target, entry.rel);
|
|
527
|
+
const text = fs.readFileSync(filePath, 'utf8');
|
|
528
|
+
const { frontmatter } = parseFrontmatter(text);
|
|
529
|
+
const name = frontmatter.name || path.basename(entry.rel, '.md');
|
|
530
|
+
const bareId = name.replace(/^rihal-/, '');
|
|
531
|
+
if (seen.has(bareId)) continue; // Skip duplicate
|
|
532
|
+
seen.add(bareId);
|
|
533
|
+
const desc = (frontmatter.description || '').replace(/"/g, '""');
|
|
534
|
+
rows.push([
|
|
535
|
+
bareId,
|
|
536
|
+
entry.rel,
|
|
537
|
+
name,
|
|
538
|
+
`"${desc}"`,
|
|
539
|
+
frontmatter.color || '',
|
|
540
|
+
]);
|
|
541
|
+
}
|
|
542
|
+
// Also include agents already on disk but not in current plan
|
|
543
|
+
const agentDir = path.join(target, '.claude', 'agents');
|
|
544
|
+
if (fs.existsSync(agentDir)) {
|
|
545
|
+
const existingFiles = fs.readdirSync(agentDir).filter(f => f.startsWith('rihal-') && f.endsWith('.md'));
|
|
546
|
+
const alreadyIncluded = new Set(plan.filter(e => e.rel.startsWith(path.join('.claude', 'agents'))).map(e => path.basename(e.rel)));
|
|
547
|
+
for (const file of existingFiles) {
|
|
548
|
+
if (alreadyIncluded.has(file)) continue;
|
|
549
|
+
const filePath = path.join(agentDir, file);
|
|
550
|
+
const text = fs.readFileSync(filePath, 'utf8');
|
|
551
|
+
const { frontmatter } = parseFrontmatter(text);
|
|
552
|
+
const name = frontmatter.name || path.basename(file, '.md');
|
|
553
|
+
const bareId = name.replace(/^rihal-/, '');
|
|
554
|
+
if (seen.has(bareId)) continue; // Skip if already added
|
|
555
|
+
seen.add(bareId);
|
|
556
|
+
const desc = (frontmatter.description || '').replace(/"/g, '""');
|
|
557
|
+
rows.push([bareId, path.join('.claude', 'agents', file), name, `"${desc}"`, frontmatter.color || '']);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return rows.map((r) => r.join(',')).join('\n') + '\n';
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Generate files-manifest.csv with SHA256 per installed file. Used by
|
|
565
|
+
* update/doctor to detect drift. Columns: rel, sha256, size.
|
|
566
|
+
*/
|
|
567
|
+
function generateFilesManifest(plan, target) {
|
|
568
|
+
const rows = [['rel', 'sha256', 'size']];
|
|
569
|
+
for (const entry of plan) {
|
|
570
|
+
const filePath = path.join(target, entry.rel);
|
|
571
|
+
if (!fs.existsSync(filePath)) continue;
|
|
572
|
+
const buf = fs.readFileSync(filePath);
|
|
573
|
+
rows.push([entry.rel.split(path.sep).join('/'), sha256(buf), String(buf.length)]);
|
|
574
|
+
}
|
|
575
|
+
return rows.map((r) => r.join(',')).join('\n') + '\n';
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function readPackageVersion() {
|
|
579
|
+
try {
|
|
580
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf8'));
|
|
581
|
+
return pkg.version || '0.0.0';
|
|
582
|
+
} catch {
|
|
583
|
+
return '0.0.0';
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function generateInstallManifest(opts) {
|
|
588
|
+
const version = readPackageVersion();
|
|
589
|
+
const newModules = opts.modules.length > 0 ? opts.modules : listAvailableModules();
|
|
590
|
+
// Merge with existing manifest if present
|
|
591
|
+
let existingModules = [];
|
|
592
|
+
const existingPath = path.join(opts.target, '.rihal', '_config', 'manifest.yaml');
|
|
593
|
+
if (fs.existsSync(existingPath)) {
|
|
594
|
+
const text = fs.readFileSync(existingPath, 'utf8');
|
|
595
|
+
let inModules = false;
|
|
596
|
+
for (const line of text.split('\n')) {
|
|
597
|
+
if (line.startsWith('modules:')) { inModules = true; continue; }
|
|
598
|
+
if (inModules && line.trim().startsWith('-')) { existingModules.push(line.trim().slice(1).trim()); }
|
|
599
|
+
else if (inModules && !line.startsWith(' ')) { inModules = false; }
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
const allModules = [...new Set([...existingModules, ...newModules])];
|
|
603
|
+
const moduleLines = allModules.map((m) => ` - ${m}`).join('\n');
|
|
604
|
+
return [
|
|
605
|
+
'# Rihal v2 install manifest',
|
|
606
|
+
`version: ${version}`,
|
|
607
|
+
`installDate: ${new Date().toISOString()}`,
|
|
608
|
+
'modules:',
|
|
609
|
+
moduleLines,
|
|
610
|
+
'ides:',
|
|
611
|
+
' - claude-code',
|
|
612
|
+
'',
|
|
613
|
+
].join('\n');
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
function sanitizeYamlValue(val) {
|
|
617
|
+
return (val || '').replace(/[\n\r]/g, ' ').replace(/"/g, '\\"');
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
function generateConfigYaml(opts) {
|
|
621
|
+
return [
|
|
622
|
+
'# Rihal v2 project config',
|
|
623
|
+
'# Generated by install. Safe to edit.',
|
|
624
|
+
`user_name: "${sanitizeYamlValue(opts.userName)}"`,
|
|
625
|
+
`project_name: "${sanitizeYamlValue(opts.projectName)}"`,
|
|
626
|
+
`communication_language: "${sanitizeYamlValue(opts.language)}"`,
|
|
627
|
+
`mode: "${sanitizeYamlValue(opts.mode)}"`,
|
|
628
|
+
`model_profile: "balanced"`,
|
|
629
|
+
`rihal_source_path: "${sanitizeYamlValue(path.dirname(path.dirname(process.argv[1])))}/"`,
|
|
630
|
+
'workflow:',
|
|
631
|
+
' research_by_default: false',
|
|
632
|
+
' plan_checker: true',
|
|
633
|
+
' post_execute_gates: true',
|
|
634
|
+
' ui_safety_gate: true',
|
|
635
|
+
'git:',
|
|
636
|
+
' branching_strategy: "none"',
|
|
637
|
+
'',
|
|
638
|
+
].join('\n');
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Convert a markdown command/agent file to Cursor's .mdc format.
|
|
643
|
+
* Wraps the file with Cursor-specific rules frontmatter.
|
|
644
|
+
*/
|
|
645
|
+
function convertToCursorMdc(sourceText) {
|
|
646
|
+
// Cursor .mdc format wraps markdown in a rules block
|
|
647
|
+
// Pattern: <!-- rules: { "rule": "value" } --> ... content ... <!-- /rules -->
|
|
648
|
+
// For now, we pass through as-is since Cursor treats .mdc as markdown with metadata
|
|
649
|
+
return sourceText;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* Main install routine. Copies files, generates manifests, writes config.
|
|
654
|
+
*/
|
|
655
|
+
function install(opts) {
|
|
656
|
+
if (opts.help) { printHelp(); return 0; }
|
|
657
|
+
|
|
658
|
+
console.log(`\n🕌 Rihal Code installer → ${opts.target}`);
|
|
659
|
+
if (!fs.existsSync(SOURCE_ROOT)) {
|
|
660
|
+
console.error(`✖ Source tree not found at ${SOURCE_ROOT}. Running from wrong dir?`);
|
|
661
|
+
return 1;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Validate IDE
|
|
665
|
+
if (!['claude', 'cursor', 'gemini'].includes(opts.ide)) {
|
|
666
|
+
console.error(`✖ Unknown IDE: ${opts.ide}. Supported: claude, cursor, gemini`);
|
|
667
|
+
return 1;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// Gemini IDE support deferred
|
|
671
|
+
if (opts.ide === 'gemini') {
|
|
672
|
+
console.log(`\n⚠️ Gemini CLI install not yet implemented\n`);
|
|
673
|
+
console.log(`Gemini IDE requires aggregating all agents and commands into a single GEMINI.md file.`);
|
|
674
|
+
console.log(`This feature is planned but not yet available.\n`);
|
|
675
|
+
console.log(`For now, use: --ide claude or --ide cursor\n`);
|
|
676
|
+
return 1;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// Validate requested modules exist
|
|
680
|
+
if (opts.modules.length > 0) {
|
|
681
|
+
const available = listAvailableModules();
|
|
682
|
+
const unknownModules = opts.modules.filter(m => !available.includes(m));
|
|
683
|
+
if (unknownModules.length > 0) {
|
|
684
|
+
console.error(`✖ Unknown module(s): ${unknownModules.join(', ')}`);
|
|
685
|
+
console.error(` Available modules: ${available.join(', ')}`);
|
|
686
|
+
return 1;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
const fullPlan = buildInstallPlan(opts.ide, opts.target);
|
|
691
|
+
const plan = filterPlanByModules(fullPlan, opts.modules);
|
|
692
|
+
if (plan.length === 0) {
|
|
693
|
+
console.error('✖ Nothing to install — install plan is empty.');
|
|
694
|
+
if (opts.modules.length > 0) console.error(` Modules requested: ${opts.modules.join(', ')}`);
|
|
695
|
+
return 1;
|
|
696
|
+
}
|
|
697
|
+
if (opts.modules.length > 0) {
|
|
698
|
+
console.log(` Modules: ${opts.modules.join(', ')}`);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
// Copy files
|
|
702
|
+
let copied = 0;
|
|
703
|
+
let skipped = 0;
|
|
704
|
+
for (const entry of plan) {
|
|
705
|
+
const destPath = path.join(opts.target, entry.rel);
|
|
706
|
+
ensureDir(path.dirname(destPath));
|
|
707
|
+
if (fs.existsSync(destPath) && !opts.force) {
|
|
708
|
+
const existingHash = sha256(fs.readFileSync(destPath));
|
|
709
|
+
const sourceHash = sha256(fs.readFileSync(entry.src));
|
|
710
|
+
if (existingHash === sourceHash) { skipped++; continue; }
|
|
711
|
+
if (!opts.yes) {
|
|
712
|
+
console.warn(` ⚠ ${entry.rel} differs from package version — use --force to overwrite`);
|
|
713
|
+
skipped++;
|
|
714
|
+
continue;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// Warn if overwriting modified file
|
|
719
|
+
if (fs.existsSync(destPath) && opts.force) {
|
|
720
|
+
const existing = fs.readFileSync(destPath);
|
|
721
|
+
const incoming = fs.readFileSync(entry.src);
|
|
722
|
+
if (!existing.equals(incoming)) {
|
|
723
|
+
console.log(` ⚠ Overwriting modified file: ${destPath}`);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Read source file
|
|
728
|
+
let content = fs.readFileSync(entry.src, 'utf8');
|
|
729
|
+
|
|
730
|
+
// Convert to Cursor .mdc format if needed
|
|
731
|
+
if (entry.cursor) {
|
|
732
|
+
content = convertToCursorMdc(content);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// Write to destination
|
|
736
|
+
fs.writeFileSync(destPath, content, 'utf8');
|
|
737
|
+
if (entry.executable) fs.chmodSync(destPath, 0o755);
|
|
738
|
+
copied++;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
// Write .rihal/_config/manifest.yaml + agent-manifest.csv + files-manifest.csv
|
|
742
|
+
const configDir = path.join(opts.target, '.rihal', '_config');
|
|
743
|
+
ensureDir(configDir);
|
|
744
|
+
fs.writeFileSync(path.join(configDir, 'manifest.yaml'), generateInstallManifest(opts));
|
|
745
|
+
fs.writeFileSync(path.join(configDir, 'agent-manifest.csv'), generateAgentManifest(plan, opts.target));
|
|
746
|
+
|
|
747
|
+
// Handle --reset flag: delete config.yaml and state.json if --reset is passed
|
|
748
|
+
const configPath = path.join(opts.target, '.rihal', 'config.yaml');
|
|
749
|
+
const stateDest = path.join(opts.target, '.rihal', 'state.json');
|
|
750
|
+
let existedBefore = false;
|
|
751
|
+
|
|
752
|
+
if (opts.reset && opts.force) {
|
|
753
|
+
if (fs.existsSync(configPath)) {
|
|
754
|
+
fs.unlinkSync(configPath);
|
|
755
|
+
}
|
|
756
|
+
if (fs.existsSync(stateDest)) {
|
|
757
|
+
fs.unlinkSync(stateDest);
|
|
758
|
+
}
|
|
759
|
+
} else if (opts.force && (fs.existsSync(configPath) || fs.existsSync(stateDest))) {
|
|
760
|
+
existedBefore = true;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// Write .rihal/config.yaml (user_name, project_name, language, mode)
|
|
764
|
+
// Note: config.yaml is user data and should NOT be overwritten on --force (unless --reset)
|
|
765
|
+
if (!fs.existsSync(configPath)) {
|
|
766
|
+
fs.writeFileSync(configPath, generateConfigYaml(opts));
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// Seed .rihal/state.json (skip if already exists — don't overwrite on re-install unless --reset)
|
|
770
|
+
if (!fs.existsSync(stateDest)) {
|
|
771
|
+
const stateSrc = path.join(SOURCE_ROOT, 'state.json');
|
|
772
|
+
if (fs.existsSync(stateSrc)) {
|
|
773
|
+
const now = new Date().toISOString();
|
|
774
|
+
const stateContent = fs.readFileSync(stateSrc, 'utf8')
|
|
775
|
+
.replace(/__PROJECT_NAME__/g, opts.projectName)
|
|
776
|
+
.replace(/__INSTALL_DATE__/g, now);
|
|
777
|
+
ensureDir(path.dirname(stateDest));
|
|
778
|
+
fs.writeFileSync(stateDest, stateContent);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
// .planning/council-sessions/ empty dir
|
|
783
|
+
ensureDir(path.join(opts.target, '.planning', 'council-sessions'));
|
|
784
|
+
|
|
785
|
+
// ~/.rihal/agents/ global agents directory
|
|
786
|
+
const globalAgentsDir = path.join(os.homedir(), '.rihal', 'agents');
|
|
787
|
+
ensureDir(globalAgentsDir);
|
|
788
|
+
|
|
789
|
+
// files-manifest.csv — written LAST so it includes itself's siblings
|
|
790
|
+
// (but not itself, since hashing a file referencing its own hash is
|
|
791
|
+
// self-referential nonsense).
|
|
792
|
+
fs.writeFileSync(
|
|
793
|
+
path.join(configDir, 'files-manifest.csv'),
|
|
794
|
+
generateFilesManifest(plan, opts.target),
|
|
795
|
+
);
|
|
796
|
+
|
|
797
|
+
// Install v1-style phrase-activated skills (scaffold-project, create-prd,
|
|
798
|
+
// retrospective, etc.) into .claude/skills/ alongside the v2 agents/commands.
|
|
799
|
+
const skillsInstalled = installSkills(PACKAGE_ROOT, opts.target);
|
|
800
|
+
|
|
801
|
+
// Seed .planning/ with starter ROADMAP + STATE so workflows work immediately
|
|
802
|
+
const starterSeeded = seedStarterPlanning(opts.target, opts.projectName);
|
|
803
|
+
|
|
804
|
+
// Pull Rihal brain content (v2.0 — issue #158).
|
|
805
|
+
// Runs rihal-tools brain pull as a child process. Placeholder URLs
|
|
806
|
+
// are skipped gracefully so this does not fail a fresh install.
|
|
807
|
+
let brainReport = null;
|
|
808
|
+
try {
|
|
809
|
+
const { execFileSync } = require('child_process');
|
|
810
|
+
const toolsPath = path.join(opts.target, '.rihal', 'bin', 'rihal-tools.cjs');
|
|
811
|
+
if (fs.existsSync(toolsPath)) {
|
|
812
|
+
const out = execFileSync('node', [toolsPath, 'brain', 'pull'], {
|
|
813
|
+
cwd: opts.target,
|
|
814
|
+
encoding: 'utf8',
|
|
815
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
816
|
+
});
|
|
817
|
+
try { brainReport = JSON.parse(out); } catch {}
|
|
818
|
+
}
|
|
819
|
+
} catch (e) {
|
|
820
|
+
// brain pull is best-effort on install — do not fail the whole install
|
|
821
|
+
brainReport = { ok: false, error: String(e.message || e).slice(0, 200) };
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// Summary
|
|
825
|
+
console.log('');
|
|
826
|
+
console.log(` Installed: ${copied} file${copied === 1 ? '' : 's'}`);
|
|
827
|
+
if (skillsInstalled > 0) {
|
|
828
|
+
console.log(` Skills: ${skillsInstalled} phrase-activated (in .claude/skills/)`);
|
|
829
|
+
}
|
|
830
|
+
if (brainReport && brainReport.ok) {
|
|
831
|
+
const pulledCount = (brainReport.pulled || []).length;
|
|
832
|
+
const skippedCount = (brainReport.skipped || []).length;
|
|
833
|
+
console.log(` Brain: ${pulledCount} source${pulledCount === 1 ? '' : 's'} pulled` +
|
|
834
|
+
(skippedCount ? `, ${skippedCount} skipped (placeholder URLs — see issue #162)` : ''));
|
|
835
|
+
} else if (brainReport && brainReport.error) {
|
|
836
|
+
console.log(` Brain: skipped (${brainReport.error})`);
|
|
837
|
+
}
|
|
838
|
+
if (skipped > 0) console.log(` Skipped: ${skipped} (already present, unchanged)`);
|
|
839
|
+
if (opts.force && existedBefore) {
|
|
840
|
+
console.log(' ⚠ Preserved: .rihal/config.yaml and .rihal/state.json');
|
|
841
|
+
console.log(' Pass --reset to wipe and re-init those too.');
|
|
842
|
+
}
|
|
843
|
+
console.log('');
|
|
844
|
+
console.log(` Installed for IDE: ${opts.ide}`);
|
|
845
|
+
console.log(` Language: ${opts.language} (change in .rihal/config.yaml → communication_language)`);
|
|
846
|
+
console.log(` Mode: ${opts.mode} (guided=confirm at gates, yolo=autonomous)`);
|
|
847
|
+
console.log(` Model profile: balanced`);
|
|
848
|
+
console.log('');
|
|
849
|
+
console.log(' Agents installed (first-class subagents):');
|
|
850
|
+
console.log(' 🧭 rihal-sadiq — Director of Strategy');
|
|
851
|
+
console.log(' 🏗️ rihal-waleed — CTO');
|
|
852
|
+
console.log(' 🛡️ rihal-fatima — QA Lead');
|
|
853
|
+
console.log('');
|
|
854
|
+
console.log(' Slash commands installed:');
|
|
855
|
+
console.log(' /rihal:council — parallel multi-agent council');
|
|
856
|
+
console.log(' /rihal:status — project state dashboard');
|
|
857
|
+
console.log(' /rihal:insert-phase — insert decimal phase for urgent work');
|
|
858
|
+
console.log('');
|
|
859
|
+
if (starterSeeded) {
|
|
860
|
+
console.log(' ✓ Starter planning scaffolded in .planning/ (ROADMAP, STATE, PROJECT)');
|
|
861
|
+
console.log('');
|
|
862
|
+
}
|
|
863
|
+
console.log(' Next:');
|
|
864
|
+
console.log(` cd ${opts.target}`);
|
|
865
|
+
console.log(' claude # start Claude Code (or restart if already open)');
|
|
866
|
+
console.log(' /rihal:sprint-planning # plan your first sprint');
|
|
867
|
+
console.log(' /rihal:do # interactive command picker');
|
|
868
|
+
console.log(' /rihal:council <question> # multi-agent strategic answer');
|
|
869
|
+
console.log('');
|
|
870
|
+
console.log(' ⚠ If Claude Code is already running, start a new session to load commands.');
|
|
871
|
+
console.log('');
|
|
872
|
+
return 0;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
async function main() {
|
|
876
|
+
const argv = process.argv.slice(2);
|
|
877
|
+
const opts = parseArgs(argv);
|
|
878
|
+
|
|
879
|
+
// Prompt for target directory when not explicitly provided and not --yes
|
|
880
|
+
if (!opts.targetProvided && !opts.yes && !opts.help) {
|
|
881
|
+
const { askText, askChoice, PromptAbortError } = require('./lib/prompts.cjs');
|
|
882
|
+
try {
|
|
883
|
+
console.log('');
|
|
884
|
+
const answer = await askText(
|
|
885
|
+
`Install Rihal Code into which directory?\n (press Enter for current directory: ${opts.target})`,
|
|
886
|
+
{ default: opts.target }
|
|
887
|
+
);
|
|
888
|
+
const resolved = path.resolve(answer.trim() || opts.target);
|
|
889
|
+
opts.target = resolved;
|
|
890
|
+
opts.projectName = path.basename(resolved);
|
|
891
|
+
|
|
892
|
+
const ideAnswer = await askChoice(
|
|
893
|
+
'Which editor are you installing for?',
|
|
894
|
+
{
|
|
895
|
+
choices: [
|
|
896
|
+
{ id: 'claude', label: 'Claude Code' },
|
|
897
|
+
{ id: 'cursor', label: 'Cursor' },
|
|
898
|
+
{ id: 'gemini', label: 'Gemini CLI' },
|
|
899
|
+
{ id: 'all', label: 'All (Claude + Cursor + Gemini)' },
|
|
900
|
+
],
|
|
901
|
+
default: 'claude',
|
|
902
|
+
}
|
|
903
|
+
);
|
|
904
|
+
opts.ide = ideAnswer[0];
|
|
905
|
+
console.log('');
|
|
906
|
+
} catch (err) {
|
|
907
|
+
if (err.name === 'PromptAbortError') process.exit(0);
|
|
908
|
+
throw err;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
try {
|
|
913
|
+
process.exit(install(opts));
|
|
914
|
+
} catch (err) {
|
|
915
|
+
if (err.code === 'EACCES' || err.code === 'EPERM') {
|
|
916
|
+
console.error(`✖ Permission denied: ${err.path || err.message}`);
|
|
917
|
+
process.exit(1);
|
|
918
|
+
}
|
|
919
|
+
if (err.code === 'ENOENT') {
|
|
920
|
+
console.error(`✖ Path not found: ${err.path || err.message}`);
|
|
921
|
+
process.exit(1);
|
|
922
|
+
}
|
|
923
|
+
console.error(`✖ Install failed: ${err.message}`);
|
|
924
|
+
if (process.env.DEBUG) console.error(err.stack);
|
|
925
|
+
process.exit(1);
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
if (require.main === module) main();
|
|
930
|
+
|
|
931
|
+
/**
|
|
932
|
+
* Handler for cli/index.js — called as `npx rihal-code install [args]`.
|
|
933
|
+
* Converts the index.js-style (args, ctx) signature into a cli/install.js
|
|
934
|
+
* parseArgs-compatible argv and runs install().
|
|
935
|
+
*/
|
|
936
|
+
function runFromCli(args /* , ctx */) {
|
|
937
|
+
const argv = Array.isArray(args) ? args : [];
|
|
938
|
+
const opts = parseArgs(argv);
|
|
939
|
+
const code = install(opts);
|
|
940
|
+
if (code !== 0) process.exit(code);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
module.exports = runFromCli;
|
|
944
|
+
module.exports.parseArgs = parseArgs;
|
|
945
|
+
module.exports.buildInstallPlan = buildInstallPlan;
|
|
946
|
+
module.exports.install = install;
|