@haposoft/cafekit 0.16.0-rc.8 → 0.16.1

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 (323) hide show
  1. package/README.md +117 -28
  2. package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
  3. package/bin/__tests__/codex-hooks.test.js +175 -0
  4. package/bin/__tests__/codex-native.test.js +1882 -70
  5. package/bin/__tests__/develop-contract.test.js +442 -23
  6. package/bin/__tests__/grok-envelope.test.js +271 -0
  7. package/bin/__tests__/grok-platform.test.js +133 -0
  8. package/bin/__tests__/hook-payload.test.js +194 -0
  9. package/bin/__tests__/installer-safety.test.js +3 -3
  10. package/bin/__tests__/omp-bridge.test.js +168 -0
  11. package/bin/__tests__/omp-hooks.test.js +178 -0
  12. package/bin/__tests__/omp-runtime.test.js +150 -0
  13. package/bin/__tests__/optional-skill-inventory.test.js +249 -0
  14. package/bin/__tests__/output-styles.test.js +214 -0
  15. package/bin/__tests__/package-inventory.test.js +1735 -98
  16. package/bin/__tests__/runtime-dir.test.js +158 -0
  17. package/bin/__tests__/runtime-schema.test.js +113 -0
  18. package/bin/__tests__/secret-output-guardrail.test.js +122 -0
  19. package/bin/__tests__/skill-routing-source.test.js +172 -0
  20. package/bin/__tests__/specs-v2-execution-closeout.test.js +28 -1
  21. package/bin/install.js +15 -5
  22. package/bin/lib/codex-install.js +170 -5
  23. package/bin/lib/context.js +64 -3
  24. package/bin/lib/i18n.js +15 -36
  25. package/bin/lib/skill-deps.js +5 -5
  26. package/bin/phases/claude-runtime.js +23 -0
  27. package/bin/phases/claude-settings.js +8 -0
  28. package/bin/phases/codex-hooks.js +156 -0
  29. package/bin/phases/codex-runtime.js +29 -38
  30. package/bin/phases/copy-payload.js +15 -2
  31. package/bin/phases/omp-runtime.js +140 -0
  32. package/bin/phases/root-config.js +3 -0
  33. package/bin/phases/select-platform.js +22 -1
  34. package/bin/phases/select-skill-bundles.js +96 -0
  35. package/bin/phases/skill-inventory.js +71 -0
  36. package/bin/phases/skills-setup.js +9 -2
  37. package/bin/phases/summary.js +0 -4
  38. package/bin/phases/write-metadata.js +8 -5
  39. package/package.json +8 -2
  40. package/src/claude/CLAUDE.md +3 -3
  41. package/src/claude/agents/brainstormer.md +52 -69
  42. package/src/claude/agents/code-auditor.md +32 -14
  43. package/src/claude/agents/debugger.md +35 -20
  44. package/src/claude/agents/deployer.md +12 -5
  45. package/src/claude/agents/docs-keeper.md +11 -1
  46. package/src/claude/agents/implementer.md +25 -13
  47. package/src/claude/agents/inspector.md +6 -3
  48. package/src/claude/agents/project-manager.md +1 -1
  49. package/src/claude/agents/researcher.md +26 -55
  50. package/src/claude/agents/spec-maker.md +12 -7
  51. package/src/claude/agents/strategist.md +52 -0
  52. package/src/claude/agents/test-runner.md +117 -132
  53. package/src/claude/agents/ui-ux-designer.md +1 -1
  54. package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
  55. package/src/claude/hooks/__tests__/precompact.test.js +158 -0
  56. package/src/claude/hooks/__tests__/semantic-review-authority.test.js +2 -0
  57. package/src/claude/hooks/__tests__/spec-gate.test.js +348 -3
  58. package/src/claude/hooks/__tests__/state.test.js +7 -0
  59. package/src/claude/hooks/__tests__/statusline.test.js +196 -0
  60. package/src/claude/hooks/agent.cjs +13 -8
  61. package/src/claude/hooks/completion-authority.cjs +10 -4
  62. package/src/claude/hooks/docs-sync.cjs +14 -11
  63. package/src/claude/hooks/inspect-block.cjs +28 -8
  64. package/src/claude/hooks/lib/config.cjs +8 -2
  65. package/src/claude/hooks/lib/counter.cjs +7 -5
  66. package/src/claude/hooks/lib/hook-payload.cjs +160 -0
  67. package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
  68. package/src/claude/hooks/lib/runtime-dir.cjs +49 -0
  69. package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
  70. package/src/claude/hooks/precompact.cjs +106 -0
  71. package/src/claude/hooks/privacy-block.cjs +4 -2
  72. package/src/claude/hooks/rules.cjs +5 -3
  73. package/src/claude/hooks/secret-output-guardrail.cjs +44 -0
  74. package/src/claude/hooks/semantic-review-authority.cjs +6 -4
  75. package/src/claude/hooks/session.cjs +37 -9
  76. package/src/claude/hooks/spec-gate.cjs +21 -11
  77. package/src/claude/hooks/spec-state.cjs +11 -7
  78. package/src/claude/hooks/state.cjs +7 -5
  79. package/src/claude/hooks/task-scaffold-guard.cjs +30 -9
  80. package/src/claude/hooks/usage.cjs +6 -5
  81. package/src/claude/migration-manifest.json +31 -15
  82. package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
  83. package/src/claude/output-styles/coding-level-1-junior.md +124 -0
  84. package/src/claude/output-styles/coding-level-2-mid.md +146 -0
  85. package/src/claude/output-styles/coding-level-3-senior.md +148 -0
  86. package/src/claude/output-styles/coding-level-4-lead.md +159 -0
  87. package/src/claude/output-styles/coding-level-5-god.md +91 -0
  88. package/src/claude/references/debugger/core-philosophy.md +5 -3
  89. package/src/claude/references/debugger/frontend-verification.md +2 -2
  90. package/src/claude/references/debugger/log-ci-analysis.md +13 -1
  91. package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
  92. package/src/claude/references/debugger/performance-diagnostics.md +2 -2
  93. package/src/claude/references/debugger/root-cause-tracing.md +37 -6
  94. package/src/claude/references/debugger/side-effect-gate.md +3 -1
  95. package/src/claude/references/debugger/verification-protocol.md +13 -12
  96. package/src/claude/rules/orchestrator.md +7 -1
  97. package/src/claude/rules/process-management.md +39 -0
  98. package/src/claude/rules/review-audit-self-decision.md +48 -0
  99. package/src/claude/rules/skill-domain-routing.md +26 -24
  100. package/src/claude/rules/skill-workflow-routing.md +22 -14
  101. package/src/claude/rules/state-sync.md +7 -1
  102. package/src/claude/rules/workflow.md +5 -3
  103. package/src/claude/runtime.json +1 -0
  104. package/src/claude/runtime.schema.json +205 -0
  105. package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
  106. package/src/claude/scripts/provenance.cjs +29 -9
  107. package/src/claude/scripts/spec-receipt.cjs +65 -4
  108. package/src/claude/scripts/workflow-policy.cjs +1 -1
  109. package/src/claude/settings/settings.json +16 -0
  110. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  111. package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
  112. package/src/claude/skills/brainstorm/SKILL.md +193 -172
  113. package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
  114. package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
  115. package/src/claude/skills/code-review/SKILL.md +43 -25
  116. package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
  117. package/src/claude/skills/code-review/references/verification-gate.md +1 -1
  118. package/src/claude/skills/debug/SKILL.md +48 -19
  119. package/src/claude/skills/delegate/SKILL.md +1 -1
  120. package/src/claude/skills/develop/SKILL.md +92 -65
  121. package/src/claude/skills/develop/references/parallel-waves.md +36 -63
  122. package/src/claude/skills/develop/references/quality-gate.md +31 -4
  123. package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
  124. package/src/claude/skills/docs/SKILL.md +42 -23
  125. package/src/claude/skills/docs/references/init-workflow.md +4 -4
  126. package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
  127. package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
  128. package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
  129. package/src/claude/skills/docs/references/update-workflow.md +9 -7
  130. package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
  131. package/src/claude/skills/docx/SKILL.md +1 -1
  132. package/src/claude/skills/git/SKILL.md +1 -1
  133. package/src/claude/skills/git/references/commit-protocols.md +1 -1
  134. package/src/claude/skills/git/references/finish-branch.md +1 -1
  135. package/src/claude/skills/hotfix/SKILL.md +159 -170
  136. package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
  137. package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
  138. package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
  139. package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
  140. package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
  141. package/src/claude/skills/inspect/SKILL.md +55 -46
  142. package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
  143. package/src/claude/skills/loop/SKILL.md +114 -0
  144. package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
  145. package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
  146. package/src/claude/skills/pdf/SKILL.md +1 -1
  147. package/src/claude/skills/pptx/SKILL.md +1 -1
  148. package/src/claude/skills/question/SKILL.md +16 -13
  149. package/src/claude/skills/research/SKILL.md +70 -43
  150. package/src/claude/skills/route/SKILL.md +94 -0
  151. package/src/claude/skills/route/references/agent-timing.md +46 -0
  152. package/src/claude/skills/route/references/chaining-patterns.md +53 -0
  153. package/src/claude/skills/route/references/task-taxonomy.md +48 -0
  154. package/src/claude/skills/specs/SKILL.md +51 -71
  155. package/src/claude/skills/specs/references/review.md +11 -8
  156. package/src/claude/skills/specs/references/templates.md +34 -18
  157. package/src/claude/skills/specs/templates/requirements-init.md +1 -1
  158. package/src/claude/skills/specs/templates/research.md +2 -2
  159. package/src/claude/skills/sync/SKILL.md +6 -6
  160. package/src/claude/skills/sync/references/sync-protocols.md +1 -1
  161. package/src/claude/skills/test/SKILL.md +120 -120
  162. package/src/claude/skills/test/references/execution-strategy.md +208 -361
  163. package/src/claude/skills/test/references/failure-triage.md +55 -121
  164. package/src/claude/skills/test/references/test-memory.md +20 -34
  165. package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
  166. package/src/claude/skills/web-testing/SKILL.md +1 -1
  167. package/src/claude/skills/xlsx/SKILL.md +1 -1
  168. package/src/claude/status.cjs +135 -33
  169. package/src/codex/AGENTS.md +14 -4
  170. package/src/codex/hooks/docs-sync.cjs +8 -3
  171. package/src/codex/hooks/lib/hook-context.cjs +18 -4
  172. package/src/codex/hooks/rules.cjs +29 -1
  173. package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
  174. package/src/codex/hooks/spec-gate.cjs +3 -8
  175. package/src/codex/hooks/spec-state.cjs +3 -2
  176. package/src/codex/hooks.json +5 -0
  177. package/src/codex/rules/state-sync.md +7 -1
  178. package/src/codex/runtime.json +2 -0
  179. package/src/common/.env.example +1 -1
  180. package/src/omp/extensions/cafekit-bridge.mjs +233 -0
  181. package/src/omp/hooks/privacy-block.cjs +250 -0
  182. package/src/omp/runtime.json +33 -0
  183. package/bin/lib/rtk-run.js +0 -28
  184. package/bin/phases/setup-rtk.js +0 -159
  185. package/src/claude/skills/backend-development/SKILL.md +0 -101
  186. package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
  187. package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
  188. package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
  189. package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
  190. package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
  191. package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
  192. package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
  193. package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
  194. package/src/claude/skills/backend-development/references/backend-security.md +0 -342
  195. package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
  196. package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
  197. package/src/claude/skills/devops/.env.example +0 -76
  198. package/src/claude/skills/devops/SKILL.md +0 -102
  199. package/src/claude/skills/devops/references/browser-rendering.md +0 -305
  200. package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
  201. package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
  202. package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
  203. package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
  204. package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
  205. package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
  206. package/src/claude/skills/devops/references/docker-basics.md +0 -297
  207. package/src/claude/skills/devops/references/docker-compose.md +0 -292
  208. package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
  209. package/src/claude/skills/devops/references/gcloud-services.md +0 -304
  210. package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
  211. package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
  212. package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
  213. package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
  214. package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
  215. package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
  216. package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
  217. package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
  218. package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
  219. package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
  220. package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
  221. package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
  222. package/src/claude/skills/devops/scripts/requirements.txt +0 -20
  223. package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
  224. package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
  225. package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
  226. package/src/claude/skills/frontend-design/SKILL.md +0 -135
  227. package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
  228. package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
  229. package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
  230. package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
  231. package/src/claude/skills/frontend-design/references/animejs.md +0 -396
  232. package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
  233. package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
  234. package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
  235. package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
  236. package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
  237. package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
  238. package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
  239. package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
  240. package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
  241. package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
  242. package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
  243. package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
  244. package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
  245. package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
  246. package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
  247. package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
  248. package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
  249. package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
  250. package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
  251. package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
  252. package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
  253. package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
  254. package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
  255. package/src/claude/skills/frontend-development/SKILL.md +0 -406
  256. package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
  257. package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
  258. package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
  259. package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
  260. package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
  261. package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
  262. package/src/claude/skills/frontend-development/resources/performance.md +0 -406
  263. package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
  264. package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
  265. package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
  266. package/src/claude/skills/mobile-development/SKILL.md +0 -218
  267. package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
  268. package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
  269. package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
  270. package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
  271. package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
  272. package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
  273. package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
  274. package/src/claude/skills/react-best-practices/README.md +0 -123
  275. package/src/claude/skills/react-best-practices/SKILL.md +0 -128
  276. package/src/claude/skills/react-best-practices/metadata.json +0 -15
  277. package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
  278. package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
  279. package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  280. package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
  281. package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
  282. package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
  283. package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
  284. package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
  285. package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  286. package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  287. package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  288. package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  289. package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  290. package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
  291. package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  292. package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  293. package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
  294. package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  295. package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  296. package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  297. package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  298. package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
  299. package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  300. package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
  301. package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  302. package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  303. package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  304. package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  305. package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
  306. package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  307. package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  308. package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  309. package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  310. package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  311. package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  312. package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  313. package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  314. package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  315. package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  316. package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  317. package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
  318. package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  319. package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  320. package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  321. package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
  322. package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
  323. package/src/claude/skills/react-best-practices/rules/server-serialization.md +0 -38
