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.
- package/.github/workflows/ci.yml +42 -0
- package/.github/workflows/release-dry-run.yml +40 -0
- package/.github/workflows/release-publish.yml +43 -0
- package/.tmp_test_control_apply/proj/.claude/agents/example_agent.md +3 -0
- package/.tmp_test_control_apply/proj/.claude/commands/example_command.md +3 -0
- package/.tmp_test_control_apply/proj/.claude/hooks/example_hook.sh +2 -0
- package/.tmp_test_control_apply/proj/.claude/output-styles/example_style.md +3 -0
- package/.tmp_test_control_apply/proj/.claude/settings.json +30 -0
- package/.tmp_test_control_apply/proj/.claude/settings.local.example.json +3 -0
- package/.tmp_test_control_apply/proj/.mcp.json +3 -0
- package/.tmp_test_control_apply/proj/CLAUDE.md +13 -0
- package/.tmp_test_control_apply/proj/MOVA.md +3 -0
- package/.tmp_test_control_check/proj/.mcp.json +1 -0
- package/.tmp_test_control_check/proj/CLAUDE.md +1 -0
- package/.tmp_test_control_prefill/out1/claude_control_profile_v0.json +114 -0
- package/.tmp_test_control_prefill/out1/prefill_report_v0.json +13 -0
- package/.tmp_test_control_prefill/out2/claude_control_profile_v0.json +114 -0
- package/.tmp_test_control_prefill/out2/prefill_report_v0.json +13 -0
- package/.tmp_test_overlay/proj/.claude/skills/a.md +1 -0
- package/.tmp_test_overlay/proj/.mcp.json +1 -0
- package/.tmp_test_overlay/proj/CLAUDE.md +1 -0
- package/.tmp_test_profile/proj/.claude/skills/a.md +1 -0
- package/.tmp_test_profile/proj/.mcp.json +1 -0
- package/.tmp_test_profile/proj/CLAUDE.md +1 -0
- package/.tmp_test_scaffold_apply/proj/.claude/agents/example_agent.md +3 -0
- package/.tmp_test_scaffold_apply/proj/.claude/commands/example_command.md +3 -0
- package/.tmp_test_scaffold_apply/proj/.claude/hooks/example_hook.sh +2 -0
- package/.tmp_test_scaffold_apply/proj/.claude/output-styles/example_style.md +3 -0
- package/.tmp_test_scaffold_apply/proj/.claude/settings.json +30 -0
- package/.tmp_test_scaffold_apply/proj/.claude/settings.local.example.json +3 -0
- package/.tmp_test_scaffold_apply/proj/.mcp.json +3 -0
- package/.tmp_test_scaffold_apply/proj/CLAUDE.md +13 -0
- package/.tmp_test_scaffold_apply/proj/MOVA.md +3 -0
- package/.tmp_test_strict/mova/claude_import/v0/VERSION.json +10 -0
- package/.tmp_test_strict/mova/claude_import/v0/episode_import_run.json +20 -0
- package/.tmp_test_strict/mova/claude_import/v0/import_manifest.json +20 -0
- package/.tmp_test_strict/mova/claude_import/v0/input_policy_report_v0.json +32 -0
- package/.tmp_test_zip/out1/.claude/agents/example_agent.md +3 -0
- package/.tmp_test_zip/out1/.claude/commands/example_command.md +3 -0
- package/.tmp_test_zip/out1/.claude/commands/mova_context.md +4 -0
- package/.tmp_test_zip/out1/.claude/commands/mova_lint.md +4 -0
- package/.tmp_test_zip/out1/.claude/commands/mova_proof.md +6 -0
- package/.tmp_test_zip/out1/.claude/hooks/example_hook.sh +2 -0
- package/.tmp_test_zip/out1/.claude/output-styles/example_style.md +3 -0
- package/.tmp_test_zip/out1/.claude/settings.json +30 -0
- package/.tmp_test_zip/out1/.claude/settings.local.example.json +3 -0
- package/.tmp_test_zip/out1/.claude/skills/a/SKILL.md +1 -0
- package/.tmp_test_zip/out1/.claude/skills/mova-control-v0/SKILL.md +11 -0
- package/.tmp_test_zip/out1/.claude/skills/mova-layer-v0/SKILL.md +8 -0
- package/.tmp_test_zip/out1/.mcp.json +3 -0
- package/.tmp_test_zip/out1/CLAUDE.md +4 -0
- package/.tmp_test_zip/out1/MOVA.md +10 -0
- package/.tmp_test_zip/out1/export.zip +0 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/VERSION.json +10 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/instruction_profile_v0.json +8 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/mcp_servers_v0.json +4 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/contracts/skills_catalog_v0.json +11 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/episode_import_run.json +80 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/export_manifest_v0.json +32 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/import_manifest.json +33 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/input_policy_report_v0.json +38 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/lint_report_v0.json +6 -0
- package/.tmp_test_zip/out1/mova/claude_import/v0/redaction_report.json +4 -0
- package/.tmp_test_zip/out2/.claude/agents/example_agent.md +3 -0
- package/.tmp_test_zip/out2/.claude/commands/example_command.md +3 -0
- package/.tmp_test_zip/out2/.claude/commands/mova_context.md +4 -0
- package/.tmp_test_zip/out2/.claude/commands/mova_lint.md +4 -0
- package/.tmp_test_zip/out2/.claude/commands/mova_proof.md +6 -0
- package/.tmp_test_zip/out2/.claude/hooks/example_hook.sh +2 -0
- package/.tmp_test_zip/out2/.claude/output-styles/example_style.md +3 -0
- package/.tmp_test_zip/out2/.claude/settings.json +30 -0
- package/.tmp_test_zip/out2/.claude/settings.local.example.json +3 -0
- package/.tmp_test_zip/out2/.claude/skills/a/SKILL.md +1 -0
- package/.tmp_test_zip/out2/.claude/skills/mova-control-v0/SKILL.md +11 -0
- package/.tmp_test_zip/out2/.claude/skills/mova-layer-v0/SKILL.md +8 -0
- package/.tmp_test_zip/out2/.mcp.json +3 -0
- package/.tmp_test_zip/out2/CLAUDE.md +4 -0
- package/.tmp_test_zip/out2/MOVA.md +10 -0
- package/.tmp_test_zip/out2/export.zip +0 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/VERSION.json +10 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/instruction_profile_v0.json +8 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/mcp_servers_v0.json +4 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/contracts/skills_catalog_v0.json +11 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/episode_import_run.json +80 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/export_manifest_v0.json +32 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/import_manifest.json +33 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/input_policy_report_v0.json +38 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/lint_report_v0.json +6 -0
- package/.tmp_test_zip/out2/mova/claude_import/v0/redaction_report.json +4 -0
- package/.tmp_test_zip/proj/.claude/skills/a.md +1 -0
- package/.tmp_test_zip/proj/.mcp.json +1 -0
- package/.tmp_test_zip/proj/CLAUDE.md +1 -0
- package/README.md +86 -0
- package/create_files.js +52 -0
- package/dist/anthropic_profile_v0.d.ts +2 -0
- package/dist/anthropic_profile_v0.js +66 -0
- package/dist/claude_profile_scaffold_v0.d.ts +2 -0
- package/dist/claude_profile_scaffold_v0.js +110 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +163 -0
- package/dist/cli_entry.d.ts +1 -0
- package/dist/cli_entry.js +1 -0
- package/dist/control_apply_v0.d.ts +6 -0
- package/dist/control_apply_v0.js +86 -0
- package/dist/control_check_v0.d.ts +7 -0
- package/dist/control_check_v0.js +80 -0
- package/dist/control_contracts_v0.d.ts +8 -0
- package/dist/control_contracts_v0.js +17 -0
- package/dist/control_prefill_v0.d.ts +6 -0
- package/dist/control_prefill_v0.js +61 -0
- package/dist/export_zip_v0.d.ts +8 -0
- package/dist/export_zip_v0.js +79 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +2 -0
- package/dist/init_v0.d.ts +7 -0
- package/dist/init_v0.js +47 -0
- package/dist/input_policy_v0.d.ts +26 -0
- package/dist/input_policy_v0.js +76 -0
- package/dist/lint_v0.d.ts +18 -0
- package/dist/lint_v0.js +131 -0
- package/dist/mova_overlay_v0.d.ts +14 -0
- package/dist/mova_overlay_v0.js +65 -0
- package/dist/mova_spec_bindings_v0.d.ts +5 -0
- package/dist/mova_spec_bindings_v0.js +5 -0
- package/dist/quality_v0.d.ts +1 -0
- package/dist/quality_v0.js +223 -0
- package/dist/redaction.d.ts +14 -0
- package/dist/redaction.js +52 -0
- package/dist/run_import.d.ts +2 -0
- package/dist/run_import.js +479 -0
- package/dist/stable_json.d.ts +1 -0
- package/dist/stable_json.js +15 -0
- package/docs/ANTHROPIC_PROFILE_v0.md +38 -0
- package/docs/COMPATIBILITY_MATRIX.md +25 -0
- package/docs/CONTROL_PROFILE_GUIDE_v0.md +40 -0
- package/docs/IMPORT_SPEC_v0.md +30 -0
- package/docs/MOVA_SPEC_BINDINGS.json +21 -0
- package/docs/MOVA_SPEC_BINDINGS.md +11 -0
- package/docs/OPERATOR_GUIDE_v0.md +43 -0
- package/docs/SECURITY_MODEL_v0.md +20 -0
- package/examples/control_profile_min.json +37 -0
- package/examples/control_profile_standard.json +81 -0
- package/examples/control_profile_strict.json +68 -0
- package/fixtures/neg/bad_skill_structure/.claude/skills/bad/README.md +3 -0
- package/fixtures/neg/bad_skill_structure/CLAUDE.md +3 -0
- package/fixtures/neg/local_settings_present/.claude/settings.local.json +3 -0
- package/fixtures/neg/local_settings_present/.claude/skills/alpha/SKILL.md +6 -0
- package/fixtures/neg/local_settings_present/CLAUDE.md +3 -0
- package/fixtures/neg/secret_leak/.claude/skills/alpha/SKILL.md +6 -0
- package/fixtures/neg/secret_leak/.mcp.json +3 -0
- package/fixtures/neg/secret_leak/CLAUDE.md +3 -0
- package/fixtures/neg/strict_denied_local/.claude/settings.local.json +3 -0
- package/fixtures/neg/strict_denied_local/CLAUDE.md +3 -0
- package/fixtures/pos/basic/.claude/skills/alpha/SKILL.md +8 -0
- package/fixtures/pos/basic/.mcp.json +3 -0
- package/fixtures/pos/basic/CLAUDE.md +3 -0
- package/fixtures/pos/control_basic_project/.mcp.json +3 -0
- package/fixtures/pos/control_basic_project/CLAUDE.md +3 -0
- package/fixtures/pos/control_profile_filled/claude_control_profile_v0.json +18 -0
- package/fixtures/pos/full_scaffold_roundtrip/README.md +1 -0
- package/package.json +39 -0
- package/schemas/claude_control/v0/ds/ds.claude_control_mapping_v0.json +227 -0
- package/schemas/claude_control/v0/ds/ds.claude_control_profile_v0.json +114 -0
- package/schemas/claude_control/v0/env/env.claude_control_apply_v0.json +170 -0
- package/schemas/claude_control/v0/env/env.claude_control_import_prefill_v0.json +171 -0
- package/schemas/claude_control/v0/global/global.claude_control_precedence_v0.json +58 -0
- package/schemas/claude_control/v0/global/global.claude_control_vocab_v0.json +98 -0
- package/schemas/ds.claude_import.instruction_profile_v0.schema.json +31 -0
- package/schemas/ds.claude_import.mcp_servers_v0.schema.json +47 -0
- package/schemas/ds.claude_import.skills_catalog_v0.schema.json +48 -0
- package/src/anthropic_profile_v0.ts +68 -0
- package/src/claude_profile_scaffold_v0.ts +117 -0
- package/src/cli.ts +160 -0
- package/src/cli_entry.ts +1 -0
- package/src/control_apply_v0.ts +108 -0
- package/src/control_check_v0.ts +98 -0
- package/src/control_contracts_v0.ts +26 -0
- package/src/control_prefill_v0.ts +74 -0
- package/src/export_zip_v0.ts +90 -0
- package/src/index.ts +29 -0
- package/src/init_v0.ts +59 -0
- package/src/input_policy_v0.ts +103 -0
- package/src/lint_v0.ts +151 -0
- package/src/mova_overlay_v0.ts +79 -0
- package/src/mova_spec_bindings_v0.ts +5 -0
- package/src/quality_v0.ts +264 -0
- package/src/redaction.ts +63 -0
- package/src/run_import.ts +526 -0
- package/src/stable_json.ts +15 -0
- package/test/control_apply_apply.test.js +40 -0
- package/test/control_check_preview.test.js +38 -0
- package/test/control_prefill.test.js +30 -0
- package/test/demo_v0_smoke.test.js +37 -0
- package/test/export_zip_determinism.test.js +41 -0
- package/test/import_determinism.test.js +53 -0
- package/test/init_v0.test.js +37 -0
- package/test/overlay_v0_output.test.js +38 -0
- package/test/profile_v0_output.test.js +44 -0
- package/test/scaffold_v0_output.test.js +64 -0
- package/test/strict_input_policy.test.js +45 -0
- package/tools/demo_v0.mjs +98 -0
- package/tools/deps_audit_v0.mjs +123 -0
- package/tools/write_mova_spec_bindings_v0.mjs +122 -0
- 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,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
|
+
}
|