@lamentis/naome 1.1.2 → 1.2.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/Cargo.lock +2 -2
  2. package/Cargo.toml +1 -1
  3. package/LICENSE +180 -21
  4. package/README.md +49 -6
  5. package/bin/naome-node.js +2 -1579
  6. package/bin/naome.js +68 -16
  7. package/crates/naome-cli/Cargo.toml +1 -1
  8. package/crates/naome-cli/src/check_commands.rs +135 -0
  9. package/crates/naome-cli/src/cli_args.rs +5 -0
  10. package/crates/naome-cli/src/dispatcher.rs +37 -0
  11. package/crates/naome-cli/src/install_bridge.rs +83 -0
  12. package/crates/naome-cli/src/main.rs +60 -341
  13. package/crates/naome-cli/src/prompt_commands.rs +68 -0
  14. package/crates/naome-cli/src/quality_commands.rs +229 -0
  15. package/crates/naome-cli/src/simple_commands.rs +53 -0
  16. package/crates/naome-cli/src/workflow_commands.rs +153 -0
  17. package/crates/naome-core/Cargo.toml +1 -1
  18. package/crates/naome-core/src/decision/checks.rs +64 -0
  19. package/crates/naome-core/src/decision/idle.rs +67 -0
  20. package/crates/naome-core/src/decision/json.rs +36 -0
  21. package/crates/naome-core/src/decision/states.rs +165 -0
  22. package/crates/naome-core/src/decision.rs +131 -353
  23. package/crates/naome-core/src/harness_health/integrity.rs +96 -0
  24. package/crates/naome-core/src/harness_health.rs +14 -126
  25. package/crates/naome-core/src/install_plan.rs +5 -0
  26. package/crates/naome-core/src/intent/classifier.rs +171 -0
  27. package/crates/naome-core/src/intent/envelope.rs +108 -0
  28. package/crates/naome-core/src/intent/legacy.rs +138 -0
  29. package/crates/naome-core/src/intent/legacy_response.rs +76 -0
  30. package/crates/naome-core/src/intent/model.rs +71 -0
  31. package/crates/naome-core/src/intent/patterns.rs +170 -0
  32. package/crates/naome-core/src/intent/resolver.rs +162 -0
  33. package/crates/naome-core/src/intent/resolver_active.rs +17 -0
  34. package/crates/naome-core/src/intent/resolver_baseline.rs +55 -0
  35. package/crates/naome-core/src/intent/resolver_catalog.rs +167 -0
  36. package/crates/naome-core/src/intent/resolver_policy.rs +72 -0
  37. package/crates/naome-core/src/intent/resolver_shared.rs +55 -0
  38. package/crates/naome-core/src/intent/risk.rs +40 -0
  39. package/crates/naome-core/src/intent/segment.rs +170 -0
  40. package/crates/naome-core/src/intent.rs +64 -879
  41. package/crates/naome-core/src/journal.rs +9 -20
  42. package/crates/naome-core/src/lib.rs +15 -0
  43. package/crates/naome-core/src/paths.rs +3 -1
  44. package/crates/naome-core/src/quality/adapter_support.rs +89 -0
  45. package/crates/naome-core/src/quality/adapters.rs +131 -0
  46. package/crates/naome-core/src/quality/baseline.rs +75 -0
  47. package/crates/naome-core/src/quality/checks/duplicate_blocks.rs +175 -0
  48. package/crates/naome-core/src/quality/checks/near_duplicates.rs +130 -0
  49. package/crates/naome-core/src/quality/checks.rs +228 -0
  50. package/crates/naome-core/src/quality/cleanup.rs +84 -0
  51. package/crates/naome-core/src/quality/config.rs +102 -0
  52. package/crates/naome-core/src/quality/config_support.rs +24 -0
  53. package/crates/naome-core/src/quality/mod.rs +108 -0
  54. package/crates/naome-core/src/quality/scanner/repo_paths.rs +103 -0
  55. package/crates/naome-core/src/quality/scanner.rs +379 -0
  56. package/crates/naome-core/src/quality/structure/adapters.rs +84 -0
  57. package/crates/naome-core/src/quality/structure/checks/basic.rs +153 -0
  58. package/crates/naome-core/src/quality/structure/checks/directory.rs +144 -0
  59. package/crates/naome-core/src/quality/structure/checks/pairing.rs +63 -0
  60. package/crates/naome-core/src/quality/structure/checks.rs +124 -0
  61. package/crates/naome-core/src/quality/structure/classify/roles.rs +188 -0
  62. package/crates/naome-core/src/quality/structure/classify.rs +94 -0
  63. package/crates/naome-core/src/quality/structure/config.rs +89 -0
  64. package/crates/naome-core/src/quality/structure/defaults.rs +107 -0
  65. package/crates/naome-core/src/quality/structure/mod.rs +77 -0
  66. package/crates/naome-core/src/quality/structure/model.rs +124 -0
  67. package/crates/naome-core/src/quality/types.rs +292 -0
  68. package/crates/naome-core/src/route/builtin_checks.rs +155 -0
  69. package/crates/naome-core/src/route/builtin_context.rs +73 -0
  70. package/crates/naome-core/src/route/builtin_integrity.rs +49 -0
  71. package/crates/naome-core/src/route/builtin_require.rs +40 -0
  72. package/crates/naome-core/src/route/context.rs +180 -0
  73. package/crates/naome-core/src/route/execution.rs +96 -0
  74. package/crates/naome-core/src/route/execution_baselines.rs +146 -0
  75. package/crates/naome-core/src/route/execution_support.rs +57 -0
  76. package/crates/naome-core/src/route/execution_tasks.rs +71 -0
  77. package/crates/naome-core/src/route/git_ops.rs +72 -0
  78. package/crates/naome-core/src/route/quality_gate.rs +73 -0
  79. package/crates/naome-core/src/route/quality_gate_config.rs +126 -0
  80. package/crates/naome-core/src/route/quality_gate_snapshot.rs +69 -0
  81. package/crates/naome-core/src/route/worktree.rs +75 -0
  82. package/crates/naome-core/src/route/worktree_files.rs +32 -0
  83. package/crates/naome-core/src/route/worktree_plan.rs +131 -0
  84. package/crates/naome-core/src/route.rs +44 -1155
  85. package/crates/naome-core/src/task_state/admission.rs +63 -0
  86. package/crates/naome-core/src/task_state/admission_proof.rs +72 -0
  87. package/crates/naome-core/src/task_state/api.rs +130 -0
  88. package/crates/naome-core/src/task_state/commit_gate.rs +138 -0
  89. package/crates/naome-core/src/task_state/compact_proof.rs +160 -0
  90. package/crates/naome-core/src/task_state/completed_refresh.rs +89 -0
  91. package/crates/naome-core/src/task_state/completion.rs +72 -0
  92. package/crates/naome-core/src/task_state/deleted_paths.rs +47 -0
  93. package/crates/naome-core/src/task_state/diff.rs +95 -0
  94. package/crates/naome-core/src/task_state/evidence.rs +154 -0
  95. package/crates/naome-core/src/task_state/git_io.rs +86 -0
  96. package/crates/naome-core/src/task_state/git_parse.rs +86 -0
  97. package/crates/naome-core/src/task_state/git_refs.rs +37 -0
  98. package/crates/naome-core/src/task_state/human_review_state.rs +31 -0
  99. package/crates/naome-core/src/task_state/mod.rs +38 -0
  100. package/crates/naome-core/src/task_state/process_guard.rs +40 -0
  101. package/crates/naome-core/src/task_state/progress.rs +123 -0
  102. package/crates/naome-core/src/task_state/proof.rs +139 -0
  103. package/crates/naome-core/src/task_state/proof_entry.rs +66 -0
  104. package/crates/naome-core/src/task_state/proof_model.rs +70 -0
  105. package/crates/naome-core/src/task_state/proof_sources.rs +76 -0
  106. package/crates/naome-core/src/task_state/push_gate.rs +49 -0
  107. package/crates/naome-core/src/task_state/reconcile.rs +7 -0
  108. package/crates/naome-core/src/task_state/repair.rs +168 -0
  109. package/crates/naome-core/src/task_state/shape.rs +117 -0
  110. package/crates/naome-core/src/task_state/task_diff_api.rs +170 -0
  111. package/crates/naome-core/src/task_state/task_records.rs +131 -0
  112. package/crates/naome-core/src/task_state/task_references.rs +126 -0
  113. package/crates/naome-core/src/task_state/types.rs +87 -0
  114. package/crates/naome-core/src/task_state/util.rs +137 -0
  115. package/crates/naome-core/src/verification/render.rs +122 -0
  116. package/crates/naome-core/src/verification.rs +177 -58
  117. package/crates/naome-core/src/verification_contract.rs +49 -21
  118. package/crates/naome-core/src/workflow/integrity.rs +123 -0
  119. package/crates/naome-core/src/workflow/integrity_normalize.rs +7 -0
  120. package/crates/naome-core/src/workflow/integrity_support.rs +110 -0
  121. package/crates/naome-core/src/workflow/mod.rs +18 -0
  122. package/crates/naome-core/src/workflow/mutation.rs +68 -0
  123. package/crates/naome-core/src/workflow/output.rs +111 -0
  124. package/crates/naome-core/src/workflow/phase_inference.rs +73 -0
  125. package/crates/naome-core/src/workflow/phases.rs +169 -0
  126. package/crates/naome-core/src/workflow/policy.rs +156 -0
  127. package/crates/naome-core/src/workflow/processes.rs +91 -0
  128. package/crates/naome-core/src/workflow/types.rs +42 -0
  129. package/crates/naome-core/tests/decision.rs +24 -118
  130. package/crates/naome-core/tests/harness_health.rs +5 -0
  131. package/crates/naome-core/tests/intent.rs +97 -792
  132. package/crates/naome-core/tests/intent_support/mod.rs +133 -0
  133. package/crates/naome-core/tests/intent_v2.rs +90 -0
  134. package/crates/naome-core/tests/quality.rs +319 -0
  135. package/crates/naome-core/tests/quality_structure.rs +116 -0
  136. package/crates/naome-core/tests/quality_structure_adapters.rs +98 -0
  137. package/crates/naome-core/tests/quality_structure_policy.rs +125 -0
  138. package/crates/naome-core/tests/quality_structure_support/mod.rs +249 -0
  139. package/crates/naome-core/tests/repo_support/mod.rs +16 -0
  140. package/crates/naome-core/tests/repo_support/repo.rs +113 -0
  141. package/crates/naome-core/tests/repo_support/repo_factories.rs +99 -0
  142. package/crates/naome-core/tests/repo_support/repo_helpers.rs +123 -0
  143. package/crates/naome-core/tests/repo_support/routes.rs +81 -0
  144. package/crates/naome-core/tests/repo_support/verification.rs +168 -0
  145. package/crates/naome-core/tests/repo_support/verification_values.rs +135 -0
  146. package/crates/naome-core/tests/route.rs +1 -1476
  147. package/crates/naome-core/tests/route_baseline.rs +86 -0
  148. package/crates/naome-core/tests/route_completion.rs +141 -0
  149. package/crates/naome-core/tests/route_harness_refresh.rs +135 -0
  150. package/crates/naome-core/tests/route_user_diff.rs +198 -0
  151. package/crates/naome-core/tests/route_worktree.rs +54 -0
  152. package/crates/naome-core/tests/task_state.rs +60 -429
  153. package/crates/naome-core/tests/task_state_compact.rs +110 -0
  154. package/crates/naome-core/tests/task_state_compact_support/mod.rs +5 -0
  155. package/crates/naome-core/tests/task_state_compact_support/repo.rs +130 -0
  156. package/crates/naome-core/tests/task_state_compact_support/states.rs +151 -0
  157. package/crates/naome-core/tests/task_state_support/mod.rs +163 -0
  158. package/crates/naome-core/tests/task_state_support/states.rs +84 -0
  159. package/crates/naome-core/tests/verification.rs +4 -45
  160. package/crates/naome-core/tests/verification_contract.rs +22 -78
  161. package/crates/naome-core/tests/workflow_integrity.rs +85 -0
  162. package/crates/naome-core/tests/workflow_policy.rs +139 -0
  163. package/crates/naome-core/tests/workflow_support/mod.rs +194 -0
  164. package/installer/agents.js +90 -0
  165. package/installer/context.js +67 -0
  166. package/installer/filesystem.js +166 -0
  167. package/installer/flows.js +84 -0
  168. package/installer/git-boundary.js +170 -0
  169. package/installer/git-hook-content.js +36 -0
  170. package/installer/git-hooks.js +134 -0
  171. package/installer/git-local.js +2 -0
  172. package/installer/git-shared.js +35 -0
  173. package/installer/harness-file-ops.js +140 -0
  174. package/installer/harness-files.js +56 -0
  175. package/installer/harness-verification.js +123 -0
  176. package/installer/install-plan.js +66 -0
  177. package/installer/main.js +25 -0
  178. package/installer/manifest-state.js +167 -0
  179. package/installer/native-build.js +24 -0
  180. package/installer/native-format.js +6 -0
  181. package/installer/native.js +162 -0
  182. package/installer/output.js +131 -0
  183. package/installer/version.js +32 -0
  184. package/native/darwin-arm64/naome +0 -0
  185. package/native/linux-x64/naome +0 -0
  186. package/package.json +3 -2
  187. package/templates/naome-root/.naome/bin/check-harness-health.js +66 -85
  188. package/templates/naome-root/.naome/bin/check-task-state.js +9 -10
  189. package/templates/naome-root/.naome/bin/naome.js +51 -76
  190. package/templates/naome-root/.naome/manifest.json +22 -18
  191. package/templates/naome-root/.naome/repository-quality-baseline.json +5 -0
  192. package/templates/naome-root/.naome/repository-quality.json +24 -0
  193. package/templates/naome-root/.naome/repository-structure.json +90 -0
  194. package/templates/naome-root/.naome/task-contract.schema.json +93 -11
  195. package/templates/naome-root/.naome/upgrade-state.json +1 -1
  196. package/templates/naome-root/.naome/verification.json +38 -0
  197. package/templates/naome-root/AGENTS.md +3 -0
  198. package/templates/naome-root/docs/naome/agent-workflow.md +25 -12
  199. package/templates/naome-root/docs/naome/execution.md +25 -21
  200. package/templates/naome-root/docs/naome/index.md +5 -3
  201. package/templates/naome-root/docs/naome/repository-quality.md +46 -0
  202. package/templates/naome-root/docs/naome/repository-structure.md +51 -0
  203. package/templates/naome-root/docs/naome/testing.md +13 -0
  204. package/crates/naome-core/src/task_state.rs +0 -2210
