mova-claude-import 0.1.1

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 (204) hide show
  1. package/.github/workflows/ci.yml +42 -0
  2. package/.github/workflows/release-dry-run.yml +40 -0
  3. package/.github/workflows/release-publish.yml +43 -0
  4. package/.tmp_test_control_apply/proj/.claude/agents/example_agent.md +3 -0
  5. package/.tmp_test_control_apply/proj/.claude/commands/example_command.md +3 -0
  6. package/.tmp_test_control_apply/proj/.claude/hooks/example_hook.sh +2 -0
  7. package/.tmp_test_control_apply/proj/.claude/output-styles/example_style.md +3 -0
  8. package/.tmp_test_control_apply/proj/.claude/settings.json +30 -0
  9. package/.tmp_test_control_apply/proj/.claude/settings.local.example.json +3 -0
  10. package/.tmp_test_control_apply/proj/.mcp.json +3 -0
  11. package/.tmp_test_control_apply/proj/CLAUDE.md +13 -0
  12. package/.tmp_test_control_apply/proj/MOVA.md +3 -0
  13. package/.tmp_test_control_check/proj/.mcp.json +1 -0
  14. package/.tmp_test_control_check/proj/CLAUDE.md +1 -0
  15. package/.tmp_test_control_prefill/out1/claude_control_profile_v0.json +114 -0
  16. package/.tmp_test_control_prefill/out1/prefill_report_v0.json +13 -0
  17. package/.tmp_test_control_prefill/out2/claude_control_profile_v0.json +114 -0
  18. package/.tmp_test_control_prefill/out2/prefill_report_v0.json +13 -0
  19. package/.tmp_test_overlay/proj/.claude/skills/a.md +1 -0
  20. package/.tmp_test_overlay/proj/.mcp.json +1 -0
  21. package/.tmp_test_overlay/proj/CLAUDE.md +1 -0
  22. package/.tmp_test_profile/proj/.claude/skills/a.md +1 -0
  23. package/.tmp_test_profile/proj/.mcp.json +1 -0
  24. package/.tmp_test_profile/proj/CLAUDE.md +1 -0
  25. package/.tmp_test_scaffold_apply/proj/.claude/agents/example_agent.md +3 -0
  26. package/.tmp_test_scaffold_apply/proj/.claude/commands/example_command.md +3 -0
  27. package/.tmp_test_scaffold_apply/proj/.claude/hooks/example_hook.sh +2 -0
  28. package/.tmp_test_scaffold_apply/proj/.claude/output-styles/example_style.md +3 -0
  29. package/.tmp_test_scaffold_apply/proj/.claude/settings.json +30 -0
  30. package/.tmp_test_scaffold_apply/proj/.claude/settings.local.example.json +3 -0
  31. package/.tmp_test_scaffold_apply/proj/.mcp.json +3 -0
  32. package/.tmp_test_scaffold_apply/proj/CLAUDE.md +13 -0
  33. package/.tmp_test_scaffold_apply/proj/MOVA.md +3 -0
  34. package/.tmp_test_strict/mova/claude_import/v0/VERSION.json +10 -0
  35. package/.tmp_test_strict/mova/claude_import/v0/episode_import_run.json +20 -0
  36. package/.tmp_test_strict/mova/claude_import/v0/import_manifest.json +20 -0
  37. package/.tmp_test_strict/mova/claude_import/v0/input_policy_report_v0.json +32 -0
  38. package/.tmp_test_zip/out1/.claude/agents/example_agent.md +3 -0
  39. package/.tmp_test_zip/out1/.claude/commands/example_command.md +3 -0
  40. package/.tmp_test_zip/out1/.claude/commands/mova_context.md +4 -0
  41. package/.tmp_test_zip/out1/.claude/commands/mova_lint.md +4 -0
  42. package/.tmp_test_zip/out1/.claude/commands/mova_proof.md +6 -0
  43. package/.tmp_test_zip/out1/.claude/hooks/example_hook.sh +2 -0
  44. package/.tmp_test_zip/out1/.claude/output-styles/example_style.md +3 -0
  45. package/.tmp_test_zip/out1/.claude/settings.json +30 -0
  46. package/.tmp_test_zip/out1/.claude/settings.local.example.json +3 -0
  47. package/.tmp_test_zip/out1/.claude/skills/a/SKILL.md +1 -0
  48. package/.tmp_test_zip/out1/.claude/skills/mova-control-v0/SKILL.md +11 -0
  49. package/.tmp_test_zip/out1/.claude/skills/mova-layer-v0/SKILL.md +8 -0
  50. package/.tmp_test_zip/out1/.mcp.json +3 -0
  51. package/.tmp_test_zip/out1/CLAUDE.md +4 -0
  52. package/.tmp_test_zip/out1/MOVA.md +10 -0
  53. package/.tmp_test_zip/out1/export.zip +0 -0
  54. package/.tmp_test_zip/out1/mova/claude_import/v0/VERSION.json +10 -0
  55. package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/instruction_profile_v0.json +8 -0
  56. package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/mcp_servers_v0.json +4 -0
  57. package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/skills_catalog_v0.json +11 -0
  58. package/.tmp_test_zip/out1/mova/claude_import/v0/episode_import_run.json +80 -0
  59. package/.tmp_test_zip/out1/mova/claude_import/v0/export_manifest_v0.json +32 -0
  60. package/.tmp_test_zip/out1/mova/claude_import/v0/import_manifest.json +33 -0
  61. package/.tmp_test_zip/out1/mova/claude_import/v0/input_policy_report_v0.json +38 -0
  62. package/.tmp_test_zip/out1/mova/claude_import/v0/lint_report_v0.json +6 -0
  63. package/.tmp_test_zip/out1/mova/claude_import/v0/redaction_report.json +4 -0
  64. package/.tmp_test_zip/out2/.claude/agents/example_agent.md +3 -0
  65. package/.tmp_test_zip/out2/.claude/commands/example_command.md +3 -0
  66. package/.tmp_test_zip/out2/.claude/commands/mova_context.md +4 -0
  67. package/.tmp_test_zip/out2/.claude/commands/mova_lint.md +4 -0
  68. package/.tmp_test_zip/out2/.claude/commands/mova_proof.md +6 -0
  69. package/.tmp_test_zip/out2/.claude/hooks/example_hook.sh +2 -0
  70. package/.tmp_test_zip/out2/.claude/output-styles/example_style.md +3 -0
  71. package/.tmp_test_zip/out2/.claude/settings.json +30 -0
  72. package/.tmp_test_zip/out2/.claude/settings.local.example.json +3 -0
  73. package/.tmp_test_zip/out2/.claude/skills/a/SKILL.md +1 -0
  74. package/.tmp_test_zip/out2/.claude/skills/mova-control-v0/SKILL.md +11 -0
  75. package/.tmp_test_zip/out2/.claude/skills/mova-layer-v0/SKILL.md +8 -0
  76. package/.tmp_test_zip/out2/.mcp.json +3 -0
  77. package/.tmp_test_zip/out2/CLAUDE.md +4 -0
  78. package/.tmp_test_zip/out2/MOVA.md +10 -0
  79. package/.tmp_test_zip/out2/export.zip +0 -0
  80. package/.tmp_test_zip/out2/mova/claude_import/v0/VERSION.json +10 -0
  81. package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/instruction_profile_v0.json +8 -0
  82. package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/mcp_servers_v0.json +4 -0
  83. package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/skills_catalog_v0.json +11 -0
  84. package/.tmp_test_zip/out2/mova/claude_import/v0/episode_import_run.json +80 -0
  85. package/.tmp_test_zip/out2/mova/claude_import/v0/export_manifest_v0.json +32 -0
  86. package/.tmp_test_zip/out2/mova/claude_import/v0/import_manifest.json +33 -0
  87. package/.tmp_test_zip/out2/mova/claude_import/v0/input_policy_report_v0.json +38 -0
  88. package/.tmp_test_zip/out2/mova/claude_import/v0/lint_report_v0.json +6 -0
  89. package/.tmp_test_zip/out2/mova/claude_import/v0/redaction_report.json +4 -0
  90. package/.tmp_test_zip/proj/.claude/skills/a.md +1 -0
  91. package/.tmp_test_zip/proj/.mcp.json +1 -0
  92. package/.tmp_test_zip/proj/CLAUDE.md +1 -0
  93. package/README.md +86 -0
  94. package/create_files.js +52 -0
  95. package/dist/anthropic_profile_v0.d.ts +2 -0
  96. package/dist/anthropic_profile_v0.js +66 -0
  97. package/dist/claude_profile_scaffold_v0.d.ts +2 -0
  98. package/dist/claude_profile_scaffold_v0.js +110 -0
  99. package/dist/cli.d.ts +1 -0
  100. package/dist/cli.js +163 -0
  101. package/dist/cli_entry.d.ts +1 -0
  102. package/dist/cli_entry.js +1 -0
  103. package/dist/control_apply_v0.d.ts +6 -0
  104. package/dist/control_apply_v0.js +86 -0
  105. package/dist/control_check_v0.d.ts +7 -0
  106. package/dist/control_check_v0.js +80 -0
  107. package/dist/control_contracts_v0.d.ts +8 -0
  108. package/dist/control_contracts_v0.js +17 -0
  109. package/dist/control_prefill_v0.d.ts +6 -0
  110. package/dist/control_prefill_v0.js +61 -0
  111. package/dist/export_zip_v0.d.ts +8 -0
  112. package/dist/export_zip_v0.js +79 -0
  113. package/dist/index.d.ts +30 -0
  114. package/dist/index.js +2 -0
  115. package/dist/init_v0.d.ts +7 -0
  116. package/dist/init_v0.js +47 -0
  117. package/dist/input_policy_v0.d.ts +26 -0
  118. package/dist/input_policy_v0.js +76 -0
  119. package/dist/lint_v0.d.ts +18 -0
  120. package/dist/lint_v0.js +131 -0
  121. package/dist/mova_overlay_v0.d.ts +14 -0
  122. package/dist/mova_overlay_v0.js +65 -0
  123. package/dist/mova_spec_bindings_v0.d.ts +5 -0
  124. package/dist/mova_spec_bindings_v0.js +5 -0
  125. package/dist/quality_v0.d.ts +1 -0
  126. package/dist/quality_v0.js +223 -0
  127. package/dist/redaction.d.ts +14 -0
  128. package/dist/redaction.js +52 -0
  129. package/dist/run_import.d.ts +2 -0
  130. package/dist/run_import.js +479 -0
  131. package/dist/stable_json.d.ts +1 -0
  132. package/dist/stable_json.js +15 -0
  133. package/docs/ANTHROPIC_PROFILE_v0.md +38 -0
  134. package/docs/COMPATIBILITY_MATRIX.md +25 -0
  135. package/docs/CONTROL_PROFILE_GUIDE_v0.md +40 -0
  136. package/docs/IMPORT_SPEC_v0.md +30 -0
  137. package/docs/MOVA_SPEC_BINDINGS.json +21 -0
  138. package/docs/MOVA_SPEC_BINDINGS.md +11 -0
  139. package/docs/OPERATOR_GUIDE_v0.md +43 -0
  140. package/docs/SECURITY_MODEL_v0.md +20 -0
  141. package/examples/control_profile_min.json +37 -0
  142. package/examples/control_profile_standard.json +81 -0
  143. package/examples/control_profile_strict.json +68 -0
  144. package/fixtures/neg/bad_skill_structure/.claude/skills/bad/README.md +3 -0
  145. package/fixtures/neg/bad_skill_structure/CLAUDE.md +3 -0
  146. package/fixtures/neg/local_settings_present/.claude/settings.local.json +3 -0
  147. package/fixtures/neg/local_settings_present/.claude/skills/alpha/SKILL.md +6 -0
  148. package/fixtures/neg/local_settings_present/CLAUDE.md +3 -0
  149. package/fixtures/neg/secret_leak/.claude/skills/alpha/SKILL.md +6 -0
  150. package/fixtures/neg/secret_leak/.mcp.json +3 -0
  151. package/fixtures/neg/secret_leak/CLAUDE.md +3 -0
  152. package/fixtures/neg/strict_denied_local/.claude/settings.local.json +3 -0
  153. package/fixtures/neg/strict_denied_local/CLAUDE.md +3 -0
  154. package/fixtures/pos/basic/.claude/skills/alpha/SKILL.md +8 -0
  155. package/fixtures/pos/basic/.mcp.json +3 -0
  156. package/fixtures/pos/basic/CLAUDE.md +3 -0
  157. package/fixtures/pos/control_basic_project/.mcp.json +3 -0
  158. package/fixtures/pos/control_basic_project/CLAUDE.md +3 -0
  159. package/fixtures/pos/control_profile_filled/claude_control_profile_v0.json +18 -0
  160. package/fixtures/pos/full_scaffold_roundtrip/README.md +1 -0
  161. package/package.json +39 -0
  162. package/schemas/claude_control/v0/ds/ds.claude_control_mapping_v0.json +227 -0
  163. package/schemas/claude_control/v0/ds/ds.claude_control_profile_v0.json +114 -0
  164. package/schemas/claude_control/v0/env/env.claude_control_apply_v0.json +170 -0
  165. package/schemas/claude_control/v0/env/env.claude_control_import_prefill_v0.json +171 -0
  166. package/schemas/claude_control/v0/global/global.claude_control_precedence_v0.json +58 -0
  167. package/schemas/claude_control/v0/global/global.claude_control_vocab_v0.json +98 -0
  168. package/schemas/ds.claude_import.instruction_profile_v0.schema.json +31 -0
  169. package/schemas/ds.claude_import.mcp_servers_v0.schema.json +47 -0
  170. package/schemas/ds.claude_import.skills_catalog_v0.schema.json +48 -0
  171. package/src/anthropic_profile_v0.ts +68 -0
  172. package/src/claude_profile_scaffold_v0.ts +117 -0
  173. package/src/cli.ts +160 -0
  174. package/src/cli_entry.ts +1 -0
  175. package/src/control_apply_v0.ts +108 -0
  176. package/src/control_check_v0.ts +98 -0
  177. package/src/control_contracts_v0.ts +26 -0
  178. package/src/control_prefill_v0.ts +74 -0
  179. package/src/export_zip_v0.ts +90 -0
  180. package/src/index.ts +29 -0
  181. package/src/init_v0.ts +59 -0
  182. package/src/input_policy_v0.ts +103 -0
  183. package/src/lint_v0.ts +151 -0
  184. package/src/mova_overlay_v0.ts +79 -0
  185. package/src/mova_spec_bindings_v0.ts +5 -0
  186. package/src/quality_v0.ts +264 -0
  187. package/src/redaction.ts +63 -0
  188. package/src/run_import.ts +526 -0
  189. package/src/stable_json.ts +15 -0
  190. package/test/control_apply_apply.test.js +40 -0
  191. package/test/control_check_preview.test.js +38 -0
  192. package/test/control_prefill.test.js +30 -0
  193. package/test/demo_v0_smoke.test.js +37 -0
  194. package/test/export_zip_determinism.test.js +41 -0
  195. package/test/import_determinism.test.js +53 -0
  196. package/test/init_v0.test.js +37 -0
  197. package/test/overlay_v0_output.test.js +38 -0
  198. package/test/profile_v0_output.test.js +44 -0
  199. package/test/scaffold_v0_output.test.js +64 -0
  200. package/test/strict_input_policy.test.js +45 -0
  201. package/tools/demo_v0.mjs +98 -0
  202. package/tools/deps_audit_v0.mjs +123 -0
  203. package/tools/write_mova_spec_bindings_v0.mjs +122 -0
  204. package/tsconfig.json +13 -0
