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.
Files changed (188) hide show
  1. package/README.md +68 -4
  2. package/control_surface_exclusions_v0.json +8 -0
  3. package/dist/anthropic_profile_v0.d.ts +1 -1
  4. package/dist/anthropic_profile_v0.js +1 -0
  5. package/dist/cli.js +206 -23
  6. package/dist/control_apply_v0.d.ts +5 -1
  7. package/dist/control_apply_v0.js +125 -8
  8. package/dist/control_check_v0.d.ts +1 -0
  9. package/dist/control_check_v0.js +194 -23
  10. package/dist/control_prefill_v0.js +128 -9
  11. package/dist/control_surface_coverage_v0.d.ts +22 -0
  12. package/dist/control_surface_coverage_v0.js +128 -0
  13. package/dist/control_v0.d.ts +149 -0
  14. package/dist/control_v0.js +360 -0
  15. package/dist/control_v0_schema.d.ts +6 -0
  16. package/dist/control_v0_schema.js +19 -0
  17. package/dist/init_v0.d.ts +6 -1
  18. package/dist/init_v0.js +41 -1
  19. package/dist/observability_writer_v0.d.ts +1 -0
  20. package/dist/observability_writer_v0.js +157 -0
  21. package/dist/observe_v0.d.ts +8 -0
  22. package/dist/observe_v0.js +57 -0
  23. package/dist/presets_v0.d.ts +11 -0
  24. package/dist/presets_v0.js +49 -0
  25. package/dist/redaction.js +5 -1
  26. package/dist/run_import.js +111 -26
  27. package/docs/CLAUDE_CONTROL_SURFACE_MAP_v0.md +78 -0
  28. package/docs/OPERATOR_GUIDE_v0.md +11 -0
  29. package/fixtures/pos/basic/mova/control_v0.json +93 -0
  30. package/fixtures/pos/claude_code_demo_full/.claude/agents/code-reviewer.md +13 -0
  31. package/fixtures/pos/claude_code_demo_full/.claude/agents/github-workflow.md +10 -0
  32. package/fixtures/pos/claude_code_demo_full/.claude/commands/code-quality.md +8 -0
  33. package/fixtures/pos/claude_code_demo_full/.claude/commands/docs-sync.md +8 -0
  34. package/fixtures/pos/claude_code_demo_full/.claude/commands/onboard.md +8 -0
  35. package/fixtures/pos/claude_code_demo_full/.claude/commands/pr-review.md +10 -0
  36. package/fixtures/pos/claude_code_demo_full/.claude/commands/pr-summary.md +8 -0
  37. package/fixtures/pos/claude_code_demo_full/.claude/commands/ticket.md +10 -0
  38. package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-eval.js +13 -0
  39. package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-eval.sh +15 -0
  40. package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-rules.json +21 -0
  41. package/fixtures/pos/claude_code_demo_full/.claude/hooks/skill-rules.schema.json +24 -0
  42. package/fixtures/pos/claude_code_demo_full/.claude/rules/code-style.md +5 -0
  43. package/fixtures/pos/claude_code_demo_full/.claude/rules/security.md +5 -0
  44. package/fixtures/pos/claude_code_demo_full/.claude/settings.json +102 -0
  45. package/fixtures/pos/claude_code_demo_full/.claude/settings.md +6 -0
  46. package/fixtures/pos/claude_code_demo_full/.claude/skills/core-components/SKILL.md +9 -0
  47. package/fixtures/pos/claude_code_demo_full/.claude/skills/formik-patterns/SKILL.md +9 -0
  48. package/fixtures/pos/claude_code_demo_full/.claude/skills/graphql-schema/SKILL.md +10 -0
  49. package/fixtures/pos/claude_code_demo_full/.claude/skills/react-ui-patterns/SKILL.md +10 -0
  50. package/fixtures/pos/claude_code_demo_full/.claude/skills/systematic-debugging/SKILL.md +9 -0
  51. package/fixtures/pos/claude_code_demo_full/.claude/skills/testing-patterns/SKILL.md +10 -0
  52. package/fixtures/pos/claude_code_demo_full/.github/workflows/pr-claude-code-review.yml +14 -0
  53. package/fixtures/pos/claude_code_demo_full/.github/workflows/scheduled-claude-code-dependency-audit.yml +14 -0
  54. package/fixtures/pos/claude_code_demo_full/.github/workflows/scheduled-claude-code-docs-sync.yml +14 -0
  55. package/fixtures/pos/claude_code_demo_full/.github/workflows/scheduled-claude-code-quality.yml +14 -0
  56. package/fixtures/pos/claude_code_demo_full/.mcp.json +44 -0
  57. package/fixtures/pos/claude_code_demo_full/CLAUDE.md +28 -0
  58. package/fixtures/pos/control_basic_project/mova/control_v0.json +93 -0
  59. package/fixtures/pos/observability_basic/CLAUDE.md +3 -0
  60. package/{.tmp_test_zip/out1 → fixtures/pos/preset_safe_observable_v0}/.mcp.json +3 -3
  61. package/fixtures/pos/preset_safe_observable_v0/CLAUDE.md +3 -0
  62. package/package.json +2 -1
  63. package/presets/safe_observable_v0/assets/.claude/agents/code-reviewer.md +9 -0
  64. package/presets/safe_observable_v0/assets/.claude/commands/finish.md +9 -0
  65. package/presets/safe_observable_v0/assets/.claude/commands/start.md +9 -0
  66. package/presets/safe_observable_v0/assets/.claude/hooks/skill-eval.js +15 -0
  67. package/presets/safe_observable_v0/assets/.claude/hooks/skill-eval.sh +17 -0
  68. package/presets/safe_observable_v0/assets/.claude/hooks/skill-rules.json +26 -0
  69. package/presets/safe_observable_v0/assets/.claude/rules/code-style.md +6 -0
  70. package/presets/safe_observable_v0/assets/.claude/rules/security.md +6 -0
  71. package/presets/safe_observable_v0/assets/.claude/skills/git-workflow/SKILL.md +9 -0
  72. package/presets/safe_observable_v0/assets/.claude/skills/security-basics/SKILL.md +9 -0
  73. package/presets/safe_observable_v0/assets/.claude/skills/systematic-debugging/SKILL.md +9 -0
  74. package/presets/safe_observable_v0/assets/.claude/skills/testing-patterns/SKILL.md +9 -0
  75. package/presets/safe_observable_v0/control_v0.json +214 -0
  76. package/schemas/mova.control_v0.schema.json +252 -0
  77. package/src/anthropic_profile_v0.ts +1 -0
  78. package/src/cli.ts +194 -23
  79. package/src/control_apply_v0.ts +131 -8
  80. package/src/control_check_v0.ts +203 -23
  81. package/src/control_prefill_v0.ts +136 -8
  82. package/src/control_surface_coverage_v0.ts +164 -0
  83. package/src/control_v0.ts +808 -0
  84. package/src/control_v0_schema.ts +26 -0
  85. package/src/init_v0.ts +48 -1
  86. package/src/observability_writer_v0.ts +157 -0
  87. package/src/observe_v0.ts +64 -0
  88. package/src/presets_v0.ts +55 -0
  89. package/src/redaction.ts +6 -1
  90. package/src/run_import.ts +132 -26
  91. package/test/control_demo_full_roundtrip.test.js +92 -0
  92. package/test/control_surface_coverage_v0.test.js +36 -0
  93. package/test/control_v0_schema_validation.test.js +69 -0
  94. package/test/init_v0.test.js +9 -0
  95. package/test/observability_writer_v0.test.js +59 -0
  96. package/test/preset_safe_observable_v0.test.js +55 -0
  97. package/test/profile_v0_output.test.js +1 -0
  98. package/test/scaffold_v0_output.test.js +1 -0
  99. package/tools/control_surface_coverage_v0.mjs +27 -0
  100. package/tools/smoke_v0.mjs +33 -0
  101. package/.tmp_test_control_apply/proj/.claude/agents/example_agent.md +0 -3
  102. package/.tmp_test_control_apply/proj/.claude/commands/example_command.md +0 -3
  103. package/.tmp_test_control_apply/proj/.claude/hooks/example_hook.sh +0 -2
  104. package/.tmp_test_control_apply/proj/.claude/output-styles/example_style.md +0 -3
  105. package/.tmp_test_control_apply/proj/.claude/settings.json +0 -30
  106. package/.tmp_test_control_apply/proj/.claude/settings.local.example.json +0 -3
  107. package/.tmp_test_control_apply/proj/.mcp.json +0 -3
  108. package/.tmp_test_control_apply/proj/CLAUDE.md +0 -13
  109. package/.tmp_test_control_apply/proj/MOVA.md +0 -3
  110. package/.tmp_test_control_check/proj/.mcp.json +0 -1
  111. package/.tmp_test_control_check/proj/CLAUDE.md +0 -1
  112. package/.tmp_test_control_prefill/out1/claude_control_profile_v0.json +0 -114
  113. package/.tmp_test_control_prefill/out1/prefill_report_v0.json +0 -13
  114. package/.tmp_test_control_prefill/out2/claude_control_profile_v0.json +0 -114
  115. package/.tmp_test_control_prefill/out2/prefill_report_v0.json +0 -13
  116. package/.tmp_test_overlay/proj/.claude/skills/a.md +0 -1
  117. package/.tmp_test_overlay/proj/.mcp.json +0 -1
  118. package/.tmp_test_overlay/proj/CLAUDE.md +0 -1
  119. package/.tmp_test_profile/proj/.claude/skills/a.md +0 -1
  120. package/.tmp_test_profile/proj/.mcp.json +0 -1
  121. package/.tmp_test_profile/proj/CLAUDE.md +0 -1
  122. package/.tmp_test_scaffold_apply/proj/.claude/agents/example_agent.md +0 -3
  123. package/.tmp_test_scaffold_apply/proj/.claude/commands/example_command.md +0 -3
  124. package/.tmp_test_scaffold_apply/proj/.claude/hooks/example_hook.sh +0 -2
  125. package/.tmp_test_scaffold_apply/proj/.claude/output-styles/example_style.md +0 -3
  126. package/.tmp_test_scaffold_apply/proj/.claude/settings.json +0 -30
  127. package/.tmp_test_scaffold_apply/proj/.claude/settings.local.example.json +0 -3
  128. package/.tmp_test_scaffold_apply/proj/.mcp.json +0 -3
  129. package/.tmp_test_scaffold_apply/proj/CLAUDE.md +0 -13
  130. package/.tmp_test_scaffold_apply/proj/MOVA.md +0 -3
  131. package/.tmp_test_strict/mova/claude_import/v0/VERSION.json +0 -10
  132. package/.tmp_test_strict/mova/claude_import/v0/episode_import_run.json +0 -20
  133. package/.tmp_test_strict/mova/claude_import/v0/import_manifest.json +0 -20
  134. package/.tmp_test_strict/mova/claude_import/v0/input_policy_report_v0.json +0 -32
  135. package/.tmp_test_zip/out1/.claude/agents/example_agent.md +0 -3
  136. package/.tmp_test_zip/out1/.claude/commands/example_command.md +0 -3
  137. package/.tmp_test_zip/out1/.claude/commands/mova_context.md +0 -4
  138. package/.tmp_test_zip/out1/.claude/commands/mova_lint.md +0 -4
  139. package/.tmp_test_zip/out1/.claude/commands/mova_proof.md +0 -6
  140. package/.tmp_test_zip/out1/.claude/hooks/example_hook.sh +0 -2
  141. package/.tmp_test_zip/out1/.claude/output-styles/example_style.md +0 -3
  142. package/.tmp_test_zip/out1/.claude/settings.json +0 -30
  143. package/.tmp_test_zip/out1/.claude/settings.local.example.json +0 -3
  144. package/.tmp_test_zip/out1/.claude/skills/a/SKILL.md +0 -1
  145. package/.tmp_test_zip/out1/.claude/skills/mova-control-v0/SKILL.md +0 -11
  146. package/.tmp_test_zip/out1/.claude/skills/mova-layer-v0/SKILL.md +0 -8
  147. package/.tmp_test_zip/out1/CLAUDE.md +0 -4
  148. package/.tmp_test_zip/out1/MOVA.md +0 -10
  149. package/.tmp_test_zip/out1/export.zip +0 -0
  150. package/.tmp_test_zip/out1/mova/claude_import/v0/VERSION.json +0 -10
  151. package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/instruction_profile_v0.json +0 -8
  152. package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/mcp_servers_v0.json +0 -4
  153. package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/skills_catalog_v0.json +0 -11
  154. package/.tmp_test_zip/out1/mova/claude_import/v0/episode_import_run.json +0 -80
  155. package/.tmp_test_zip/out1/mova/claude_import/v0/export_manifest_v0.json +0 -32
  156. package/.tmp_test_zip/out1/mova/claude_import/v0/import_manifest.json +0 -33
  157. package/.tmp_test_zip/out1/mova/claude_import/v0/input_policy_report_v0.json +0 -38
  158. package/.tmp_test_zip/out1/mova/claude_import/v0/lint_report_v0.json +0 -6
  159. package/.tmp_test_zip/out1/mova/claude_import/v0/redaction_report.json +0 -4
  160. package/.tmp_test_zip/out2/.claude/agents/example_agent.md +0 -3
  161. package/.tmp_test_zip/out2/.claude/commands/example_command.md +0 -3
  162. package/.tmp_test_zip/out2/.claude/commands/mova_context.md +0 -4
  163. package/.tmp_test_zip/out2/.claude/commands/mova_lint.md +0 -4
  164. package/.tmp_test_zip/out2/.claude/commands/mova_proof.md +0 -6
  165. package/.tmp_test_zip/out2/.claude/hooks/example_hook.sh +0 -2
  166. package/.tmp_test_zip/out2/.claude/output-styles/example_style.md +0 -3
  167. package/.tmp_test_zip/out2/.claude/settings.json +0 -30
  168. package/.tmp_test_zip/out2/.claude/settings.local.example.json +0 -3
  169. package/.tmp_test_zip/out2/.claude/skills/a/SKILL.md +0 -1
  170. package/.tmp_test_zip/out2/.claude/skills/mova-control-v0/SKILL.md +0 -11
  171. package/.tmp_test_zip/out2/.claude/skills/mova-layer-v0/SKILL.md +0 -8
  172. package/.tmp_test_zip/out2/.mcp.json +0 -3
  173. package/.tmp_test_zip/out2/CLAUDE.md +0 -4
  174. package/.tmp_test_zip/out2/MOVA.md +0 -10
  175. package/.tmp_test_zip/out2/export.zip +0 -0
  176. package/.tmp_test_zip/out2/mova/claude_import/v0/VERSION.json +0 -10
  177. package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/instruction_profile_v0.json +0 -8
  178. package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/mcp_servers_v0.json +0 -4
  179. package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/skills_catalog_v0.json +0 -11
  180. package/.tmp_test_zip/out2/mova/claude_import/v0/episode_import_run.json +0 -80
  181. package/.tmp_test_zip/out2/mova/claude_import/v0/export_manifest_v0.json +0 -32
  182. package/.tmp_test_zip/out2/mova/claude_import/v0/import_manifest.json +0 -33
  183. package/.tmp_test_zip/out2/mova/claude_import/v0/input_policy_report_v0.json +0 -38
  184. package/.tmp_test_zip/out2/mova/claude_import/v0/lint_report_v0.json +0 -6
  185. package/.tmp_test_zip/out2/mova/claude_import/v0/redaction_report.json +0 -4
  186. package/.tmp_test_zip/proj/.claude/skills/a.md +0 -1
  187. package/.tmp_test_zip/proj/.mcp.json +0 -1
  188. 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