package/bin/naome.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { existsSync, readFileSync } from "node:fs";
3
+ import { existsSync, readFileSync, unlinkSync } from "node:fs";
4
4
  import { spawnSync } from "node:child_process";
5
5
  import { dirname, join, resolve } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
@@ -12,6 +12,7 @@ const packageVersion = packageMetadata.version;
12
12
  const nativeBinaryName = process.platform === "win32" ? "naome.exe" : "naome";
13
13
  const args = process.argv.slice(2);
14
14
  const [command] = args;
15
+ const helpCommands = "status [--json]|next [--json]|intent --prompt-file <path> [--json]|intent --prompt <text> [--json]|route --prompt-file <path> [--execute] [--json]|route --prompt <text> [--execute] [--json]|explain --prompt-file <path> [--json]|explain --prompt <text> [--json]|install|sync [--check-update]|update [--json] [--execute]|quality init [--json]|quality check --changed [--json]|quality report [--json]|structure report [--json]|structure explain --path <path> [--json]|cleanup plan [--json]|cleanup route --path <path> [--json]|refresh-integrity [--json]|workflow search-profile|check-search|phases|processes|mutations [--json]|commit -m \"type(scope): message\"".split("|");
15
16
 
16
17
  if (isHelpRequest(args)) {
17
18
  printHelp();
@@ -27,7 +28,12 @@ if (command === "install" || command === "sync") {
27
28
  requireCurrentCliBeforeSync();
28
29
  }
29
30
 
30
- runNativePackageCommand(args.filter((arg) => arg !== "--check-update"));
31
+ const qualityConfigExisted = existsSync(repositoryQualityConfigPath(process.cwd()));
32
+ const result = runNativePackageCommand(args.filter((arg) => arg !== "--check-update"));
33
+ if (result.status === 0) {
34
+ ensureRepositoryQualityInitialized(result.nativeBinary, qualityConfigExisted);
35
+ }
36
+ process.exit(result.status === null ? 1 : result.status);
31
37
  }