@@ -0,0 +1,43 @@
1
+ # Operator Guide v0
2
+
3
+ ## Контрольные поверхности Claude Code
4
+
5
+ Основные точки контроля, которые всегда существуют в эталонном профиле:
6
+
7
+ - `CLAUDE.md` (маркер `<!-- MOVA_CONTROL_ENTRY_V0 -->`)
8
+ - `.claude/settings.json`
9
+ - `.claude/settings.local.example.json`
10
+ - `.claude/commands/`
11
+ - `.claude/agents/`
12
+ - `.claude/output-styles/`
13
+ - `.claude/hooks/`
14
+ - `.mcp.json`
15
+
16
+ ## Как MOVA слой добавляет наблюдаемость
17
+
18
+ - Импорт и проверки пишут отчёты в `mova/claude_import/v0/`.
19
+ - Control‑команды пишут планы/отчёты в `mova/claude_control/v0/runs/<run_id>/`.
20
+ - Канон control‑схем: `schemas/claude_control/v0/{ds,env,global}`.
21
+
22
+ ## Команды CLI
23
+
24
+ | Команда | Назначение |
25
+ | --- | --- |
26
+ | `init` | создать полный эталонный профиль |
27
+ | `--project ...` | импорт/ребилд существующего проекта |
28
+ | `control prefill` | создать `claude_control_profile_v0.json` и `prefill_report_v0.json` |
29
+ | `control check` | построить план, ничего не менять |
30
+ | `control apply` | применить изменения при `--mode apply`, иначе preview |
31
+
32
+ См. `docs/CONTROL_PROFILE_GUIDE_v0.md` и примеры в `examples/`.
33
+
34
+ ## Автоматизация/CI
35
+
36
+ `--strict` предназначен для CI/проверок: при запрещённых входах он останавливает процесс и возвращает код 2.
37
+ Для пользовательских сценариев по умолчанию применяется мягкий режим (preview + отчёт).
38
+
39
+ ## Коды завершения CLI
40
+
41
+ - `0` — успех или preview‑план построен.
42
+ - `1` — неожиданный runtime‑сбой.
43
+ - `2` — автоматизация остановлена политикой контроля (strict/CI).
@@ -0,0 +1,20 @@
1
+ # Security Model v0
2
+
3
+ ## Основная идея
4
+
5
+ Control‑команды по умолчанию работают в режиме preview: они строят планы и отчёты,
6
+ но не вносят изменений, пока вы явно не попросите `--mode apply`.
7
+
8
+ ## Жёсткие режимы — для автоматизации
9
+
10
+ `--strict` — это режим CI/проверок. Он останавливает процесс с кодом 2, если
11
+ политика контроля запрещает входы или шаги. Пользовательский режим остаётся мягким.
12
+
13
+ ## Ответственность пользователя
14
+
15
+ Профиль контроля (`claude_control_profile_v0.json`) — это явная политика, которую
16
+ вы задаёте сами. Инструмент не добавляет скрытых запретов и не выполняет “магии”.
17
+
18
+ ## Границы модели
19
+
20
+ Мы не оцениваем “смысл” навыков и команд, и не гарантируем безопасность внешних MCP‑серверов.
@@ -0,0 +1,37 @@
1
+ {
2
+ "kind": "ds",
3
+ "id": "ds.claude_control_profile_v0",
4
+ "version": "0.1.0",
5
+ "title": "Claude Control Profile v0 (min)",
6
+ "mode": "report_only",
7
+ "anthropic": {
8
+ "permissions": {
9
+ "allow": [],
10
+ "deny": [],
11
+ "behavior": {
12
+ "on_conflict": "deny_wins",
13
+ "on_unknown": "report_only"
14
+ }
15
+ },
16
+ "mcp": {
17
+ "servers": {}
18
+ },
19
+ "claude_md": {
20
+ "inject_control_entry": true,
21
+ "marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->"
22
+ }
23
+ },
24
+ "mova": {
25
+ "overlay": {
26
+ "emit": true
27
+ },
28
+ "observability": {
29
+ "artifact_root": "mova/claude_import/v0"
30
+ }
31
+ },
32
+ "apply": {
33
+ "default_apply_mode": "preview",
34
+ "default_target": "project_only",
35
+ "backup_before_write": true
36
+ }
37
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "kind": "ds",
3
+ "id": "ds.claude_control_profile_v0",
4
+ "version": "0.1.0",
5
+ "title": "Claude Control Profile v0 (standard)",
6
+ "mode": "report_only",
7
+ "anthropic": {
8
+ "permissions": {
9
+ "allow": [],
10
+ "deny": [],
11
+ "behavior": {
12
+ "on_conflict": "deny_wins",
13
+ "on_unknown": "report_only"
14
+ }
15
+ },
16
+ "mcp": {
17
+ "servers": {},
18
+ "env_expansion_policy": {
19
+ "require_all_vars": false,
20
+ "allow_defaults_syntax": true,
21
+ "on_missing_var": "report_only"
22
+ }
23
+ },
24
+ "plugins": {
25
+ "enable": true,
26
+ "allowed_plugin_ids": [],
27
+ "denied_plugin_ids": [],
28
+ "behavior": {
29
+ "on_unknown": "report_only"
30
+ }
31
+ },
32
+ "hooks": {
33
+ "enable": true,
34
+ "definitions": [],
35
+ "behavior": {
36
+ "on_invalid_hook": "report_only"
37
+ }
38
+ },
39
+ "claude_md": {
40
+ "inject_control_entry": true,
41
+ "marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->",
42
+ "paths": {
43
+ "project_primary": "CLAUDE.md",
44
+ "project_alt": ".claude/CLAUDE.md",
45
+ "local": "CLAUDE.local.md"
46
+ }
47
+ }
48
+ },
49
+ "mova": {
50
+ "overlay": {
51
+ "emit": true
52
+ },
53
+ "observability": {
54
+ "emit_version_anchor": true,
55
+ "emit_manifest": true,
56
+ "emit_policy_report": true,
57
+ "emit_apply_report": true,
58
+ "emit_quality_report": true,
59
+ "artifact_root": "mova/claude_import/v0"
60
+ },
61
+ "export": {
62
+ "emit_zip": false,
63
+ "zip_name": "export.zip",
64
+ "emit_export_manifest": true
65
+ }
66
+ },
67
+ "apply": {
68
+ "default_apply_mode": "preview",
69
+ "default_target": "project_only",
70
+ "backup_before_write": true,
71
+ "write_scopes": {
72
+ "user": false,
73
+ "project": true,
74
+ "local": false
75
+ },
76
+ "behavior": {
77
+ "on_unwritable_target": "report_only",
78
+ "on_parse_error": "report_only"
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "kind": "ds",
3
+ "id": "ds.claude_control_profile_v0",
4
+ "version": "0.1.0",
5
+ "title": "Claude Control Profile v0 (strict)",
6
+ "mode": "report_only",
7
+ "anthropic": {
8
+ "permissions": {
9
+ "allow": [
10
+ "fs.read",
11
+ "fs.write",
12
+ "process.spawn"
13
+ ],
14
+ "deny": [
15
+ "network.raw"
16
+ ],
17
+ "behavior": {
18
+ "on_conflict": "deny_wins",
19
+ "on_unknown": "report_only"
20
+ }
21
+ },
22
+ "mcp": {
23
+ "servers": {},
24
+ "env_expansion_policy": {
25
+ "require_all_vars": true,
26
+ "allow_defaults_syntax": false,
27
+ "on_missing_var": "report_only"
28
+ }
29
+ },
30
+ "plugins": {
31
+ "enable": true,
32
+ "allowed_plugin_ids": [
33
+ "local-tools"
34
+ ],
35
+ "denied_plugin_ids": [],
36
+ "behavior": {
37
+ "on_unknown": "report_only"
38
+ }
39
+ },
40
+ "claude_md": {
41
+ "inject_control_entry": true,
42
+ "marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->"
43
+ }
44
+ },
45
+ "mova": {
46
+ "overlay": {
47
+ "emit": true
48
+ },
49
+ "observability": {
50
+ "emit_version_anchor": true,
51
+ "emit_manifest": true,
52
+ "emit_policy_report": true,
53
+ "emit_apply_report": true,
54
+ "emit_quality_report": true,
55
+ "artifact_root": "mova/claude_import/v0"
56
+ },
57
+ "export": {
58
+ "emit_zip": true,
59
+ "zip_name": "export.zip",
60
+ "emit_export_manifest": true
61
+ }
62
+ },
63
+ "apply": {
64
+ "default_apply_mode": "preview",
65
+ "default_target": "project_only",
66
+ "backup_before_write": true
67
+ }
68
+ }
@@ -0,0 +1,3 @@
1
+ # Bad Skill
2
+
3
+ Missing SKILL.md on purpose.
@@ -0,0 +1,3 @@
1
+ # CLAUDE
2
+
3
+ This fixture has an invalid skills structure.
@@ -0,0 +1,3 @@
1
+ {
2
+ "note": "local settings should not be present"
3
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: alpha
3
+ version: v0
4
+ ---
5
+
6
+ # Alpha Skill
@@ -0,0 +1,3 @@
1
+ # CLAUDE
2
+
3
+ Local settings should not be present in inputs for quality.
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: alpha
3
+ version: v0
4
+ ---
5
+
6
+ # Alpha Skill
@@ -0,0 +1,3 @@
1
+ {
2
+ "servers": []
3
+ }
@@ -0,0 +1,3 @@
1
+ # CLAUDE
2
+
3
+ This fixture includes a token: sk-SECRET123456.
@@ -0,0 +1,3 @@
1
+ {
2
+ "note": "local settings must be denied"
3
+ }
@@ -0,0 +1,3 @@
1
+ # CLAUDE
2
+
3
+ Strict input policy should deny local settings.
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: alpha
3
+ version: v0
4
+ ---
5
+
6
+ # Alpha Skill
7
+
8
+ Quality v0 positive fixture.
@@ -0,0 +1,3 @@
1
+ {
2
+ "servers": []
3
+ }
@@ -0,0 +1,3 @@
1
+ # CLAUDE
2
+
3
+ Project: quality v0 basic fixture.
@@ -0,0 +1,3 @@
1
+ {
2
+ "servers": []
3
+ }
@@ -0,0 +1,3 @@
1
+ # CLAUDE
2
+
3
+ Control basic project fixture.
@@ -0,0 +1,18 @@
1
+ {
2
+ "anthropic": {
3
+ "claude_md": {
4
+ "inject_control_entry": true,
5
+ "marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->"
6
+ },
7
+ "mcp": {
8
+ "servers": {}
9
+ }
10
+ },
11
+ "apply": {
12
+ "default_apply_mode": "preview"
13
+ },
14
+ "kind": "ds",
15
+ "mode": "report_only",
16
+ "title": "Claude Control Profile v0",
17
+ "version": "0.1.0"
18
+ }
@@ -0,0 +1 @@
1
+ Full scaffold roundtrip fixture.
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "mova-claude-import",
3
+ "version": "0.1.1",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "node --test",
7
+ "build": "tsc -p tsconfig.json",
8
+ "validate": "npm run build",
9
+ "deps:audit": "node tools/deps_audit_v0.mjs",
10
+ "docs:bindings": "node tools/write_mova_spec_bindings_v0.mjs",
11
+ "docs:check": "npm run docs:bindings -- --check",
12
+ "demo": "node tools/demo_v0.mjs",
13
+ "demo:clean": "node -e \"require('fs').rmSync('.tmp_demo',{recursive:true,force:true})\"",
14
+ "quality": "node dist/quality_v0.js --suite pos",
15
+ "quality:neg": "node dist/quality_v0.js --suite neg"
16
+ },
17
+ "keywords": [],
18
+ "author": "",
19
+ "license": "ISC",
20
+ "description": "",
21
+ "devDependencies": {
22
+ "@types/node": "^25.0.9",
23
+ "@types/yazl": "^3.3.0",
24
+ "typescript": "^5.9.3"
25
+ },
26
+ "dependencies": {
27
+ "@leryk1981/mova-core-engine": "^0.1.1",
28
+ "@leryk1981/mova-spec": "^4.1.1",
29
+ "yazl": "^3.3.1"
30
+ },
31
+ "type": "module",
32
+ "bin": {
33
+ "mova-claude-import": "dist/cli.js"
34
+ },
35
+ "exports": {
36
+ "./package.json": "./package.json",
37
+ ".": "./dist/index.js"
38
+ }
39
+ }
@@ -0,0 +1,227 @@
1
+ {
2
+ "kind": "ds",
3
+ "id": "ds.claude_control_mapping_v0",
4
+ "version": "0.1.0",
5
+ "title": "Claude Control Mapping v0",
6
+ "notes": [
7
+ "Явная карта разноса значений из control_profile в файлы Claude Code.",
8
+ "Цель v0: детерминированный apply без «магии» и без неожиданных изменений user/local.",
9
+ "Все операции должны сопровождаться apply_report и policy_report."
10
+ ],
11
+ "files": {
12
+ "claude_md_project": {
13
+ "scope": "project",
14
+ "path": "CLAUDE.md",
15
+ "format": "text"
16
+ },
17
+ "claude_settings_project": {
18
+ "scope": "project",
19
+ "path": ".claude/settings.json",
20
+ "format": "json"
21
+ },
22
+ "claude_settings_local": {
23
+ "scope": "local",
24
+ "path": ".claude/settings.local.json",
25
+ "format": "json"
26
+ },
27
+ "mcp_project": {
28
+ "scope": "project",
29
+ "path": ".mcp.json",
30
+ "format": "json"
31
+ },
32
+ "mova_overlay_context": {
33
+ "scope": "project",
34
+ "path": "mova/claude_import/v0/overlay/mova_context_v0.json",
35
+ "format": "json"
36
+ },
37
+ "mova_overlay_proof": {
38
+ "scope": "project",
39
+ "path": "mova/claude_import/v0/overlay/mova_proof_v0.json",
40
+ "format": "json"
41
+ },
42
+ "mova_control_skill": {
43
+ "scope": "project",
44
+ "path": "mova/claude_import/v0/overlay/skills/mova_control.skill.md",
45
+ "format": "text"
46
+ }
47
+ },
48
+ "merge": {
49
+ "strategies": {
50
+ "override": {
51
+ "description": "Заменить целевое значение полностью.",
52
+ "kind": "override"
53
+ },
54
+ "append_unique": {
55
+ "description": "Добавить элементы, сохраняя уникальность (по строковому представлению).",
56
+ "kind": "append_unique"
57
+ },
58
+ "deny_wins": {
59
+ "description": "При конфликте allow/deny — deny сильнее.",
60
+ "kind": "deny_wins"
61
+ },
62
+ "object_deep_merge": {
63
+ "description": "Рекурсивное слияние объектов, ключи источника перекрывают целевые.",
64
+ "kind": "object_deep_merge"
65
+ }
66
+ }
67
+ },
68
+ "mappings": [
69
+ {
70
+ "id": "map.claude_md.control_entry",
71
+ "description": "Вставить/обновить блок MOVA Control Entry в CLAUDE.md по маркеру.",
72
+ "from": "control_profile.anthropic.claude_md",
73
+ "to": {
74
+ "file_ref": "claude_md_project",
75
+ "text_mode": "marker_replace",
76
+ "marker": "<!-- MOVA_CONTROL_ENTRY_V0 -->"
77
+ },
78
+ "when": {
79
+ "field_equals": {
80
+ "path": "control_profile.anthropic.claude_md.inject_control_entry",
81
+ "value": true
82
+ }
83
+ },
84
+ "behavior": {
85
+ "on_missing_target": "report_only",
86
+ "on_parse_error": "report_only"
87
+ }
88
+ },
89
+ {
90
+ "id": "map.settings.permissions.allow",
91
+ "description": "Разнести allow-правила в project settings.",
92
+ "from": "control_profile.anthropic.permissions.allow",
93
+ "to": {
94
+ "file_ref": "claude_settings_project",
95
+ "json_path": "permissions.allow",
96
+ "merge_strategy": "append_unique"
97
+ },
98
+ "when": {
99
+ "non_empty_array": "control_profile.anthropic.permissions.allow"
100
+ }
101
+ },
102
+ {
103
+ "id": "map.settings.permissions.deny",
104
+ "description": "Разнести deny-правила в project settings.",
105
+ "from": "control_profile.anthropic.permissions.deny",
106
+ "to": {
107
+ "file_ref": "claude_settings_project",
108
+ "json_path": "permissions.deny",
109
+ "merge_strategy": "append_unique"
110
+ },
111
+ "when": {
112
+ "non_empty_array": "control_profile.anthropic.permissions.deny"
113
+ }
114
+ },
115
+ {
116
+ "id": "map.settings.permissions.behavior",
117
+ "description": "Записать поведение разрешений (конфликт/неизвестное) в settings.",
118
+ "from": "control_profile.anthropic.permissions.behavior",
119
+ "to": {
120
+ "file_ref": "claude_settings_project",
121
+ "json_path": "permissions.behavior",
122
+ "merge_strategy": "object_deep_merge"
123
+ }
124
+ },
125
+ {
126
+ "id": "map.mcp.servers",
127
+ "description": "Разнести MCP servers в .mcp.json (project).",
128
+ "from": "control_profile.anthropic.mcp.servers",
129
+ "to": {
130
+ "file_ref": "mcp_project",
131
+ "json_path": "mcpServers",
132
+ "merge_strategy": "object_deep_merge"
133
+ }
134
+ },
135
+ {
136
+ "id": "map.mcp.env_policy",
137
+ "description": "Записать политику разворачивания env-переменных (MOVA-уровень) в overlay context.",
138
+ "from": "control_profile.anthropic.mcp.env_expansion_policy",
139
+ "to": {
140
+ "file_ref": "mova_overlay_context",
141
+ "json_path": "anthropic.mcp.env_expansion_policy",
142
+ "merge_strategy": "object_deep_merge"
143
+ }
144
+ },
145
+ {
146
+ "id": "map.plugins.policy",
147
+ "description": "Политика плагинов как наблюдаемость (не навязываем Anthropic формат).",
148
+ "from": "control_profile.anthropic.plugins",
149
+ "to": {
150
+ "file_ref": "mova_overlay_context",
151
+ "json_path": "anthropic.plugins",
152
+ "merge_strategy": "object_deep_merge"
153
+ }
154
+ },
155
+ {
156
+ "id": "map.hooks.policy",
157
+ "description": "Политика hooks как наблюдаемость (v0).",
158
+ "from": "control_profile.anthropic.hooks",
159
+ "to": {
160
+ "file_ref": "mova_overlay_context",
161
+ "json_path": "anthropic.hooks",
162
+ "merge_strategy": "object_deep_merge"
163
+ }
164
+ },
165
+ {
166
+ "id": "map.apply.defaults",
167
+ "description": "Зафиксировать настройки apply в overlay context (источник правды для отчётов).",
168
+ "from": "control_profile.apply",
169
+ "to": {
170
+ "file_ref": "mova_overlay_context",
171
+ "json_path": "apply",
172
+ "merge_strategy": "object_deep_merge"
173
+ }
174
+ },
175
+ {
176
+ "id": "map.mova.observability",
177
+ "description": "Настройки наблюдаемости MOVA слоя.",
178
+ "from": "control_profile.mova.observability",
179
+ "to": {
180
+ "file_ref": "mova_overlay_context",
181
+ "json_path": "mova.observability",
182
+ "merge_strategy": "object_deep_merge"
183
+ }
184
+ },
185
+ {
186
+ "id": "map.mova.export",
187
+ "description": "Настройки экспорта zip.",
188
+ "from": "control_profile.mova.export",
189
+ "to": {
190
+ "file_ref": "mova_overlay_context",
191
+ "json_path": "mova.export",
192
+ "merge_strategy": "object_deep_merge"
193
+ }
194
+ },
195
+ {
196
+ "id": "map.mova.premium",
197
+ "description": "Премиум-блоки (по умолчанию выключены) — только фиксация намерения.",
198
+ "from": "control_profile.mova.premium",
199
+ "to": {
200
+ "file_ref": "mova_overlay_context",
201
+ "json_path": "mova.premium",
202
+ "merge_strategy": "object_deep_merge"
203
+ }
204
+ },
205
+ {
206
+ "id": "map.overlay.proof",
207
+ "description": "Сформировать базовый proof-контейнер для ссылок на отчёты/доказательства.",
208
+ "from": "control_profile",
209
+ "to": {
210
+ "file_ref": "mova_overlay_proof",
211
+ "json_path": "proof",
212
+ "merge_strategy": "override"
213
+ },
214
+ "behavior": {
215
+ "generate_proof_container": true
216
+ }
217
+ }
218
+ ],
219
+ "constraints": {
220
+ "default_write_scopes": ["project"],
221
+ "safe_by_default": true,
222
+ "never_write_user_scope_by_default": true,
223
+ "never_write_local_scope_by_default": true,
224
+ "require_apply_report": true,
225
+ "require_policy_report": true
226
+ }
227
+ }