@lamentis/naome 1.2.0 → 1.3.0

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 (139) hide show
  1. package/Cargo.lock +2 -2
  2. package/README.md +108 -47
  3. package/bin/naome-node.js +2 -1579
  4. package/bin/naome.js +34 -5
  5. package/crates/naome-cli/Cargo.toml +1 -1
  6. package/crates/naome-cli/src/dispatcher.rs +7 -2
  7. package/crates/naome-cli/src/main.rs +37 -22
  8. package/crates/naome-cli/src/quality_commands.rs +317 -10
  9. package/crates/naome-cli/src/workflow_commands.rs +21 -1
  10. package/crates/naome-core/Cargo.toml +1 -1
  11. package/crates/naome-core/src/decision/checks.rs +64 -0
  12. package/crates/naome-core/src/decision/idle.rs +67 -0
  13. package/crates/naome-core/src/decision/json.rs +36 -0
  14. package/crates/naome-core/src/decision/states.rs +165 -0
  15. package/crates/naome-core/src/decision.rs +131 -353
  16. package/crates/naome-core/src/git.rs +4 -2
  17. package/crates/naome-core/src/install_plan.rs +4 -0
  18. package/crates/naome-core/src/lib.rs +12 -6
  19. package/crates/naome-core/src/paths.rs +3 -1
  20. package/crates/naome-core/src/quality/adapter_support.rs +89 -0
  21. package/crates/naome-core/src/quality/adapters.rs +20 -67
  22. package/crates/naome-core/src/quality/baseline.rs +8 -0
  23. package/crates/naome-core/src/quality/cache.rs +153 -0
  24. package/crates/naome-core/src/quality/checks/duplicate_blocks.rs +25 -11
  25. package/crates/naome-core/src/quality/checks/near_duplicates.rs +4 -2
  26. package/crates/naome-core/src/quality/checks.rs +7 -8
  27. package/crates/naome-core/src/quality/cleanup.rs +48 -3
  28. package/crates/naome-core/src/quality/config.rs +8 -15
  29. package/crates/naome-core/src/quality/config_support.rs +24 -0
  30. package/crates/naome-core/src/quality/mod.rs +72 -6
  31. package/crates/naome-core/src/quality/scanner/analysis/normalize.rs +78 -0
  32. package/crates/naome-core/src/quality/scanner/analysis.rs +160 -0
  33. package/crates/naome-core/src/quality/scanner/repo_paths.rs +39 -3
  34. package/crates/naome-core/src/quality/scanner.rs +200 -215
  35. package/crates/naome-core/src/quality/semantic/checks.rs +134 -0
  36. package/crates/naome-core/src/quality/semantic/extract.rs +158 -0
  37. package/crates/naome-core/src/quality/semantic/model.rs +85 -0
  38. package/crates/naome-core/src/quality/semantic/route.rs +52 -0
  39. package/crates/naome-core/src/quality/semantic.rs +68 -0
  40. package/crates/naome-core/src/quality/structure/adapters.rs +84 -0
  41. package/crates/naome-core/src/quality/structure/checks/basic.rs +153 -0
  42. package/crates/naome-core/src/quality/structure/checks/directory.rs +134 -0
  43. package/crates/naome-core/src/quality/structure/checks/pairing.rs +63 -0
  44. package/crates/naome-core/src/quality/structure/checks.rs +124 -0
  45. package/crates/naome-core/src/quality/structure/classify/roles.rs +188 -0
  46. package/crates/naome-core/src/quality/structure/classify.rs +146 -0
  47. package/crates/naome-core/src/quality/structure/config.rs +89 -0
  48. package/crates/naome-core/src/quality/structure/defaults.rs +107 -0
  49. package/crates/naome-core/src/quality/structure/mod.rs +77 -0
  50. package/crates/naome-core/src/quality/structure/model.rs +131 -0
  51. package/crates/naome-core/src/quality/types.rs +43 -2
  52. package/crates/naome-core/src/route/builtin_checks.rs +141 -0
  53. package/crates/naome-core/src/route/builtin_context.rs +73 -0
  54. package/crates/naome-core/src/route/builtin_integrity.rs +49 -0
  55. package/crates/naome-core/src/route/builtin_require.rs +40 -0
  56. package/crates/naome-core/src/route/context.rs +180 -0
  57. package/crates/naome-core/src/route/execution.rs +96 -0
  58. package/crates/naome-core/src/route/execution_baselines.rs +146 -0
  59. package/crates/naome-core/src/route/execution_support.rs +57 -0
  60. package/crates/naome-core/src/route/execution_tasks.rs +71 -0
  61. package/crates/naome-core/src/route/git_ops.rs +72 -0
  62. package/crates/naome-core/src/route/quality_gate.rs +73 -0
  63. package/crates/naome-core/src/route/quality_gate_config.rs +126 -0
  64. package/crates/naome-core/src/route/quality_gate_snapshot.rs +69 -0
  65. package/crates/naome-core/src/route/worktree.rs +75 -0
  66. package/crates/naome-core/src/route/worktree_files.rs +32 -0
  67. package/crates/naome-core/src/route/worktree_plan.rs +131 -0
  68. package/crates/naome-core/src/route.rs +44 -1217
  69. package/crates/naome-core/src/verification.rs +1 -0
  70. package/crates/naome-core/src/workflow/doctor.rs +144 -0
  71. package/crates/naome-core/src/workflow/mod.rs +2 -0
  72. package/crates/naome-core/src/workflow/mutation.rs +1 -2
  73. package/crates/naome-core/tests/decision.rs +24 -118
  74. package/crates/naome-core/tests/harness_health.rs +2 -0
  75. package/crates/naome-core/tests/install_plan.rs +2 -0
  76. package/crates/naome-core/tests/quality.rs +26 -123
  77. package/crates/naome-core/tests/quality_performance.rs +231 -0
  78. package/crates/naome-core/tests/quality_structure.rs +116 -0
  79. package/crates/naome-core/tests/quality_structure_adapters.rs +98 -0
  80. package/crates/naome-core/tests/quality_structure_policy.rs +144 -0
  81. package/crates/naome-core/tests/quality_structure_support/mod.rs +249 -0
  82. package/crates/naome-core/tests/repo_support/mod.rs +16 -0
  83. package/crates/naome-core/tests/repo_support/repo.rs +113 -0
  84. package/crates/naome-core/tests/repo_support/repo_factories.rs +99 -0
  85. package/crates/naome-core/tests/repo_support/repo_helpers.rs +123 -0
  86. package/crates/naome-core/tests/repo_support/routes.rs +81 -0
  87. package/crates/naome-core/tests/repo_support/verification.rs +168 -0
  88. package/crates/naome-core/tests/repo_support/verification_values.rs +135 -0
  89. package/crates/naome-core/tests/route.rs +1 -1376
  90. package/crates/naome-core/tests/route_baseline.rs +86 -0
  91. package/crates/naome-core/tests/route_completion.rs +141 -0
  92. package/crates/naome-core/tests/route_harness_refresh.rs +135 -0
  93. package/crates/naome-core/tests/route_user_diff.rs +202 -0
  94. package/crates/naome-core/tests/route_worktree.rs +54 -0
  95. package/crates/naome-core/tests/semantic_legacy.rs +140 -0
  96. package/crates/naome-core/tests/task_state.rs +60 -432
  97. package/crates/naome-core/tests/task_state_compact_support/repo.rs +1 -1
  98. package/crates/naome-core/tests/task_state_support/mod.rs +163 -0
  99. package/crates/naome-core/tests/task_state_support/states.rs +84 -0
  100. package/crates/naome-core/tests/verification.rs +4 -45
  101. package/crates/naome-core/tests/verification_contract.rs +22 -78
  102. package/crates/naome-core/tests/workflow_doctor.rs +24 -0
  103. package/crates/naome-core/tests/workflow_policy.rs +6 -1
  104. package/crates/naome-core/tests/workflow_support/mod.rs +1 -1
  105. package/installer/agents.js +90 -0
  106. package/installer/context.js +67 -0
  107. package/installer/filesystem.js +166 -0
  108. package/installer/flows.js +84 -0
  109. package/installer/git-boundary.js +171 -0
  110. package/installer/git-hook-content.js +36 -0
  111. package/installer/git-hooks.js +134 -0
  112. package/installer/git-local.js +2 -0
  113. package/installer/git-shared.js +35 -0
  114. package/installer/harness-file-ops.js +140 -0
  115. package/installer/harness-files.js +56 -0
  116. package/installer/harness-verification.js +123 -0
  117. package/installer/install-plan.js +66 -0
  118. package/installer/main.js +25 -0
  119. package/installer/manifest-state.js +167 -0
  120. package/installer/native-build.js +24 -0
  121. package/installer/native-format.js +6 -0
  122. package/installer/native.js +162 -0
  123. package/installer/output.js +131 -0
  124. package/installer/version.js +32 -0
  125. package/native/darwin-arm64/naome +0 -0
  126. package/native/linux-x64/naome +0 -0
  127. package/package.json +2 -1
  128. package/templates/naome-root/.naome/bin/check-harness-health.js +3 -3
  129. package/templates/naome-root/.naome/bin/check-task-state.js +3 -3
  130. package/templates/naome-root/.naome/bin/naome.js +32 -21
  131. package/templates/naome-root/.naome/manifest.json +5 -3
  132. package/templates/naome-root/.naome/repository-structure.json +90 -0
  133. package/templates/naome-root/.naome/verification.json +1 -0
  134. package/templates/naome-root/.naomeignore +1 -0
  135. package/templates/naome-root/docs/naome/agent-workflow.md +16 -14
  136. package/templates/naome-root/docs/naome/index.md +4 -3
  137. package/templates/naome-root/docs/naome/repository-quality.md +66 -4
  138. package/templates/naome-root/docs/naome/repository-structure.md +51 -0
  139. package/templates/naome-root/docs/naome/testing.md +2 -1