32
38
 
33
39
  const commandPath = findHarnessCommand(process.cwd());
@@ -50,19 +56,7 @@ function isHelpRequest(args) {
50
56
  }
51
57
 
52
58
  function printHelp() {
53
- console.log("Usage:");
54
- console.log(" naome status [--json]");
55
- console.log(" naome next [--json]");
56
- console.log(" naome intent --prompt-file <path> [--json]");
57
- console.log(" naome intent --prompt <text> [--json]");
58
- console.log(" naome route --prompt-file <path> [--execute] [--json]");
59
- console.log(" naome route --prompt <text> [--execute] [--json]");
60
- console.log(" naome explain --prompt-file <path> [--json]");
61
- console.log(" naome explain --prompt <text> [--json]");
62
- console.log(" naome install");
63
- console.log(" naome sync [--check-update]");
64
- console.log(" naome update [--json] [--execute]");
65
- console.log(" naome commit -m \"type(scope): message\"");
59
+ console.log(["Usage:", ...helpCommands.map((item) => ` naome ${item}`)].join("\n"));
66
60
  }
67
61
 
68
62
  function runUpdateCommand(commandArgs) {
@@ -266,7 +260,65 @@ function runNativePackageCommand(args) {
266
260
  stdio: "inherit"
267
261
  });