+ }
@@ -0,0 +1,3 @@
1
+ # Observability Basic
2
+
3
+ Minimal fixture for observability writer tests.
@@ -1,3 +1,3 @@
1
- {
2
- "servers": []
3
- }
1
+ {
2
+ "servers": []
3
+ }
@@ -0,0 +1,3 @@
1
+ # Preset Safe Observable Fixture
2
+
3
+ Minimal fixture for preset overlay tests.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mova-claude-import",
3
- "version": "0.1.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,6 @@
1
+ # Code Style
2
+
3
+ - Prefer clear, explicit naming over brevity.
4
+ - Keep functions small; refactor if they grow complex.
5
+ - Avoid global side effects; pass dependencies explicitly.
6
+ - Use stable formatting (no manual alignment).
@@ -0,0 +1,6 @@
1
+ # Security
2
+
3
+ - Do not log secrets or tokens.
4
+ - Use environment variables for credentials.
5
+ - Avoid unsafe shell patterns (curl | sh, sudo, rm -rf).
6
+ - Validate external inputs before use.
@@ -0,0 +1,9 @@
1
+ # Git Workflow
2
+
3
+ Focus: keep history clean and changes reviewable.
4
+
5
+ Guidelines:
6
+ - Work on feature branches, not main.
7
+ - Make small, focused commits.
8
+ - Explain intent in commit messages.
9
+ - Keep generated files out of commits.
@@ -0,0 +1,9 @@
1
+ # Security Basics
2
+
3
+ Focus: avoid unsafe defaults and handle secrets carefully.
4
+
5
+ Guidelines:
6
+ - Never print secrets to logs.
7
+ - Validate external input and sanitize paths.
8
+ - Prefer least-privilege behavior.
9
+ - Flag risky operations before running them.
@@ -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
+ }