@haposoft/cafekit 0.18.0 → 0.18.2
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 +12 -1
- package/bin/__tests__/claude-settings.test.js +123 -0
- package/bin/__tests__/codex-ask-guard.test.js +123 -0
- package/bin/__tests__/codex-ask-projection.test.js +51 -0
- package/bin/__tests__/codex-hooks-ownership.test.js +80 -1
- package/bin/__tests__/codex-hooks.test.js +938 -237
- package/bin/__tests__/codex-native-hook-boundaries.test.js +136 -0
- package/bin/__tests__/codex-native.test.js +222 -149
- package/bin/__tests__/codex-projection-parity.test.js +314 -0
- package/bin/__tests__/codex-quiet-hooks.test.js +170 -0
- package/bin/__tests__/codex-research-projection.test.js +70 -0
- package/bin/__tests__/codex-specs-projection.test.js +76 -0
- package/bin/__tests__/develop-contract.test.js +102 -1362
- package/bin/__tests__/docs-sync-on-demand.test.js +25 -20
- package/bin/__tests__/inspect-paths.test.js +183 -0
- package/bin/__tests__/installer-safety.test.js +335 -0
- package/bin/__tests__/legacy-authority-decoupled.test.js +14 -19
- package/bin/__tests__/legacy-hooks-retired.test.js +18 -8
- package/bin/__tests__/omp-bridge.test.js +66 -12
- package/bin/__tests__/omp-hooks.test.js +11 -5
- package/bin/__tests__/orca-session.test.js +7 -0
- package/bin/__tests__/package-inventory.test.js +1 -395
- package/bin/__tests__/privacy-paths.test.js +317 -0
- package/bin/__tests__/spec-narrowing.test.js +30 -134
- package/bin/__tests__/specs-v2-execution-closeout.test.js +0 -372
- package/bin/__tests__/test-runtime-dependency-closure.cjs +1 -2
- package/bin/__tests__/usage-hook-retired.test.js +5 -3
- package/bin/__tests__/validator-grounding.test.js +17 -2929
- package/bin/install.js +25 -0
- package/bin/lib/codex-install.js +134 -12
- package/bin/lib/context.js +1 -1
- package/bin/lib/managed-writer.js +2 -3
- package/bin/phases/claude-runtime.js +91 -25
- package/bin/phases/claude-settings.js +22 -1
- package/bin/phases/codex-hooks.js +96 -33
- package/bin/phases/codex-runtime.js +45 -49
- package/bin/phases/copy-payload.js +11 -28
- package/bin/phases/omp-runtime.js +6 -3
- package/package.json +2 -3
- package/src/claude/CLAUDE.md +4 -0
- package/src/claude/agents/code-auditor.md +9 -6
- package/src/claude/agents/debugger.md +3 -9
- package/src/claude/agents/docs-keeper.md +4 -7
- package/src/claude/agents/git-ops.md +2 -4
- package/src/claude/agents/implementer.md +6 -7
- package/src/claude/agents/inspector.md +2 -0
- package/src/claude/agents/project-manager.md +2 -2
- package/src/claude/agents/spec-maker.md +4 -4
- package/src/claude/agents/test-runner.md +8 -11
- package/src/claude/agents/ui-ux-designer.md +0 -1
- package/src/claude/gitignore +3 -0
- package/src/claude/hooks/__tests__/installed-root.test.js +111 -0
- package/src/claude/hooks/__tests__/precompact.test.js +206 -10
- package/src/claude/hooks/__tests__/privacy-block.test.js +27 -0
- package/src/claude/hooks/__tests__/session-writeenv.test.js +25 -0
- package/src/claude/hooks/__tests__/spec-gate.test.js +311 -340
- package/src/claude/hooks/__tests__/spec-state-touched.test.js +230 -8
- package/src/claude/hooks/__tests__/state.test.js +207 -7
- package/src/claude/hooks/__tests__/update-check.test.js +88 -0
- package/src/claude/hooks/agent.cjs +7 -6
- package/src/claude/hooks/inspect-block.cjs +15 -63
- package/src/claude/hooks/lib/inspect-paths.cjs +304 -0
- package/src/claude/hooks/lib/parser.cjs +1 -1
- package/src/claude/hooks/lib/privacy-command-analysis.cjs +191 -17
- package/src/claude/hooks/lib/privacy-paths.cjs +313 -0
- package/src/claude/hooks/lib/project-root.cjs +15 -0
- package/src/claude/hooks/lib/rules-reservation.cjs +36 -0
- package/src/claude/hooks/lib/spec-touch.cjs +67 -0
- package/src/claude/hooks/lib/update-check.cjs +77 -0
- package/src/claude/hooks/precompact.cjs +8 -15
- package/src/claude/hooks/privacy-block.cjs +23 -205
- package/src/claude/hooks/rules.cjs +6 -28
- package/src/claude/hooks/session.cjs +34 -117
- package/src/claude/hooks/spec-gate.cjs +17 -89
- package/src/claude/hooks/spec-state.cjs +89 -96
- package/src/claude/hooks/state.cjs +96 -51
- package/src/claude/migration-manifest.json +20 -8
- package/src/claude/output-styles/coding-level-0-eli5.md +9 -9
- package/src/claude/output-styles/coding-level-1-junior.md +3 -3
- package/src/claude/output-styles/coding-level-2-mid.md +3 -3
- package/src/claude/output-styles/coding-level-3-senior.md +2 -2
- package/src/claude/output-styles/coding-level-4-lead.md +5 -5
- package/src/claude/output-styles/coding-level-5-god.md +6 -6
- package/src/claude/rules/ai-dev-rules.md +1 -2
- package/src/claude/rules/hook-protocols.md +1 -1
- package/src/claude/rules/workflow.md +1 -1
- package/src/claude/runtime.json +0 -3
- package/src/claude/scripts/generate-skill-catalog.cjs +2 -2
- package/src/claude/scripts/provenance.cjs +14 -0
- package/src/claude/scripts/spec-receipt.cjs +0 -114
- package/src/claude/scripts/spec-resolver.cjs +41 -457
- package/src/claude/scripts/workflow-policy.cjs +3 -1801
- package/src/claude/settings/settings.json +1 -1
- package/src/claude/skills/agent-browser/SKILL.md +1 -1
- package/src/claude/skills/ai-multimodal/scripts/check_setup.py +8 -68
- package/src/claude/skills/ai-multimodal/scripts/gemini_batch_process.py +6 -28
- package/src/claude/skills/chrome-devtools/SKILL.md +14 -31
- package/src/claude/skills/code-review/SKILL.md +25 -108
- package/src/claude/skills/code-review/references/spec-compliance-review.md +4 -7
- package/src/claude/skills/develop/SKILL.md +22 -70
- package/src/claude/skills/develop/references/subagent-patterns.md +0 -6
- package/src/claude/skills/git/SKILL.md +1 -1
- package/src/claude/skills/git/references/worktree-blueprint.md +1 -1
- package/src/claude/skills/research/SKILL.md +24 -55
- package/src/claude/skills/sync/SKILL.md +12 -34
- package/src/claude/skills/sync/references/rebind-and-audit.md +2 -2
- package/src/claude/skills/test/SKILL.md +39 -123
- package/src/claude/skills/test/references/execution-strategy.md +11 -22
- package/src/claude/skills/ui-ux/SKILL.md +1 -1
- package/src/claude/skills/ui-ux-pro-max/SKILL.md +24 -79
- package/src/claude/skills/web-testing/SKILL.md +2 -20
- package/src/codex/AGENTS.md +8 -0
- package/src/codex/hooks/ask-guard.cjs +54 -0
- package/src/codex/hooks/inspect-block.cjs +11 -7
- package/src/codex/hooks/lib/inspect-paths.cjs +1 -199
- package/src/codex/hooks/lib/privacy-paths.cjs +1 -0
- package/src/codex/hooks/lib/privacy-state.cjs +98 -16
- package/src/codex/hooks/lib/rules-reservation.cjs +38 -0
- package/src/codex/hooks/lib/secret-keywords.cjs +1 -0
- package/src/codex/hooks/lib/spec-receipt.cjs +2 -30
- package/src/codex/hooks/lib/spec-session-touch.cjs +100 -0
- package/src/codex/hooks/lib/spec-touch.cjs +3 -0
- package/src/codex/hooks/lib/spec-utils.cjs +6 -45
- package/src/codex/hooks/lib/update-check.cjs +1 -0
- package/src/codex/hooks/precompact.cjs +39 -0
- package/src/codex/hooks/privacy-approval.cjs +28 -17
- package/src/codex/hooks/privacy-block.cjs +9 -215
- package/src/codex/hooks/rules.cjs +4 -30
- package/src/codex/hooks/secret-output-guardrail.cjs +1 -1
- package/src/codex/hooks/session.cjs +47 -11
- package/src/codex/hooks/spec-gate.cjs +32 -74
- package/src/codex/hooks/spec-state.cjs +68 -46
- package/src/codex/hooks/state.cjs +25 -4
- package/src/codex/hooks.json +39 -7
- package/src/codex/rules/hook-protocols.md +13 -6
- package/src/common/AGENTS.md +4 -10
- package/src/omp/extensions/cafekit-bridge.mjs +12 -4
- package/src/omp/hooks/privacy-block.cjs +24 -206
- package/bin/__tests__/change-firewall.semantic-firewall.test.js +0 -2133
- package/bin/__tests__/finalizer-pass-gate.semantic-firewall.test.js +0 -342
- package/bin/__tests__/release-preflight.semantic-firewall.test.js +0 -586
- package/bin/__tests__/review-receipt-c2.semantic-firewall.test.js +0 -378
- package/bin/__tests__/specs-v2-policy-and-scaffold.test.js +0 -665
- package/bin/__tests__/specs-v2-validator-grounder-contract.test.js +0 -1132
- package/src/claude/hooks/lib/context.cjs +0 -527
- package/src/claude/hooks/lib/detect.cjs +0 -474
- package/src/claude/scripts/change-firewall.cjs +0 -1748
- package/src/claude/scripts/spec-authoring-digest.cjs +0 -151
- package/src/claude/scripts/spec-authoring-validation.cjs +0 -126
- package/src/claude/scripts/spec-final-state.cjs +0 -290
- package/src/claude/scripts/spec-ground.cjs +0 -650
- package/src/claude/scripts/spec-readiness.cjs +0 -425
- package/src/claude/scripts/spec-scaffold.cjs +0 -2317
- package/src/claude/scripts/spec-semantic-model.cjs +0 -396
- package/src/claude/scripts/validate-spec-output.cjs +0 -3914
- package/src/claude/skills/code-review/references/verification-gate.md +0 -41
- package/src/claude/skills/specs/templates/design.md +0 -82
- package/src/claude/skills/specs/templates/requirements-init.md +0 -8
- package/src/claude/skills/specs/templates/requirements.md +0 -42
- package/src/claude/skills/specs/templates/spec-state.json +0 -56
- package/src/claude/skills/specs/templates/task.md +0 -47
- package/src/codex/rules/state-sync.md +0 -60
|
@@ -236,7 +236,7 @@ agent-browser snapshot -i
|
|
|
236
236
|
agent-browser fill @e1 "user@example.com"
|
|
237
237
|
agent-browser fill @e2 "password123"
|
|
238
238
|
agent-browser click @e3 # Submit button
|
|
239
|
-
agent-browser wait url "/dashboard"
|
|
239
|
+
agent-browser wait --url "/dashboard"
|
|
240
240
|
```
|
|
241
241
|
|
|
242
242
|
### State Persistence (Auth)
|
|
@@ -5,7 +5,6 @@ Validate ai-multimodal skill setup and configuration.
|
|
|
5
5
|
Checks:
|
|
6
6
|
- API key presence and format
|
|
7
7
|
- Python dependencies
|
|
8
|
-
- Centralized resolver availability
|
|
9
8
|
- Directory structure
|
|
10
9
|
"""
|
|
11
10
|
|
|
@@ -85,69 +84,16 @@ def check_dependencies():
|
|
|
85
84
|
return True
|
|
86
85
|
|
|
87
86
|
|
|
88
|
-
def check_centralized_resolver():
|
|
89
|
-
"""Check if centralized resolver is available."""
|
|
90
|
-
print_header("Checking Centralized Resolver")
|
|
91
|
-
|
|
92
|
-
claude_root = Path(__file__).parent.parent.parent.parent
|
|
93
|
-
resolver_path = claude_root / 'scripts' / 'resolve_env.py'
|
|
94
|
-
|
|
95
|
-
if resolver_path.exists():
|
|
96
|
-
print_success(f"Centralized resolver found: {resolver_path}")
|
|
97
|
-
|
|
98
|
-
# Try to import it
|
|
99
|
-
sys.path.insert(0, str(resolver_path.parent))
|
|
100
|
-
try:
|
|
101
|
-
from resolve_env import resolve_env
|
|
102
|
-
print_success("Centralized resolver can be imported")
|
|
103
|
-
return True
|
|
104
|
-
except ImportError as e:
|
|
105
|
-
print_error(f"Centralized resolver exists but cannot be imported: {e}")
|
|
106
|
-
return False
|
|
107
|
-
else:
|
|
108
|
-
print_warning(f"Centralized resolver not found: {resolver_path}")
|
|
109
|
-
print_info("Skill will use fallback resolution logic")
|
|
110
|
-
return True # Not critical, fallback works
|
|
111
|
-
|
|
112
|
-
|
|
113
87
|
def find_api_key():
|
|
114
|
-
"""Find
|
|
88
|
+
"""Find the API key in the runtime environment."""
|
|
115
89
|
print_header("Checking API Key Configuration")
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
print_info("Using centralized resolver...")
|
|
124
|
-
api_key = resolve_env('GEMINI_API_KEY', skill='ai-multimodal')
|
|
125
|
-
|
|
126
|
-
if api_key:
|
|
127
|
-
print_success("API key found via centralized resolver")
|
|
128
|
-
print_info(f"Key preview: {api_key[:20]}...{api_key[-4:]}")
|
|
129
|
-
|
|
130
|
-
# Show hierarchy
|
|
131
|
-
print_info("\nTo see where the key was found, run:")
|
|
132
|
-
print_info("python ~/packages/spec/src/claude/scripts/resolve_env.py GEMINI_API_KEY --skill ai-multimodal --verbose")
|
|
133
|
-
|
|
134
|
-
return api_key
|
|
135
|
-
else:
|
|
136
|
-
print_error("API key not found in any location")
|
|
137
|
-
return None
|
|
138
|
-
|
|
139
|
-
except ImportError:
|
|
140
|
-
print_warning("Centralized resolver not available, using fallback")
|
|
141
|
-
|
|
142
|
-
# Fallback: check environment
|
|
143
|
-
api_key = os.getenv('GEMINI_API_KEY')
|
|
144
|
-
if api_key:
|
|
145
|
-
print_success("API key found in process.env")
|
|
146
|
-
print_info(f"Key preview: {api_key[:20]}...{api_key[-4:]}")
|
|
147
|
-
return api_key
|
|
148
|
-
else:
|
|
149
|
-
print_error("API key not found")
|
|
150
|
-
return None
|
|
90
|
+
api_key = os.getenv('GEMINI_API_KEY')
|
|
91
|
+
if api_key:
|
|
92
|
+
print_success("API key found in process.env")
|
|
93
|
+
print_info(f"Key preview: {api_key[:20]}...{api_key[-4:]}")
|
|
94
|
+
return api_key
|
|
95
|
+
print_error("API key not found")
|
|
96
|
+
return None
|
|
151
97
|
|
|
152
98
|
|
|
153
99
|
def validate_api_key_format(api_key):
|
|
@@ -250,9 +196,6 @@ def provide_setup_instructions():
|
|
|
250
196
|
print("\n3. Verify setup:")
|
|
251
197
|
print(f" $ python {Path(__file__)}")
|
|
252
198
|
|
|
253
|
-
print("\n4. Debug if needed:")
|
|
254
|
-
print(f" $ python ~/packages/spec/src/claude/scripts/resolve_env.py --show-hierarchy --skill ai-multimodal")
|
|
255
|
-
print(f" $ python ~/packages/spec/src/claude/scripts/resolve_env.py GEMINI_API_KEY --skill ai-multimodal --verbose")
|
|
256
199
|
|
|
257
200
|
|
|
258
201
|
def main():
|
|
@@ -265,9 +208,6 @@ def main():
|
|
|
265
208
|
if not check_directory_structure():
|
|
266
209
|
all_passed = False
|
|
267
210
|
|
|
268
|
-
# Check centralized resolver
|
|
269
|
-
check_centralized_resolver()
|
|
270
|
-
|
|
271
211
|
# Check dependencies
|
|
272
212
|
if not check_dependencies():
|
|
273
213
|
all_passed = False
|
|
@@ -23,19 +23,10 @@ from typing import List, Dict, Any, Optional
|
|
|
23
23
|
import csv
|
|
24
24
|
import shutil
|
|
25
25
|
|
|
26
|
-
# Import centralized environment resolver (works for both local and global installs)
|
|
27
|
-
CLAUDE_ROOT = Path(__file__).parent.parent.parent.parent
|
|
28
|
-
sys.path.insert(0, str(CLAUDE_ROOT / 'scripts'))
|
|
29
26
|
try:
|
|
30
|
-
from
|
|
31
|
-
CENTRALIZED_RESOLVER_AVAILABLE = True
|
|
27
|
+
from dotenv import load_dotenv
|
|
32
28
|
except ImportError:
|
|
33
|
-
|
|
34
|
-
CENTRALIZED_RESOLVER_AVAILABLE = False
|
|
35
|
-
try:
|
|
36
|
-
from dotenv import load_dotenv
|
|
37
|
-
except ImportError:
|
|
38
|
-
load_dotenv = None
|
|
29
|
+
load_dotenv = None
|
|
39
30
|
|
|
40
31
|
# Import key rotation support
|
|
41
32
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / 'common'))
|
|
@@ -74,10 +65,7 @@ IMAGEN_MODELS = {
|
|
|
74
65
|
|
|
75
66
|
|
|
76
67
|
def find_api_key() -> Optional[str]:
|
|
77
|
-
"""Find Gemini API key using
|
|
78
|
-
|
|
79
|
-
Uses ~/packages/spec/src/claude/scripts/resolve_env.py for consistent resolution across all skills.
|
|
80
|
-
Falls back to local resolution if centralized resolver not available.
|
|
68
|
+
"""Find Gemini API key using local environment resolution.
|
|
81
69
|
|
|
82
70
|
Priority order (highest to lowest):
|
|
83
71
|
1. process.env (runtime environment variables)
|
|
@@ -88,11 +76,6 @@ def find_api_key() -> Optional[str]:
|
|
|
88
76
|
6. ~/packages/spec/src/claude/skills/.env (user shared)
|
|
89
77
|
7. ~/packages/spec/src/claude/.env (user global)
|
|
90
78
|
"""
|
|
91
|
-
if CENTRALIZED_RESOLVER_AVAILABLE:
|
|
92
|
-
# Use centralized resolver (recommended)
|
|
93
|
-
return resolve_env('GEMINI_API_KEY', skill='ai-multimodal')
|
|
94
|
-
|
|
95
|
-
# Fallback: Local resolution (legacy)
|
|
96
79
|
api_key = os.getenv('GEMINI_API_KEY')
|
|
97
80
|
if api_key:
|
|
98
81
|
return api_key
|
|
@@ -751,18 +734,13 @@ def batch_process(
|
|
|
751
734
|
print("Error: GEMINI_API_KEY not found in any location")
|
|
752
735
|
print("\nSearched locations (highest to lowest priority):")
|
|
753
736
|
print(" 1. OS environment (process.env)")
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
exists = "[OK]" if path.exists() else "[ ]"
|
|
758
|
-
print(f" {i}. {exists} {path}")
|
|
759
|
-
else:
|
|
760
|
-
print(" 2-7. .env files (centralized resolver unavailable)")
|
|
737
|
+
print(" 2. Runtime .env file")
|
|
738
|
+
print(" 3. Shared skills .env file")
|
|
739
|
+
print(" 4. Skill-specific .env file")
|
|
761
740
|
print("\nQuick fix — add your key to any .env file above:")
|
|
762
741
|
print(" echo 'GEMINI_API_KEY=your-key' >> ~/packages/spec/src/claude/.env")
|
|
763
742
|
print("\nOther options:")
|
|
764
743
|
print(" - Run setup checker: python scripts/check_setup.py")
|
|
765
|
-
print(" - Show full hierarchy: python ~/packages/spec/src/claude/scripts/resolve_env.py --show-hierarchy --skill ai-multimodal -v")
|
|
766
744
|
print("\nFor key rotation, add multiple keys to any .env:")
|
|
767
745
|
print(" GEMINI_API_KEY=key1")
|
|
768
746
|
print(" GEMINI_API_KEY_2=key2")
|
|
@@ -52,8 +52,7 @@ Browser visibility is resolved automatically by `resolveHeadless()` in `lib/brow
|
|
|
52
52
|
|
|
53
53
|
Override with `--headless true` or `--headless false` on any script.
|
|
54
54
|
|
|
55
|
-
-
|
|
56
|
-
- Run multiple scripts/sessions in parallel to simulate different device types (mobile, tablet, desktop).
|
|
55
|
+
Scripts share one browser and its first tab through `.browser-session.json`, so run them one at a time; parallel runs drive the same page.
|
|
57
56
|
|
|
58
57
|
## ARIA Snapshot (Element Discovery)
|
|
59
58
|
|
|
@@ -104,7 +103,6 @@ node "$SKILL_DIR/aria-snapshot.js" --url https://example.com --output ./packages
|
|
|
104
103
|
|
|
105
104
|
### Interact by Ref
|
|
106
105
|
|
|
107
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
108
106
|
Use `select-ref.js` to interact with elements by their ref:
|
|
109
107
|
|
|
110
108
|
```bash
|
|
@@ -129,7 +127,6 @@ node "$SKILL_DIR/select-ref.js" --ref e5 --action hover
|
|
|
129
127
|
|
|
130
128
|
### Store Snapshots
|
|
131
129
|
|
|
132
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
133
130
|
Store snapshots for analysis in `<project>/packages/spec/src/claude/chrome-devtools/snapshots/`:
|
|
134
131
|
|
|
135
132
|
```bash
|
|
@@ -162,7 +159,6 @@ node "$SKILL_DIR/aria-snapshot.js" --url https://example.com --output packages/s
|
|
|
162
159
|
|
|
163
160
|
## Local HTML Files
|
|
164
161
|
|
|
165
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
166
162
|
**IMPORTANT**: Never browse local HTML files via `file://` protocol. Always serve via local server:
|
|
167
163
|
**Why**: `file://` protocol blocks many browser features (CORS, ES modules, fetch API, service workers). Local server ensures proper HTTP behavior.
|
|
168
164
|
|
|
@@ -176,7 +172,7 @@ python -m http.server 3000 --directory ./dist &
|
|
|
176
172
|
node "$SKILL_DIR/navigate.js" --url http://localhost:3000
|
|
177
173
|
```
|
|
178
174
|
|
|
179
|
-
**Note**: when port 3000 is busy, find
|
|
175
|
+
**Note**: when port 3000 is busy, find its owner with `lsof -i :3000`; stop it if you started it, otherwise ask the user. Do not move to another port (`rules/process-management.md`).
|
|
180
176
|
|
|
181
177
|
## Quick Start
|
|
182
178
|
|
|
@@ -207,11 +203,10 @@ chrome-devtools auto-detects Chrome at standard OS paths and uses it automatical
|
|
|
207
203
|
|
|
208
204
|
### Manual Configuration
|
|
209
205
|
|
|
210
|
-
To force a specific Chrome installation,
|
|
206
|
+
To force a specific Chrome installation, export `CHROME_EXECUTABLE_PATH` (or `PUPPETEER_EXECUTABLE_PATH`) in the shell that runs the scripts; they read the environment, not a `.env` file:
|
|
211
207
|
|
|
212
208
|
```bash
|
|
213
|
-
|
|
214
|
-
# Edit .env and set CHROME_EXECUTABLE_PATH to your Chrome executable
|
|
209
|
+
export CHROME_EXECUTABLE_PATH="/path/to/chrome"
|
|
215
210
|
```
|
|
216
211
|
|
|
217
212
|
### Skip Chromium Download
|
|
@@ -249,7 +244,6 @@ node "$SKILL_DIR/navigate.js" --url about:blank --close true
|
|
|
249
244
|
|
|
250
245
|
## Available Scripts
|
|
251
246
|
|
|
252
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
253
247
|
All in `packages/spec/src/claude/skills/chrome-devtools/scripts/`:
|
|
254
248
|
|
|
255
249
|
| Script | Purpose |
|
|
@@ -281,15 +275,14 @@ All in `packages/spec/src/claude/skills/chrome-devtools/scripts/`:
|
|
|
281
275
|
|
|
282
276
|
## Writing Custom Test Scripts
|
|
283
277
|
|
|
284
|
-
|
|
285
|
-
For complex automation, write scripts to `<project>/packages/spec/src/claude/chrome-devtools/tmp/`:
|
|
278
|
+
For complex automation, write scripts to `$SKILL_DIR/../tmp/` (beside `scripts/`, so the `../scripts/lib/browser.js` import resolves):
|
|
286
279
|
|
|
287
280
|
```bash
|
|
288
281
|
# Create tmp directory for test scripts
|
|
289
|
-
mkdir -p $SKILL_DIR
|
|
282
|
+
mkdir -p "$SKILL_DIR/../tmp"
|
|
290
283
|
|
|
291
284
|
# Write a test script
|
|
292
|
-
cat > $SKILL_DIR
|
|
285
|
+
cat > "$SKILL_DIR/../tmp/login-test.js" << 'EOF'
|
|
293
286
|
import { getBrowser, getPage, disconnectBrowser, outputJSON } from '../scripts/lib/browser.js';
|
|
294
287
|
|
|
295
288
|
async function loginTest() {
|
|
@@ -315,7 +308,7 @@ loginTest();
|
|
|
315
308
|
EOF
|
|
316
309
|
|
|
317
310
|
# Run the test
|
|
318
|
-
node $SKILL_DIR
|
|
311
|
+
node "$SKILL_DIR/../tmp/login-test.js"
|
|
319
312
|
```
|
|
320
313
|
|
|
321
314
|
**Key principles for custom scripts**:
|
|
@@ -327,11 +320,7 @@ node $SKILL_DIR/packages/spec/src/claude/chrome-devtools/tmp/login-test.js
|
|
|
327
320
|
|
|
328
321
|
## Screenshots
|
|
329
322
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
**IMPORTANT:** Store browser artifacts in a project-local screenshots or reports folder and include exact output paths in the final report.
|
|
333
|
-
|
|
334
|
-
Store screenshots for analysis in `<project>/packages/spec/src/claude/chrome-devtools/screenshots/`:
|
|
323
|
+
Store screenshots in `<project>/packages/spec/src/claude/chrome-devtools/screenshots/` and give their exact output paths in the final report:
|
|
335
324
|
|
|
336
325
|
```bash
|
|
337
326
|
# Basic screenshot
|
|
@@ -356,15 +345,13 @@ node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/sp
|
|
|
356
345
|
node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/spec/src/claude/chrome-devtools/screenshots/page.png --max-size 3
|
|
357
346
|
|
|
358
347
|
# Disable compression
|
|
359
|
-
node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/spec/src/claude/chrome-devtools/screenshots/page.png --no-compress
|
|
348
|
+
node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/spec/src/claude/chrome-devtools/screenshots/page.png --no-compress true
|
|
360
349
|
```
|
|
361
350
|
|
|
362
351
|
Store screenshots for analysis in `<project>/packages/spec/src/claude/chrome-devtools/screenshots/`.
|
|
363
352
|
|
|
364
353
|
## Console Log Collection & Analysis
|
|
365
354
|
|
|
366
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
367
|
-
|
|
368
355
|
### Capture Logs
|
|
369
356
|
|
|
370
357
|
```bash
|
|
@@ -407,7 +394,6 @@ node "$SKILL_DIR/console.js" --url https://example.com --types error --duration
|
|
|
407
394
|
|
|
408
395
|
## Finding Elements
|
|
409
396
|
|
|
410
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
411
397
|
Use `snapshot.js` to discover selectors before interacting:
|
|
412
398
|
|
|
413
399
|
```bash
|
|
@@ -423,12 +409,11 @@ node "$SKILL_DIR/snapshot.js" --url https://example.com | jq '.elements[] | sele
|
|
|
423
409
|
|
|
424
410
|
## Error Recovery
|
|
425
411
|
|
|
426
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
427
412
|
If script fails:
|
|
428
413
|
|
|
429
414
|
```bash
|
|
430
415
|
# 1. Capture current state (without navigating to preserve state)
|
|
431
|
-
node "$SKILL_DIR/screenshot.js" --output ./packages/spec/src/claude/
|
|
416
|
+
node "$SKILL_DIR/screenshot.js" --output ./packages/spec/src/claude/chrome-devtools/screenshots/debug.png
|
|
432
417
|
|
|
433
418
|
# 2. Get console errors
|
|
434
419
|
node "$SKILL_DIR/console.js" --url about:blank --types error --duration 1000
|
|
@@ -469,22 +454,20 @@ node "$SKILL_DIR/performance.js" --url https://example.com | jq '.vitals'
|
|
|
469
454
|
All scripts support:
|
|
470
455
|
- `--headless true/false` - Override auto-detected headless mode (default: auto by OS)
|
|
471
456
|
- `--close true` - Close browser completely (default: stay running)
|
|
472
|
-
- `--
|
|
473
|
-
- `--
|
|
457
|
+
- `--wait-until networkidle2` - Wait strategy when the script loads `--url`
|
|
458
|
+
- `--timeout <ms>` - read by the scripts that load a page or wait for one (`navigate.js`, `click.js`, `fill.js`, `connect-chrome.js`, `import-cookies.js`, `inject-auth.js`)
|
|
474
459
|
|
|
475
460
|
`navigate.js` additionally supports:
|
|
476
461
|
- `--wait-for-login <pattern>` - Interactive login: open headed, wait for URL regex match
|
|
477
462
|
- `--login-timeout <ms>` - Max wait for login completion (default: 300000 = 5 min)
|
|
478
463
|
|
|
479
464
|
## Troubleshooting
|
|
480
|
-
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
481
|
-
|
|
482
465
|
| Error | Solution |
|
|
483
466
|
|-------|----------|
|
|
484
467
|
| `Cannot find package 'puppeteer'` | Run `npm install` in scripts directory |
|
|
485
468
|
| `libnss3.so` missing (Linux) | Run `./install-deps.sh` |
|
|
486
469
|
| Element not found | Use `snapshot.js` to find correct selector |
|
|
487
|
-
| Script hangs | Use `--
|
|
470
|
+
| Script hangs | Use `--wait-until load`, or `--timeout 60000` on a script that reads it |
|
|
488
471
|
| Screenshot >5MB | Auto-compressed; use `--max-size 3` for lower |
|
|
489
472
|
| Session stale | Delete `.browser-session.json` and retry |
|
|
490
473
|
|
|
@@ -12,118 +12,50 @@ metadata:
|
|
|
12
12
|
---
|
|
13
13
|
# Code Review — correctness and compliance owner
|
|
14
14
|
|
|
15
|
-
Review evaluates correctness, security, scope, architecture, and specification
|
|
16
|
-
compliance. It does not execute the test suite, create a canonical execution
|
|
17
|
-
receipt, or turn a missing test result into a review-owned proof. `cf:test`
|
|
18
|
-
owns execution proof; the single closeout owner combines both results.
|
|
15
|
+
Review evaluates correctness, security, scope, architecture, and specification compliance. It does not execute the test suite, create a canonical execution receipt, or turn a missing test result into a review-owned proof. `cf:test` owns execution proof; the single closeout owner combines both results.
|
|
19
16
|
|
|
20
17
|
## Input and depth
|
|
21
18
|
|
|
22
|
-
With no argument, review the pending diff. Supported targets are a PR, commit,
|
|
23
|
-
pending changes, or an explicit path. Load only current target bytes and needed
|
|
24
|
-
references. For a valid process-first target, read `plan.md`, the active flat
|
|
25
|
-
`task-NN-*.md`, and the controller-validated `test-proof-v1` handoff. Mixed,
|
|
26
|
-
orphaned, malformed, symlinked, nonregular, or identity-conflicting packet state
|
|
27
|
-
is `BLOCKED`; review never migrates it.
|
|
19
|
+
With no argument, review the pending diff. Supported targets are a PR, commit, pending changes, or an explicit path. Load only current target bytes and needed references. For a valid process-first target, read `plan.md`, the active flat `task-NN-*.md`, and the controller-validated `test-proof-v1` handoff. Orphaned, malformed, symlinked, nonregular, or identity-conflicting packet state is `BLOCKED`; review never migrates it.
|
|
28
20
|
|
|
29
|
-
For
|
|
30
|
-
is authoritative. Do not load or follow legacy separate-receipt paragraphs from
|
|
31
|
-
references; they apply only to a legacy packet.
|
|
21
|
+
For proof consumption, this skill's `## Execution-proof boundary` is authoritative.
|
|
32
22
|
|
|
33
|
-
Select review depth from
|
|
34
|
-
derived view:
|
|
23
|
+
Select review depth from risk and blast radius: for a process-first task, its coverage-profile Risk/evidence. Lane is a derived view:
|
|
35
24
|
|
|
36
25
|
- Direct: targeted correctness/security/spec check;
|
|
37
26
|
- Standard: bounded feature review at closeout;
|
|
38
27
|
- Critical: independent, adversarial review covering every required obligation.
|
|
39
28
|
|
|
40
|
-
Do not use file count as the depth selector.
|
|
41
|
-
legacy adapter and cannot choose a review sequence. The review contract has no
|
|
42
|
-
fixed Light/Standard/Deep sequence.
|
|
29
|
+
Do not use file count as the depth selector. The review contract has no fixed Light/Standard/Deep sequence.
|
|
43
30
|
|
|
44
|
-
##
|
|
31
|
+
## Standards
|
|
45
32
|
|
|
46
|
-
|
|
33
|
+
**Specification compliance.** For process-first work, compare the diff with current plan scope and the active task's Outcome, Scope, Coverage, Ownership, Acceptance, Dependencies, Verification Plan, and declared runtime reachability. Identify missing behavior, unjustified extras, contract substitution, orphaned outputs, and incorrect completion claims. If a design image or document carries requirements, load its multimodal reference only when needed; do not guess from a filename.
|
|
47
34
|
|
|
48
|
-
|
|
49
|
-
task's Outcome, Scope, Coverage, Ownership, Acceptance, Dependencies,
|
|
50
|
-
Verification Plan, and declared runtime reachability. Identify missing behavior,
|
|
51
|
-
unjustified extras, contract substitution, orphaned outputs, and incorrect
|
|
52
|
-
completion claims. If a design image or document carries requirements, load its
|
|
53
|
-
multimodal reference only when needed; do not guess from a filename.
|
|
35
|
+
**Correctness and security.** Trace changed entrypoints and callers. Check boundary validation, error paths, resource handling, race assumptions, secrets, authorization, persistence, and failure recovery in proportion to risk. Apply YAGNI/KISS/DRY as maintainability signals, not as a numeric score.
|
|
54
36
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
Trace changed entrypoints and callers. Check boundary validation, error paths,
|
|
58
|
-
resource handling, race assumptions, secrets, authorization, persistence, and
|
|
59
|
-
failure recovery in proportion to risk. Apply YAGNI/KISS/DRY as maintainability
|
|
60
|
-
signals, not as a numeric score.
|
|
61
|
-
|
|
62
|
-
### 3. Adversarial checks
|
|
63
|
-
|
|
64
|
-
Try empty, malformed, unauthorized, duplicate, stale, boundary, and concurrent
|
|
65
|
-
inputs where the changed contract makes them relevant. For Critical obligations,
|
|
66
|
-
review the required independent evidence and provenance. A marker such as
|
|
67
|
-
`Audit: PASS` is not independent evidence.
|
|
68
|
-
|
|
69
|
-
The independent-audit proof must be a durable object with exactly
|
|
70
|
-
`schema_version: "1"`, distinct concrete `reviewer_session_id` and
|
|
71
|
-
`implementation_session_id`, `expected_provenance: { base, head }` matching the
|
|
72
|
-
runtime binding, concrete `evidence`, and literal `verdict: "PASS"`.
|
|
73
|
-
`independent: true`, `PASS_WITH_WARNINGS`, missing binding, or reused session
|
|
74
|
-
provenance is insufficient.
|
|
37
|
+
**Adversarial checks.** Try empty, malformed, unauthorized, duplicate, stale, boundary, and concurrent inputs where the changed contract makes them relevant. For Critical obligations, review the required independent evidence and provenance. A marker such as `Audit: PASS` is not independent evidence.
|
|
75
38
|
|
|
76
39
|
## Test-run boundary
|
|
77
40
|
|
|
78
|
-
Review reads code; it does not run tests. Never run the project's test suite or a
|
|
79
|
-
test file, not even as a sanity check. A read-only run of the reviewed code (for
|
|
80
|
-
example `node -e` on the changed function) may reproduce a defect; cite it as a
|
|
81
|
-
reproduction, never as test evidence. Never report a test result, pass count, or
|
|
82
|
-
exit code as the review's evidence. Without a `test-proof-v1` handoff, write the
|
|
83
|
-
proof line exactly as `**Execution proof:** unavailable (owned by cf:test)` and do
|
|
84
|
-
not otherwise say whether tests pass; the review still returns its correctness
|
|
85
|
-
verdict.
|
|
41
|
+
Review reads code; it does not run tests. Never run the project's test suite or a test file, not even as a sanity check. A read-only run of the reviewed code (for example `node -e` on the changed function) may reproduce a defect; cite it as a reproduction, never as test evidence. Never report a test result, pass count, or exit code as the review's evidence. Without a `test-proof-v1` handoff, write the proof line exactly as `**Execution proof:** unavailable (owned by cf:test)` and do not otherwise say whether tests pass; the review still returns its correctness verdict.
|
|
86
42
|
|
|
87
43
|
## Execution-proof boundary
|
|
88
44
|
|
|
89
|
-
For process-first work, consume only the controller-validated `test-proof-v1`
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
artifacts, branches, and redactions. Unknown keys/verdicts, duplicate or missing
|
|
93
|
-
branches, stale provenance, zero execution, required skips, unsafe redaction, or
|
|
94
|
-
`PASS_WITH_WARNINGS` remain unfinished. Never create or search for a separate
|
|
95
|
-
process-first receipt; Develop alone writes Status and inline `## Receipt` after
|
|
96
|
-
proof and review are both literal `PASS`.
|
|
97
|
-
|
|
98
|
-
Never rerun commands to manufacture proof. If execution proof is missing or
|
|
99
|
-
invalid, write the proof line from the test-run boundary and leave closeout
|
|
100
|
-
unfinished; do not claim feature PASS from review alone. A review may still return a correctness
|
|
101
|
-
verdict when its review inputs are complete, but that verdict is not execution
|
|
102
|
-
proof or GATE-DONE approval.
|
|
45
|
+
For process-first work, consume only the controller-validated `test-proof-v1` handoff. Require its exact closed schema, stable digest, current Base/Head, target task, exact command, exit/counts, raw output, reachability, proof level, artifacts, branches, and redactions. Unknown keys/verdicts, duplicate or missing branches, stale provenance, zero execution, required skips, unsafe redaction, or `PASS_WITH_WARNINGS` remain unfinished. Never create or search for a separate process-first receipt; Develop alone writes Status and inline `## Receipt` after proof and review are both literal `PASS`.
|
|
46
|
+
|
|
47
|
+
Never rerun commands to manufacture proof. If execution proof is missing or invalid, write the proof line from the test-run boundary and leave closeout unfinished; do not claim feature PASS from review alone. A review may still return a correctness verdict when its review inputs are complete, but that verdict is not execution proof or GATE-DONE approval.
|
|
103
48
|
|
|
104
49
|
## Severity
|
|
105
50
|
|
|
106
|
-
Rate each finding by its production impact. Write the labels `Critical`, `High`,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
changed boundary with no test; a leftover debug log).
|
|
115
|
-
- Low: cleanup, clarity, or a question (a naming nit; a behavior the change's
|
|
116
|
-
README or docs state as intended).
|
|
117
|
-
|
|
118
|
-
A leftover debug log is at most Medium; if it prints a secret or credential,
|
|
119
|
-
report that exposure as a separate security finding at its own severity. A
|
|
120
|
-
behavior the change's README or docs state as intended is not a Medium or
|
|
121
|
-
heavier defect; raise it as Low or a question. Task and spec compliance findings
|
|
122
|
-
are Critical only when a task or spec is supplied, and there `UNVERIFIED` means
|
|
123
|
-
supplied proof that failed, never proof that is unavailable. A blocking Medium is
|
|
124
|
-
one with a concrete failure before merge. A review whose heaviest remaining
|
|
125
|
-
finding is a non-blocking Medium returns `PASS_WITH_WARNINGS`; one with only Low
|
|
126
|
-
findings returns `PASS`.
|
|
51
|
+
Rate each finding by its production impact. Write the labels `Critical`, `High`, `Medium`, and `Low` verbatim in English, whatever language the report uses.
|
|
52
|
+
|
|
53
|
+
- Critical: a concrete failure a user or operator hits that loses or corrupts data, breaks security, or stops the product (a login bypass).
|
|
54
|
+
- High: a concrete wrong result a user or operator hits (an order exactly at a tier boundary priced with the wrong discount).
|
|
55
|
+
- Medium: a real risk with a failure scenario that has not reached users (a changed boundary with no test; a leftover debug log).
|
|
56
|
+
- Low: cleanup, clarity, or a question (a naming nit; a behavior the change's README or docs state as intended).
|
|
57
|
+
|
|
58
|
+
A leftover debug log is at most Medium; if it prints a secret or credential, report that exposure as a separate security finding at its own severity. A behavior the change's README or docs state as intended is not a Medium or heavier defect; raise it as Low or a question. Task and spec compliance findings are Critical only when a task or spec is supplied, and there `UNVERIFIED` means supplied proof that failed, never proof that is unavailable. A blocking Medium is one with a concrete failure before merge. A review whose heaviest remaining finding is a non-blocking Medium returns `PASS_WITH_WARNINGS`; one with only Low findings returns `PASS`.
|
|
127
59
|
|
|
128
60
|
## Verdict
|
|
129
61
|
|
|
@@ -131,19 +63,9 @@ Use the shared adapter surface exactly:
|
|
|
131
63
|
|
|
132
64
|
`PASS | PASS_WITH_WARNINGS | FAIL | BLOCKED`
|
|
133
65
|
|
|
134
|
-
|
|
135
|
-
normalized to the shared surface and no second enum is allowed. `PASS` means no
|
|
136
|
-
Critical, High, or Medium finding remains; Low findings may remain.
|
|
137
|
-
`PASS_WITH_WARNINGS` means the heaviest remaining finding is a non-blocking
|
|
138
|
-
Medium. `FAIL` means a Critical, High, or blocking Medium finding requires
|
|
139
|
-
remediation. Finding count never selects depth or overrides missing execution
|
|
140
|
-
proof. A review `PASS_WITH_WARNINGS` remains an unfinished
|
|
141
|
-
closeout result; only literal `PASS` can finish a task. `BLOCKED` means the review input or a user-owned
|
|
142
|
-
decision is unavailable.
|
|
66
|
+
No second verdict enum is allowed. `PASS` means no Critical, High, or Medium finding remains; Low findings may remain. `PASS_WITH_WARNINGS` means the heaviest remaining finding is a non-blocking Medium. `FAIL` means a Critical, High, or blocking Medium finding requires remediation. Finding count never selects depth or overrides missing execution proof. A review `PASS_WITH_WARNINGS` remains an unfinished closeout result; only literal `PASS` can finish a task. `BLOCKED` means the review input or a user-owned decision is unavailable.
|
|
143
67
|
|
|
144
|
-
Copy the header line `# Code Review Results [cf:code-review]`, the field labels,
|
|
145
|
-
and the severity labels verbatim in English; write the content in the user's
|
|
146
|
-
language.
|
|
68
|
+
Copy the header line `# Code Review Results [cf:code-review]`, the field labels, and the severity labels verbatim in English; write the content in the user's language.
|
|
147
69
|
|
|
148
70
|
```markdown
|
|
149
71
|
# Code Review Results [cf:code-review]
|
|
@@ -163,15 +85,10 @@ language.
|
|
|
163
85
|
- Reachability/provenance review: PASS | WARN | FAIL
|
|
164
86
|
```
|
|
165
87
|
|
|
166
|
-
Do not add a test command, a fabricated receipt, or an `Audit: PASS` marker to
|
|
167
|
-
make the review look complete. Return unresolved questions at the end.
|
|
88
|
+
Do not add a test command, a fabricated receipt, or an `Audit: PASS` marker to make the review look complete. Return unresolved questions at the end.
|
|
168
89
|
|
|
169
90
|
## References
|
|
170
91
|
|
|
171
|
-
- `references/spec-compliance-review.md` — load
|
|
172
|
-
its separate-receipt paragraph is Legacy-only.
|
|
92
|
+
- `references/spec-compliance-review.md` — load for its detailed scope checks.
|
|
173
93
|
- `references/pre-landing-checklists.md` — load for the selected risk surface.
|
|
174
94
|
- `references/adversarial-review.md` — load for Critical/adversarial depth.
|
|
175
|
-
- `references/verification-gate.md` — Legacy separate-receipt consumption only;
|
|
176
|
-
process-first proof uses this skill's execution-proof boundary. Execution
|
|
177
|
-
always stays with `cf:test`.
|
|
@@ -24,15 +24,12 @@ Do not attempt a standard text-based review if the project includes Visual Specs
|
|
|
24
24
|
- requirement bullets
|
|
25
25
|
- task `Outcome`, `Scope`, `Anchors and Ownership`, `Changes`, `Acceptance`,
|
|
26
26
|
`Dependencies`, and `Verification Plan`
|
|
27
|
-
-
|
|
28
|
-
- task `Verification Plan`
|
|
29
|
-
- canonical contracts/invariants from `design.md`
|
|
27
|
+
- the plan's acceptance criteria and coverage profile rows the task references
|
|
30
28
|
Then verify the changed files against those concrete obligations.
|
|
31
29
|
|
|
32
|
-
Execution proof is separate from the task plan
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
never treats a receipt as approval, readiness, audit status, or semantic judgment.
|
|
30
|
+
Execution proof is separate from the task plan and lives only in the task's
|
|
31
|
+
inline `## Receipt`. Review never creates a receipt and never treats a receipt as
|
|
32
|
+
approval, readiness, audit status, or semantic judgment.
|
|
36
33
|
|
|
37
34
|
## 3. Verdict Scale
|
|
38
35
|
|