mova-claude-import 0.1.1 → 0.1.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 +68 -4
- package/control_surface_exclusions_v0.json +8 -0
- package/dist/anthropic_profile_v0.d.ts +1 -1
- package/dist/anthropic_profile_v0.js +1 -0
- package/dist/cli.js +206 -23
- package/dist/control_apply_v0.d.ts +5 -1
- package/dist/control_apply_v0.js +125 -8
- package/dist/control_check_v0.d.ts +1 -0
- package/dist/control_check_v0.js +194 -23
- package/dist/control_prefill_v0.js +128 -9
- package/dist/control_surface_coverage_v0.d.ts +22 -0
- package/dist/control_surface_coverage_v0.js +128 -0
- package/dist/control_v0.d.ts +149 -0
- package/dist/control_v0.js +360 -0
- package/dist/control_v0_schema.d.ts +6 -0
- package/dist/control_v0_schema.js +19 -0
- package/dist/init_v0.d.ts +6 -1
- package/dist/init_v0.js +41 -1
- package/dist/observability_writer_v0.d.ts +1 -0
- package/dist/observability_writer_v0.js +157 -0
- package/dist/observe_v0.d.ts +8 -0
- package/dist/observe_v0.js +57 -0
- package/dist/presets_v0.d.ts +11 -0
- package/dist/presets_v0.js +49 -0
- package/dist/redaction.js +5 -1
- package/dist/run_import.js +111 -26
- package/docs/CLAUDE_CONTROL_SURFACE_MAP_v0.md +78 -0
- package/docs/OPERATOR_GUIDE_v0.md +11 -0
- package/fixtures/pos/basic/mova/control_v0.json +93 -0
- package/fixtures/pos/claude_code_demo_full/.claude/agents/code-reviewer.md +13 -0
- package/fixtures/pos/claude_code_demo_full/.claude/agents/github-workflow.md +10 -0
- package/fixtures/pos/claude_code_demo_full/.claude/commands/code-quality.md +8 -0
- package/fixtures/pos/claude_code_demo_full/.claude/commands/docs-sync.md +8 -0
- package/fixtures/pos/claude_code_demo_full/.claude/commands/onboard.md +8 -0
- package/fixtures/pos/claude_code_demo_full/.claude/commands/pr-review.md +10 -0
- package/fixtures/pos/claude_code_demo_full/.claude/commands/pr-summary.md +8 -0
- package/fixtures/pos/claude_code_demo_full/.claude/commands/ticket.md +10 -0
- package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-eval.js +13 -0
- package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-eval.sh +15 -0
- package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-rules.json +21 -0
- package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-rules.schema.json +24 -0
- package/fixtures/pos/claude_code_demo_full/.claude/rules/code-style.md +5 -0
- package/fixtures/pos/claude_code_demo_full/.claude/rules/security.md +5 -0
- package/fixtures/pos/claude_code_demo_full/.claude/settings.json +102 -0
- package/fixtures/pos/claude_code_demo_full/.claude/settings.md +6 -0
- package/fixtures/pos/claude_code_demo_full/.claude/skills/core-components/SKILL.md +9 -0
- package/fixtures/pos/claude_code_demo_full/.claude/skills/formik-patterns/SKILL.md +9 -0
- package/fixtures/pos/claude_code_demo_full/.claude/skills/graphql-schema/SKILL.md +10 -0
- package/fixtures/pos/claude_code_demo_full/.claude/skills/react-ui-patterns/SKILL.md +10 -0
- package/fixtures/pos/claude_code_demo_full/.claude/skills/systematic-debugging/SKILL.md +9 -0
- package/fixtures/pos/claude_code_demo_full/.claude/skills/testing-patterns/SKILL.md +10 -0
- package/fixtures/pos/claude_code_demo_full/.github/workflows/pr-claude-code-review.yml +14 -0
- package/fixtures/pos/claude_code_demo_full/.github/workflows/scheduled-claude-code-dependency-audit.yml +14 -0
- package/fixtures/pos/claude_code_demo_full/.github/workflows/scheduled-claude-code-docs-sync.yml +14 -0
- package/fixtures/pos/claude_code_demo_full/.github/workflows/scheduled-claude-code-quality.yml +14 -0
- package/fixtures/pos/claude_code_demo_full/.mcp.json +44 -0
- package/fixtures/pos/claude_code_demo_full/CLAUDE.md +28 -0
- package/fixtures/pos/control_basic_project/mova/control_v0.json +93 -0
- package/fixtures/pos/observability_basic/CLAUDE.md +3 -0
- package/{.tmp_test_zip/out1 → fixtures/pos/preset_safe_observable_v0}/.mcp.json +3 -3
- package/fixtures/pos/preset_safe_observable_v0/CLAUDE.md +3 -0
- package/package.json +2 -1
- package/presets/safe_observable_v0/assets/.claude/agents/code-reviewer.md +9 -0
- package/presets/safe_observable_v0/assets/.claude/commands/finish.md +9 -0
- package/presets/safe_observable_v0/assets/.claude/commands/start.md +9 -0
- package/presets/safe_observable_v0/assets/.claude/hooks/skill-eval.js +15 -0
- package/presets/safe_observable_v0/assets/.claude/hooks/skill-eval.sh +17 -0
- package/presets/safe_observable_v0/assets/.claude/hooks/skill-rules.json +26 -0
- package/presets/safe_observable_v0/assets/.claude/rules/code-style.md +6 -0
- package/presets/safe_observable_v0/assets/.claude/rules/security.md +6 -0
- package/presets/safe_observable_v0/assets/.claude/skills/git-workflow/SKILL.md +9 -0
- package/presets/safe_observable_v0/assets/.claude/skills/security-basics/SKILL.md +9 -0
- package/presets/safe_observable_v0/assets/.claude/skills/systematic-debugging/SKILL.md +9 -0
- package/presets/safe_observable_v0/assets/.claude/skills/testing-patterns/SKILL.md +9 -0
- package/presets/safe_observable_v0/control_v0.json +214 -0
- package/schemas/mova.control_v0.schema.json +252 -0
- package/src/anthropic_profile_v0.ts +1 -0
- package/src/cli.ts +194 -23
- package/src/control_apply_v0.ts +131 -8
- package/src/control_check_v0.ts +203 -23
- package/src/control_prefill_v0.ts +136 -8
- package/src/control_surface_coverage_v0.ts +164 -0
- package/src/control_v0.ts +808 -0
- package/src/control_v0_schema.ts +26 -0
- package/src/init_v0.ts +48 -1
- package/src/observability_writer_v0.ts +157 -0
- package/src/observe_v0.ts +64 -0
- package/src/presets_v0.ts +55 -0
- package/src/redaction.ts +6 -1
- package/src/run_import.ts +132 -26
- package/test/control_demo_full_roundtrip.test.js +92 -0
- package/test/control_surface_coverage_v0.test.js +36 -0
- package/test/control_v0_schema_validation.test.js +69 -0
- package/test/init_v0.test.js +9 -0
- package/test/observability_writer_v0.test.js +59 -0
- package/test/preset_safe_observable_v0.test.js +55 -0
- package/test/profile_v0_output.test.js +1 -0
- package/test/scaffold_v0_output.test.js +1 -0
- package/tools/control_surface_coverage_v0.mjs +27 -0
- package/tools/smoke_v0.mjs +33 -0
- package/.tmp_test_control_apply/proj/.claude/agents/example_agent.md +0 -3
- package/.tmp_test_control_apply/proj/.claude/commands/example_command.md +0 -3
- package/.tmp_test_control_apply/proj/.claude/hooks/example_hook.sh +0 -2
- package/.tmp_test_control_apply/proj/.claude/output-styles/example_style.md +0 -3
- package/.tmp_test_control_apply/proj/.claude/settings.json +0 -30
- package/.tmp_test_control_apply/proj/.claude/settings.local.example.json +0 -3
- package/.tmp_test_control_apply/proj/.mcp.json +0 -3
- package/.tmp_test_control_apply/proj/CLAUDE.md +0 -13
- package/.tmp_test_control_apply/proj/MOVA.md +0 -3
- package/.tmp_test_control_check/proj/.mcp.json +0 -1
- package/.tmp_test_control_check/proj/CLAUDE.md +0 -1
- package/.tmp_test_control_prefill/out1/claude_control_profile_v0.json +0 -114
- package/.tmp_test_control_prefill/out1/prefill_report_v0.json +0 -13
- package/.tmp_test_control_prefill/out2/claude_control_profile_v0.json +0 -114
- package/.tmp_test_control_prefill/out2/prefill_report_v0.json +0 -13
- package/.tmp_test_overlay/proj/.claude/skills/a.md +0 -1
- package/.tmp_test_overlay/proj/.mcp.json +0 -1
- package/.tmp_test_overlay/proj/CLAUDE.md +0 -1
- package/.tmp_test_profile/proj/.claude/skills/a.md +0 -1
- package/.tmp_test_profile/proj/.mcp.json +0 -1
- package/.tmp_test_profile/proj/CLAUDE.md +0 -1
- package/.tmp_test_scaffold_apply/proj/.claude/agents/example_agent.md +0 -3
- package/.tmp_test_scaffold_apply/proj/.claude/commands/example_command.md +0 -3
- package/.tmp_test_scaffold_apply/proj/.claude/hooks/example_hook.sh +0 -2
- package/.tmp_test_scaffold_apply/proj/.claude/output-styles/example_style.md +0 -3
- package/.tmp_test_scaffold_apply/proj/.claude/settings.json +0 -30
- package/.tmp_test_scaffold_apply/proj/.claude/settings.local.example.json +0 -3
- package/.tmp_test_scaffold_apply/proj/.mcp.json +0 -3
- package/.tmp_test_scaffold_apply/proj/CLAUDE.md +0 -13
- package/.tmp_test_scaffold_apply/proj/MOVA.md +0 -3
- package/.tmp_test_strict/mova/claude_import/v0/VERSION.json +0 -10
- package/.tmp_test_strict/mova/claude_import/v0/episode_import_run.json +0 -20
- package/.tmp_test_strict/mova/claude_import/v0/import_manifest.json +0 -20
- package/.tmp_test_strict/mova/claude_import/v0/input_policy_report_v0.json +0 -32
- package/.tmp_test_zip/out1/.claude/agents/example_agent.md +0 -3
- package/.tmp_test_zip/out1/.claude/commands/example_command.md +0 -3
- package/.tmp_test_zip/out1/.claude/commands/mova_context.md +0 -4
- package/.tmp_test_zip/out1/.claude/commands/mova_lint.md +0 -4
- package/.tmp_test_zip/out1/.claude/commands/mova_proof.md +0 -6
- package/.tmp_test_zip/out1/.claude/hooks/example_hook.sh +0 -2
- package/.tmp_test_zip/out1/.claude/output-styles/example_style.md +0 -3
- package/.tmp_test_zip/out1/.claude/settings.json +0 -30
- package/.tmp_test_zip/out1/.claude/settings.local.example.json +0 -3
- package/.tmp_test_zip/out1/.claude/skills/a/SKILL.md +0 -1
- package/.tmp_test_zip/out1/.claude/skills/mova-control-v0/SKILL.md +0 -11
- package/.tmp_test_zip/out1/.claude/skills/mova-layer-v0/SKILL.md +0 -8
- package/.tmp_test_zip/out1/CLAUDE.md +0 -4
- package/.tmp_test_zip/out1/MOVA.md +0 -10
- package/.tmp_test_zip/out1/export.zip +0 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/VERSION.json +0 -10
- package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/instruction_profile_v0.json +0 -8
- package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/mcp_servers_v0.json +0 -4
- package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/skills_catalog_v0.json +0 -11
- package/.tmp_test_zip/out1/mova/claude_import/v0/episode_import_run.json +0 -80
- package/.tmp_test_zip/out1/mova/claude_import/v0/export_manifest_v0.json +0 -32
- package/.tmp_test_zip/out1/mova/claude_import/v0/import_manifest.json +0 -33
- package/.tmp_test_zip/out1/mova/claude_import/v0/input_policy_report_v0.json +0 -38
- package/.tmp_test_zip/out1/mova/claude_import/v0/lint_report_v0.json +0 -6
- package/.tmp_test_zip/out1/mova/claude_import/v0/redaction_report.json +0 -4
- package/.tmp_test_zip/out2/.claude/agents/example_agent.md +0 -3
- package/.tmp_test_zip/out2/.claude/commands/example_command.md +0 -3
- package/.tmp_test_zip/out2/.claude/commands/mova_context.md +0 -4
- package/.tmp_test_zip/out2/.claude/commands/mova_lint.md +0 -4
- package/.tmp_test_zip/out2/.claude/commands/mova_proof.md +0 -6
- package/.tmp_test_zip/out2/.claude/hooks/example_hook.sh +0 -2
- package/.tmp_test_zip/out2/.claude/output-styles/example_style.md +0 -3
- package/.tmp_test_zip/out2/.claude/settings.json +0 -30
- package/.tmp_test_zip/out2/.claude/settings.local.example.json +0 -3
- package/.tmp_test_zip/out2/.claude/skills/a/SKILL.md +0 -1
- package/.tmp_test_zip/out2/.claude/skills/mova-control-v0/SKILL.md +0 -11
- package/.tmp_test_zip/out2/.claude/skills/mova-layer-v0/SKILL.md +0 -8
- package/.tmp_test_zip/out2/.mcp.json +0 -3
- package/.tmp_test_zip/out2/CLAUDE.md +0 -4
- package/.tmp_test_zip/out2/MOVA.md +0 -10
- package/.tmp_test_zip/out2/export.zip +0 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/VERSION.json +0 -10
- package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/instruction_profile_v0.json +0 -8
- package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/mcp_servers_v0.json +0 -4
- package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/skills_catalog_v0.json +0 -11
- package/.tmp_test_zip/out2/mova/claude_import/v0/episode_import_run.json +0 -80
- package/.tmp_test_zip/out2/mova/claude_import/v0/export_manifest_v0.json +0 -32
- package/.tmp_test_zip/out2/mova/claude_import/v0/import_manifest.json +0 -33
- package/.tmp_test_zip/out2/mova/claude_import/v0/input_policy_report_v0.json +0 -38
- package/.tmp_test_zip/out2/mova/claude_import/v0/lint_report_v0.json +0 -6
- package/.tmp_test_zip/out2/mova/claude_import/v0/redaction_report.json +0 -4
- package/.tmp_test_zip/proj/.claude/skills/a.md +0 -1
- package/.tmp_test_zip/proj/.mcp.json +0 -1
- package/.tmp_test_zip/proj/CLAUDE.md +0 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://mova.dev/schemas/mova.control_v0.schema.json",
|
|
3
|
+
"version": "control_v0",
|
|
4
|
+
"claude_md": {
|
|
5
|
+
"inject_control_entry": true,
|
|
6
|
+
"marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->",
|
|
7
|
+
"priority_sources": ["CLAUDE.md", ".claude/CLAUDE.md", "~/.claude/CLAUDE.md"]
|
|
8
|
+
},
|
|
9
|
+
"claude_memory": {
|
|
10
|
+
"enable": true,
|
|
11
|
+
"sources": ["CLAUDE.md"]
|
|
12
|
+
},
|
|
13
|
+
"overlay": {
|
|
14
|
+
"enable": true
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"include_co_authored_by": true,
|
|
18
|
+
"env": {}
|
|
19
|
+
},
|
|
20
|
+
"mcp": {
|
|
21
|
+
"servers": {},
|
|
22
|
+
"enable_all_project_mcp_servers": false,
|
|
23
|
+
"enabled_mcpjson_servers": [],
|
|
24
|
+
"env_substitutions": {
|
|
25
|
+
"format": "${VAR}",
|
|
26
|
+
"default_format": "${VAR:-default}"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"policy": {
|
|
30
|
+
"mode": "report_only",
|
|
31
|
+
"hooks": {
|
|
32
|
+
"enable": true,
|
|
33
|
+
"on_invalid_hook": "report_only",
|
|
34
|
+
"definitions": [],
|
|
35
|
+
"events": {}
|
|
36
|
+
},
|
|
37
|
+
"permissions": {
|
|
38
|
+
"allow": [],
|
|
39
|
+
"deny": [],
|
|
40
|
+
"on_conflict": "deny_wins",
|
|
41
|
+
"on_unknown": "report_only"
|
|
42
|
+
},
|
|
43
|
+
"plugins": {
|
|
44
|
+
"enable": true,
|
|
45
|
+
"allowed_plugin_ids": [],
|
|
46
|
+
"denied_plugin_ids": [],
|
|
47
|
+
"on_unknown": "report_only",
|
|
48
|
+
"enabled_plugins": {}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"lsp": {
|
|
52
|
+
"enabled_plugins": [],
|
|
53
|
+
"config_path": ".claude/lsp.json",
|
|
54
|
+
"managed": false
|
|
55
|
+
},
|
|
56
|
+
"skill_eval": {
|
|
57
|
+
"enable": false,
|
|
58
|
+
"hooks": {
|
|
59
|
+
"shell": ".claude/hooks/skill-eval.sh",
|
|
60
|
+
"node": ".claude/hooks/skill-eval.js"
|
|
61
|
+
},
|
|
62
|
+
"rules_path": ".claude/hooks/skill-rules.json",
|
|
63
|
+
"scoring": {
|
|
64
|
+
"threshold": 0.6
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"observability": {
|
|
68
|
+
"enable": true,
|
|
69
|
+
"mode": "report_only",
|
|
70
|
+
"writer": {
|
|
71
|
+
"type": "node",
|
|
72
|
+
"script_path": ".claude/hooks/mova-observe.js"
|
|
73
|
+
},
|
|
74
|
+
"output_dir": ".mova/episodes",
|
|
75
|
+
"stdout_tail_bytes": 4000,
|
|
76
|
+
"stderr_tail_bytes": 4000,
|
|
77
|
+
"max_event_bytes": 20000,
|
|
78
|
+
"tail_lines": 50,
|
|
79
|
+
"include_tools": ["Bash", "Read", "Edit", "MultiEdit", "Write"],
|
|
80
|
+
"include_events": ["PostToolUse", "UserPromptSubmit", "Stop"]
|
|
81
|
+
},
|
|
82
|
+
"assets": {
|
|
83
|
+
"skills": [],
|
|
84
|
+
"agents": [],
|
|
85
|
+
"commands": [],
|
|
86
|
+
"rules": [],
|
|
87
|
+
"hooks": [],
|
|
88
|
+
"workflows": [],
|
|
89
|
+
"docs": [],
|
|
90
|
+
"dotfiles": [],
|
|
91
|
+
"schemas": []
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{
|
|
2
|
-
"servers": []
|
|
3
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"servers": []
|
|
3
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mova-claude-import",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node --test",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"docs:check": "npm run docs:bindings -- --check",
|
|
12
12
|
"demo": "node tools/demo_v0.mjs",
|
|
13
13
|
"demo:clean": "node -e \"require('fs').rmSync('.tmp_demo',{recursive:true,force:true})\"",
|
|
14
|
+
"smoke": "node tools/smoke_v0.mjs",
|
|
14
15
|
"quality": "node dist/quality_v0.js --suite pos",
|
|
15
16
|
"quality:neg": "node dist/quality_v0.js --suite neg"
|
|
16
17
|
},
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Code Reviewer
|
|
2
|
+
|
|
3
|
+
Focus on correctness, regressions, and missing tests.
|
|
4
|
+
|
|
5
|
+
Checklist:
|
|
6
|
+
- Identify behavior changes and edge cases.
|
|
7
|
+
- Look for unsafe file operations or permission changes.
|
|
8
|
+
- Verify hooks, settings, and mcp changes are consistent.
|
|
9
|
+
- Call out missing tests for new paths.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# /finish
|
|
2
|
+
|
|
3
|
+
Purpose: close the session with verified changes and explicit outputs.
|
|
4
|
+
|
|
5
|
+
Checklist:
|
|
6
|
+
- Run relevant tests/formatting (if any).
|
|
7
|
+
- Summarize changed files and rationale.
|
|
8
|
+
- Note any follow-up tasks or risks.
|
|
9
|
+
- Ensure outputs are saved to disk (no hidden state).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# /start
|
|
2
|
+
|
|
3
|
+
Purpose: start a focused session and set ground truth in files.
|
|
4
|
+
|
|
5
|
+
Checklist:
|
|
6
|
+
- Read `CLAUDE.md` and relevant rules.
|
|
7
|
+
- Confirm branch is not `main`.
|
|
8
|
+
- Identify target files and expected outputs.
|
|
9
|
+
- Write or update a brief plan in `MOVA.md` if present.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const prompt = process.env.CLAUDE_USER_PROMPT || process.env.CLAUDE_PROMPT || "";
|
|
3
|
+
let skill = "general";
|
|
4
|
+
|
|
5
|
+
if (/test|tdd|mock|coverage/i.test(prompt)) {
|
|
6
|
+
skill = "testing-patterns";
|
|
7
|
+
} else if (/debug|trace|repro|bug/i.test(prompt)) {
|
|
8
|
+
skill = "systematic-debugging";
|
|
9
|
+
} else if (/security|vuln|xss|csrf|auth/i.test(prompt)) {
|
|
10
|
+
skill = "security-basics";
|
|
11
|
+
} else if (/git|branch|merge|rebase/i.test(prompt)) {
|
|
12
|
+
skill = "git-workflow";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
process.stdout.write(JSON.stringify({ feedback: `skill-eval: ${skill}`, suppressOutput: true }));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
prompt="${CLAUDE_USER_PROMPT:-${CLAUDE_PROMPT:-}}"
|
|
5
|
+
skill="general"
|
|
6
|
+
|
|
7
|
+
if echo "$prompt" | grep -qi "test\\|tdd\\|mock\\|coverage"; then
|
|
8
|
+
skill="testing-patterns"
|
|
9
|
+
elif echo "$prompt" | grep -qi "debug\\|trace\\|repro\\|bug"; then
|
|
10
|
+
skill="systematic-debugging"
|
|
11
|
+
elif echo "$prompt" | grep -qi "security\\|vuln\\|xss\\|csrf\\|auth"; then
|
|
12
|
+
skill="security-basics"
|
|
13
|
+
elif echo "$prompt" | grep -qi "git\\|branch\\|merge\\|rebase"; then
|
|
14
|
+
skill="git-workflow"
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo "{\"feedback\": \"skill-eval: ${skill}\", \"suppressOutput\": true}"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "v0",
|
|
3
|
+
"threshold": 0.6,
|
|
4
|
+
"rules": [
|
|
5
|
+
{
|
|
6
|
+
"id": "testing-patterns",
|
|
7
|
+
"keywords": ["test", "tdd", "mock", "coverage"],
|
|
8
|
+
"score": 0.8
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "systematic-debugging",
|
|
12
|
+
"keywords": ["debug", "trace", "repro", "bug"],
|
|
13
|
+
"score": 0.8
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "security-basics",
|
|
17
|
+
"keywords": ["security", "vuln", "xss", "csrf", "auth"],
|
|
18
|
+
"score": 0.8
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "git-workflow",
|
|
22
|
+
"keywords": ["git", "branch", "merge", "rebase"],
|
|
23
|
+
"score": 0.7
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Systematic Debugging
|
|
2
|
+
|
|
3
|
+
Focus: isolate the failure with evidence and minimal changes.
|
|
4
|
+
|
|
5
|
+
Guidelines:
|
|
6
|
+
- Reproduce with a small, stable case.
|
|
7
|
+
- Narrow the scope before proposing fixes.
|
|
8
|
+
- Log or trace only what you need.
|
|
9
|
+
- Confirm the fix with a regression test.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Testing Patterns
|
|
2
|
+
|
|
3
|
+
Focus: build small, reliable tests around observed behavior.
|
|
4
|
+
|
|
5
|
+
Guidelines:
|
|
6
|
+
- Start from a failing example, then fix.
|
|
7
|
+
- Prefer targeted tests over broad suites.
|
|
8
|
+
- Use clear names that describe expected behavior.
|
|
9
|
+
- Keep fixtures minimal and deterministic.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://mova.dev/schemas/mova.control_v0.schema.json",
|
|
3
|
+
"version": "control_v0",
|
|
4
|
+
"claude_md": {
|
|
5
|
+
"inject_control_entry": true,
|
|
6
|
+
"marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->",
|
|
7
|
+
"priority_sources": ["CLAUDE.md", ".claude/CLAUDE.md", "~/.claude/CLAUDE.md"]
|
|
8
|
+
},
|
|
9
|
+
"claude_memory": {
|
|
10
|
+
"enable": true,
|
|
11
|
+
"sources": ["CLAUDE.md"]
|
|
12
|
+
},
|
|
13
|
+
"overlay": {
|
|
14
|
+
"enable": true
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"include_co_authored_by": true,
|
|
18
|
+
"env": {}
|
|
19
|
+
},
|
|
20
|
+
"mcp": {
|
|
21
|
+
"servers": {},
|
|
22
|
+
"enable_all_project_mcp_servers": false,
|
|
23
|
+
"enabled_mcpjson_servers": [],
|
|
24
|
+
"env_substitutions": {
|
|
25
|
+
"format": "${VAR}",
|
|
26
|
+
"default_format": "${VAR:-default}"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"policy": {
|
|
30
|
+
"mode": "report_only",
|
|
31
|
+
"hooks": {
|
|
32
|
+
"enable": true,
|
|
33
|
+
"on_invalid_hook": "report_only",
|
|
34
|
+
"definitions": [],
|
|
35
|
+
"events": {
|
|
36
|
+
"PreToolUse": [
|
|
37
|
+
{
|
|
38
|
+
"matcher": "Edit|MultiEdit|Write",
|
|
39
|
+
"hooks": [
|
|
40
|
+
{
|
|
41
|
+
"type": "command",
|
|
42
|
+
"command": "[ \"$(git branch --show-current)\" != \"main\" ] || { echo '{\"block\": true, \"message\": \"Cannot edit files on main branch. Create a feature branch first.\"}' >&2; exit 2; }",
|
|
43
|
+
"timeout": 5
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"matcher": "Bash",
|
|
49
|
+
"hooks": [
|
|
50
|
+
{
|
|
51
|
+
"type": "command",
|
|
52
|
+
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -E -i \"(rm\\\\s+-rf|sudo|curl\\\\s+[^|]+\\\\|\\\\s*sh|wget\\\\s+[^|]+\\\\|\\\\s*sh|mkfs\\\\.|dd\\\\s+if=|chmod\\\\s+777|chown\\\\s+root|\\\\.env|id_rsa|\\\\.pem)\"; then\n echo '{\"block\": true, \"message\": \"Potentially dangerous command blocked.\"}' >&2\n exit 2\nfi",
|
|
53
|
+
"timeout": 5
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"PostToolUse": [
|
|
59
|
+
{
|
|
60
|
+
"matcher": "Edit|MultiEdit|Write",
|
|
61
|
+
"hooks": [
|
|
62
|
+
{
|
|
63
|
+
"type": "command",
|
|
64
|
+
"command": "if [[ \"$CLAUDE_TOOL_INPUT_FILE_PATH\" =~ \\\\.(js|jsx|ts|tsx)$ ]]; then\n npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\" 2>&1\n exit_code=$?\n if [ $exit_code -ne 0 ]; then\n echo '{\"feedback\": \"Formatting failed.\"}' >&2\n exit 1\n fi\n echo '{\"feedback\": \"Formatting applied.\", \"suppressOutput\": true}'\nfi",
|
|
65
|
+
"timeout": 30
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"matcher": "Edit|MultiEdit|Write",
|
|
71
|
+
"hooks": [
|
|
72
|
+
{
|
|
73
|
+
"type": "command",
|
|
74
|
+
"command": "if [[ \"$CLAUDE_TOOL_INPUT_FILE_PATH\" =~ \\\\.test\\\\.(js|jsx|ts|tsx)$ ]]; then\n npm test -- --findRelatedTests \"$CLAUDE_TOOL_INPUT_FILE_PATH\" --passWithNoTests 2>&1 | tail -30\n exit 0\nfi",
|
|
75
|
+
"timeout": 90
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"UserPromptSubmit": [
|
|
81
|
+
{
|
|
82
|
+
"hooks": [
|
|
83
|
+
{
|
|
84
|
+
"type": "command",
|
|
85
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/skill-eval.sh",
|
|
86
|
+
"timeout": 5
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"permissions": {
|
|
94
|
+
"allow": ["Bash", "Edit", "Read"],
|
|
95
|
+
"deny": [],
|
|
96
|
+
"on_conflict": "deny_wins",
|
|
97
|
+
"on_unknown": "report_only"
|
|
98
|
+
},
|
|
99
|
+
"plugins": {
|
|
100
|
+
"enable": true,
|
|
101
|
+
"allowed_plugin_ids": [],
|
|
102
|
+
"denied_plugin_ids": [],
|
|
103
|
+
"on_unknown": "report_only",
|
|
104
|
+
"enabled_plugins": {}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"lsp": {
|
|
108
|
+
"enabled_plugins": [],
|
|
109
|
+
"config_path": ".claude/lsp.json",
|
|
110
|
+
"managed": false
|
|
111
|
+
},
|
|
112
|
+
"skill_eval": {
|
|
113
|
+
"enable": true,
|
|
114
|
+
"hooks": {
|
|
115
|
+
"shell": ".claude/hooks/skill-eval.sh",
|
|
116
|
+
"node": ".claude/hooks/skill-eval.js"
|
|
117
|
+
},
|
|
118
|
+
"rules_path": ".claude/hooks/skill-rules.json",
|
|
119
|
+
"scoring": {
|
|
120
|
+
"threshold": 0.6
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"observability": {
|
|
124
|
+
"enable": true,
|
|
125
|
+
"mode": "report_only",
|
|
126
|
+
"writer": {
|
|
127
|
+
"type": "node",
|
|
128
|
+
"script_path": ".claude/hooks/mova-observe.js"
|
|
129
|
+
},
|
|
130
|
+
"output_dir": ".mova/episodes",
|
|
131
|
+
"stdout_tail_bytes": 4000,
|
|
132
|
+
"stderr_tail_bytes": 4000,
|
|
133
|
+
"max_event_bytes": 20000,
|
|
134
|
+
"tail_lines": 50,
|
|
135
|
+
"include_tools": ["Bash", "Read", "Edit", "MultiEdit", "Write"],
|
|
136
|
+
"include_events": ["PostToolUse", "UserPromptSubmit", "Stop"]
|
|
137
|
+
},
|
|
138
|
+
"assets": {
|
|
139
|
+
"skills": [
|
|
140
|
+
{
|
|
141
|
+
"path": ".claude/skills/testing-patterns/SKILL.md",
|
|
142
|
+
"mode": "copy_through",
|
|
143
|
+
"source_path": ".claude/skills/testing-patterns/SKILL.md"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"path": ".claude/skills/systematic-debugging/SKILL.md",
|
|
147
|
+
"mode": "copy_through",
|
|
148
|
+
"source_path": ".claude/skills/systematic-debugging/SKILL.md"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"path": ".claude/skills/security-basics/SKILL.md",
|
|
152
|
+
"mode": "copy_through",
|
|
153
|
+
"source_path": ".claude/skills/security-basics/SKILL.md"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"path": ".claude/skills/git-workflow/SKILL.md",
|
|
157
|
+
"mode": "copy_through",
|
|
158
|
+
"source_path": ".claude/skills/git-workflow/SKILL.md"
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"agents": [
|
|
162
|
+
{
|
|
163
|
+
"path": ".claude/agents/code-reviewer.md",
|
|
164
|
+
"mode": "copy_through",
|
|
165
|
+
"source_path": ".claude/agents/code-reviewer.md"
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
"commands": [
|
|
169
|
+
{
|
|
170
|
+
"path": ".claude/commands/start.md",
|
|
171
|
+
"mode": "copy_through",
|
|
172
|
+
"source_path": ".claude/commands/start.md"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"path": ".claude/commands/finish.md",
|
|
176
|
+
"mode": "copy_through",
|
|
177
|
+
"source_path": ".claude/commands/finish.md"
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"rules": [
|
|
181
|
+
{
|
|
182
|
+
"path": ".claude/rules/code-style.md",
|
|
183
|
+
"mode": "copy_through",
|
|
184
|
+
"source_path": ".claude/rules/code-style.md"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"path": ".claude/rules/security.md",
|
|
188
|
+
"mode": "copy_through",
|
|
189
|
+
"source_path": ".claude/rules/security.md"
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
"hooks": [
|
|
193
|
+
{
|
|
194
|
+
"path": ".claude/hooks/skill-eval.sh",
|
|
195
|
+
"mode": "copy_through",
|
|
196
|
+
"source_path": ".claude/hooks/skill-eval.sh"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"path": ".claude/hooks/skill-eval.js",
|
|
200
|
+
"mode": "copy_through",
|
|
201
|
+
"source_path": ".claude/hooks/skill-eval.js"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"path": ".claude/hooks/skill-rules.json",
|
|
205
|
+
"mode": "copy_through",
|
|
206
|
+
"source_path": ".claude/hooks/skill-rules.json"
|
|
207
|
+
}
|
|
208
|
+
],
|
|
209
|
+
"workflows": [],
|
|
210
|
+
"docs": [],
|
|
211
|
+
"dotfiles": [],
|
|
212
|
+
"schemas": []
|
|
213
|
+
}
|
|
214
|
+
}
|