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,33 @@
1
+ {
2
+ "emit_profile": true,
3
+ "imported": {
4
+ "claude_md": true,
5
+ "mcp_json": true,
6
+ "skills_count": 1
7
+ },
8
+ "input_policy_ok": true,
9
+ "inputs": [
10
+ {
11
+ "rel": ".claude/skills/a.md",
12
+ "sha256": "6504f2de0a1febf7492c3b98f93d9ab49558eb364607a706f02fe9a75aa7f75b"
13
+ },
14
+ {
15
+ "rel": ".mcp.json",
16
+ "sha256": "c942d9ddbaf0a866c828a904b734915c84ec8b1137b04a698325500b40a2f238"
17
+ },
18
+ {
19
+ "rel": "CLAUDE.md",
20
+ "sha256": "66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18"
21
+ }
22
+ ],
23
+ "project_dir": "D:\\Projects_Clean\\mova-claude-import\\.tmp_test_zip\\proj",
24
+ "run_id": "db01068e8282aec1",
25
+ "skipped": [
26
+ {
27
+ "path": "~/.claude/*",
28
+ "reason": "excluded_by_default_user_settings"
29
+ }
30
+ ],
31
+ "tool": "mova-claude-import",
32
+ "version": "v0"
33
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "allowed": [
3
+ {
4
+ "kind": "other",
5
+ "path": ".mcp.json"
6
+ },
7
+ {
8
+ "kind": "other",
9
+ "path": "CLAUDE.md"
10
+ },
11
+ {
12
+ "kind": "other",
13
+ "path": ".claude/skills/a.md"
14
+ }
15
+ ],
16
+ "denied": [],
17
+ "exit_code_recommended": 0,
18
+ "found": [
19
+ {
20
+ "kind": "other",
21
+ "path": ".mcp.json"
22
+ },
23
+ {
24
+ "kind": "other",
25
+ "path": "CLAUDE.md"
26
+ },
27
+ {
28
+ "kind": "other",
29
+ "path": ".claude/skills/a.md"
30
+ }
31
+ ],
32
+ "ok": true,
33
+ "opts": {
34
+ "include_local": false,
35
+ "strict": false
36
+ },
37
+ "policy_version": "v0"
38
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "issues": [],
3
+ "ok": true,
4
+ "profile_version": "v0",
5
+ "summary": "lint_v0: ok"
6
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "hits": [],
3
+ "note": "Only presence/len recorded, values omitted."
4
+ }
@@ -0,0 +1 @@
1
+ # skill
@@ -0,0 +1 @@
1
+ {"servers":[]}
@@ -0,0 +1 @@
1
+ Hello
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # mova-claude-import
2
+
3
+ Детерминированный генератор и контролёр структуры Claude Code‑проекта с наблюдаемостью MOVA.
4
+
5
+ ## Что делает инструмент
6
+
7
+ - создаёт полный “эталонный” скелет Claude Code‑проекта;
8
+ - импортирует существующий проект в чистую структуру;
9
+ - добавляет слой контроля и отчёты без “магии” и без LLM.
10
+
11
+ ## Что было → что стало
12
+
13
+ Было: разрозненные файлы, нет единой точки контроля, нечего “применять”.
14
+
15
+ Стало (минимальный срез):
16
+
17
+ ```
18
+ <project>/
19
+ CLAUDE.md
20
+ .claude/
21
+ settings.json
22
+ settings.local.example.json
23
+ commands/
24
+ agents/
25
+ output-styles/
26
+ hooks/
27
+ .mcp.json
28
+ mova/
29
+ claude_import/v0/...
30
+ claude_control/v0/runs/...
31
+ ```
32
+
33
+ ## Быстрый старт
34
+
35
+ ### У меня уже есть папка Claude Code‑проекта
36
+
37
+ ```
38
+ npx mova-claude-import --project <in> --out <out> --zip
39
+ ```
40
+
41
+ Дальше добавьте контрольный профиль и проверьте план:
42
+
43
+ ```
44
+ npx mova-claude-import control prefill --project <in> --out <out>
45
+ npx mova-claude-import control check --project <in> --profile <out>/claude_control_profile_v0.json
46
+ ```
47
+
48
+ ### Я хочу создать эталонный профиль с нуля (init)
49
+
50
+ ```
51
+ npx mova-claude-import init --out <dir> --zip
52
+ ```
53
+
54
+ ### Контроль (preview по умолчанию)
55
+
56
+ ```
57
+ npx mova-claude-import control apply --project <in> --profile <out>/claude_control_profile_v0.json --mode apply
58
+ ```
59
+
60
+ ## Демо (60 секунд)
61
+
62
+ ```
63
+ npm run demo
64
+ ```
65
+
66
+ ## Где настраивается контроль
67
+
68
+ Файл профиля: `claude_control_profile_v0.json` (создаётся через `control prefill`).
69
+ Руководство: `docs/CONTROL_PROFILE_GUIDE_v0.md`.
70
+ Примеры: `examples/control_profile_min.json`, `examples/control_profile_standard.json`, `examples/control_profile_strict.json`.
71
+
72
+ Канон схем control‑слоя: `schemas/claude_control/v0/{ds,env,global}`.
73
+
74
+ ## Где смотреть отчёты/доказательства
75
+
76
+ - `mova/claude_import/v0/*` — отчёты импорта и контроля качества
77
+ - `mova/claude_control/v0/runs/*` — планы/отчёты control‑команд
78
+
79
+ ## Для автоматизации
80
+
81
+ Подробности по `--strict`, кодам завершения и CI‑проверкам — в `docs/OPERATOR_GUIDE_v0.md`.
82
+
83
+ ## Ссылки
84
+
85
+ - `docs/COMPATIBILITY_MATRIX.md`
86
+ - `docs/MOVA_SPEC_BINDINGS.md`
@@ -0,0 +1,52 @@
1
+ const fs = require(\'fs');
2
+
3
+ // Create cli.ts
4
+ fs.writeFileSync(\'src/cli.ts\', \`import { runImport } from \"./run_import.js\";
5
+
6
+ function getArg(name: string): string | undefined {
7
+ const idx = process.argv.indexOf(name);
8
+ if (idx === -1) return undefined;
9
+ return process.argv[idx + 1];
10
+ }
11
+ function hasFlag(name: string): boolean {
12
+ return process.argv.includes(name);
13
+ }
14
+ function usage(exitCode = 0) {
15
+ console.log([
16
+ \"mova-claude-import ^(v0^)\",
17
+ \"\",
18
+ \"Usage:\",
19
+ \" mova-claude-import --project ^<dir^> [--out ^<dir^>] [--dry-run] [--strict] [--include-local] [--include-user-settings]\",
20
+ \"\",
21
+ \"Notes:\",
22
+ \" - CLAUDE.local.md and *.local.* are excluded unless --include-local\",
23
+ \" - user-level settings are excluded unless --include-user-settings\",
24
+ ].join(\"\\\\n\"));
25
+ process.exit(exitCode);
26
+ }
27
+
28
+ if (hasFlag(\"--help\") || hasFlag(\"-h\")) usage(0);
29
+ if (hasFlag(\"--version\") || hasFlag(\"-v\")) {
30
+ console.log(\"0.0.0\");
31
+ process.exit(0);
32
+ }
33
+
34
+ const project = getArg(\"--project\");
35
+ if (!project) usage(2);
36
+
37
+ const out = getArg(\"--out\") || project;
38
+
39
+ const res = await runImport{
40
+ projectDir: project,
41
+ outDir: out,
42
+ includeLocal: hasFlag(\"--include-local\"),
43
+ includeUserSettings: hasFlag(\"--include-user-settings\"),
44
+ dryRun: hasFlag(\"--dry-run\"),
45
+ strict: hasFlag(\"--strict\")
46
+ });
47
+
48
+ process.stdout.write(JSON.stringify(res, null, 2) + \"\\\\n\");
49
+ process.exit(res.ok ? 0 : 1);
50
+ \`);
51
+
52
+ console.log(\'cli.ts created successfully.');
@@ -0,0 +1,2 @@
1
+ export declare const anthropicProfileV0RequiredFiles: readonly ["CLAUDE.md", "MOVA.md", ".claude/settings.json", ".claude/commands/mova_context.md", ".claude/commands/mova_lint.md", ".claude/skills/mova-layer-v0/SKILL.md"];
2
+ export declare function getAnthropicProfileV0Files(): Record<string, string>;
@@ -0,0 +1,66 @@
1
+ import { stableStringify } from "./stable_json.js";
2
+ export const anthropicProfileV0RequiredFiles = [
3
+ "CLAUDE.md",
4
+ "MOVA.md",
5
+ ".claude/settings.json",
6
+ ".claude/commands/mova_context.md",
7
+ ".claude/commands/mova_lint.md",
8
+ ".claude/skills/mova-layer-v0/SKILL.md",
9
+ ];
10
+ export function getAnthropicProfileV0Files() {
11
+ return {
12
+ "CLAUDE.md": [
13
+ "# CLAUDE",
14
+ "",
15
+ "This profile is generated by mova-claude-import.",
16
+ "",
17
+ "Use MOVA.md for the project rules and structure.",
18
+ "Use .claude/commands/mova_context.md to build context.",
19
+ "Use .claude/commands/mova_lint.md to run structural lint.",
20
+ "",
21
+ ].join("\n"),
22
+ "MOVA.md": [
23
+ "# MOVA",
24
+ "",
25
+ "This is a clean Anthropic profile v0 output.",
26
+ "",
27
+ "Artifacts:",
28
+ "- mova/claude_import/v0/import_manifest.json",
29
+ "- mova/claude_import/v0/redaction_report.json",
30
+ "- mova/claude_import/v0/lint_report_v0.json",
31
+ "- mova/claude_import/v0/contracts/*.json",
32
+ "- mova/claude_import/v0/episode_import_run.json",
33
+ "",
34
+ ].join("\n"),
35
+ ".claude/settings.json": stableStringify({
36
+ profile_version: "v0",
37
+ commands: ["mova_context", "mova_lint"],
38
+ skills_root: ".claude/skills",
39
+ }) + "\n",
40
+ ".claude/commands/mova_context.md": [
41
+ "# mova_context",
42
+ "",
43
+ "Summarize the project based on MOVA.md and the contracts in",
44
+ "mova/claude_import/v0/contracts.",
45
+ "",
46
+ ].join("\n"),
47
+ ".claude/commands/mova_lint.md": [
48
+ "# mova_lint",
49
+ "",
50
+ "Run structural checks and report results from",
51
+ "mova/claude_import/v0/lint_report_v0.json.",
52
+ "",
53
+ ].join("\n"),
54
+ ".claude/skills/mova-layer-v0/SKILL.md": [
55
+ "---",
56
+ "name: mova-layer-v0",
57
+ "version: v0",
58
+ "---",
59
+ "",
60
+ "# mova-layer-v0",
61
+ "",
62
+ "Baseline behavior for the Anthropic profile v0 output.",
63
+ "",
64
+ ].join("\n"),
65
+ };
66
+ }
@@ -0,0 +1,2 @@
1
+ export declare function writeCleanClaudeProfileScaffoldV0(outDir: string): Promise<void>;
2
+ export declare function ensureClaudeControlSurfacesV0(projectDir: string): Promise<void>;
@@ -0,0 +1,110 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { stableStringify } from "./stable_json.js";
4
+ import { MOVA_CONTROL_ENTRY_MARKER } from "./mova_overlay_v0.js";
5
+ async function exists(p) {
6
+ try {
7
+ await fs.stat(p);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function writeFile(absPath, content) {
15
+ await fs.mkdir(path.dirname(absPath), { recursive: true });
16
+ await fs.writeFile(absPath, content, "utf8");
17
+ }
18
+ function scaffoldFiles() {
19
+ const settings = {
20
+ profile_version: "v0",
21
+ permissions: {
22
+ allow: [],
23
+ deny: [],
24
+ behavior: {
25
+ on_conflict: "deny_wins",
26
+ on_unknown: "report_only",
27
+ },
28
+ },
29
+ plugins: {
30
+ enable: true,
31
+ allowed_plugin_ids: [],
32
+ denied_plugin_ids: [],
33
+ behavior: {
34
+ on_unknown: "report_only",
35
+ },
36
+ },
37
+ hooks: {
38
+ enable: true,
39
+ definitions: [],
40
+ behavior: {
41
+ on_invalid_hook: "report_only",
42
+ },
43
+ },
44
+ claude_md: {
45
+ inject_control_entry: true,
46
+ marker: MOVA_CONTROL_ENTRY_MARKER,
47
+ },
48
+ };
49
+ return [
50
+ {
51
+ rel: "CLAUDE.md",
52
+ content: [
53
+ MOVA_CONTROL_ENTRY_MARKER,
54
+ "## MOVA Control Entry (v0)",
55
+ "",
56
+ "This is the canonical control entry marker for Claude Code.",
57
+ "",
58
+ ].join("\n"),
59
+ },
60
+ {
61
+ rel: ".claude/settings.json",
62
+ content: stableStringify(settings) + "\n",
63
+ },
64
+ {
65
+ rel: ".claude/settings.local.example.json",
66
+ content: stableStringify({
67
+ note: "Local settings are not committed; use this as a template.",
68
+ }) + "\n",
69
+ },
70
+ {
71
+ rel: ".claude/commands/example_command.md",
72
+ content: ["# example_command", "", "Write a brief project summary.", ""].join("\n"),
73
+ },
74
+ {
75
+ rel: ".claude/agents/example_agent.md",
76
+ content: ["# example_agent", "", "Role: reviewer", ""].join("\n"),
77
+ },
78
+ {
79
+ rel: ".claude/output-styles/example_style.md",
80
+ content: ["# example_style", "", "Style: concise, bullet-first.", ""].join("\n"),
81
+ },
82
+ {
83
+ rel: ".claude/hooks/example_hook.sh",
84
+ content: ["#!/usr/bin/env bash", "echo \"hook: dry check\""].join("\n") + "\n",
85
+ },
86
+ {
87
+ rel: ".mcp.json",
88
+ content: stableStringify({ servers: [] }) + "\n",
89
+ },
90
+ {
91
+ rel: "MOVA.md",
92
+ content: ["# MOVA", "", "Notes and operator instructions.", ""].join("\n"),
93
+ },
94
+ ];
95
+ }
96
+ export async function writeCleanClaudeProfileScaffoldV0(outDir) {
97
+ const files = scaffoldFiles();
98
+ for (const f of files) {
99
+ await writeFile(path.join(outDir, f.rel), f.content);
100
+ }
101
+ }
102
+ export async function ensureClaudeControlSurfacesV0(projectDir) {
103
+ const files = scaffoldFiles();
104
+ for (const f of files) {
105
+ const abs = path.join(projectDir, f.rel);
106
+ if (!(await exists(abs))) {
107
+ await writeFile(abs, f.content);
108
+ }
109
+ }
110
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,163 @@
1
+ import { runImport } from "./run_import.js";
2
+ import { initProfileV0 } from "./init_v0.js";
3
+ import { controlPrefillV0 } from "./control_prefill_v0.js";
4
+ import { controlCheckV0 } from "./control_check_v0.js";
5
+ import { controlApplyV0 } from "./control_apply_v0.js";
6
+ function getArg(name) {
7
+ const idx = process.argv.indexOf(name);
8
+ if (idx === -1)
9
+ return undefined;
10
+ return process.argv[idx + 1];
11
+ }
12
+ function hasFlag(name) {
13
+ return process.argv.includes(name);
14
+ }
15
+ function usage(exitCode = 0) {
16
+ console.log([
17
+ "mova-claude-import (v0)",
18
+ "",
19
+ "Usage:",
20
+ " mova-claude-import --project <dir> [--out <dir>] [--dry-run] [--strict] [--include-local] [--include-user-settings] [--no-emit-profile] [--no-emit-overlay] [--zip] [--zip-name <name>]",
21
+ " mova-claude-import init --out <dir> [--zip]",
22
+ " mova-claude-import control prefill --project <dir> --out <dir> [--include-local]",
23
+ " mova-claude-import control check --project <dir> --profile <file>",
24
+ " mova-claude-import control apply --project <dir> --profile <file> [--mode preview|apply]",
25
+ "",
26
+ "Notes:",
27
+ " - CLAUDE.local.md and *.local.* are excluded unless --include-local",
28
+ " - user-level settings are excluded unless --include-user-settings",
29
+ " - profile emission is enabled by default; use --no-emit-profile to skip",
30
+ " - overlay emission is enabled by default; use --no-emit-overlay to skip",
31
+ " - zip export is disabled by default; use --zip to enable",
32
+ " - init creates a clean Anthropic profile v0 scaffold",
33
+ " - control commands run in preview by default",
34
+ ].join("\n"));
35
+ process.exit(exitCode);
36
+ }
37
+ if (hasFlag("--help") || hasFlag("-h"))
38
+ usage(0);
39
+ if (hasFlag("--version") || hasFlag("-v")) {
40
+ console.log("0.0.0");
41
+ process.exit(0);
42
+ }
43
+ const subcommand = process.argv[2];
44
+ if (subcommand === "init") {
45
+ const out = getArg("--out");
46
+ if (!out) {
47
+ usage(2);
48
+ process.exit(2);
49
+ }
50
+ const emitZip = hasFlag("--zip");
51
+ initProfileV0(out, emitZip)
52
+ .then((res) => {
53
+ process.stdout.write(JSON.stringify(res, null, 2) + "\n");
54
+ process.exit(0);
55
+ })
56
+ .catch((err) => {
57
+ console.error(err);
58
+ process.exit(1);
59
+ });
60
+ }
61
+ else if (subcommand === "control") {
62
+ const action = process.argv[3];
63
+ const project = getArg("--project");
64
+ if (!project) {
65
+ usage(2);
66
+ process.exit(2);
67
+ }
68
+ if (action === "prefill") {
69
+ const out = getArg("--out");
70
+ if (!out) {
71
+ usage(2);
72
+ process.exit(2);
73
+ }
74
+ controlPrefillV0(project, out)
75
+ .then((res) => {
76
+ console.log([
77
+ "control prefill: ok",
78
+ `profile: ${res.profile_path}`,
79
+ `report: ${res.report_path}`,
80
+ ].join("\n"));
81
+ process.exit(0);
82
+ })
83
+ .catch((err) => {
84
+ console.error(err);
85
+ process.exit(1);
86
+ });
87
+ }
88
+ else if (action === "check") {
89
+ const profile = getArg("--profile");
90
+ if (!profile) {
91
+ usage(2);
92
+ process.exit(2);
93
+ }
94
+ const out = getArg("--out") || project;
95
+ controlCheckV0(project, profile, out)
96
+ .then((res) => {
97
+ console.log([
98
+ "control check: ok",
99
+ `plan: ${res.plan_path}`,
100
+ `summary: ${res.summary_path}`,
101
+ ].join("\n"));
102
+ process.exit(0);
103
+ })
104
+ .catch((err) => {
105
+ console.error(err);
106
+ process.exit(1);
107
+ });
108
+ }
109
+ else if (action === "apply") {
110
+ const profile = getArg("--profile");
111
+ if (!profile) {
112
+ usage(2);
113
+ process.exit(2);
114
+ }
115
+ const out = getArg("--out") || project;
116
+ const mode = getArg("--mode");
117
+ controlApplyV0(project, profile, out, mode)
118
+ .then((res) => {
119
+ console.log([
120
+ "control apply: ok",
121
+ `report: ${res.report_path}`,
122
+ ].join("\n"));
123
+ process.exit(0);
124
+ })
125
+ .catch((err) => {
126
+ console.error(err);
127
+ process.exit(1);
128
+ });
129
+ }
130
+ else {
131
+ usage(2);
132
+ process.exit(2);
133
+ }
134
+ }
135
+ else {
136
+ const project = getArg("--project");
137
+ if (!project) {
138
+ usage(2);
139
+ process.exit(2);
140
+ }
141
+ const out = getArg("--out") || project;
142
+ const emitProfile = !hasFlag("--no-emit-profile");
143
+ const emitOverlay = !hasFlag("--no-emit-overlay");
144
+ const emitZip = hasFlag("--zip");
145
+ const zipName = getArg("--zip-name");
146
+ runImport({
147
+ projectDir: project,
148
+ outDir: out,
149
+ includeLocal: hasFlag("--include-local"),
150
+ includeUserSettings: hasFlag("--include-user-settings"),
151
+ dryRun: hasFlag("--dry-run"),
152
+ strict: hasFlag("--strict"),
153
+ emitProfile,
154
+ emitOverlay,
155
+ emitZip,
156
+ zipName,
157
+ }).then((res) => {
158
+ process.stdout.write(JSON.stringify(res, null, 2) + "\n");
159
+ if (typeof res.exit_code === "number")
160
+ process.exit(res.exit_code);
161
+ process.exit(res.ok ? 0 : 1);
162
+ });
163
+ }
@@ -0,0 +1 @@
1
+ import "./cli.js";
@@ -0,0 +1 @@
1
+ import "./cli.js";
@@ -0,0 +1,6 @@
1
+ type ApplyResult = {
2
+ run_id: string;
3
+ report_path: string;
4
+ };
5
+ export declare function controlApplyV0(projectDir: string, profilePath: string, outDir: string, mode?: string): Promise<ApplyResult>;
6
+ export {};