@haposoft/cafekit 0.16.0-rc.7 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -27
- package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
- package/bin/__tests__/codex-hooks.test.js +295 -0
- package/bin/__tests__/codex-native.test.js +2289 -34
- package/bin/__tests__/develop-contract.test.js +400 -23
- package/bin/__tests__/installer-safety.test.js +3 -3
- 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 +2131 -16
- package/bin/__tests__/runtime-schema.test.js +111 -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 +1 -1
- package/bin/install.js +10 -0
- package/bin/lib/codex-install.js +170 -5
- package/bin/lib/context.js +14 -0
- package/bin/lib/i18n.js +12 -6
- 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 +8 -2
- 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/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 +24 -13
- 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__/spec-gate.test.js +87 -4
- package/src/claude/hooks/__tests__/state.test.js +254 -3
- package/src/claude/hooks/__tests__/statusline.test.js +196 -0
- package/src/claude/hooks/agent.cjs +1 -1
- package/src/claude/hooks/docs-sync.cjs +12 -10
- package/src/claude/hooks/inspect-block.cjs +1 -1
- package/src/claude/hooks/lib/config.cjs +3 -0
- package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
- package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
- package/src/claude/hooks/precompact.cjs +105 -0
- package/src/claude/hooks/rules.cjs +1 -1
- package/src/claude/hooks/secret-output-guardrail.cjs +43 -0
- package/src/claude/hooks/session.cjs +27 -1
- package/src/claude/hooks/spec-gate.cjs +3 -3
- package/src/claude/hooks/spec-state.cjs +32 -5
- package/src/claude/hooks/state.cjs +1 -1
- package/src/claude/hooks/task-scaffold-guard.cjs +1 -1
- package/src/claude/hooks/usage.cjs +1 -1
- package/src/claude/migration-manifest.json +29 -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/workflow.md +3 -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 +18 -5
- package/src/claude/scripts/spec-receipt.cjs +76 -21
- package/src/claude/scripts/spec-resolver.cjs +144 -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 +48 -57
- package/src/claude/skills/specs/references/review.md +26 -8
- package/src/claude/skills/specs/references/templates.md +76 -31
- 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 +34 -5
- package/src/codex/hooks.json +5 -0
- package/src/codex/runtime.json +2 -0
- package/src/common/.env.example +1 -1
- 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
|
@@ -5,6 +5,7 @@ const fs = require('fs');
|
|
|
5
5
|
const path = require('path');
|
|
6
6
|
const {
|
|
7
7
|
getHookContext,
|
|
8
|
+
hookStateDir,
|
|
8
9
|
logCrash,
|
|
9
10
|
readPayload,
|
|
10
11
|
resolveProjectPath
|
|
@@ -15,7 +16,7 @@ function reservationFile(projectRoot, sessionId) {
|
|
|
15
16
|
.update(String(sessionId || 'unknown'))
|
|
16
17
|
.digest('hex')
|
|
17
18
|
.slice(0, 16);
|
|
18
|
-
return path.join(projectRoot,
|
|
19
|
+
return path.join(hookStateDir(projectRoot), `rules-${key}.json`);
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
/** Reserve one injection slot per session. Returns null on reservation errors. */
|
|
@@ -35,6 +36,28 @@ function reserveSession(projectRoot, sessionId) {
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Body of the output style for `codingLevel`, or null.
|
|
41
|
+
*
|
|
42
|
+
* Codex CLI has no output-style feature, so the style Claude Code would load natively is
|
|
43
|
+
* injected here instead. The rules hook reserves one injection per session, so this costs
|
|
44
|
+
* the same as a host-loaded style rather than repeating every turn.
|
|
45
|
+
*/
|
|
46
|
+
function readCodingStyle(projectRoot, level) {
|
|
47
|
+
if (!Number.isInteger(level) || level < 0 || level > 5) return null;
|
|
48
|
+
try {
|
|
49
|
+
const dir = path.join(projectRoot, '.codex', 'output-styles');
|
|
50
|
+
const match = fs.readdirSync(dir).find((name) => name.startsWith(`coding-level-${level}-`));
|
|
51
|
+
if (!match) return null;
|
|
52
|
+
const raw = fs.readFileSync(path.join(dir, match), 'utf8');
|
|
53
|
+
// Strip the frontmatter Claude Code reads; Codex only needs the instructions.
|
|
54
|
+
const body = raw.replace(/^---\n[\s\S]*?\n---\n/, '').trim();
|
|
55
|
+
return body || null;
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
38
61
|
function readRuntime(projectRoot) {
|
|
39
62
|
try {
|
|
40
63
|
const file = path.join(projectRoot, '.codex', 'runtime.json');
|
|
@@ -74,6 +97,11 @@ try {
|
|
|
74
97
|
`- docs.maxLoc: ${runtime.docs?.maxLoc || 800} lines per doc file`
|
|
75
98
|
);
|
|
76
99
|
|
|
100
|
+
const style = readCodingStyle(projectRoot, runtime.codingLevel);
|
|
101
|
+
if (style) {
|
|
102
|
+
lines.push('', '## Communication style', style);
|
|
103
|
+
}
|
|
104
|
+
|
|
77
105
|
process.stdout.write(`${lines.join('\n')}\n`);
|
|
78
106
|
} catch (error) {
|
|
79
107
|
logCrash('rules', error);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Copyright (c) 2026 Haposoft. MIT License.
|
|
6
|
+
*
|
|
7
|
+
* UserPromptSubmit hook — secret-output-guardrail.cjs (Codex)
|
|
8
|
+
*
|
|
9
|
+
* Mirror of the Claude hook. The privacy hook gates whether a sensitive file may be
|
|
10
|
+
* read; nothing gated whether an approved value may then be printed into the
|
|
11
|
+
* transcript, where it survives compaction and is replayed on every later turn.
|
|
12
|
+
*
|
|
13
|
+
* Reads the prompt and never echoes it: no prompt text and no matched value is
|
|
14
|
+
* written out, so the guardrail cannot itself become the leak. Fail-open.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const { logCrash, readPayload } = require('./lib/hook-context.cjs');
|
|
18
|
+
const { REMINDER, containsSecretKeyword } = require('./lib/secret-keywords.cjs');
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const payload = readPayload();
|
|
22
|
+
if (!payload) process.exit(0);
|
|
23
|
+
|
|
24
|
+
const prompt = String(payload.prompt || payload.user_prompt || '');
|
|
25
|
+
if (!containsSecretKeyword(prompt)) process.exit(0);
|
|
26
|
+
|
|
27
|
+
process.stdout.write(`${REMINDER}\n`);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
logCrash('secret-output-guardrail', error);
|
|
30
|
+
}
|
|
@@ -6,6 +6,7 @@ const path = require('path');
|
|
|
6
6
|
const {
|
|
7
7
|
atomicWrite,
|
|
8
8
|
getHookContext,
|
|
9
|
+
hookStateDir,
|
|
9
10
|
logCrash,
|
|
10
11
|
readPayload
|
|
11
12
|
} = require('./lib/hook-context.cjs');
|
|
@@ -132,13 +133,7 @@ try {
|
|
|
132
133
|
const currentStatuses = processWorkflow
|
|
133
134
|
? Object.fromEntries(Object.entries(registry).map(([taskPath, task]) => [taskPath, task?.status || 'pending']))
|
|
134
135
|
: taskStatusMap(activeSpec);
|
|
135
|
-
const cacheFile = path.join(
|
|
136
|
-
projectRoot,
|
|
137
|
-
'.codex',
|
|
138
|
-
'hooks',
|
|
139
|
-
'.logs',
|
|
140
|
-
'spec-gate-last.json'
|
|
141
|
-
);
|
|
136
|
+
const cacheFile = path.join(hookStateDir(projectRoot), 'spec-gate-last.json');
|
|
142
137
|
const cacheExists = fs.existsSync(cacheFile);
|
|
143
138
|
let cache = {};
|
|
144
139
|
if (cacheExists) {
|
|
@@ -169,7 +164,7 @@ try {
|
|
|
169
164
|
if (staleFlashTasks.length > 0) {
|
|
170
165
|
process.stdout.write(`${JSON.stringify({
|
|
171
166
|
decision: 'block',
|
|
172
|
-
reason: `Completion gate: ${staleFlashTasks.length} task(s) marked done with FLASH_UNVERIFIED (${staleFlashTasks.join(', ')}). Run /
|
|
167
|
+
reason: `Completion gate: ${staleFlashTasks.length} task(s) marked done with FLASH_UNVERIFIED (${staleFlashTasks.join(', ')}). Run /cf:test, then use explicit sync-finalize.`
|
|
173
168
|
})}\n`);
|
|
174
169
|
process.exit(0);
|
|
175
170
|
}
|
|
@@ -7,6 +7,7 @@ const path = require('path');
|
|
|
7
7
|
const {
|
|
8
8
|
atomicWrite,
|
|
9
9
|
getHookContext,
|
|
10
|
+
hookStateDir,
|
|
10
11
|
logCrash,
|
|
11
12
|
readPayload
|
|
12
13
|
} = require('./lib/hook-context.cjs');
|
|
@@ -21,7 +22,7 @@ function cacheFile(projectRoot, sessionId) {
|
|
|
21
22
|
.update(String(sessionId || 'unknown'))
|
|
22
23
|
.digest('hex')
|
|
23
24
|
.slice(0, 16);
|
|
24
|
-
return path.join(projectRoot,
|
|
25
|
+
return path.join(hookStateDir(projectRoot), `tollgate-${key}.txt`);
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
try {
|
|
@@ -77,15 +78,33 @@ try {
|
|
|
77
78
|
result[status] = (result[status] || 0) + 1;
|
|
78
79
|
return result;
|
|
79
80
|
}, {});
|
|
81
|
+
const featureDir = path.join(active.specsDir, active.featureName);
|
|
80
82
|
const statuses = new Map(tasks.map(([taskPath, task]) => [
|
|
81
83
|
taskPath,
|
|
82
84
|
task?.status || 'pending'
|
|
83
85
|
]));
|
|
86
|
+
const dependencyProof = processWorkflow
|
|
87
|
+
? RECEIPT.workflowDependencyProofState(featureDir, taskRegistry, runtimeContext, POLICY)
|
|
88
|
+
: {};
|
|
89
|
+
const taskState = tasks.map(([taskPath, task]) => [
|
|
90
|
+
taskPath,
|
|
91
|
+
task?.status || 'pending',
|
|
92
|
+
[...(Array.isArray(task?.dependencies) ? task.dependencies : [])].sort(),
|
|
93
|
+
]).sort(([left], [right]) => left.localeCompare(right));
|
|
94
|
+
const proofState = Object.entries(dependencyProof).map(([taskPath, proof]) => [
|
|
95
|
+
taskPath,
|
|
96
|
+
proof.done,
|
|
97
|
+
proof.valid,
|
|
98
|
+
proof.eligible,
|
|
99
|
+
proof.signature,
|
|
100
|
+
]);
|
|
84
101
|
const next = tasks.find(([, task]) => (
|
|
85
|
-
|
|
86
|
-
&& (task?.
|
|
102
|
+
active.queueReady !== false
|
|
103
|
+
&& (task?.status || 'pending') === 'pending'
|
|
104
|
+
&& (task?.dependencies || []).every((dependency) => (
|
|
105
|
+
processWorkflow ? dependencyProof[dependency]?.eligible === true : statuses.get(dependency) === 'done'
|
|
106
|
+
))
|
|
87
107
|
));
|
|
88
|
-
const featureDir = path.join(active.specsDir, active.featureName);
|
|
89
108
|
const featureReceiptPresent = !processWorkflow
|
|
90
109
|
&& RECEIPT.safeRead(featureDir, 'feature-receipt.md').status === 'ok';
|
|
91
110
|
const stateKey = JSON.stringify({
|
|
@@ -99,6 +118,10 @@ try {
|
|
|
99
118
|
Head: runtimeContext.head,
|
|
100
119
|
context_id: runtimeContext.context_id,
|
|
101
120
|
phase,
|
|
121
|
+
workflow_contract: active.workflowContract || null,
|
|
122
|
+
queue_ready: active.queueReady !== false,
|
|
123
|
+
task_state: taskState,
|
|
124
|
+
proof_state: proofState,
|
|
102
125
|
done: counts.done || 0,
|
|
103
126
|
total: tasks.length,
|
|
104
127
|
feature_receipt_present: featureReceiptPresent,
|
|
@@ -108,9 +131,12 @@ try {
|
|
|
108
131
|
try { previous = fs.readFileSync(cache, 'utf8').trim(); } catch { /* first run */ }
|
|
109
132
|
|
|
110
133
|
if (previous === stateKey) {
|
|
134
|
+
const migration = processWorkflow && active.queueReady === false
|
|
135
|
+
? ' Add `Specs-Contract: process-first-ready-v1` after the plan title before tasks can enter Next.'
|
|
136
|
+
: '';
|
|
111
137
|
process.stdout.write(
|
|
112
138
|
`> Spec \`${active.featureName}\` @ \`${phase}\` `
|
|
113
|
-
+ `(${counts.done || 0}/${tasks.length} tasks done). Tollgate active
|
|
139
|
+
+ `(${counts.done || 0}/${tasks.length} tasks done). Tollgate active.${migration}\n`
|
|
114
140
|
);
|
|
115
141
|
process.exit(0);
|
|
116
142
|
}
|
|
@@ -125,6 +151,9 @@ try {
|
|
|
125
151
|
lines.push(`- Flash verification pending: ${flashTasks.map((taskPath) => `\`${taskPath}\``).join(', ')}. A PASS proof keeps the persisted task in_progress until explicit sync-finalize.`);
|
|
126
152
|
}
|
|
127
153
|
if (processWorkflow) {
|
|
154
|
+
if (active.queueReady === false) {
|
|
155
|
+
lines.push('- Migration required: add `Specs-Contract: process-first-ready-v1` after the plan title before tasks can enter Next.');
|
|
156
|
+
}
|
|
128
157
|
lines.push(
|
|
129
158
|
'- Sync each flat task `Status:` only after verified work; task proof belongs in that task\'s inline `## Receipt`.',
|
|
130
159
|
`- Workflow source: \`specs/${active.featureName}/plan.md\`; Stop revalidates every task currently marked done.`,
|
package/src/codex/hooks.json
CHANGED
|
@@ -38,6 +38,11 @@
|
|
|
38
38
|
"UserPromptSubmit": [
|
|
39
39
|
{
|
|
40
40
|
"hooks": [
|
|
41
|
+
{
|
|
42
|
+
"type": "command",
|
|
43
|
+
"command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/secret-output-guardrail.cjs\"",
|
|
44
|
+
"commandWindows": "node \".codex/hooks/secret-output-guardrail.cjs\""
|
|
45
|
+
},
|
|
41
46
|
{
|
|
42
47
|
"type": "command",
|
|
43
48
|
"command": "node \"$(git rev-parse --show-toplevel)/.codex/hooks/privacy-approval.cjs\"",
|
package/src/codex/runtime.json
CHANGED
package/src/common/.env.example
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# ============================================
|
|
9
9
|
|
|
10
10
|
# Google Gemini / AI Studio API key
|
|
11
|
-
# Required for
|
|
11
|
+
# Required for cf:test Multimodal Visual checks
|
|
12
12
|
# Get from: https://aistudio.google.com/apikey
|
|
13
13
|
GEMINI_API_KEY=
|
|
14
14
|
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: hapo:backend-development
|
|
3
|
-
description: Build backends with Node.js, Python, Go (NestJS, FastAPI, Django). Use for REST/GraphQL/gRPC APIs, auth (OAuth, JWT), databases, microservices, security (OWASP), Docker/K8s.
|
|
4
|
-
license: MIT
|
|
5
|
-
user-invocable: true
|
|
6
|
-
when_to_use: "Invoke to build or modify server APIs, services, and data layers."
|
|
7
|
-
category: backend
|
|
8
|
-
keywords: [backend, api, server, database]
|
|
9
|
-
argument-hint: "[framework] [task]"
|
|
10
|
-
metadata:
|
|
11
|
-
author: haposoft
|
|
12
|
-
version: "1.0.0"
|
|
13
|
-
---
|
|
14
|
-
# Backend Development Skill
|
|
15
|
-
|
|
16
|
-
Production-ready backend development with modern technologies, best practices, and proven patterns.
|
|
17
|
-
|
|
18
|
-
## When to Use
|
|
19
|
-
|
|
20
|
-
- Designing RESTful, GraphQL, or gRPC APIs
|
|
21
|
-
- Building authentication/authorization systems
|
|
22
|
-
- Optimizing database queries and schemas
|
|
23
|
-
- Implementing caching and performance optimization
|
|
24
|
-
- OWASP Top 10 security mitigation
|
|
25
|
-
- Designing scalable microservices
|
|
26
|
-
- Testing strategies (unit, integration, E2E)
|
|
27
|
-
- CI/CD pipelines and deployment
|
|
28
|
-
- Monitoring and debugging production systems
|
|
29
|
-
|
|
30
|
-
## Technology Selection Guide
|
|
31
|
-
|
|
32
|
-
**Languages:** Node.js/TypeScript (full-stack), Python (data/ML), Go (concurrency), Rust (performance)
|
|
33
|
-
**Frameworks:** NestJS, FastAPI, Django, Express, Gin
|
|
34
|
-
**Databases:** PostgreSQL (ACID), MongoDB (flexible schema), Redis (caching)
|
|
35
|
-
**APIs:** REST (simple), GraphQL (flexible), gRPC (performance)
|
|
36
|
-
|
|
37
|
-
See: `references/backend-technologies.md` for detailed comparisons
|
|
38
|
-
|
|
39
|
-
## Reference Navigation
|
|
40
|
-
|
|
41
|
-
**Core Technologies:**
|
|
42
|
-
- `backend-technologies.md` - Languages, frameworks, databases, message queues, ORMs
|
|
43
|
-
- `backend-api-design.md` - REST, GraphQL, gRPC patterns and best practices
|
|
44
|
-
|
|
45
|
-
**Security & Authentication:**
|
|
46
|
-
- `backend-security.md` - OWASP Top 10 2025, security best practices, input validation
|
|
47
|
-
- `backend-authentication.md` - OAuth 2.1, JWT, RBAC, MFA, session management
|
|
48
|
-
|
|
49
|
-
**Performance & Architecture:**
|
|
50
|
-
- `backend-performance.md` - Caching, query optimization, load balancing, scaling
|
|
51
|
-
- `backend-architecture.md` - Microservices, event-driven, CQRS, saga patterns
|
|
52
|
-
|
|
53
|
-
**Quality & Operations:**
|
|
54
|
-
- `backend-testing.md` - Testing strategies, frameworks, tools, CI/CD testing
|
|
55
|
-
- `backend-code-quality.md` - SOLID principles, design patterns, clean code
|
|
56
|
-
- `backend-devops.md` - Docker, Kubernetes, deployment strategies, monitoring
|
|
57
|
-
- `backend-debugging.md` - Debugging strategies, profiling, logging, production debugging
|
|
58
|
-
- `backend-mindset.md` - Problem-solving, architectural thinking, collaboration
|
|
59
|
-
|
|
60
|
-
## Key Best Practices (2025)
|
|
61
|
-
|
|
62
|
-
**Security:** Argon2id passwords, parameterized queries prevent SQL injection, OAuth 2.1 + PKCE, rate limiting, security headers
|
|
63
|
-
|
|
64
|
-
**Performance:** Redis caching reduces DB load, database indexing reduces I/O, CDN cuts latency, connection pooling
|
|
65
|
-
|
|
66
|
-
**Testing:** 70-20-10 pyramid (unit-integration-E2E), Vitest or Jest, contract testing for microservices, migration tests
|
|
67
|
-
|
|
68
|
-
**DevOps:** Blue-green/canary deployments, feature flags can reduce failures, Kubernetes, Prometheus/Grafana monitoring, OpenTelemetry tracing
|
|
69
|
-
|
|
70
|
-
## Quick Decision Matrix
|
|
71
|
-
|
|
72
|
-
| Need | Choose |
|
|
73
|
-
|------|--------|
|
|
74
|
-
| Fast development | Node.js + NestJS |
|
|
75
|
-
| Data/ML integration | Python + FastAPI |
|
|
76
|
-
| High concurrency | Go + Gin |
|
|
77
|
-
| Max performance | Rust + Axum |
|
|
78
|
-
| ACID transactions | PostgreSQL |
|
|
79
|
-
| Flexible schema | MongoDB |
|
|
80
|
-
| Caching | Redis |
|
|
81
|
-
| Internal services | gRPC |
|
|
82
|
-
| Public APIs | GraphQL/REST |
|
|
83
|
-
| Real-time events | Kafka |
|
|
84
|
-
|
|
85
|
-
## Implementation Checklist
|
|
86
|
-
|
|
87
|
-
**API:** Choose style → Design schema → Validate input → Add auth → Rate limiting → Documentation → Error handling
|
|
88
|
-
|
|
89
|
-
**Database:** Choose DB → Design schema → Create indexes → Connection pooling → Migration strategy → Backup/restore → Test performance
|
|
90
|
-
|
|
91
|
-
**Security:** OWASP Top 10 → Parameterized queries → OAuth 2.1 + JWT → Security headers → Rate limiting → Input validation → Argon2id passwords
|
|
92
|
-
|
|
93
|
-
**Testing:** Unit 70% → Integration 20% → E2E 10% → Load tests → Migration tests → Contract tests (microservices)
|
|
94
|
-
|
|
95
|
-
**Deployment:** Docker → CI/CD → Blue-green/canary → Feature flags → Monitoring → Logging → Health checks
|
|
96
|
-
|
|
97
|
-
## Resources
|
|
98
|
-
|
|
99
|
-
- OWASP Top 10: https://owasp.org/www-project-top-ten/
|
|
100
|
-
- OAuth 2.1: https://oauth.net/2.1/
|
|
101
|
-
- OpenTelemetry: https://opentelemetry.io/
|