@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.
- package/README.md +117 -28
- package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
- package/bin/__tests__/codex-hooks.test.js +175 -0
- package/bin/__tests__/codex-native.test.js +1882 -70
- package/bin/__tests__/develop-contract.test.js +442 -23
- package/bin/__tests__/grok-envelope.test.js +271 -0
- package/bin/__tests__/grok-platform.test.js +133 -0
- package/bin/__tests__/hook-payload.test.js +194 -0
- package/bin/__tests__/installer-safety.test.js +3 -3
- package/bin/__tests__/omp-bridge.test.js +168 -0
- package/bin/__tests__/omp-hooks.test.js +178 -0
- package/bin/__tests__/omp-runtime.test.js +150 -0
- package/bin/__tests__/optional-skill-inventory.test.js +249 -0
- package/bin/__tests__/output-styles.test.js +214 -0
- package/bin/__tests__/package-inventory.test.js +1735 -98
- package/bin/__tests__/runtime-dir.test.js +158 -0
- package/bin/__tests__/runtime-schema.test.js +113 -0
- package/bin/__tests__/secret-output-guardrail.test.js +122 -0
- package/bin/__tests__/skill-routing-source.test.js +172 -0
- package/bin/__tests__/specs-v2-execution-closeout.test.js +28 -1
- package/bin/install.js +15 -5
- package/bin/lib/codex-install.js +170 -5
- package/bin/lib/context.js +64 -3
- package/bin/lib/i18n.js +15 -36
- package/bin/lib/skill-deps.js +5 -5
- package/bin/phases/claude-runtime.js +23 -0
- package/bin/phases/claude-settings.js +8 -0
- package/bin/phases/codex-hooks.js +156 -0
- package/bin/phases/codex-runtime.js +29 -38
- package/bin/phases/copy-payload.js +15 -2
- package/bin/phases/omp-runtime.js +140 -0
- package/bin/phases/root-config.js +3 -0
- package/bin/phases/select-platform.js +22 -1
- package/bin/phases/select-skill-bundles.js +96 -0
- package/bin/phases/skill-inventory.js +71 -0
- package/bin/phases/skills-setup.js +9 -2
- package/bin/phases/summary.js +0 -4
- package/bin/phases/write-metadata.js +8 -5
- package/package.json +8 -2
- package/src/claude/CLAUDE.md +3 -3
- package/src/claude/agents/brainstormer.md +52 -69
- package/src/claude/agents/code-auditor.md +32 -14
- package/src/claude/agents/debugger.md +35 -20
- package/src/claude/agents/deployer.md +12 -5
- package/src/claude/agents/docs-keeper.md +11 -1
- package/src/claude/agents/implementer.md +25 -13
- package/src/claude/agents/inspector.md +6 -3
- package/src/claude/agents/project-manager.md +1 -1
- package/src/claude/agents/researcher.md +26 -55
- package/src/claude/agents/spec-maker.md +12 -7
- package/src/claude/agents/strategist.md +52 -0
- package/src/claude/agents/test-runner.md +117 -132
- package/src/claude/agents/ui-ux-designer.md +1 -1
- package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
- package/src/claude/hooks/__tests__/precompact.test.js +158 -0
- package/src/claude/hooks/__tests__/semantic-review-authority.test.js +2 -0
- package/src/claude/hooks/__tests__/spec-gate.test.js +348 -3
- package/src/claude/hooks/__tests__/state.test.js +7 -0
- package/src/claude/hooks/__tests__/statusline.test.js +196 -0
- package/src/claude/hooks/agent.cjs +13 -8
- package/src/claude/hooks/completion-authority.cjs +10 -4
- package/src/claude/hooks/docs-sync.cjs +14 -11
- package/src/claude/hooks/inspect-block.cjs +28 -8
- package/src/claude/hooks/lib/config.cjs +8 -2
- package/src/claude/hooks/lib/counter.cjs +7 -5
- package/src/claude/hooks/lib/hook-payload.cjs +160 -0
- package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
- package/src/claude/hooks/lib/runtime-dir.cjs +49 -0
- package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
- package/src/claude/hooks/precompact.cjs +106 -0
- package/src/claude/hooks/privacy-block.cjs +4 -2
- package/src/claude/hooks/rules.cjs +5 -3
- package/src/claude/hooks/secret-output-guardrail.cjs +44 -0
- package/src/claude/hooks/semantic-review-authority.cjs +6 -4
- package/src/claude/hooks/session.cjs +37 -9
- package/src/claude/hooks/spec-gate.cjs +21 -11
- package/src/claude/hooks/spec-state.cjs +11 -7
- package/src/claude/hooks/state.cjs +7 -5
- package/src/claude/hooks/task-scaffold-guard.cjs +30 -9
- package/src/claude/hooks/usage.cjs +6 -5
- package/src/claude/migration-manifest.json +31 -15
- package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
- package/src/claude/output-styles/coding-level-1-junior.md +124 -0
- package/src/claude/output-styles/coding-level-2-mid.md +146 -0
- package/src/claude/output-styles/coding-level-3-senior.md +148 -0
- package/src/claude/output-styles/coding-level-4-lead.md +159 -0
- package/src/claude/output-styles/coding-level-5-god.md +91 -0
- package/src/claude/references/debugger/core-philosophy.md +5 -3
- package/src/claude/references/debugger/frontend-verification.md +2 -2
- package/src/claude/references/debugger/log-ci-analysis.md +13 -1
- package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
- package/src/claude/references/debugger/performance-diagnostics.md +2 -2
- package/src/claude/references/debugger/root-cause-tracing.md +37 -6
- package/src/claude/references/debugger/side-effect-gate.md +3 -1
- package/src/claude/references/debugger/verification-protocol.md +13 -12
- package/src/claude/rules/orchestrator.md +7 -1
- package/src/claude/rules/process-management.md +39 -0
- package/src/claude/rules/review-audit-self-decision.md +48 -0
- package/src/claude/rules/skill-domain-routing.md +26 -24
- package/src/claude/rules/skill-workflow-routing.md +22 -14
- package/src/claude/rules/state-sync.md +7 -1
- package/src/claude/rules/workflow.md +5 -3
- package/src/claude/runtime.json +1 -0
- package/src/claude/runtime.schema.json +205 -0
- package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
- package/src/claude/scripts/provenance.cjs +29 -9
- package/src/claude/scripts/spec-receipt.cjs +65 -4
- package/src/claude/scripts/workflow-policy.cjs +1 -1
- package/src/claude/settings/settings.json +16 -0
- package/src/claude/skills/agent-browser/SKILL.md +1 -1
- package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
- package/src/claude/skills/brainstorm/SKILL.md +193 -172
- package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
- package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
- package/src/claude/skills/code-review/SKILL.md +43 -25
- package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
- package/src/claude/skills/code-review/references/verification-gate.md +1 -1
- package/src/claude/skills/debug/SKILL.md +48 -19
- package/src/claude/skills/delegate/SKILL.md +1 -1
- package/src/claude/skills/develop/SKILL.md +92 -65
- package/src/claude/skills/develop/references/parallel-waves.md +36 -63
- package/src/claude/skills/develop/references/quality-gate.md +31 -4
- package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
- package/src/claude/skills/docs/SKILL.md +42 -23
- package/src/claude/skills/docs/references/init-workflow.md +4 -4
- package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
- package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
- package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
- package/src/claude/skills/docs/references/update-workflow.md +9 -7
- package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
- package/src/claude/skills/docx/SKILL.md +1 -1
- package/src/claude/skills/git/SKILL.md +1 -1
- package/src/claude/skills/git/references/commit-protocols.md +1 -1
- package/src/claude/skills/git/references/finish-branch.md +1 -1
- package/src/claude/skills/hotfix/SKILL.md +159 -170
- package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
- package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
- package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
- package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
- package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
- package/src/claude/skills/inspect/SKILL.md +55 -46
- package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
- package/src/claude/skills/loop/SKILL.md +114 -0
- package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
- package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
- package/src/claude/skills/pdf/SKILL.md +1 -1
- package/src/claude/skills/pptx/SKILL.md +1 -1
- package/src/claude/skills/question/SKILL.md +16 -13
- package/src/claude/skills/research/SKILL.md +70 -43
- package/src/claude/skills/route/SKILL.md +94 -0
- package/src/claude/skills/route/references/agent-timing.md +46 -0
- package/src/claude/skills/route/references/chaining-patterns.md +53 -0
- package/src/claude/skills/route/references/task-taxonomy.md +48 -0
- package/src/claude/skills/specs/SKILL.md +51 -71
- package/src/claude/skills/specs/references/review.md +11 -8
- package/src/claude/skills/specs/references/templates.md +34 -18
- package/src/claude/skills/specs/templates/requirements-init.md +1 -1
- package/src/claude/skills/specs/templates/research.md +2 -2
- package/src/claude/skills/sync/SKILL.md +6 -6
- package/src/claude/skills/sync/references/sync-protocols.md +1 -1
- package/src/claude/skills/test/SKILL.md +120 -120
- package/src/claude/skills/test/references/execution-strategy.md +208 -361
- package/src/claude/skills/test/references/failure-triage.md +55 -121
- package/src/claude/skills/test/references/test-memory.md +20 -34
- package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
- package/src/claude/skills/web-testing/SKILL.md +1 -1
- package/src/claude/skills/xlsx/SKILL.md +1 -1
- package/src/claude/status.cjs +135 -33
- package/src/codex/AGENTS.md +14 -4
- package/src/codex/hooks/docs-sync.cjs +8 -3
- package/src/codex/hooks/lib/hook-context.cjs +18 -4
- package/src/codex/hooks/rules.cjs +29 -1
- package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
- package/src/codex/hooks/spec-gate.cjs +3 -8
- package/src/codex/hooks/spec-state.cjs +3 -2
- package/src/codex/hooks.json +5 -0
- package/src/codex/rules/state-sync.md +7 -1
- package/src/codex/runtime.json +2 -0
- package/src/common/.env.example +1 -1
- package/src/omp/extensions/cafekit-bridge.mjs +233 -0
- package/src/omp/hooks/privacy-block.cjs +250 -0
- package/src/omp/runtime.json +33 -0
- package/bin/lib/rtk-run.js +0 -28
- package/bin/phases/setup-rtk.js +0 -159
- package/src/claude/skills/backend-development/SKILL.md +0 -101
- package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
- package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
- package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
- package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
- package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
- package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
- package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
- package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
- package/src/claude/skills/backend-development/references/backend-security.md +0 -342
- package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
- package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
- package/src/claude/skills/devops/.env.example +0 -76
- package/src/claude/skills/devops/SKILL.md +0 -102
- package/src/claude/skills/devops/references/browser-rendering.md +0 -305
- package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
- package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
- package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
- package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
- package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
- package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
- package/src/claude/skills/devops/references/docker-basics.md +0 -297
- package/src/claude/skills/devops/references/docker-compose.md +0 -292
- package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
- package/src/claude/skills/devops/references/gcloud-services.md +0 -304
- package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
- package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
- package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
- package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
- package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
- package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
- package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
- package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
- package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
- package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
- package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
- package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
- package/src/claude/skills/devops/scripts/requirements.txt +0 -20
- package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
- package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
- package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
- package/src/claude/skills/frontend-design/SKILL.md +0 -135
- package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
- package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
- package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
- package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
- package/src/claude/skills/frontend-design/references/animejs.md +0 -396
- package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
- package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
- package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
- package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
- package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
- package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
- package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
- package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
- package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
- package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
- package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
- package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
- package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
- package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
- package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
- package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
- package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
- package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
- package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
- package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
- package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
- package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
- package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
- package/src/claude/skills/frontend-development/SKILL.md +0 -406
- package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
- package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
- package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
- package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
- package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
- package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
- package/src/claude/skills/frontend-development/resources/performance.md +0 -406
- package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
- package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
- package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
- package/src/claude/skills/mobile-development/SKILL.md +0 -218
- package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
- package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
- package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
- package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
- package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
- package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
- package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
- package/src/claude/skills/react-best-practices/README.md +0 -123
- package/src/claude/skills/react-best-practices/SKILL.md +0 -128
- package/src/claude/skills/react-best-practices/metadata.json +0 -15
- package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
- package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
- package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
- package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
- package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
- package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
- package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
- 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
|
package/bin/lib/codex-install.js
CHANGED
|
@@ -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(/\/
|
|
82
|
-
.replace(/\
|
|
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}$
|
|
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 = {}) {
|
package/bin/lib/context.js
CHANGED
|
@@ -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
|
-
|
|
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-
|
|
223
|
-
args.
|
|
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: /
|
|
110
|
-
nsCodex: 'Start with `$
|
|
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: 'コーディング開始: /
|
|
230
|
-
nsCodex: '`$
|
|
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: /
|
|
349
|
-
nsCodex: 'Bắt đầu bằng `$
|
|
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
|
|
package/bin/lib/skill-deps.js
CHANGED
|
@@ -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
|