@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.
Files changed (676) hide show
  1. package/AGENTS.md +120 -0
  2. package/CLAUDE.md +120 -0
  3. package/CONTRIBUTING.md +298 -0
  4. package/README.md +436 -0
  5. package/cli/config.js +142 -0
  6. package/cli/context.js +213 -0
  7. package/cli/dashboard.js +38 -0
  8. package/cli/digest.js +66 -0
  9. package/cli/doctor.js +283 -0
  10. package/cli/github-sync.js +1016 -0
  11. package/cli/index.js +113 -0
  12. package/cli/install.js +946 -0
  13. package/cli/lib/config.cjs +334 -0
  14. package/cli/lib/fsutil.cjs +76 -0
  15. package/cli/lib/github.cjs +365 -0
  16. package/cli/lib/manifest.cjs +240 -0
  17. package/cli/lib/memory-bank.cjs +348 -0
  18. package/cli/lib/model-profiles.cjs +169 -0
  19. package/cli/lib/prompts.cjs +355 -0
  20. package/cli/postinstall.js +32 -0
  21. package/cli/set-mode.js +94 -0
  22. package/cli/set-profile.js +80 -0
  23. package/cli/show-model.js +82 -0
  24. package/cli/team.js +35 -0
  25. package/cli/tiers.js +49 -0
  26. package/cli/uninstall.js +600 -0
  27. package/cli/update.js +373 -0
  28. package/package.json +60 -0
  29. package/rihal/agents/rihal-advisor-researcher.md +116 -0
  30. package/rihal/agents/rihal-ahmed.md +66 -0
  31. package/rihal/agents/rihal-architect.md +79 -0
  32. package/rihal/agents/rihal-assumptions-analyzer.md +117 -0
  33. package/rihal/agents/rihal-code-fixer.md +74 -0
  34. package/rihal/agents/rihal-code-reviewer.md +75 -0
  35. package/rihal/agents/rihal-codebase-mapper.md +170 -0
  36. package/rihal/agents/rihal-debugger.md +140 -0
  37. package/rihal/agents/rihal-deviation-analyzer.md +74 -0
  38. package/rihal/agents/rihal-docs-auditor.md +77 -0
  39. package/rihal/agents/rihal-edge-case-hunter.md +75 -0
  40. package/rihal/agents/rihal-executor.md +113 -0
  41. package/rihal/agents/rihal-fatima.md +68 -0
  42. package/rihal/agents/rihal-haitham.md +75 -0
  43. package/rihal/agents/rihal-hanzla.md +59 -0
  44. package/rihal/agents/rihal-hussain-pm.md +82 -0
  45. package/rihal/agents/rihal-integration-checker.md +455 -0
  46. package/rihal/agents/rihal-khalid.md +59 -0
  47. package/rihal/agents/rihal-layla.md +57 -0
  48. package/rihal/agents/rihal-mariam.md +58 -0
  49. package/rihal/agents/rihal-nasser.md +57 -0
  50. package/rihal/agents/rihal-noor.md +60 -0
  51. package/rihal/agents/rihal-nyquist-auditor.md +182 -0
  52. package/rihal/agents/rihal-omar.md +57 -0
  53. package/rihal/agents/rihal-phase-researcher.md +84 -0
  54. package/rihal/agents/rihal-planner.md +176 -0
  55. package/rihal/agents/rihal-profiler.md +74 -0
  56. package/rihal/agents/rihal-project-researcher.md +80 -0
  57. package/rihal/agents/rihal-remediation-planner.md +78 -0
  58. package/rihal/agents/rihal-research-synthesizer.md +253 -0
  59. package/rihal/agents/rihal-roadmapper.md +73 -0
  60. package/rihal/agents/rihal-sadiq.md +72 -0
  61. package/rihal/agents/rihal-security-adversary.md +82 -0
  62. package/rihal/agents/rihal-security-auditor.md +78 -0
  63. package/rihal/agents/rihal-sprint-checker.md +124 -0
  64. package/rihal/agents/rihal-tech-writer.md +80 -0
  65. package/rihal/agents/rihal-ui-auditor.md +81 -0
  66. package/rihal/agents/rihal-ui-designer.md +6 -0
  67. package/rihal/agents/rihal-ux-designer.md +83 -0
  68. package/rihal/agents/rihal-verifier.md +124 -0
  69. package/rihal/agents/rihal-waleed.md +60 -0
  70. package/rihal/agents/rihal-yousef.md +78 -0
  71. package/rihal/agents/rihal-zahra.md +62 -0
  72. package/rihal/agents/rihal-zayd.md +78 -0
  73. package/rihal/agents/rules/codebase-mapper/detailed-guide.md +615 -0
  74. package/rihal/agents/rules/debugger/checkpoint-recovery.md +272 -0
  75. package/rihal/agents/rules/debugger/debug-session-state.md +261 -0
  76. package/rihal/agents/rules/debugger/hypothesis-templates.md +330 -0
  77. package/rihal/agents/rules/debugger/investigation-protocol.md +298 -0
  78. package/rihal/agents/rules/debugger/scientific-method.md +317 -0
  79. package/rihal/agents/rules/executor/authentication-gates.md +202 -0
  80. package/rihal/agents/rules/executor/deviation-rules.md +191 -0
  81. package/rihal/agents/rules/executor/execution-flow.md +116 -0
  82. package/rihal/agents/rules/executor/self-check.md +241 -0
  83. package/rihal/agents/rules/executor/stub-detection.md +267 -0
  84. package/rihal/agents/rules/executor/summary-creation.md +76 -0
  85. package/rihal/agents/rules/executor/task-commit-protocol.md +283 -0
  86. package/rihal/agents/rules/executor/tdd-flow.md +294 -0
  87. package/rihal/agents/rules/phase-researcher/detailed-guide.md +628 -0
  88. package/rihal/agents/rules/planner/common-patterns.md +373 -0
  89. package/rihal/agents/rules/planner/dependency-analysis.md +195 -0
  90. package/rihal/agents/rules/planner/goal-backward-thinking.md +220 -0
  91. package/rihal/agents/rules/planner/sprint-verification.md +202 -0
  92. package/rihal/agents/rules/planner/task-templates.md +296 -0
  93. package/rihal/agents/rules/project-researcher/detailed-guide.md +589 -0
  94. package/rihal/agents/rules/roadmapper/detailed-guide.md +620 -0
  95. package/rihal/agents/rules/sprint-checker/dimensions.md +414 -0
  96. package/rihal/agents/rules/sprint-checker/process.md +377 -0
  97. package/rihal/agents/rules/verifier/anti-patterns.md +94 -0
  98. package/rihal/agents/rules/verifier/artifact-verification.md +69 -0
  99. package/rihal/agents/rules/verifier/behavioral-spot-checks.md +49 -0
  100. package/rihal/agents/rules/verifier/context-loading.md +84 -0
  101. package/rihal/agents/rules/verifier/data-flow-trace.md +65 -0
  102. package/rihal/agents/rules/verifier/gap-output.md +51 -0
  103. package/rihal/agents/rules/verifier/key-links.md +56 -0
  104. package/rihal/agents/rules/verifier/requirements-coverage.md +28 -0
  105. package/rihal/agents/rules/verifier/verification-report.md +131 -0
  106. package/rihal/bin/lib/code-references.cjs +196 -0
  107. package/rihal/bin/lib/config.cjs +146 -0
  108. package/rihal/bin/lib/council-panel.cjs +501 -0
  109. package/rihal/bin/lib/roadmap.cjs +256 -0
  110. package/rihal/bin/lib/verify.cjs +118 -0
  111. package/rihal/bin/rihal-hooks.cjs +204 -0
  112. package/rihal/bin/rihal-tools.cjs +3554 -0
  113. package/rihal/brain/README.md +38 -0
  114. package/rihal/brain/best-practices/no-autonomous-bypass.md +37 -0
  115. package/rihal/brain/best-practices/research-citation-rule.md +39 -0
  116. package/rihal/brain/best-practices/state-sync-rule.md +43 -0
  117. package/rihal/brain/sources.yaml +59 -0
  118. package/rihal/commands/add-phase.md +18 -0
  119. package/rihal/commands/add-tests.md +18 -0
  120. package/rihal/commands/add-todo.md +8 -0
  121. package/rihal/commands/analyze-dependencies.md +11 -0
  122. package/rihal/commands/audit-fix.md +14 -0
  123. package/rihal/commands/audit-milestone.md +12 -0
  124. package/rihal/commands/audit-uat.md +18 -0
  125. package/rihal/commands/autonomous.md +19 -0
  126. package/rihal/commands/brainstorm.md +11 -0
  127. package/rihal/commands/chain.md +8 -0
  128. package/rihal/commands/check-implementation-readiness.md +8 -0
  129. package/rihal/commands/check-todos.md +18 -0
  130. package/rihal/commands/cleanup.md +18 -0
  131. package/rihal/commands/code-review-fix.md +14 -0
  132. package/rihal/commands/code-review.md +14 -0
  133. package/rihal/commands/complete-milestone.md +12 -0
  134. package/rihal/commands/config.md +8 -0
  135. package/rihal/commands/correct-course.md +8 -0
  136. package/rihal/commands/council.md +25 -0
  137. package/rihal/commands/create-epics-and-stories.md +8 -0
  138. package/rihal/commands/create-story.md +8 -0
  139. package/rihal/commands/dashboard.md +10 -0
  140. package/rihal/commands/debug.md +8 -0
  141. package/rihal/commands/decisions.md +10 -0
  142. package/rihal/commands/dev-story.md +8 -0
  143. package/rihal/commands/diff.md +10 -0
  144. package/rihal/commands/discuss-phase-power.md +11 -0
  145. package/rihal/commands/discuss-phase.md +19 -0
  146. package/rihal/commands/discuss.md +23 -0
  147. package/rihal/commands/do.md +22 -0
  148. package/rihal/commands/docs-update.md +14 -0
  149. package/rihal/commands/document-project.md +8 -0
  150. package/rihal/commands/enable-hooks.md +11 -0
  151. package/rihal/commands/execute-sprint.md +13 -0
  152. package/rihal/commands/execute.md +19 -0
  153. package/rihal/commands/explore.md +14 -0
  154. package/rihal/commands/export-to-github.md +11 -0
  155. package/rihal/commands/forensics.md +11 -0
  156. package/rihal/commands/from-template.md +11 -0
  157. package/rihal/commands/health.md +10 -0
  158. package/rihal/commands/help.md +8 -0
  159. package/rihal/commands/import.md +12 -0
  160. package/rihal/commands/inbox.md +12 -0
  161. package/rihal/commands/init.md +14 -0
  162. package/rihal/commands/insert-phase.md +11 -0
  163. package/rihal/commands/install.md +10 -0
  164. package/rihal/commands/karpathy-audit.md +12 -0
  165. package/rihal/commands/list-plans.md +11 -0
  166. package/rihal/commands/list-workspaces.md +10 -0
  167. package/rihal/commands/map-codebase.md +14 -0
  168. package/rihal/commands/milestone-summary.md +11 -0
  169. package/rihal/commands/new-milestone.md +12 -0
  170. package/rihal/commands/new-project-research.md +11 -0
  171. package/rihal/commands/new-project-roadmap.md +11 -0
  172. package/rihal/commands/new-project.md +13 -0
  173. package/rihal/commands/new-workspace.md +12 -0
  174. package/rihal/commands/next.md +19 -0
  175. package/rihal/commands/note.md +12 -0
  176. package/rihal/commands/notify-test.md +10 -0
  177. package/rihal/commands/pause-work.md +8 -0
  178. package/rihal/commands/plan-milestone-gaps.md +18 -0
  179. package/rihal/commands/plan.md +19 -0
  180. package/rihal/commands/plant-seed.md +18 -0
  181. package/rihal/commands/pr-branch.md +18 -0
  182. package/rihal/commands/profile-user.md +8 -0
  183. package/rihal/commands/progress.md +19 -0
  184. package/rihal/commands/quick.md +14 -0
  185. package/rihal/commands/remove-phase.md +18 -0
  186. package/rihal/commands/remove-workspace.md +11 -0
  187. package/rihal/commands/replay.md +11 -0
  188. package/rihal/commands/report.md +10 -0
  189. package/rihal/commands/rerun.md +11 -0
  190. package/rihal/commands/research-phase.md +18 -0
  191. package/rihal/commands/resume-work.md +8 -0
  192. package/rihal/commands/review-adversarial.md +8 -0
  193. package/rihal/commands/review-edge-case-hunter.md +8 -0
  194. package/rihal/commands/review.md +18 -0
  195. package/rihal/commands/scan.md +14 -0
  196. package/rihal/commands/secure-phase.md +14 -0
  197. package/rihal/commands/session-report.md +10 -0
  198. package/rihal/commands/settings.md +8 -0
  199. package/rihal/commands/ship.md +18 -0
  200. package/rihal/commands/show.md +10 -0
  201. package/rihal/commands/sprint-planning.md +20 -0
  202. package/rihal/commands/sprint-status.md +21 -0
  203. package/rihal/commands/stats.md +10 -0
  204. package/rihal/commands/status.md +21 -0
  205. package/rihal/commands/ui-phase.md +8 -0
  206. package/rihal/commands/ui-review.md +8 -0
  207. package/rihal/commands/undo.md +14 -0
  208. package/rihal/commands/update.md +11 -0
  209. package/rihal/commands/validate-phase.md +18 -0
  210. package/rihal/commands/verify-phase.md +18 -0
  211. package/rihal/commands/verify-work.md +19 -0
  212. package/rihal/commands/why.md +10 -0
  213. package/rihal/commands/workstream.md +11 -0
  214. package/rihal/config/model-profiles.json +226 -0
  215. package/rihal/config/model-profiles.schema.json +36 -0
  216. package/rihal/config.yaml +39 -0
  217. package/rihal/digests/README.md +50 -0
  218. package/rihal/digests/fatima.md +24 -0
  219. package/rihal/digests/hussain-pm.md +24 -0
  220. package/rihal/digests/mariam.md +24 -0
  221. package/rihal/digests/sadiq.md +24 -0
  222. package/rihal/digests/waleed.md +24 -0
  223. package/rihal/modules/core.yaml +101 -0
  224. package/rihal/modules/discovery.yaml +50 -0
  225. package/rihal/modules/execution.yaml +66 -0
  226. package/rihal/references/brain-methods.csv +9 -0
  227. package/rihal/references/checklist-architect.md +146 -0
  228. package/rihal/references/checklist-change.md +136 -0
  229. package/rihal/references/checklist-pm.md +154 -0
  230. package/rihal/references/checklist-po-master.md +100 -0
  231. package/rihal/references/checklist-story-dod.md +75 -0
  232. package/rihal/references/checklist-story-draft.md +53 -0
  233. package/rihal/references/checkpoints-index.md +53 -0
  234. package/rihal/references/checkpoints.md +778 -0
  235. package/rihal/references/codebase-grounding.md +76 -0
  236. package/rihal/references/command-redirect-format.md +62 -0
  237. package/rihal/references/commit-conventions.md +125 -0
  238. package/rihal/references/common-bug-patterns-index.md +44 -0
  239. package/rihal/references/common-bug-patterns.md +621 -0
  240. package/rihal/references/context-budget.md +104 -0
  241. package/rihal/references/continuation-format.md +249 -0
  242. package/rihal/references/council-protocol.md +91 -0
  243. package/rihal/references/domain-probes.md +213 -0
  244. package/rihal/references/elicitation-methods.csv +16 -0
  245. package/rihal/references/execution-protocol.md +155 -0
  246. package/rihal/references/gate-prompts.md +212 -0
  247. package/rihal/references/gates.md +127 -0
  248. package/rihal/references/git-integration.md +159 -0
  249. package/rihal/references/git-planning-commit.md +185 -0
  250. package/rihal/references/karpathy-guidelines.md +79 -0
  251. package/rihal/references/model-profiles.md +90 -0
  252. package/rihal/references/no-unauthorized-git-ops.md +73 -0
  253. package/rihal/references/output-format.md +319 -0
  254. package/rihal/references/output-realism.md +52 -0
  255. package/rihal/references/project-types.yaml +270 -0
  256. package/rihal/references/questioning.md +163 -0
  257. package/rihal/references/response-style.md +81 -0
  258. package/rihal/references/state-schema.md +366 -0
  259. package/rihal/references/tdd.md +263 -0
  260. package/rihal/references/thinking-models-debug.md +126 -0
  261. package/rihal/references/thinking-models-planning.md +127 -0
  262. package/rihal/references/ui-brand.md +254 -0
  263. package/rihal/references/verification-patterns-index.md +76 -0
  264. package/rihal/references/verification-patterns.md +612 -0
  265. package/rihal/references/workstream-flag.md +166 -0
  266. package/rihal/skills/SKILLS_INDEX.md +114 -0
  267. package/rihal/skills/_shared/no-autonomous-bypass.md +37 -0
  268. package/rihal/skills/_shared/research-citation-rule.md +39 -0
  269. package/rihal/skills/_shared/state-sync-rule.md +43 -0
  270. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/SKILL.md +31 -0
  271. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-01-init.md +137 -0
  272. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
  273. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
  274. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
  275. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-05-technical-trends.md +234 -0
  276. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
  277. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/research.template.md +29 -0
  278. package/rihal/skills/actions/1-analysis/research/rihal-domain-research/workflow.md +49 -0
  279. package/rihal/skills/actions/1-analysis/research/rihal-market-research/SKILL.md +30 -0
  280. package/rihal/skills/actions/1-analysis/research/rihal-market-research/research.template.md +29 -0
  281. package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-01-init.md +184 -0
  282. package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-02-customer-behavior.md +239 -0
  283. package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-03-customer-pain-points.md +251 -0
  284. package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-04-customer-decisions.md +261 -0
  285. package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-05-competitive-analysis.md +173 -0
  286. package/rihal/skills/actions/1-analysis/research/rihal-market-research/steps/step-06-research-completion.md +478 -0
  287. package/rihal/skills/actions/1-analysis/research/rihal-market-research/workflow.md +49 -0
  288. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/SKILL.md +31 -0
  289. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/research.template.md +29 -0
  290. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-01-init.md +137 -0
  291. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-02-technical-overview.md +239 -0
  292. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
  293. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
  294. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-05-implementation-research.md +233 -0
  295. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
  296. package/rihal/skills/actions/1-analysis/research/rihal-technical-research/workflow.md +50 -0
  297. package/rihal/skills/actions/1-analysis/rihal-document-project/SKILL.md +30 -0
  298. package/rihal/skills/actions/1-analysis/rihal-document-project/checklist.md +245 -0
  299. package/rihal/skills/actions/1-analysis/rihal-document-project/documentation-requirements.csv +12 -0
  300. package/rihal/skills/actions/1-analysis/rihal-document-project/instructions.md +128 -0
  301. package/rihal/skills/actions/1-analysis/rihal-document-project/templates/deep-dive-template.md +345 -0
  302. package/rihal/skills/actions/1-analysis/rihal-document-project/templates/index-template.md +169 -0
  303. package/rihal/skills/actions/1-analysis/rihal-document-project/templates/project-overview-template.md +103 -0
  304. package/rihal/skills/actions/1-analysis/rihal-document-project/templates/project-scan-report-schema.json +160 -0
  305. package/rihal/skills/actions/1-analysis/rihal-document-project/templates/source-tree-template.md +135 -0
  306. package/rihal/skills/actions/1-analysis/rihal-document-project/workflow.md +27 -0
  307. package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/deep-dive-instructions.md +299 -0
  308. package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/deep-dive-workflow.md +34 -0
  309. package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/full-scan-instructions.md +1107 -0
  310. package/rihal/skills/actions/1-analysis/rihal-document-project/workflows/full-scan-workflow.md +34 -0
  311. package/rihal/skills/actions/1-analysis/rihal-prfaq/SKILL.md +120 -0
  312. package/rihal/skills/actions/1-analysis/rihal-prfaq/agents/artifact-analyzer.md +60 -0
  313. package/rihal/skills/actions/1-analysis/rihal-prfaq/agents/web-researcher.md +49 -0
  314. package/rihal/skills/actions/1-analysis/rihal-prfaq/assets/prfaq-template.md +62 -0
  315. package/rihal/skills/actions/1-analysis/rihal-prfaq/references/customer-faq.md +55 -0
  316. package/rihal/skills/actions/1-analysis/rihal-prfaq/references/internal-faq.md +51 -0
  317. package/rihal/skills/actions/1-analysis/rihal-prfaq/references/press-release.md +60 -0
  318. package/rihal/skills/actions/1-analysis/rihal-prfaq/references/verdict.md +79 -0
  319. package/rihal/skills/actions/1-analysis/rihal-prfaq/rihal-manifest.json +16 -0
  320. package/rihal/skills/actions/1-analysis/rihal-product-brief/SKILL.md +112 -0
  321. package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/artifact-analyzer.md +60 -0
  322. package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/opportunity-reviewer.md +44 -0
  323. package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/skeptic-reviewer.md +44 -0
  324. package/rihal/skills/actions/1-analysis/rihal-product-brief/agents/web-researcher.md +49 -0
  325. package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/contextual-discovery.md +57 -0
  326. package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/draft-and-review.md +86 -0
  327. package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/finalize.md +75 -0
  328. package/rihal/skills/actions/1-analysis/rihal-product-brief/prompts/guided-elicitation.md +70 -0
  329. package/rihal/skills/actions/1-analysis/rihal-product-brief/resources/brief-template.md +60 -0
  330. package/rihal/skills/actions/1-analysis/rihal-product-brief/rihal-manifest.json +17 -0
  331. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/SKILL.md +30 -0
  332. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
  333. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
  334. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
  335. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
  336. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/templates/epics-template.md +61 -0
  337. package/rihal/skills/actions/2-plan/rihal-create-epics-and-stories/workflow.md +54 -0
  338. package/rihal/skills/actions/2-plan/rihal-create-milestone/SKILL.md +39 -0
  339. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/README.md +30 -0
  340. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-01-init.md +62 -0
  341. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-02-outcomes.md +64 -0
  342. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-03-sequencing.md +65 -0
  343. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-04-windows.md +60 -0
  344. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-05-kill-criteria.md +59 -0
  345. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-06-phase-stubs.md +56 -0
  346. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-07-backlog.md +44 -0
  347. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-08-write-roadmap.md +58 -0
  348. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-09-state-sync.md +62 -0
  349. package/rihal/skills/actions/2-plan/rihal-create-milestone/steps/step-10-complete.md +56 -0
  350. package/rihal/skills/actions/2-plan/rihal-create-milestone/workflow.md +93 -0
  351. package/rihal/skills/actions/2-plan/rihal-create-prd/SKILL.md +40 -0
  352. package/rihal/skills/actions/2-plan/rihal-create-prd/data/domain-complexity.csv +15 -0
  353. package/rihal/skills/actions/2-plan/rihal-create-prd/data/prd-purpose.md +197 -0
  354. package/rihal/skills/actions/2-plan/rihal-create-prd/data/project-types.csv +11 -0
  355. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-01-init.md +178 -0
  356. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-01b-continue.md +161 -0
  357. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-02-discovery.md +208 -0
  358. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-02b-vision.md +142 -0
  359. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-02c-executive-summary.md +158 -0
  360. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-03-success.md +214 -0
  361. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-04-journeys.md +201 -0
  362. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-05-domain.md +194 -0
  363. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-06-innovation.md +211 -0
  364. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-07-project-type.md +222 -0
  365. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-08-scoping.md +216 -0
  366. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-09-functional.md +219 -0
  367. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-10-nonfunctional.md +230 -0
  368. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-11-polish.md +221 -0
  369. package/rihal/skills/actions/2-plan/rihal-create-prd/steps-c/step-12-complete.md +115 -0
  370. package/rihal/skills/actions/2-plan/rihal-create-prd/templates/prd-template.md +10 -0
  371. package/rihal/skills/actions/2-plan/rihal-create-prd/workflow.md +64 -0
  372. package/rihal/skills/actions/2-plan/rihal-create-story/SKILL.md +31 -0
  373. package/rihal/skills/actions/2-plan/rihal-create-story/checklist.md +357 -0
  374. package/rihal/skills/actions/2-plan/rihal-create-story/discover-inputs.md +88 -0
  375. package/rihal/skills/actions/2-plan/rihal-create-story/template.md +49 -0
  376. package/rihal/skills/actions/2-plan/rihal-create-story/workflow.md +380 -0
  377. package/rihal/skills/actions/2-plan/rihal-create-ux-design/SKILL.md +31 -0
  378. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-01-init.md +135 -0
  379. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-01b-continue.md +127 -0
  380. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-02-discovery.md +190 -0
  381. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-03-core-experience.md +217 -0
  382. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-04-emotional-response.md +220 -0
  383. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-05-inspiration.md +235 -0
  384. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-06-design-system.md +253 -0
  385. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-07-defining-experience.md +255 -0
  386. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-08-visual-foundation.md +225 -0
  387. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-09-design-directions.md +225 -0
  388. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-10-user-journeys.md +242 -0
  389. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-11-component-strategy.md +249 -0
  390. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-12-ux-patterns.md +238 -0
  391. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
  392. package/rihal/skills/actions/2-plan/rihal-create-ux-design/steps/step-14-complete.md +171 -0
  393. package/rihal/skills/actions/2-plan/rihal-create-ux-design/ux-design-template.md +13 -0
  394. package/rihal/skills/actions/2-plan/rihal-create-ux-design/workflow.md +36 -0
  395. package/rihal/skills/actions/2-plan/rihal-edit-prd/SKILL.md +30 -0
  396. package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-01-discovery.md +242 -0
  397. package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
  398. package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-02-review.md +245 -0
  399. package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-03-edit.md +250 -0
  400. package/rihal/skills/actions/2-plan/rihal-edit-prd/steps-e/step-e-04-complete.md +165 -0
  401. package/rihal/skills/actions/2-plan/rihal-edit-prd/workflow.md +63 -0
  402. package/rihal/skills/actions/2-plan/rihal-frontend-design/SKILL.md +169 -0
  403. package/rihal/skills/actions/2-plan/rihal-validate-prd/SKILL.md +29 -0
  404. package/rihal/skills/actions/2-plan/rihal-validate-prd/data/domain-complexity.csv +15 -0
  405. package/rihal/skills/actions/2-plan/rihal-validate-prd/data/prd-purpose.md +197 -0
  406. package/rihal/skills/actions/2-plan/rihal-validate-prd/data/project-types.csv +11 -0
  407. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-01-discovery.md +221 -0
  408. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
  409. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
  410. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
  411. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
  412. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
  413. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
  414. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
  415. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
  416. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
  417. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
  418. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
  419. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
  420. package/rihal/skills/actions/2-plan/rihal-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
  421. package/rihal/skills/actions/2-plan/rihal-validate-prd/workflow.md +62 -0
  422. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/SKILL.md +30 -0
  423. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
  424. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
  425. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
  426. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
  427. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
  428. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
  429. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/templates/readiness-report-template.md +4 -0
  430. package/rihal/skills/actions/3-solutioning/rihal-check-implementation-readiness/workflow.md +49 -0
  431. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/SKILL.md +32 -0
  432. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/architecture-decision-template.md +12 -0
  433. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/data/domain-complexity.csv +13 -0
  434. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/data/project-types.csv +7 -0
  435. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-01-init.md +153 -0
  436. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-01b-continue.md +173 -0
  437. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-02-context.md +224 -0
  438. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-03-starter.md +329 -0
  439. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-04-decisions.md +318 -0
  440. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-05-patterns.md +359 -0
  441. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-06-structure.md +379 -0
  442. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-07-validation.md +359 -0
  443. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/steps/step-08-complete.md +76 -0
  444. package/rihal/skills/actions/3-solutioning/rihal-create-architecture/workflow.md +38 -0
  445. package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/SKILL.md +31 -0
  446. package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/project-context-template.md +21 -0
  447. package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/steps/step-01-discover.md +186 -0
  448. package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/steps/step-02-generate.md +321 -0
  449. package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/steps/step-03-complete.md +278 -0
  450. package/rihal/skills/actions/3-solutioning/rihal-generate-project-context/workflow.md +43 -0
  451. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/SKILL.md +48 -0
  452. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/generate-trail.md +38 -0
  453. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-01-orientation.md +105 -0
  454. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-02-walkthrough.md +89 -0
  455. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-03-detail-pass.md +106 -0
  456. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-04-testing.md +74 -0
  457. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/step-05-wrapup.md +24 -0
  458. package/rihal/skills/actions/4-implementation/rihal-code-review/SKILL.md +31 -0
  459. package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-01-gather-context.md +62 -0
  460. package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-02-review.md +34 -0
  461. package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-03-triage.md +49 -0
  462. package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-04-present.md +129 -0
  463. package/rihal/skills/actions/4-implementation/rihal-code-review/workflow.md +55 -0
  464. package/rihal/skills/actions/4-implementation/rihal-correct-course/SKILL.md +29 -0
  465. package/rihal/skills/actions/4-implementation/rihal-correct-course/checklist.md +288 -0
  466. package/rihal/skills/actions/4-implementation/rihal-correct-course/workflow.md +267 -0
  467. package/rihal/skills/actions/4-implementation/rihal-dev-story/SKILL.md +36 -0
  468. package/rihal/skills/actions/4-implementation/rihal-dev-story/checklist.md +80 -0
  469. package/rihal/skills/actions/4-implementation/rihal-dev-story/workflow.md +450 -0
  470. package/rihal/skills/actions/4-implementation/rihal-qa-generate-e2e-tests/SKILL.md +31 -0
  471. package/rihal/skills/actions/4-implementation/rihal-qa-generate-e2e-tests/checklist.md +33 -0
  472. package/rihal/skills/actions/4-implementation/rihal-qa-generate-e2e-tests/workflow.md +136 -0
  473. package/rihal/skills/actions/4-implementation/rihal-retrospective/SKILL.md +30 -0
  474. package/rihal/skills/actions/4-implementation/rihal-retrospective/workflow.md +1479 -0
  475. package/rihal/skills/actions/4-implementation/rihal-scaffold-project/SKILL.md +77 -0
  476. package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-01-target.md +17 -0
  477. package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-02-safety.md +35 -0
  478. package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-03-clone.md +50 -0
  479. package/rihal/skills/actions/4-implementation/rihal-scaffold-project/steps/step-04-post-setup.md +44 -0
  480. package/rihal/skills/actions/4-implementation/rihal-sprint-planning/SKILL.md +35 -0
  481. package/rihal/skills/actions/4-implementation/rihal-sprint-planning/checklist.md +43 -0
  482. package/rihal/skills/actions/4-implementation/rihal-sprint-planning/sprint-status-template.yaml +56 -0
  483. package/rihal/skills/actions/4-implementation/rihal-sprint-planning/workflow.md +284 -0
  484. package/rihal/skills/actions/4-implementation/rihal-sprint-status/SKILL.md +30 -0
  485. package/rihal/skills/actions/4-implementation/rihal-sprint-status/workflow.md +261 -0
  486. package/rihal/skills/agents/ahmed-hassani-director/SKILL.md +121 -0
  487. package/rihal/skills/agents/fatima-qa/SKILL.md +106 -0
  488. package/rihal/skills/agents/fatima-qa/skill-manifest.yaml +11 -0
  489. package/rihal/skills/agents/haitham-frontend/SKILL.md +120 -0
  490. package/rihal/skills/agents/hanzla-engineer/SKILL.md +109 -0
  491. package/rihal/skills/agents/hanzla-engineer/skill-manifest.yaml +11 -0
  492. package/rihal/skills/agents/hussain-pm/SKILL.md +107 -0
  493. package/rihal/skills/agents/hussain-pm/skill-manifest.yaml +11 -0
  494. package/rihal/skills/agents/hussain-sm/SKILL.md +104 -0
  495. package/rihal/skills/agents/hussain-sm/skill-manifest.yaml +11 -0
  496. package/rihal/skills/agents/layla-designer/SKILL.md +96 -0
  497. package/rihal/skills/agents/layla-designer/skill-manifest.yaml +11 -0
  498. package/rihal/skills/agents/majlis-council/SKILL.md +179 -0
  499. package/rihal/skills/agents/mariam-marketing/SKILL.md +133 -0
  500. package/rihal/skills/agents/nasser-eng-manager/SKILL.md +125 -0
  501. package/rihal/skills/agents/noor-writer/SKILL.md +104 -0
  502. package/rihal/skills/agents/noor-writer/explain-concept.md +20 -0
  503. package/rihal/skills/agents/noor-writer/mermaid-gen.md +20 -0
  504. package/rihal/skills/agents/noor-writer/skill-manifest.yaml +11 -0
  505. package/rihal/skills/agents/noor-writer/validate-doc.md +19 -0
  506. package/rihal/skills/agents/noor-writer/write-document.md +20 -0
  507. package/rihal/skills/agents/raees-orchestrator/SKILL.md +154 -0
  508. package/rihal/skills/agents/sadiq-analyst/SKILL.md +106 -0
  509. package/rihal/skills/agents/sadiq-analyst/skill-manifest.yaml +11 -0
  510. package/rihal/skills/agents/waleed-architect/SKILL.md +106 -0
  511. package/rihal/skills/agents/waleed-architect/skill-manifest.yaml +11 -0
  512. package/rihal/skills/agents/yousef-backend/SKILL.md +136 -0
  513. package/rihal/skills/agents/zahra-branding/SKILL.md +141 -0
  514. package/rihal/skills/agents/zayd-ml/SKILL.md +124 -0
  515. package/rihal/skills/core/module-help.csv +11 -0
  516. package/rihal/skills/core/module.yaml +25 -0
  517. package/rihal/skills/core/rihal-advanced-elicitation/SKILL.md +155 -0
  518. package/rihal/skills/core/rihal-advanced-elicitation/methods.csv +51 -0
  519. package/rihal/skills/core/rihal-advanced-elicitation/rihal-advanced-elicitation/SKILL.md +148 -0
  520. package/rihal/skills/core/rihal-advanced-elicitation/rihal-advanced-elicitation/methods.csv +51 -0
  521. package/rihal/skills/core/rihal-brainstorming/SKILL.md +82 -0
  522. package/rihal/skills/core/rihal-brainstorming/brain-methods.csv +62 -0
  523. package/rihal/skills/core/rihal-brainstorming/steps/step-01-session-setup.md +214 -0
  524. package/rihal/skills/core/rihal-brainstorming/steps/step-01b-continue.md +124 -0
  525. package/rihal/skills/core/rihal-brainstorming/steps/step-02a-user-selected.md +229 -0
  526. package/rihal/skills/core/rihal-brainstorming/steps/step-02b-ai-recommended.md +239 -0
  527. package/rihal/skills/core/rihal-brainstorming/steps/step-02c-random-selection.md +211 -0
  528. package/rihal/skills/core/rihal-brainstorming/steps/step-02d-progressive-flow.md +266 -0
  529. package/rihal/skills/core/rihal-brainstorming/steps/step-03-technique-execution.md +401 -0
  530. package/rihal/skills/core/rihal-brainstorming/steps/step-04-idea-organization.md +305 -0
  531. package/rihal/skills/core/rihal-brainstorming/template.md +15 -0
  532. package/rihal/skills/core/rihal-brainstorming/workflow.md +53 -0
  533. package/rihal/skills/core/rihal-clone-website/SKILL.md +395 -0
  534. package/rihal/skills/core/rihal-distillator/SKILL.md +205 -0
  535. package/rihal/skills/core/rihal-distillator/agents/distillate-compressor.md +116 -0
  536. package/rihal/skills/core/rihal-distillator/agents/round-trip-reconstructor.md +68 -0
  537. package/rihal/skills/core/rihal-distillator/resources/compression-rules.md +51 -0
  538. package/rihal/skills/core/rihal-distillator/resources/distillate-format-reference.md +227 -0
  539. package/rihal/skills/core/rihal-distillator/resources/splitting-strategy.md +78 -0
  540. package/rihal/skills/core/rihal-distillator/scripts/analyze_sources.py +300 -0
  541. package/rihal/skills/core/rihal-distillator/scripts/tests/test_analyze_sources.py +204 -0
  542. package/rihal/skills/core/rihal-editorial-review-prose/SKILL.md +108 -0
  543. package/rihal/skills/core/rihal-editorial-review-structure/SKILL.md +193 -0
  544. package/rihal/skills/core/rihal-help/SKILL.md +91 -0
  545. package/rihal/skills/core/rihal-index-docs/SKILL.md +80 -0
  546. package/rihal/skills/core/rihal-init/SKILL.md +119 -0
  547. package/rihal/skills/core/rihal-init/resources/core-module.yaml +25 -0
  548. package/rihal/skills/core/rihal-init/scripts/rihal_init.py +593 -0
  549. package/rihal/skills/core/rihal-init/scripts/tests/test_rihal_init.py +329 -0
  550. package/rihal/skills/core/rihal-party-mode/SKILL.md +77 -0
  551. package/rihal/skills/core/rihal-party-mode/steps/step-01-agent-loading.md +138 -0
  552. package/rihal/skills/core/rihal-party-mode/steps/step-02-discussion-orchestration.md +187 -0
  553. package/rihal/skills/core/rihal-party-mode/steps/step-03-graceful-exit.md +167 -0
  554. package/rihal/skills/core/rihal-party-mode/workflow.md +190 -0
  555. package/rihal/skills/core/rihal-review-adversarial-general/SKILL.md +55 -0
  556. package/rihal/skills/core/rihal-review-edge-case-hunter/SKILL.md +81 -0
  557. package/rihal/skills/core/rihal-shard-doc/SKILL.md +119 -0
  558. package/rihal/skills/core/rihal-shard-doc/rihal-shard-doc/SKILL.md +122 -0
  559. package/rihal/team.yaml +343 -0
  560. package/rihal/templates/UI-SPEC.md +127 -0
  561. package/rihal/templates/documentation-requirements.csv +11 -0
  562. package/rihal/templates/github/bug-template.md +53 -0
  563. package/rihal/templates/github/epic-template.md +57 -0
  564. package/rihal/templates/github/feature-template.md +55 -0
  565. package/rihal/templates/github/task-template.md +52 -0
  566. package/rihal/templates/milestone.md +147 -0
  567. package/rihal/templates/projects/api-backend/PROJECT.md +37 -0
  568. package/rihal/templates/projects/api-backend/REQUIREMENTS.md +38 -0
  569. package/rihal/templates/projects/api-backend/ROADMAP.md +92 -0
  570. package/rihal/templates/projects/api-backend/template.yaml +17 -0
  571. package/rihal/templates/projects/mobile-app/PROJECT.md +37 -0
  572. package/rihal/templates/projects/mobile-app/REQUIREMENTS.md +32 -0
  573. package/rihal/templates/projects/mobile-app/ROADMAP.md +93 -0
  574. package/rihal/templates/projects/mobile-app/template.yaml +17 -0
  575. package/rihal/templates/projects/saas-b2b/PROJECT.md +40 -0
  576. package/rihal/templates/projects/saas-b2b/REQUIREMENTS.md +38 -0
  577. package/rihal/templates/projects/saas-b2b/ROADMAP.md +95 -0
  578. package/rihal/templates/projects/saas-b2b/template.yaml +18 -0
  579. package/rihal/templates/settings-hooks.json +36 -0
  580. package/rihal/templates/sprint.md +70 -0
  581. package/rihal/workflows/add-phase.md +112 -0
  582. package/rihal/workflows/add-tests.md +351 -0
  583. package/rihal/workflows/add-todo.md +181 -0
  584. package/rihal/workflows/analyze-dependencies.md +138 -0
  585. package/rihal/workflows/audit-fix.md +190 -0
  586. package/rihal/workflows/audit-milestone.md +155 -0
  587. package/rihal/workflows/audit-uat.md +109 -0
  588. package/rihal/workflows/autonomous.md +992 -0
  589. package/rihal/workflows/brainstorm.md +203 -0
  590. package/rihal/workflows/chain.md +188 -0
  591. package/rihal/workflows/check-implementation-readiness.md +193 -0
  592. package/rihal/workflows/check-todos.md +177 -0
  593. package/rihal/workflows/cleanup.md +152 -0
  594. package/rihal/workflows/code-review-fix.md +529 -0
  595. package/rihal/workflows/code-review.md +566 -0
  596. package/rihal/workflows/complete-milestone.md +836 -0
  597. package/rihal/workflows/config.md +105 -0
  598. package/rihal/workflows/correct-course.md +190 -0
  599. package/rihal/workflows/council.md +565 -0
  600. package/rihal/workflows/create-epics-and-stories.md +373 -0
  601. package/rihal/workflows/create-story.md +297 -0
  602. package/rihal/workflows/dashboard.md +102 -0
  603. package/rihal/workflows/debug.md +256 -0
  604. package/rihal/workflows/decisions.md +107 -0
  605. package/rihal/workflows/dev-story.md +432 -0
  606. package/rihal/workflows/diff.md +74 -0
  607. package/rihal/workflows/discuss-phase-power.md +325 -0
  608. package/rihal/workflows/discuss-phase.md +1201 -0
  609. package/rihal/workflows/discuss.md +227 -0
  610. package/rihal/workflows/do.md +175 -0
  611. package/rihal/workflows/docs-update.md +261 -0
  612. package/rihal/workflows/document-project.md +180 -0
  613. package/rihal/workflows/enable-hooks.md +102 -0
  614. package/rihal/workflows/execute-sprint.md +514 -0
  615. package/rihal/workflows/execute.md +1478 -0
  616. package/rihal/workflows/explore.md +171 -0
  617. package/rihal/workflows/export-to-github.md +174 -0
  618. package/rihal/workflows/forensics.md +201 -0
  619. package/rihal/workflows/from-template.md +173 -0
  620. package/rihal/workflows/health.md +194 -0
  621. package/rihal/workflows/help.md +318 -0
  622. package/rihal/workflows/import.md +306 -0
  623. package/rihal/workflows/inbox.md +418 -0
  624. package/rihal/workflows/init.md +245 -0
  625. package/rihal/workflows/insert-phase.md +116 -0
  626. package/rihal/workflows/install.md +85 -0
  627. package/rihal/workflows/karpathy-audit.md +409 -0
  628. package/rihal/workflows/list-plans.md +146 -0
  629. package/rihal/workflows/list-workspaces.md +115 -0
  630. package/rihal/workflows/map-codebase.md +449 -0
  631. package/rihal/workflows/milestone-summary.md +206 -0
  632. package/rihal/workflows/new-milestone.md +616 -0
  633. package/rihal/workflows/new-project-research.md +262 -0
  634. package/rihal/workflows/new-project-roadmap.md +446 -0
  635. package/rihal/workflows/new-project.md +1503 -0
  636. package/rihal/workflows/new-workspace.md +167 -0
  637. package/rihal/workflows/next.md +162 -0
  638. package/rihal/workflows/note.md +156 -0
  639. package/rihal/workflows/notify-test.md +113 -0
  640. package/rihal/workflows/pause-work.md +243 -0
  641. package/rihal/workflows/plan-milestone-gaps.md +273 -0
  642. package/rihal/workflows/plan.md +1262 -0
  643. package/rihal/workflows/plant-seed.md +169 -0
  644. package/rihal/workflows/pr-branch.md +129 -0
  645. package/rihal/workflows/profile-user.md +162 -0
  646. package/rihal/workflows/progress.md +184 -0
  647. package/rihal/workflows/quick.md +105 -0
  648. package/rihal/workflows/remove-phase.md +155 -0
  649. package/rihal/workflows/remove-workspace.md +158 -0
  650. package/rihal/workflows/replay.md +160 -0
  651. package/rihal/workflows/rerun.md +77 -0
  652. package/rihal/workflows/research-phase.md +82 -0
  653. package/rihal/workflows/resume-work.md +326 -0
  654. package/rihal/workflows/review-adversarial.md +180 -0
  655. package/rihal/workflows/review-edge-case-hunter.md +214 -0
  656. package/rihal/workflows/review.md +281 -0
  657. package/rihal/workflows/scan.md +135 -0
  658. package/rihal/workflows/secure-phase.md +196 -0
  659. package/rihal/workflows/session-report.md +187 -0
  660. package/rihal/workflows/settings.md +185 -0
  661. package/rihal/workflows/ship.md +237 -0
  662. package/rihal/workflows/show.md +63 -0
  663. package/rihal/workflows/sprint-planning.md +166 -0
  664. package/rihal/workflows/sprint-status.md +124 -0
  665. package/rihal/workflows/stats.md +141 -0
  666. package/rihal/workflows/status.md +116 -0
  667. package/rihal/workflows/ui-phase.md +148 -0
  668. package/rihal/workflows/ui-review.md +130 -0
  669. package/rihal/workflows/undo.md +426 -0
  670. package/rihal/workflows/update.md +185 -0
  671. package/rihal/workflows/validate-phase.md +174 -0
  672. package/rihal/workflows/verify-phase.md +375 -0
  673. package/rihal/workflows/verify-work.md +717 -0
  674. package/rihal/workflows/why.md +130 -0
  675. package/rihal/workflows/workstream.md +197 -0
  676. 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;