@@ -0,0 +1,168 @@
1
+ use serde_json::{json, Value};
2
+
3
+ use super::repo::TestRepo;
4
+ use super::verification_values::{
5
+ change_type, diff_check, mutating_diff_check, repository_quality_check, verification_value,
6
+ };
7
+
8
+ impl TestRepo {
9
+ pub fn write_base_naome_state(&self, task_state: serde_json::Value) {
10
+ self.write_naome_json(
11
+ "init-state.json",
12
+ json!({ "initialized": true, "intakeStatus": "complete" }),
13
+ );
14
+ self.write_naome_json("upgrade-state.json", json!({ "status": "complete" }));
15
+ self.write_naome_json(
16
+ "verification.json",
17
+ json!({
18
+ "schema": "naome.verification.v1",
19
+ "version": 1,
20
+ "status": "ready",
21
+ "checks": [diff_check(vec!["README.md"])],
22
+ "changeTypes": [],
23
+ "releaseGates": []
24
+ }),
25
+ );
26
+ self.write_naome_json("task-state.json", task_state);
27
+ }
28
+
29
+ pub fn write_readme_quality_verification(
30
+ &self,
31
+ extra_checks: Vec<Value>,
32
+ required_checks: Vec<&str>,
33
+ ) {
34
+ let mut checks = vec![diff_check(vec!["README.md"])];
35
+ checks.extend(extra_checks);
36
+
37
+ self.write_naome_json(
38
+ "verification.json",
39
+ json!({
40
+ "schema": "naome.verification.v1",
41
+ "version": 1,
42
+ "status": "ready",
43
+ "checks": checks,
44
+ "changeTypes": [
45
+ {
46
+ "id": "readme",
47
+ "description": "README changes.",
48
+ "paths": ["README.md"],
49
+ "requiredChecks": required_checks,
50
+ "recommendedChecks": [],
51
+ "humanReview": false
52
+ }
53
+ ],
54
+ "releaseGates": []
55
+ }),
56
+ );
57
+ }
58
+
59
+ pub fn write_product_quality_verification(&self) {
60
+ self.write_naome_json(
61
+ "verification.json",
62
+ json!({
63
+ "schema": "naome.verification.v1",
64
+ "version": 1,
65
+ "status": "ready",
66
+ "checks": product_quality_checks(),
67
+ "changeTypes": [
68
+ {
69
+ "id": "product-installer-or-template",
70
+ "description": "NAOME product changes.",
71
+ "paths": ["packages/naome/**", "scripts/**"],
72
+ "requiredChecks": [
73
+ "installer-tests",
74
+ "rust-build",
75
+ "decision-engine-tests",
76
+ "package-dry-run"
77
+ ],
78
+ "recommendedChecks": [],
79
+ "humanReview": false
80
+ }
81
+ ],
82
+ "releaseGates": []
83
+ }),
84
+ );
85
+ }
86
+
87
+ pub fn write_source_quality_verification(&self) {
88
+ self.write_naome_json(
89
+ "verification.json",
90
+ verification_value(
91
+ "ready",
92
+ vec![repository_quality_check()],
93
+ vec![change_type(
94
+ "source",
95
+ "Source changes.",
96
+ vec!["src/**"],
97
+ vec!["repository-quality-check"],
98
+ )],
99
+ ),
100
+ );
101
+ }
102
+
103
+ pub fn write_readme_rename_verification(&self) {
104
+ self.write_naome_json(
105
+ "verification.json",
106
+ verification_value(
107
+ "ready",
108
+ vec![diff_check(vec!["README.md", "INTRO.md"])],
109
+ vec![change_type(
110
+ "docs",
111
+ "Repository docs.",
112
+ vec!["README.md", "INTRO.md"],
113
+ vec!["diff-check"],
114
+ )],
115
+ ),
116
+ );
117
+ }
118
+
119
+ pub fn write_unsafe_readme_diff_verification(&self) {
120
+ self.write_naome_json(
121
+ "verification.json",
122
+ verification_value(
123
+ "ready",
124
+ vec![mutating_diff_check()],
125
+ vec![change_type(
126
+ "readme",
127
+ "README changes.",
128
+ vec!["README.md"],
129
+ vec!["diff-check"],
130
+ )],
131
+ ),
132
+ );
133
+ }
134
+ }
135
+
136
+ fn product_quality_checks() -> Vec<serde_json::Value> {
137
+ vec![
138
+ super::verification_values::quality_check(
139
+ "installer-tests",
140
+ "npm run test:naome-installer",
141
+ "Validate installer behavior.",
142
+ "medium",
143
+ vec!["scripts/naome-installer.test.js"],
144
+ ),
145
+ super::verification_values::quality_check(
146
+ "rust-build",
147
+ "npm run build:rust",
148
+ "Build native CLI.",
149
+ "medium",
150
+ vec!["packages/naome/Cargo.toml"],
151
+ ),
152
+ super::verification_values::quality_check(
153
+ "decision-engine-tests",
154
+ "npm run test:decision-engine",
155
+ "Validate route decisions.",
156
+ "fast",
157
+ vec!["packages/naome/crates/naome-core/tests/route.rs"],
158
+ ),
159
+ super::verification_values::quality_check(
160
+ "package-dry-run",
161
+ "npm run pack:dry-run",
162
+ "Validate package metadata.",
163
+ "medium",
164
+ vec!["packages/naome/package.json"],
165
+ ),
166
+ diff_check(vec!["packages/naome/crates/naome-core/src/route.rs"]),
167
+ ]
168
+ }
@@ -0,0 +1,135 @@
1
+ use serde_json::json;
2
+
3
+ pub fn completed_task_state(admission_head: &str) -> serde_json::Value {
4
+ json!({
5
+ "schema": "naome.task-state.v1",
6
+ "version": 1,
7
+ "status": "complete",
8
+ "activeTask": {
9
+ "id": "readme-task",
10
+ "request": "Change README.",
11
+ "userPrompt": {
12
+ "receivedAt": "2026-05-06T00:00:00.000Z",
13
+ "text": "Change README."
14
+ },
15
+ "admission": {
16
+ "command": "node .naome/bin/check-task-state.js --admission",
17
+ "cwd": ".",
18
+ "exitCode": 0,
19
+ "checkedAt": "2026-05-06T00:00:00.000Z",
20
+ "gitHead": admission_head,
21
+ "changedPaths": []
22
+ },
23
+ "allowedPaths": ["README.md"],
24
+ "declaredChangeTypes": ["product-docs"],
25
+ "requiredCheckIds": ["diff-check"],
26
+ "proofResults": [
27
+ {
28
+ "checkId": "diff-check",
29
+ "command": "git diff --check",
30
+ "cwd": ".",
31
+ "exitCode": 0,
32
+ "checkedAt": "2026-05-06T00:00:00.000Z",
33
+ "evidence": ["README.md"]
34
+ }
35
+ ],
36
+ "revisions": [],
37
+ "humanReview": {
38
+ "required": false,
39
+ "approved": false,
40
+ "reason": null
41
+ }
42
+ },
43
+ "blocker": null,
44
+ "updatedAt": "2026-05-06T00:00:00.000Z"
45
+ })
46
+ }
47
+
48
+ pub fn diff_check(evidence: Vec<&str>) -> serde_json::Value {
49
+ json!({
50
+ "id": "diff-check",
51
+ "command": "git diff --check",
52
+ "cwd": ".",
53
+ "purpose": "Reject whitespace errors.",
54
+ "cost": "fast",
55
+ "source": "test",
56
+ "evidence": evidence,
57
+ "lastVerified": null
58
+ })
59
+ }
60
+
61
+ pub fn verification_value(
62
+ status: &str,
63
+ checks: Vec<serde_json::Value>,
64
+ change_types: Vec<serde_json::Value>,
65
+ ) -> serde_json::Value {
66
+ json!({
67
+ "schema": "naome.verification.v1",
68
+ "version": 1,
69
+ "status": status,
70
+ "checks": checks,
71
+ "changeTypes": change_types,
72
+ "releaseGates": []
73
+ })
74
+ }
75
+
76
+ pub fn change_type(
77
+ id: &str,
78
+ description: &str,
79
+ paths: Vec<&str>,
80
+ required_checks: Vec<&str>,
81
+ ) -> serde_json::Value {
82
+ json!({
83
+ "id": id,
84
+ "description": description,
85
+ "paths": paths,
86
+ "requiredChecks": required_checks,
87
+ "recommendedChecks": [],
88
+ "humanReview": false
89
+ })
90
+ }
91
+
92
+ pub fn quality_check(
93
+ id: &str,
94
+ command: &str,
95
+ purpose: &str,
96
+ cost: &str,
97
+ evidence: Vec<&str>,
98
+ ) -> serde_json::Value {
99
+ json!({
100
+ "id": id,
101
+ "command": command,
102
+ "cwd": ".",
103
+ "purpose": purpose,
104
+ "cost": cost,
105
+ "source": "test",
106
+ "evidence": evidence,
107
+ "lastVerified": null
108
+ })
109
+ }
110
+
111
+ pub fn repository_quality_check() -> serde_json::Value {
112
+ json!({
113
+ "id": "repository-quality-check",
114
+ "command": "naome quality check --changed",
115
+ "cwd": ".",
116
+ "purpose": "Validate changed files against repository quality rules.",
117
+ "cost": "fast",
118
+ "source": "NAOME built-in",
119
+ "evidence": ["src/**"],
120
+ "lastVerified": null
121
+ })
122
+ }
123
+
124
+ pub fn mutating_diff_check() -> serde_json::Value {
125
+ json!({
126
+ "id": "diff-check",
127
+ "command": "node -e \"const fs = require('fs'); const marker = '.git/naome-diff-check-marker'; if (fs.existsSync(marker)) { fs.writeFileSync('NEW.md', '# unexpected\\\\n'); } else { fs.writeFileSync(marker, 'x'); }\"",
128
+ "cwd": ".",
129
+ "purpose": "Simulate a mutating diff check.",
130
+ "cost": "fast",
131
+ "source": "test",
132
+ "evidence": ["README.md"],
133
+ "lastVerified": null
134
+ })
135
+ }