268
262
 
269
- process.exit(result.status === null ? 1 : result.status);
263
+ return { nativeBinary, status: result.status };
264
+ }
265
+
266
+ function ensureRepositoryQualityInitialized(nativeBinary, qualityConfigExisted) {
267
+ const root = process.cwd();
268
+ if (!existsSync(join(root, ".naome"))) {
269
+ return;
270
+ }
271
+
272
+ if (qualityConfigExisted && repositoryQualitySupportFilesExist(root)) {
273
+ return;
274
+ }
275
+
276
+ if (!qualityConfigExisted) {
277
+ for (const path of repositoryQualityPaths(root)) {
278
+ if (existsSync(path)) {
279
+ unlinkSync(path);
280
+ }
281
+ }
282
+ }
283
+
284
+ const result = spawnSync(nativeBinary, ["quality", "init", "--json"], {
285
+ cwd: root,
286
+ encoding: "utf8",
287
+ env: {
288
+ ...process.env,
289
+ NAOME_NODE_BIN: process.execPath
290
+ }
291
+ });
292
+
293
+ if (result.status !== 0) {
294
+ console.error("NAOME: repository quality initialization failed.");
295
+ if (result.stdout.trim()) {
296
+ console.error(result.stdout.trim());
297
+ }
298
+ if (result.stderr.trim()) {
299
+ console.error(result.stderr.trim());
300
+ }
301
+ process.exit(result.status === null ? 1 : result.status);
302
+ }
303
+ }
304
+
305
+ function repositoryQualityConfigPath(root) {
306
+ return join(root, ".naome", "repository-quality.json");
307
+ }
308
+
309
+ function repositoryQualityPaths(root) {
310
+ return [
311
+ repositoryQualityConfigPath(root),
312
+ join(root, ".naome", "repository-structure.json"),
313
+ join(root, ".naome", "repository-quality-baseline.json")
314
+ ];
315
+ }
316
+
317
+ function repositoryQualitySupportFilesExist(root) {
318
+ return [
319
+ join(root, ".naome", "repository-structure.json"),
320
+ join(root, ".naome", "repository-quality-baseline.json")
321
+ ].every((path) => existsSync(path));
270
322
  }