package/bin/install.js CHANGED
@@ -22,6 +22,7 @@ const backup = require('./lib/backup');
22
22
  const manifestLib = require('./lib/manifest');
23
23
 
24
24
  const { selectLanguage, resolvePlatforms } = require('./phases/select-platform');
25
+ const { selectDocumentSkills } = require('./phases/select-skill-bundles');
25
26
  const { copyPlatformFiles } = require('./phases/copy-payload');
26
27
  const {
27
28
  copyRoutingFile,
@@ -30,16 +31,18 @@ const {
30
31
  copyClaudeMdFile,
31
32
  ensureSharedAgentsMdCore,
32
33
  copyRulesDirectory,
34
+ copyOutputStylesDirectory,
33
35
  removeObsoleteAgents
34
36
  } = require('./phases/claude-runtime');
37
+ const { reconcileSkillInventory } = require('./phases/skill-inventory');
35
38
  const { mergeClaudeSettings } = require('./phases/claude-settings');
36
39
  const { installCodexRuntime } = require('./phases/codex-runtime');
40
+ const { installOmpRuntime } = require('./phases/omp-runtime');
37
41
  const { writePlatformVersionMetadata } = require('./phases/write-metadata');
38
42
  const { checkVersions } = require('./lib/version-check');
39
43
  const { ensureGitignore } = require('./phases/root-config');
40
44
  const { runPostInstall } = require('./phases/post-install');
41
45
  const { setupSkillDeps } = require('./phases/skills-setup');
42
- const { setupRtk } = require('./phases/setup-rtk');
43
46
  const { printSummary } = require('./phases/summary');
44
47
 
45
48
  /** Install a single platform: payload + runtime + metadata, under one spinner. */
@@ -58,6 +61,7 @@ function installPlatform(ctx, platformKey) {
58
61
  ctx.ui.startSpinner(ctx.t('installingPlatform', { name: platform.name }));
59
62
 
60
63
  copyPlatformFiles(ctx, platformKey);
64
+ reconcileSkillInventory(ctx, platformKey);
61
65
  removeObsoleteAgents(ctx, platformKey);
62
66
 
63
67
  if (platformKey === 'claude') {
@@ -67,12 +71,17 @@ function installPlatform(ctx, platformKey) {
67
71
  mergeClaudeSettings(ctx, platformKey);
68
72
  copyClaudeMdFile(ctx, platformKey);
69
73
  copyRulesDirectory(ctx, platformKey);
74
+ copyOutputStylesDirectory(ctx, platformKey);
70
75
  }
71
76
 
72
77
  if (platformKey === 'codex') {
73
78
  installCodexRuntime(ctx, platformKey);
74
79
  }
75
80
 
81
+ if (platformKey === 'omp') {
82
+ installOmpRuntime(ctx, platformKey);
83
+ }
84
+
76
85
  writePlatformVersionMetadata(ctx, platformKey);
77
86
 
78
87
  const wrote = (ctx.results.copied - before.copied) + (ctx.results.updated - before.updated);
@@ -100,8 +109,9 @@ Options:
100
109
  -u, --upgrade, -f, --force Alias of --force-overwrite
101
110
  --with-skills-deps Install skill dependencies (Python venv + pip, npm,
102
111
  Chromium/Playwright). Otherwise prompted interactively.
103
- --with-rtk Install the rtk token-saver (binary + Claude Code hook).
104
112
  Otherwise prompted interactively.
113
+ --with-document-skills Install docs/DOCX/PDF/PPTX/XLSX/multimodal skills
114
+ --without-document-skills Skip or remove CafeKit-owned document skills
105
115
  -y, --yes Non-interactive: skip prompts, use defaults (CI)
106
116
  -h, --help Show this help
107
117
  -v, --version Print version
@@ -162,6 +172,9 @@ async function main() {
162
172
  process.exit(result.status ?? 1);
163
173
  }
164
174
 
175
+ await selectDocumentSkills(ctx);
176
+ if (ctx.cancelled) { lock.release(); process.exit(0); }
177
+
165
178
  // ── Pre-run snapshot for rollback ─────────────────────
166
179
  // Capture platform folders AND the root files the pipeline mutates
167
180
  // (CLAUDE.md, .gitignore) so a mid-run failure rolls back cleanly.
@@ -180,9 +193,6 @@ async function main() {
180
193
  ensureGitignore(ctx);
181
194
  await runPostInstall(ctx);
182
195
  await setupSkillDeps(ctx);
183
- if (ctx.platforms.includes('claude')) {
184
- await setupRtk(ctx);
185
- }
186
196
 
187
197
  // Phase handlers may report recoverable-looking errors through counters
188
198
  // instead of throwing. Treat them as transactional failure so the snapshot
@@ -25,7 +25,6 @@ const AGENT_NAMES = [
25
25
  'ui-ux-designer'
26
26
  ];
27
27
  const INSTRUCTION_REPLACEMENTS = [
28
- [/`?\bAskUserQuestion\b`?/g, 'a structured user-input request'],
29
28
  [/`?\bTodoWrite\b`?/g, 'task-state tracking'],
30
29
  [/`?\bTaskCreate\b`?/g, 'task creation'],
31
30
  [/`?\bTaskUpdate\b`?/g, 'task-state updates'],
@@ -64,6 +63,172 @@ function applyReplacements(content, replacements) {
64
63
  return next;
65
64
  }
66
65
 
66
+ function isMarkdownLinkDestination(content, offset) {
67
+ const opener = content.lastIndexOf('](', offset);
68
+ if (opener < 0 || content.lastIndexOf('[', opener) < 0) return false;
69
+
70
+ let depth = 1;
71
+ for (let index = opener + 2; index < offset; index += 1) {
72
+ if (content[index] === '\\') {
73
+ index += 1;
74
+ } else if (content[index] === '(') {
75
+ depth += 1;
76
+ } else if (content[index] === ')') {
77
+ depth -= 1;
78
+ if (depth === 0) return false;
79
+ }
80
+ }
81
+ return depth > 0;
82
+ }
83
+
84
+ function isUrlLikeToken(content, offset) {
85
+ const prefix = content.slice(0, offset).split(/[\s]/).at(-1) || '';
86
+ return /^<?(?:[a-z][a-z0-9+.-]*:\/\/|mailto:|www\.)\S*$/i.test(prefix);
87
+ }
88
+
89
+ function maskMarkdownCodeSpans(content) {
90
+ const spans = [];
91
+ let markerNonce = 0;
92
+ while (content.includes(`\uE000CAFEKIT_${markerNonce}_`)) markerNonce += 1;
93
+ const markerPrefix = `\uE000CAFEKIT_${markerNonce}_`;
94
+ let masked = '';
95
+ let index = 0;
96
+
97
+ const addMarker = (kind, original) => {
98
+ const marker = `${markerPrefix}${kind}_${spans.length}\uE001`;
99
+ spans.push({ marker, original });
100
+ return marker;
101
+ };
102
+
103
+ const fencedBlockEnd = (openerLineEnd, delimiter, delimiterLength) => {
104
+ let lineStart = openerLineEnd < 0 ? content.length : openerLineEnd + 1;
105
+ while (lineStart < content.length) {
106
+ const newline = content.indexOf('\n', lineStart);
107
+ const lineEnd = newline < 0 ? content.length : newline;
108
+ const line = content.slice(lineStart, lineEnd);
109
+ const match = line.match(/^[ \t]{0,3}([`~]+)[ \t]*\r?$/);
110
+ if (match
111
+ && [...match[1]].every((character) => character === delimiter)
112
+ && match[1].length >= delimiterLength) {
113
+ return lineEnd;
114
+ }
115
+ lineStart = newline < 0 ? content.length : newline + 1;
116
+ }
117
+ return content.length;
118
+ };
119
+
120
+ while (index < content.length) {
121
+ if (content[index] !== '`' && content[index] !== '~') {
122
+ masked += content[index];
123
+ index += 1;
124
+ continue;
125
+ }
126
+
127
+ const opener = index;
128
+ const delimiter = content[index];
129
+ while (index < content.length && content[index] === delimiter) index += 1;
130
+ const delimiterLength = index - opener;
131
+ const lineStart = content.lastIndexOf('\n', opener - 1) + 1;
132
+ const linePrefix = content.slice(lineStart, opener);
133
+ const openerLineEnd = content.indexOf('\n', index);
134
+ const infoEnd = openerLineEnd < 0 ? content.length : openerLineEnd;
135
+ const info = content.slice(index, infoEnd);
136
+ const isFence = delimiterLength >= 3
137
+ && /^[ \t]{0,3}$/.test(linePrefix)
138
+ && (delimiter === '~' || !info.includes('`'));
139
+
140
+ if (isFence) {
141
+ const end = fencedBlockEnd(openerLineEnd, delimiter, delimiterLength);
142
+ masked += addMarker('CODE', content.slice(opener, end));
143
+ index = end;
144
+ continue;
145
+ }
146
+
147
+ if (delimiter !== '`') {
148
+ masked += content.slice(opener, index);
149
+ continue;
150
+ }
151
+
152
+ let cursor = index;
153
+ let closer = -1;
154
+ while (cursor < content.length) {
155
+ const runStart = content.indexOf('`', cursor);
156
+ if (runStart < 0) break;
157
+ let runEnd = runStart;
158
+ while (runEnd < content.length && content[runEnd] === '`') runEnd += 1;
159
+ if (runEnd - runStart === delimiterLength) {
160
+ closer = runStart;
161
+ break;
162
+ }
163
+ cursor = runEnd;
164
+ }
165
+
166
+ if (closer < 0) {
167
+ const newline = content.indexOf('\n', opener);
168
+ const end = newline < 0 ? content.length : newline;
169
+ masked += addMarker('CODE', content.slice(opener, end));
170
+ index = end;
171
+ continue;
172
+ }
173
+
174
+ const end = closer + delimiterLength;
175
+ const original = content.slice(opener, end);
176
+ const inner = content.slice(opener + delimiterLength, closer);
177
+ const kind = inner.trim() === 'AskUserQuestion' ? 'ASK' : 'CODE';
178
+ masked += addMarker(kind, original);
179
+ index = end;
180
+ }
181
+
182
+ return {
183
+ content: masked,
184
+ askMarkerPattern: `${markerPrefix}ASK_[0-9]+\uE001`,
185
+ askMarkerPrefix: `${markerPrefix}ASK_`,
186
+ restore(value) {
187
+ return spans.reduce(
188
+ (next, { marker, original }) => next.split(marker).join(original),
189
+ value
190
+ );
191
+ }
192
+ };
193
+ }
194
+
195
+ function normalizeAskUserQuestion(content) {
196
+ const masked = maskMarkdownCodeSpans(content);
197
+ const determinerPattern = [
198
+ 'one', 'each', 'every', 'another', 'this', 'that', 'a', 'an', 'the'
199
+ ].map((word) => [...word].map((letter) => `[${letter}${letter.toUpperCase()}]`).join('')).join('|');
200
+ const oneSeparator = '(?:[^\\S\\r\\n]+|[^\\S\\r\\n]*\\r?\\n[^\\S\\r\\n]*)';
201
+ const pattern = new RegExp(
202
+ `(?:(\\b(?:${determinerPattern}|[0-9]+)\\b)(${oneSeparator}))?`
203
+ + `(\\bAskUserQuestion\\b|${masked.askMarkerPattern})`,
204
+ 'g'
205
+ );
206
+ const normalized = masked.content.replace(pattern, (match, determiner, spacing, _token, offset, source) => {
207
+ const literalIndex = match.indexOf('AskUserQuestion');
208
+ const tokenOffset = offset + (literalIndex >= 0
209
+ ? literalIndex
210
+ : match.indexOf(masked.askMarkerPrefix));
211
+ const previous = source[tokenOffset - 1] || '';
212
+ if (isMarkdownLinkDestination(source, tokenOffset)
213
+ || isUrlLikeToken(source, tokenOffset)
214
+ || /[/=?#&%@]/.test(previous)) {
215
+ return match;
216
+ }
217
+
218
+ if (determiner) {
219
+ const normalizedDeterminer = /^an$/i.test(determiner)
220
+ ? (determiner[0] === 'A' ? 'A' : 'a')
221
+ : determiner;
222
+ return `${normalizedDeterminer}${spacing}structured user-input request`;
223
+ }
224
+
225
+ const trailing = source.slice(offset + match.length);
226
+ const pluralContext = new RegExp(`^${oneSeparator}(?:calls|batches)\\b`, 'i').test(trailing);
227
+ return `${pluralContext ? '' : 'a '}structured user-input request`;
228
+ });
229
+ return masked.restore(normalized);
230
+ }
231
+
67
232
  function normalizeRuntimePaths(content) {
68
233
  return normalizeSourcePaths(content, {
69
234
  runtimeRoot: '.codex',
@@ -78,11 +243,11 @@ function normalizeRuntimePaths(content) {
78
243
 
79
244
  function normalizeSkillNames(content) {
80
245
  return content
81
- .replace(/\/hapo:([a-z0-9-]+)/gi, (_match, name) => `$hapo-${name}`)
82
- .replace(/\bhapo:([a-z0-9-]+)/gi, (_match, name) => `hapo-${name}`)
246
+ .replace(/\/cf:([a-z0-9-]+)/gi, (_match, name) => `$cf-${name}`)
247
+ .replace(/\bcf:([a-z0-9-]+)/gi, (_match, name) => `cf-${name}`)
83
248
  .replace(
84
249
  /(^|[\s("'`→])\/(brainstorm|code-review|debug|develop|docs|frontend-design|git|hotfix|inspect|question|research|specs|test)(?=$|[\s<`),.:])/gim,
85
- (_match, prefix, name) => `${prefix}$hapo-${name}`
250
+ (_match, prefix, name) => `${prefix}$cf-${name}`
86
251
  );
87
252
  }
88
253
 
@@ -129,7 +294,7 @@ function normalizeCodexBody(content, sourcePath = '') {
129
294
  if (!isInstructionAsset(sourcePath)) return next;
130
295
 
131
296
  next = normalizeAgentInvocations(normalizeAgentNames(normalizeSkillNames(next)));
132
- return applyReplacements(next, INSTRUCTION_REPLACEMENTS);
297
+ return applyReplacements(normalizeAskUserQuestion(next), INSTRUCTION_REPLACEMENTS);
133
298
  }
134
299
 
135
300
  function getCodexCopyOptions(baseOptions = {}) {
@@ -27,6 +27,9 @@ function validateManifestV2(manifest) {
27
27
  if (!manifest || manifest.version !== 2) return false;
28
28
  if (!manifest.runtime?.files || !Array.isArray(manifest.runtime.files)) return false;
29
29
  if (!manifest.settings?.template) return false;
30
+ if (!Array.isArray(manifest.skills?.required)) return false;
31
+ if (!Array.isArray(manifest.skills?.bundles?.documentSkills)) return false;
32
+ if (!Array.isArray(manifest.obsolete?.skills)) return false;
30
33
  return true;
31
34
  }
32
35
 
@@ -116,6 +119,35 @@ const PLATFORMS = {
116
119
  rules: true,
117
120
  commands: false
118
121
  }
122
+ },
123
+ omp: {
124
+ id: 'omp',
125
+ name: 'Oh My Pi',
126
+ description: 'Oh My Pi coding agent',
127
+ folder: '.omp',
128
+ detectFiles: ['.omp'],
129
+ commandsDir: null,
130
+ // omp discovers .claude/skills and .agents/skills itself, so CafeKit copies
131
+ // no skill payload for it. See specs/omp-runtime-support/plan.md.
132
+ skillsDir: '.agents/skills',
133
+ agentsDir: null,
134
+ skillsRef: '.agents/skills',
135
+ commandPrefix: '$',
136
+ sourceDir: 'claude',
137
+ sourceSubdir: null,
138
+ backupTargets: ['.omp', 'AGENTS.md'],
139
+ ownership: {
140
+ recordRoot: '.',
141
+ allowedRoots: ['.omp']
142
+ },
143
+ capabilities: {
144
+ skills: false,
145
+ agents: false,
146
+ references: true,
147
+ scripts: true,
148
+ rules: true,
149
+ commands: false
150
+ }
119
151
  }
120
152
  // Add new platforms here:
121
153
  // cursor: {
@@ -129,6 +161,25 @@ const PLATFORMS = {
129
161
  // }
130
162
  };
131
163
 
164
+ /**
165
+ * Hosts that run another platform's install rather than one of their own.
166
+ *
167
+ * Grok CLI discovers `.claude/skills`, `.claude/rules`, `CLAUDE*.md` and the hooks in
168
+ * `.claude/settings.json` through its own Claude-compatibility layer, and the gate hooks
169
+ * normalize its envelope, so `--platform grok` provisions the Claude runtime. There is no
170
+ * `.grok/` payload and deliberately no detection marker: a repository that merely holds
171
+ * `.grok/` has not asked for a CafeKit install.
172
+ */
173
+ const PLATFORM_ALIASES = Object.freeze({
174
+ grok: 'claude'
175
+ });
176
+
177
+ /** Resolve host aliases and drop duplicates, preserving the requested order. */
178
+ function resolvePlatformAliases(keys = []) {
179
+ const resolved = keys.map((key) => PLATFORM_ALIASES[key] || key);
180
+ return { platforms: [...new Set(resolved)], aliased: keys.some((key) => Boolean(PLATFORM_ALIASES[key])) };
181
+ }
182
+
132
183
  // ═══════════════════════════════════════════════════════════
133
184
  // DETECTION + PLATFORM HELPERS
134
185
  // ═══════════════════════════════════════════════════════════
@@ -204,7 +255,8 @@ function parseInstallerArgs(argv) {
204
255
  dryRun: false,
205
256
  yes: false,
206
257
  withSkillsDeps: false,
207
- withRtk: false,
258
+ withDocumentSkills: false,
259
+ withoutDocumentSkills: false,
208
260
  platforms: []
209
261
  };
210
262
 
@@ -219,8 +271,10 @@ function parseInstallerArgs(argv) {
219
271
  args.yes = true;
220
272
  } else if (arg === '--with-skills-deps') {
221
273
  args.withSkillsDeps = true;
222
- } else if (arg === '--with-rtk') {
223
- args.withRtk = true;
274
+ } else if (arg === '--with-document-skills') {
275
+ args.withDocumentSkills = true;
276
+ } else if (arg === '--without-document-skills') {
277
+ args.withoutDocumentSkills = true;
224
278
  } else if (arg === '--platform') {
225
279
  args.platforms.push(...String(argv[++i] || '').split(',').filter(Boolean));
226
280
  } else if (arg.startsWith('--platform=')) {
@@ -232,6 +286,10 @@ function parseInstallerArgs(argv) {
232
286
  }
233
287
  }
234
288
 
289
+ if (args.withDocumentSkills && args.withoutDocumentSkills) {
290
+ throw new Error('--with-document-skills and --without-document-skills cannot be used together');
291
+ }
292
+
235
293
  // Back-compat alias used throughout the phases.
236
294
  args.upgrade = args.forceOverwrite;
237
295
  return args;
@@ -298,6 +356,7 @@ function buildContext(argv, runId) {
298
356
  results: createResults(),
299
357
  trackers: {}, // platformKey → ownership tracker, set per platform
300
358
  ownership: {}, // platformFolder → ownership manifest read at run start
359
+ documentSkills: {}, // platformKey → persisted optional-bundle selection
301
360
  cancelled: false
302
361
  };
303
362
  }
@@ -307,6 +366,8 @@ module.exports = {
307
366
  INSTALL_COMMAND,
308
367
  DEPENDENCY_TEMPLATES,
309
368
  PLATFORMS,
369
+ PLATFORM_ALIASES,
370
+ resolvePlatformAliases,
310
371
  validateManifestV2,
311
372
  loadClaudeMigrationManifest,
312
373
  detectPlatforms,
package/bin/lib/i18n.js CHANGED
@@ -58,18 +58,10 @@ const MESSAGES = {
58
58
 
59
59
  // Skills / deps setup
60
60
  skillDepsConfirm: 'Install skill dependencies? (Python venv, pip, npm, Chromium — takes a few minutes)',
61
+ documentSkillsConfirm: 'Install optional document skills? (docs, DOCX, PDF, PPTX, XLSX, multimodal)',
62
+ documentSkillsMetadataRecovery: 'Could not read {path}; preserving document skills to avoid destructive cleanup.',
61
63
  skillsSkipped: 'Skill dependencies skipped.\n Run later: npx @haposoft/cafekit --with-skills-deps',
62
64
 
63
- // rtk token-saver setup
64
- rtkConfirm: 'Install the rtk token-saver? (compacts git/grep/ls/build/test output for Claude Code Bash commands)',
65
- rtkInstalling: 'Installing rtk via {method}',
66
- rtkInstalled: 'rtk installed',
67
- rtkInstallFailed: 'Could not install rtk — skipping (non-fatal). Install manually later: https://github.com/rtk-ai/rtk',
68
- rtkInitFailed: 'rtk init -g failed: {reason} — hook not registered (non-fatal)',
69
- rtkNeedsJq: 'rtk hook needs jq to run. Install jq, then the hook activates automatically.',
70
- rtkFailed: 'rtk setup error: {reason} — skipped (non-fatal)',
71
- rtkSkipped: 'rtk token-saver skipped.\n Run later: npx @haposoft/cafekit --with-rtk',
72
- rtkSummary: 'rtk token-saver: hook registered for Claude Code Bash commands',
73
65
  venvCreating: 'Setting up Python environment',
74
66
  venvReady: 'Python environment ready',
75
67
  venvFailed: 'Could not create Python environment — check your Python 3 installation.',
@@ -106,8 +98,8 @@ const MESSAGES = {
106
98
 
107
99
  // Next steps
108
100
  nextStepsTitle: 'Next steps',
109
- nsClaude: 'Start coding: /hapo:specs <feature>',
110
- nsCodex: 'Start with `$hapo-specs <feature>`; review and trust project hooks with `/hooks`',
101
+ nsClaude: 'Start coding: /cf:specs <feature>',
102
+ nsCodex: 'Start with `$cf-specs <feature>`; review and trust project hooks with `/hooks`',
111
103
  nsKeys: 'Some skills need API keys: {skills}\n Copy <skill>/.env.example → .env and fill in the values',
112
104
  nsForce: 'To force-refresh managed files: npx @haposoft/cafekit --force-overwrite',
113
105
  dryRunOnly: 'Dry-run complete — no files were changed.\n Re-run without --dry-run to apply.',
@@ -128,6 +120,7 @@ const MESSAGES = {
128
120
 
129
121
  // Platform/language auto-skip when already installed
130
122
  installingFor: 'Installing for: {names}',
123
+ grokCompatNotice: 'Grok CLI reads this install through its Claude compatibility. Trust the project first: run `grok --trust` or `/hooks-trust`, or its project hooks are skipped.',
131
124
  langKept: 'Language: {lang} (saved — skipping prompt)',
132
125
  platformKept: 'Platform: {names} (saved — skipping prompt)',
133
126
 
@@ -180,18 +173,10 @@ const MESSAGES = {
180
173
  changeAddressingOption:'別の名前に変更',
181
174
 
182
175
  skillDepsConfirm: 'スキルの依存関係をインストールしますか?(Python venv、pip、npm、Chromium — 数分かかります)',
176
+ documentSkillsConfirm: '任意のドキュメントスキルをインストールしますか?(docs、DOCX、PDF、PPTX、XLSX、multimodal)',
177
+ documentSkillsMetadataRecovery: '{path} を読み取れないため、破壊的な削除を避けて document skills を保持します。',
183
178
  skillsSkipped: 'スキルの依存関係をスキップしました。\n 後で実行: npx @haposoft/cafekit --with-skills-deps',
184
179
 
185
- // rtk token-saver setup
186
- rtkConfirm: 'rtk トークンセーバーをインストールしますか?(Claude Code の Bash コマンドの git/grep/ls/build/test 出力を圧縮します)',
187
- rtkInstalling: '{method} で rtk をインストール中',
188
- rtkInstalled: 'rtk をインストールしました',
189
- rtkInstallFailed: 'rtk をインストールできませんでした — スキップします(致命的ではありません)。後で手動でインストール: https://github.com/rtk-ai/rtk',
190
- rtkInitFailed: 'rtk init -g が失敗しました: {reason} — フックは未登録です(致命的ではありません)',
191
- rtkNeedsJq: 'rtk フックの実行には jq が必要です。jq をインストールするとフックが自動的に有効になります。',
192
- rtkFailed: 'rtk セットアップエラー: {reason} — スキップしました(致命的ではありません)',
193
- rtkSkipped: 'rtk トークンセーバーをスキップしました。\n 後で実行: npx @haposoft/cafekit --with-rtk',
194
- rtkSummary: 'rtk トークンセーバー: Claude Code の Bash コマンド用にフックを登録しました',
195
180
  venvCreating: 'Python 環境を準備しています',
196
181
  venvReady: 'Python 環境の準備ができました',
197
182
  venvFailed: 'Python 環境を作成できませんでした — Python 3 のインストールを確認してください。',
@@ -226,8 +211,8 @@ const MESSAGES = {
226
211
  preservedNote: '編集済みファイル {n} 件はそのままにしました。\n --force-overwrite で再実行するとリセットできます(.cafekit-backup/ にバックアップ保存)。',
227
212
 
228
213
  nextStepsTitle: '次のステップ',
229
- nsClaude: 'コーディング開始: /hapo:specs <機能名>',
230
- nsCodex: '`$hapo-specs <機能名>` で開始し、`/hooks` でプロジェクトフックを確認・信頼',
214
+ nsClaude: 'コーディング開始: /cf:specs <機能名>',
215
+ nsCodex: '`$cf-specs <機能名>` で開始し、`/hooks` でプロジェクトフックを確認・信頼',
231
216
  nsKeys: '一部のスキルに API キーが必要です: {skills}\n <skill>/.env.example を .env にコピーし、値を入力してください',
232
217
  nsForce: '管理ファイルを強制更新: npx @haposoft/cafekit --force-overwrite',
233
218
  dryRunOnly: 'ドライラン完了 — ファイルへの変更はありませんでした。\n 変更を適用するには --dry-run なしで再実行してください。',
@@ -247,6 +232,7 @@ const MESSAGES = {
247
232
 
248
233
  // Platform/language auto-skip when already installed
249
234
  installingFor: 'インストール先: {names}',
235
+ grokCompatNotice: 'Grok CLI はこのインストールを Claude 互換として読み込みます。先にプロジェクトを信頼してください: `grok --trust` または `/hooks-trust`。信頼しないとプロジェクトフックはスキップされます。',
250
236
  langKept: '言語: {lang} (保存済み — スキップ)',
251
237
  platformKept: 'プラットフォーム: {names} (保存済み — スキップ)',
252
238
 
@@ -299,18 +285,10 @@ const MESSAGES = {
299
285
  changeAddressingOption:'Đổi tên khác',
300
286
 
301
287
  skillDepsConfirm: 'Cài dependencies cho skill ngay? (Python venv, pip, npm, Chromium — mất vài phút)',
288
+ documentSkillsConfirm: 'Cài thêm nhóm skill tài liệu? (docs, DOCX, PDF, PPTX, XLSX, multimodal)',
289
+ documentSkillsMetadataRecovery: 'Không đọc được {path}; giữ nguyên skill tài liệu để tránh dọn nhầm dữ liệu.',
302
290
  skillsSkipped: 'Đã bỏ qua dependencies skill.\n Cài sau bằng lệnh: npx @haposoft/cafekit --with-skills-deps',
303
291
 
304
- // rtk token-saver setup
305
- rtkConfirm: 'Cài rtk token-saver? (rút gọn output git/grep/ls/build/test cho các lệnh Bash của Claude Code)',
306
- rtkInstalling: 'Đang cài rtk qua {method}',
307
- rtkInstalled: 'Đã cài rtk',
308
- rtkInstallFailed: 'Không thể cài rtk — bỏ qua (không nghiêm trọng). Cài thủ công sau: https://github.com/rtk-ai/rtk',
309
- rtkInitFailed: 'rtk init -g thất bại: {reason} — hook chưa được đăng ký (không nghiêm trọng)',
310
- rtkNeedsJq: 'Hook của rtk cần jq để chạy. Cài jq thì hook sẽ tự kích hoạt.',
311
- rtkFailed: 'Lỗi cài rtk: {reason} — đã bỏ qua (không nghiêm trọng)',
312
- rtkSkipped: 'Đã bỏ qua rtk token-saver.\n Cài sau bằng lệnh: npx @haposoft/cafekit --with-rtk',
313
- rtkSummary: 'rtk token-saver: đã đăng ký hook cho các lệnh Bash của Claude Code',
314
292
  venvCreating: 'Đang thiết lập môi trường Python',
315
293
  venvReady: 'Môi trường Python đã sẵn sàng',
316
294
  venvFailed: 'Không thể tạo môi trường Python — hãy kiểm tra cài đặt Python 3.',
@@ -345,8 +323,8 @@ const MESSAGES = {
345
323
  preservedNote: '{n} tệp bạn đã chỉnh sửa được giữ nguyên.\n Chạy lại với --force-overwrite để cài đè (bản sao lưu ở .cafekit-backup/).',
346
324
 
347
325
  nextStepsTitle: 'Bước tiếp theo',
348
- nsClaude: 'Bắt đầu code: /hapo:specs <mô-tả-tính-năng>',
349
- nsCodex: 'Bắt đầu bằng `$hapo-specs <tính-năng>`; kiểm tra và trust project hooks bằng `/hooks`',
326
+ nsClaude: 'Bắt đầu code: /cf:specs <mô-tả-tính-năng>',
327
+ nsCodex: 'Bắt đầu bằng `$cf-specs <tính-năng>`; kiểm tra và trust project hooks bằng `/hooks`',
350
328
  nsKeys: 'Một số skill cần API key: {skills}\n Sao chép <skill>/.env.example → .env rồi điền giá trị',
351
329
  nsForce: 'Làm mới file được quản lý: npx @haposoft/cafekit --force-overwrite',
352
330
  dryRunOnly: 'Dry-run hoàn tất — không có tệp nào thay đổi.\n Chạy lại không có --dry-run để áp dụng.',
@@ -366,6 +344,7 @@ const MESSAGES = {
366
344
 
367
345
  // Platform/language auto-skip when already installed
368
346
  installingFor: 'Cài cho: {names}',
347
+ grokCompatNotice: 'Grok CLI đọc bản cài này qua lớp tương thích Claude. Hãy trust project trước: chạy `grok --trust` hoặc `/hooks-trust`, nếu không project hooks sẽ bị bỏ qua.',
369
348
  langKept: 'Ngôn ngữ: {lang} (đã lưu — bỏ qua chọn lại)',
370
349
  platformKept: 'Nền tảng: {names} (đã lưu — bỏ qua chọn lại)',
371
350
 
@@ -271,15 +271,15 @@ function collectSkillPackages(skillsDir) {
271
271
 
272
272
  /** External binaries some skills shell out to — detected, never auto-installed. */
273
273
  const SYSTEM_TOOLS = [
274
- { cmd: 'ffmpeg', why: 'ai-multimodal (audio/video)', brew: 'brew install ffmpeg', apt: 'sudo apt install ffmpeg', win: 'winget install ffmpeg' },
275
- { cmd: 'pdftotext', why: 'pdf (text extraction, poppler)', brew: 'brew install poppler', apt: 'sudo apt install poppler-utils', win: 'choco install poppler' },
276
- { cmd: 'rsvg-convert', why: 'generate-graph (PNG export, librsvg)', brew: 'brew install librsvg', apt: 'sudo apt install librsvg2-bin', win: 'choco install rsvg-convert' },
277
- { cmd: 'tesseract', why: 'pdf/ai-multimodal (OCR)', brew: 'brew install tesseract', apt: 'sudo apt install tesseract-ocr', win: 'choco install tesseract' }
274
+ { cmd: 'ffmpeg', skills: ['ai-multimodal'], why: 'ai-multimodal (audio/video)', brew: 'brew install ffmpeg', apt: 'sudo apt install ffmpeg', win: 'winget install ffmpeg' },
275
+ { cmd: 'pdftotext', skills: ['pdf'], why: 'pdf (text extraction, poppler)', brew: 'brew install poppler', apt: 'sudo apt install poppler-utils', win: 'choco install poppler' },
276
+ { cmd: 'rsvg-convert', skills: ['generate-graph'], why: 'generate-graph (PNG export, librsvg)', brew: 'brew install librsvg', apt: 'sudo apt install librsvg2-bin', win: 'choco install rsvg-convert' },
277
+ { cmd: 'tesseract', skills: ['pdf', 'ai-multimodal'], why: 'pdf/ai-multimodal (OCR)', brew: 'brew install tesseract', apt: 'sudo apt install tesseract-ocr', win: 'choco install tesseract' }
278
278
  ];
279
279
 
280
280
  /** Global npm CLIs some skills expect — detected, never auto-installed. */
281
281
  const GLOBAL_NPM = [
282
- { cmd: 'agent-browser', pkg: 'agent-browser', why: 'agent-browser skill' }
282
+ { cmd: 'agent-browser', pkg: 'agent-browser', skills: ['agent-browser'], why: 'agent-browser skill' }
283
283
  ];
284
284
 
285
285
  /** Per-OS install hint for a SYSTEM_TOOLS entry. */
@@ -276,8 +276,31 @@ function copyRulesDirectory(ctx, platformKey) {
276
276
  report(ctx, treeAction(agg), 'rules/ directory');
277
277
  }
278
278
 
279
+ /**
280
+ * Copy the output-styles/ tree from the one canonical source. Claude Code discovers
281
+ * these natively under `.claude/`; Codex CLI has no output-style feature, so its rules
282
+ * hook reads the selected file and injects it once per session instead.
283
+ */
284
+ function copyOutputStylesDirectory(ctx, platformKey) {
285
+
286
+ const src = path.join(SRC, 'claude/output-styles');
287
+ const dest = getRuntimeSupportTargetDir(platformKey, 'output-styles');
288
+ if (!fs.existsSync(src)) {
289
+ ctx.ui.warn('output-styles/ directory not found');
290
+ ctx.results.missingDependencies++;
291
+ return;
292
+ }
293
+
294
+ const transform = getCopyOptions(platformKey, {}).transform;
295
+ const agg = copyManagedTree({
296
+ src, dest, platformFolder: PLATFORMS[platformKey].folder, ctx, tracker: ctx.trackers[platformKey], transform
297
+ });
298
+ report(ctx, treeAction(agg), 'output-styles/ directory');
299
+ }
300
+
279
301
  module.exports = {
280
302
  copyRoutingFile,
303
+ copyOutputStylesDirectory,
281
304
  copyClaudeRuntimeFiles,
282
305
  removeObsoleteClaudeRuntimeFiles,
283
306
  copyClaudeMdFile,
@@ -109,6 +109,14 @@ function mergeClaudeSettings(ctx, platformKey) {
109
109
  }
110
110
  }
111
111
 
112
+ // outputStyle: a reader preference, not CafeKit functionality. Seed it once when
113
+ // the user has none, and never replace a choice they made — not even under
114
+ // --force-overwrite, which exists to repair managed files, not to reset taste.
115
+ if (managedSettings.outputStyle && !existingSettings.outputStyle) {
116
+ mergedSettings.outputStyle = managedSettings.outputStyle;
117
+ ctx.ui.detail(` ✓ ${ctx.dryRun ? '[dry-run] ' : ''}Settings: outputStyle seeded (${managedSettings.outputStyle})`);
118
+ }
119
+
112
120
  // hooks: merge managed hooks per command (not per entry). An entry is keyed
113
121
  // by its matcher; commands missing from the matching entry are appended, so
114
122
  // a new command added to an existing matcher entry is not swallowed on