@haposoft/cafekit 0.18.2 → 0.18.4
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 +1 -1
- package/bin/__tests__/adv-skill.test.js +370 -0
- package/bin/__tests__/agent-authority.test.js +38 -0
- package/bin/__tests__/agent-instructions.test.js +54 -0
- package/bin/__tests__/claude-plugin-build.test.js +151 -0
- package/bin/__tests__/codex-hook-runtime-fixture.cjs +26 -0
- package/bin/__tests__/codex-hooks-ownership.test.js +8 -11
- package/bin/__tests__/codex-hooks.test.js +87 -85
- package/bin/__tests__/codex-implicit-policy.test.js +160 -0
- package/bin/__tests__/codex-native-hook-boundaries.test.js +2 -4
- package/bin/__tests__/codex-native.test.js +136 -2298
- package/bin/__tests__/codex-plugin-build.test.js +230 -0
- package/bin/__tests__/codex-plugin-context.test.js +135 -0
- package/bin/__tests__/codex-plugin-hooks.test.js +220 -0
- package/bin/__tests__/codex-quiet-hooks.test.js +2 -8
- package/bin/__tests__/codex-runtime-layout.test.js +81 -0
- package/bin/__tests__/codex-setup-agents.test.js +216 -0
- package/bin/__tests__/codex-skill-projections.test.js +101 -0
- package/bin/__tests__/develop-contract.test.js +100 -874
- package/bin/__tests__/legacy-hooks-retired.test.js +63 -13
- package/bin/__tests__/migrate-apply.test.js +373 -0
- package/bin/__tests__/migrate-cli.test.js +152 -0
- package/bin/__tests__/migrate-merged.test.js +269 -0
- package/bin/__tests__/migrate-plan.test.js +271 -0
- package/bin/__tests__/omp-bridge.test.js +81 -5
- package/bin/__tests__/omp-hooks.test.js +24 -0
- package/bin/__tests__/orca-session.test.js +2 -16
- package/bin/__tests__/package-inventory.test.js +228 -2044
- package/bin/__tests__/plugin-safety-keys.test.js +121 -0
- package/bin/__tests__/privacy-paths.test.js +184 -0
- package/bin/__tests__/secret-scanner.test.js +73 -0
- package/bin/__tests__/skill-routing-source.test.js +6 -0
- package/bin/__tests__/toaa-skill.test.js +195 -0
- package/bin/__tests__/usage-hook-retired.test.js +24 -6
- package/bin/__tests__/validator-grounding.test.js +0 -198
- package/bin/__tests__/vibe-run.test.js +215 -0
- package/bin/__tests__/vibe-skill.test.js +548 -0
- package/bin/__tests__/website-docs.test.js +58 -0
- package/bin/install.js +99 -1
- package/bin/lib/backup.js +43 -24
- package/bin/lib/codex-install.js +12 -3
- package/bin/lib/context.js +5 -0
- package/bin/lib/lock.js +98 -18
- package/bin/lib/managed-writer.js +16 -10
- package/bin/lib/migrate-apply.js +202 -0
- package/bin/lib/migrate-merged.js +342 -0
- package/bin/lib/migrate-plan.js +419 -0
- package/bin/lib/plugin-inventory.js +33 -0
- package/bin/phases/claude-runtime.js +5 -3
- package/bin/phases/codex-hooks.js +38 -0
- package/bin/phases/codex-runtime.js +106 -74
- package/bin/phases/copy-payload.js +49 -1
- package/bin/phases/omp-runtime.js +4 -26
- package/bin/phases/root-config.js +5 -2
- package/package.json +1 -1
- package/src/claude/CLAUDE.md +1 -1
- package/src/claude/agents/advisor.md +55 -0
- package/src/claude/agents/debugger.md +2 -3
- package/src/claude/agents/deployer.md +2 -1
- package/src/claude/agents/docs-keeper.md +12 -0
- package/src/claude/agents/inspector.md +1 -1
- package/src/claude/agents/project-manager.md +2 -2
- package/src/claude/agents/researcher.md +0 -1
- package/src/claude/agents/spec-maker.md +4 -1
- package/src/claude/hooks/__tests__/plugin-context.test.js +96 -0
- package/src/claude/hooks/__tests__/plugin-options.test.js +141 -0
- package/src/claude/hooks/__tests__/plugin-state-isolation.test.js +125 -0
- package/src/claude/hooks/__tests__/precompact.test.js +7 -1
- package/src/claude/hooks/__tests__/privacy-block.test.js +33 -35
- package/src/claude/hooks/__tests__/setup-statusline.test.js +179 -0
- package/src/claude/hooks/__tests__/spec-gate.test.js +86 -48
- package/src/claude/hooks/__tests__/state.test.js +21 -0
- package/src/claude/hooks/agent.cjs +5 -2
- package/src/claude/hooks/inspect-block.cjs +3 -1
- package/src/claude/hooks/lib/hook-state-dir.cjs +19 -1
- package/src/claude/hooks/lib/plugin-options.cjs +47 -0
- package/src/claude/hooks/lib/privacy-command-analysis.cjs +130 -11
- package/src/claude/hooks/lib/privacy-paths.cjs +370 -10
- package/src/claude/hooks/lib/spec-touch.cjs +14 -1
- package/src/claude/hooks/plugin-context.cjs +80 -0
- package/src/claude/hooks/privacy-block.cjs +2 -1
- package/src/claude/hooks/rules.cjs +5 -2
- package/src/claude/hooks/session.cjs +4 -1
- package/src/claude/hooks/spec-state.cjs +5 -4
- package/src/claude/hooks/state.cjs +27 -1
- package/src/claude/migration-manifest.json +7 -1
- package/src/claude/plugin/commands/setup-statusline.md +12 -0
- package/src/claude/plugin/core.md +71 -0
- package/src/claude/rules/manage-docs.md +1 -2
- package/src/claude/rules/review-audit-self-decision.md +1 -1
- package/src/claude/rules/skill-workflow-routing.md +1 -1
- package/src/claude/rules/state-sync.md +14 -0
- package/src/claude/rules/workflow.md +1 -1
- package/src/claude/scripts/generate-skill-catalog.cjs +5 -0
- package/src/claude/scripts/provenance.cjs +40 -16
- package/src/claude/scripts/scan-staged-secrets.cjs +49 -3
- package/src/claude/scripts/setup-statusline.cjs +88 -0
- package/src/claude/skills/adv/SKILL.md +139 -0
- package/src/claude/skills/adv/references/optional-modes.md +41 -0
- package/src/claude/skills/adv/references/ultra-mode.md +29 -0
- package/src/claude/skills/brainstorm/SKILL.md +1 -1
- package/src/claude/skills/code-review/SKILL.md +4 -1
- package/src/claude/skills/code-review/references/pr-fix-reply.md +42 -0
- package/src/claude/skills/develop/SKILL.md +11 -3
- package/src/claude/skills/develop/references/quality-gate.md +1 -1
- package/src/claude/skills/fix/SKILL.md +2 -2
- package/src/claude/skills/git/SKILL.md +4 -2
- package/src/claude/skills/git/references/merge-pr.md +125 -0
- package/src/claude/skills/specs/SKILL.md +2 -2
- package/src/claude/skills/specs/references/review.md +1 -1
- package/src/claude/skills/specs/references/templates.md +2 -0
- package/src/claude/skills/sync/SKILL.md +4 -0
- package/src/claude/skills/toaa/SKILL.md +82 -0
- package/src/claude/skills/toaa/references/autonomous-orchestration.md +54 -0
- package/src/claude/skills/toaa/references/prerequisites-checklist.md +37 -0
- package/src/claude/skills/vibe/SKILL.md +69 -0
- package/src/claude/skills/vibe/references/pipeline-skill-integration.md +34 -0
- package/src/claude/skills/vibe/references/report-templates.md +84 -0
- package/src/claude/skills/vibe/references/subagent-orchestration.md +23 -0
- package/src/codex/AGENTS.md +1 -1
- package/src/codex/hooks/inspect-block.cjs +7 -4
- package/src/codex/hooks/lib/hook-context.cjs +119 -4
- package/src/codex/hooks/lib/plugin-options.cjs +2 -0
- package/src/codex/hooks/lib/privacy-state.cjs +18 -1
- package/src/codex/hooks/lib/state-store.cjs +31 -6
- package/src/codex/hooks/precompact.cjs +9 -8
- package/src/codex/hooks/privacy-approval.cjs +2 -2
- package/src/codex/hooks/privacy-block.cjs +5 -4
- package/src/codex/hooks/rules.cjs +12 -6
- package/src/codex/hooks/session.cjs +22 -10
- package/src/codex/plugin/core.md +76 -0
- package/src/codex/plugin/hooks/plugin-context.cjs +63 -0
- package/src/codex/plugin/skills/setup-agents/SKILL.md +17 -0
- package/src/codex/scripts/setup-agents.cjs +124 -0
- package/src/common/AGENTS.md +1 -1
- package/src/omp/extensions/{cafekit-bridge.mjs → cafekit-bridge.js} +73 -5
- package/src/omp/hooks/privacy-block.cjs +2 -1
- package/bin/__tests__/codex-research-projection.test.js +0 -70
- package/bin/__tests__/codex-specs-projection.test.js +0 -76
- package/bin/__tests__/specs-v2-execution-closeout.test.js +0 -58
- package/src/claude/skills/chrome-devtools/scripts/__tests__/error-handling.test.js +0 -102
|
@@ -163,3 +163,27 @@ test('an empty stdin is denied under omp, where Claude asks', () => {
|
|
|
163
163
|
assert.equal(output.permissionDecision, 'deny');
|
|
164
164
|
assert.match(output.permissionDecisionReason, /Sensitive access could not be evaluated safely\./);
|
|
165
165
|
});
|
|
166
|
+
|
|
167
|
+
test('omp edits that move, rename or hide their target cannot reach a protected file', () => {
|
|
168
|
+
withSecretProject((root) => {
|
|
169
|
+
const run = (tool, input) => verdict(path.join(INSTALLED, 'privacy-block.cjs'), { tool_name: tool, tool_input: input, cwd: root });
|
|
170
|
+
// Envelopes as omp delivers them to extensions: it adds `path`/`paths` from file headers.
|
|
171
|
+
assert.equal(run('edit', { input: '[notes.md#ABCD]\nMV .env', path: 'notes.md', paths: ['notes.md'] }).decision, 'deny', 'hashline MV');
|
|
172
|
+
assert.equal(run('edit', { path: 'notes.md', edits: [{ op: 'update', rename: '.omp/runtime.json', diff: '' }] }).decision, 'deny', 'patch rename');
|
|
173
|
+
assert.equal(run('edit', { input: '*** Edit File: .env\n@@\n+X=1' }).decision, 'deny', 'sloppy header');
|
|
174
|
+
assert.equal(run('edit', { input: 'no file header at all' }).decision, 'deny', 'an edit that names no file is not evaluated');
|
|
175
|
+
assert.equal(run('edit', { input: '[notes.md#ABCD]\nPUT >2:\n+x', path: 'notes.md', paths: ['notes.md'] }).decision, null, 'an ordinary edit passes');
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test('omp read selectors and eval code cannot reach a secret file', () => {
|
|
180
|
+
withSecretProject((root) => {
|
|
181
|
+
fs.writeFileSync(path.join(root, 'README.md'), 'hi\n');
|
|
182
|
+
const run = (tool, input) => verdict(path.join(INSTALLED, 'privacy-block.cjs'), { tool_name: tool, tool_input: input, cwd: root });
|
|
183
|
+
assert.equal(run('read', { path: '.env:raw' }).decision, 'deny', 'raw selector');
|
|
184
|
+
assert.equal(run('read', { path: '.env:1-50' }).decision, 'deny', 'line range selector');
|
|
185
|
+
assert.equal(run('read', { path: 'README.md:1-5' }).decision, null, 'a selector on an ordinary file passes');
|
|
186
|
+
assert.equal(run('eval', { language: 'python', code: "print(open('.env').read())" }).decision, 'deny', 'eval naming a secret');
|
|
187
|
+
assert.equal(run('eval', { language: 'python', code: 'credentials = 1\nprint(credentials)' }).decision, null, 'an identifier is not a file');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -15,6 +15,7 @@ const os = require('node:os');
|
|
|
15
15
|
const path = require('node:path');
|
|
16
16
|
const { spawnSync } = require('node:child_process');
|
|
17
17
|
const { test } = require('node:test');
|
|
18
|
+
const { installCodexHookRuntime } = require('./codex-hook-runtime-fixture.cjs');
|
|
18
19
|
|
|
19
20
|
const PACKAGE_ROOT = path.join(__dirname, '..', '..');
|
|
20
21
|
const CLAUDE_HOOK = path.join(PACKAGE_ROOT, 'src/claude/hooks/session.cjs');
|
|
@@ -142,22 +143,7 @@ test('no token ever reaches stdout, stderr, or the Claude env file', () => {
|
|
|
142
143
|
// ---------------------------------------------------------------------------------------
|
|
143
144
|
|
|
144
145
|
function composeCodexHookTree(root) {
|
|
145
|
-
const hooksDir =
|
|
146
|
-
fs.mkdirSync(path.join(hooksDir, 'lib'), { recursive: true });
|
|
147
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/codex/hooks/session.cjs'), path.join(hooksDir, 'session.cjs'));
|
|
148
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/codex/hooks/lib/hook-context.cjs'),
|
|
149
|
-
path.join(hooksDir, 'lib', 'hook-context.cjs'));
|
|
150
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/codex/hooks/lib/privacy-state.cjs'),
|
|
151
|
-
path.join(hooksDir, 'lib', 'privacy-state.cjs'));
|
|
152
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/codex/hooks/lib/rules-reservation.cjs'),
|
|
153
|
-
path.join(hooksDir, 'lib', 'rules-reservation.cjs'));
|
|
154
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/claude/hooks/lib/update-check.cjs'),
|
|
155
|
-
path.join(hooksDir, 'lib', 'update-check.cjs'));
|
|
156
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/claude/hooks/lib/runtime-path-safety.cjs'),
|
|
157
|
-
path.join(hooksDir, 'lib', 'runtime-path-safety.cjs'));
|
|
158
|
-
for (const name of ['privacy-paths.cjs', 'privacy-command-analysis.cjs']) {
|
|
159
|
-
fs.copyFileSync(path.join(PACKAGE_ROOT, 'src/claude/hooks/lib', name), path.join(hooksDir, 'lib', name));
|
|
160
|
-
}
|
|
146
|
+
const hooksDir = installCodexHookRuntime(root);
|
|
161
147
|
return path.join(hooksDir, 'session.cjs');
|
|
162
148
|
}
|
|
163
149
|
|