271
323
 
272
324
  function resolveNativePackageBinary() {
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "naome-cli"
3
- version = "1.1.2"
3
+ version = "1.2.1"
4
4
  edition.workspace = true
5
5
  license.workspace = true
6
6
  repository.workspace = true
@@ -0,0 +1,135 @@
1
+ use std::collections::HashMap;
2
+ use std::path::Path;
3
+
4
+ use naome_core::{
5
+ validate_harness_health, validate_task_state, validate_verification_contract,
6
+ HarnessHealthOptions, TaskStateMode, TaskStateOptions,
7
+ };
8
+
9
+ pub fn run_harness_health(root: &Path, args: &[String]) -> Result<(), Box<dyn std::error::Error>> {
10
+ let errors = validate_harness_health(root, harness_health_options(args)?)?;
11
+ finish_gate(
12
+ errors,
13
+ "NAOME harness health OK.",
14
+ "NAOME harness health check failed.",
15
+ )
16
+ }
17
+
18
+ pub fn run_task_state(root: &Path, args: &[String]) -> Result<(), Box<dyn std::error::Error>> {
19
+ let mode = task_state_mode(args);
20
+ let report = validate_task_state(
21
+ root,
22
+ TaskStateOptions {
23
+ mode,
24
+ harness_health: optional_harness_health(args)?,
25
+ },
26
+ )?;
27
+ if report.errors.is_empty() {
28
+ println!("{}", task_state_success_message(mode));
29
+ for notice in report.notices {
30
+ println!("- {notice}");
31
+ }
32
+ return Ok(());
33
+ }
34
+ print_errors(task_state_failure_message(mode), report.errors);
35
+ std::process::exit(1);
36
+ }
37
+
38
+ pub fn run_verification_contract(root: &Path) -> Result<(), Box<dyn std::error::Error>> {
39
+ let errors = validate_verification_contract(root)?;
40
+ finish_gate(
41
+ errors,
42
+ "NAOME verification contract OK.",
43
+ "NAOME verification contract failed.",
44
+ )
45
+ }
46
+
47
+ fn finish_gate(
48
+ errors: Vec<String>,
49
+ success: &str,
50
+ failure: &str,
51
+ ) -> Result<(), Box<dyn std::error::Error>> {
52
+ if errors.is_empty() {
53
+ println!("{success}");
54
+ return Ok(());
55
+ }
56
+ print_errors(failure, errors);
57
+ std::process::exit(1);
58
+ }
59
+
60
+ fn print_errors(header: &str, errors: Vec<String>) {
61
+ eprintln!("{header}");
62
+ for error in errors {
63
+ eprintln!("- {error}");
64
+ }
65
+ }
66
+
67
+ fn harness_health_options(
68
+ args: &[String],
69
+ ) -> Result<HarnessHealthOptions, Box<dyn std::error::Error>> {
70
+ Ok(build_health_options(args, expected_integrity_from_env()?))
71
+ }
72
+
73
+ fn optional_harness_health(
74
+ args: &[String],
75
+ ) -> Result<Option<HarnessHealthOptions>, Box<dyn std::error::Error>> {
76
+ let expected_integrity = expected_integrity_from_env()?;
77
+ if expected_integrity.is_empty() && std::env::var("NAOME_ALLOW_MISSING_INTEGRITY").is_err() {
78
+ Ok(None)
79
+ } else {
80
+ Ok(Some(build_health_options(args, expected_integrity)))
81
+ }
82
+ }
83
+
84
+ fn build_health_options(
85
+ args: &[String],
86
+ expected_integrity: HashMap<String, String>,
87
+ ) -> HarnessHealthOptions {
88
+ HarnessHealthOptions {
89
+ expected_integrity,
90
+ allow_missing_integrity: std::env::var("NAOME_ALLOW_MISSING_INTEGRITY")
91
+ .is_ok_and(|value| value == "1"),
92
+ allow_missing_archive: args.iter().any(|arg| arg == "--allow-missing-archive"),
93
+ }
94
+ }
95
+
96
+ fn task_state_mode(args: &[String]) -> TaskStateMode {
97
+ if args.iter().any(|arg| arg == "--admission") {
98
+ TaskStateMode::Admission
99
+ } else if args.iter().any(|arg| arg == "--progress") {
100
+ TaskStateMode::Progress
101
+ } else if args.iter().any(|arg| arg == "--commit-gate") {
102
+ TaskStateMode::CommitGate
103
+ } else if args.iter().any(|arg| arg == "--push-gate") {
104
+ TaskStateMode::PushGate
105
+ } else {
106
+ TaskStateMode::State
107
+ }
108
+ }
109
+
110
+ fn expected_integrity_from_env() -> Result<HashMap<String, String>, Box<dyn std::error::Error>> {
111
+ let Ok(value) = std::env::var("NAOME_EXPECTED_INTEGRITY_JSON") else {
112
+ return Ok(HashMap::new());
113
+ };
114
+ Ok(serde_json::from_str(&value)?)
115
+ }
116
+
117
+ fn task_state_failure_message(mode: TaskStateMode) -> &'static str {
118
+ match mode {
119
+ TaskStateMode::Admission => "NAOME task admission check failed.",
120
+ TaskStateMode::Progress => "NAOME task progress check failed.",
121
+ TaskStateMode::CommitGate => "NAOME commit gate failed.",
122
+ TaskStateMode::PushGate => "NAOME push gate failed.",
123
+ TaskStateMode::State => "NAOME task state check failed.",
124
+ }
125
+ }
126
+
127
+ fn task_state_success_message(mode: TaskStateMode) -> &'static str {
128
+ match mode {
129
+ TaskStateMode::Admission => "NAOME task admission OK.",
130
+ TaskStateMode::Progress => "NAOME task progress OK.",
131
+ TaskStateMode::CommitGate => "NAOME commit gate OK.",
132
+ TaskStateMode::PushGate => "NAOME push gate OK.",
133
+ TaskStateMode::State => "NAOME task state OK.",
134
+ }
135
+ }
@@ -0,0 +1,5 @@
1
+ pub fn option_value(args: &[String], option: &str) -> Option<String> {
2
+ args.windows(2)
3
+ .find(|window| window[0] == option)
4
+ .map(|window| window[1].clone())
5
+ }
@@ -0,0 +1,37 @@
1
+ use std::path::Path;
2
+
3
+ use crate::check_commands::{run_harness_health, run_task_state, run_verification_contract};
4
+ use crate::install_bridge::run_install_bridge;
5
+ use crate::prompt_commands::{run_explain, run_intent, run_route};
6
+ use crate::quality_commands::{run_cleanup_command, run_quality_command, run_structure_command};
7
+ use crate::simple_commands::{
8
+ print_install_plan, run_commit_paths, run_journal_task, seed_verification,
9
+ };
10
+ use crate::workflow_commands::{run_refresh_integrity, run_workflow_command};
11
+
12
+ pub fn dispatch_command(
13
+ root: &Path,
14
+ command: &str,
15
+ args: &[String],
16
+ ) -> Result<bool, Box<dyn std::error::Error>> {
17
+ match command {
18
+ "install" | "sync" => run_install_bridge(command, args)?,
19
+ "install-plan" => print_install_plan(args)?,
20
+ "seed-verification" => seed_verification(root)?,
21
+ "refresh-integrity" => run_refresh_integrity(root, args)?,
22
+ "quality" => run_quality_command(root, args)?,
23
+ "structure" => run_structure_command(root, args)?,
24
+ "cleanup" => run_cleanup_command(root, args)?,
25
+ "workflow" => run_workflow_command(root, args)?,
26
+ "check-harness-health" => run_harness_health(root, args)?,
27
+ "check-task-state" => run_task_state(root, args)?,
28
+ "validate-verification" => run_verification_contract(root)?,
29
+ "intent" => run_intent(root, args)?,
30
+ "route" => run_route(root, args)?,
31
+ "explain" => run_explain(root, args)?,
32
+ "journal-task" => run_journal_task(root, args)?,
33
+ "commit-paths" => run_commit_paths(root, args)?,
34
+ _ => return Ok(false),
35
+ }
36
+ Ok(true)
37
+ }
@@ -0,0 +1,83 @@
1
+ use std::path::PathBuf;
2
+ use std::process::Command;
3
+
4
+ use crate::cli_args::option_value;
5
+
6
+ pub fn run_install_bridge(
7
+ command: &str,
8
+ args: &[String],
9
+ ) -> Result<(), Box<dyn std::error::Error>> {
10
+ let package_root = option_value(args, "--package-root")
11
+ .map(PathBuf::from)
12
+ .or_else(|| std::env::var("NAOME_PACKAGE_ROOT").ok().map(PathBuf::from))
13
+ .or_else(resolve_package_root_from_exe)
14
+ .or_else(resolve_package_root_from_cwd);
15
+ let installer_js = option_value(args, "--installer-js")
16
+ .map(PathBuf::from)
17
+ .or_else(|| std::env::var("NAOME_INSTALLER_JS").ok().map(PathBuf::from))
18
+ .or_else(|| {
19
+ package_root
20
+ .as_ref()
21
+ .map(|root| root.join("bin").join("naome-node.js"))
22
+ });
23
+ let Some(installer_js) = installer_js.filter(|path| path.is_file()) else {
24
+ return Err(format!(
25
+ "native {command} needs naome-node.js. Install the naome npm package, or pass --package-root/--installer-js."
26
+ )
27
+ .into());
28
+ };
29
+
30
+ let node_bin = std::env::var("NAOME_NODE_BIN").unwrap_or_else(|_| "node".to_string());
31
+ let status = Command::new(node_bin)
32
+ .arg(installer_js)
33
+ .args(strip_install_bridge_options(args))
34
+ .status()?;
35
+
36
+ if status.success() {
37
+ return Ok(());
38
+ }
39
+
40
+ std::process::exit(status.code().unwrap_or(1));
41
+ }
42
+
43
+ fn strip_install_bridge_options(args: &[String]) -> Vec<String> {
44
+ let mut result = Vec::new();
45
+ let mut index = 1;
46
+ while index < args.len() {
47
+ let arg = &args[index];
48
+ if arg == "--package-root" || arg == "--installer-js" {
49
+ index += 2;
50
+ continue;
51
+ }
52
+ if arg.starts_with("--package-root=") || arg.starts_with("--installer-js=") {
53
+ index += 1;
54
+ continue;
55
+ }
56
+ result.push(arg.clone());
57
+ index += 1;
58
+ }
59
+ result
60
+ }
61
+
62
+ fn resolve_package_root_from_exe() -> Option<PathBuf> {
63
+ let exe = std::env::current_exe().ok()?;
64
+ let platform_dir = exe.parent()?;
65
+ let native_dir = platform_dir.parent()?;
66
+ if native_dir.file_name().and_then(|value| value.to_str()) == Some("native") {
67
+ let package_root = native_dir.parent()?.to_path_buf();
68
+ if package_root.join("bin").join("naome-node.js").is_file() {
69
+ return Some(package_root);
70
+ }
71
+ }
72
+ None
73
+ }
74
+
75
+ fn resolve_package_root_from_cwd() -> Option<PathBuf> {
76
+ let current = std::env::current_dir().ok()?;
77
+ for candidate in [current.join("packages").join("naome"), current] {
78
+ if candidate.join("bin").join("naome-node.js").is_file() {
79
+ return Some(candidate);
80
+ }
81
+ }
82
+ None
83
+ }