agentera 3.0.0-dev.5 → 3.0.0-dev.6

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 (247) hide show
  1. package/README.md +4 -3
  2. package/bundle/references/adapters/opencode.md +1 -1
  3. package/bundle/references/adapters/package-registry.yaml +0 -1
  4. package/bundle/references/adapters/package-surface-characterization.md +1 -2
  5. package/bundle/references/analysis/startup-measurement-contract.yaml +11 -11
  6. package/bundle/references/cli/audience-namespace-cli-migration.yaml +40 -26
  7. package/bundle/references/cli/bundle-skill-vocabulary.yaml +1 -29
  8. package/bundle/references/cli/coexistence-probe.yaml +9 -0
  9. package/bundle/references/cli/single-name-protocol.yaml +42 -0
  10. package/bundle/references/cli/update-channels.yaml +1 -0
  11. package/bundle/references/cli/upgrade-repair-wording.md +31 -0
  12. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +98 -0
  13. package/bundle/references/cli/vocabulary.md +12 -10
  14. package/bundle/references/meta/documentation-inventory.md +9 -3
  15. package/bundle/skills/agentera/SKILL.md +14 -14
  16. package/dist/analytics/extractCorpus/cli.js +101 -0
  17. package/dist/analytics/extractCorpus/cli.js.map +1 -0
  18. package/dist/analytics/extractCorpus/copilotSessions.js +231 -0
  19. package/dist/analytics/extractCorpus/copilotSessions.js.map +1 -0
  20. package/dist/analytics/extractCorpus/core.js +357 -0
  21. package/dist/analytics/extractCorpus/core.js.map +1 -0
  22. package/dist/analytics/extractCorpus/corpus.js +132 -0
  23. package/dist/analytics/extractCorpus/corpus.js.map +1 -0
  24. package/dist/analytics/extractCorpus/cursorSessions.js +420 -0
  25. package/dist/analytics/extractCorpus/cursorSessions.js.map +1 -0
  26. package/dist/analytics/extractCorpus/filesystemSources.js +122 -0
  27. package/dist/analytics/extractCorpus/filesystemSources.js.map +1 -0
  28. package/dist/analytics/extractCorpus/index.js +9 -0
  29. package/dist/analytics/extractCorpus/index.js.map +1 -0
  30. package/dist/analytics/extractCorpus/jsonlSessions.js +185 -0
  31. package/dist/analytics/extractCorpus/jsonlSessions.js.map +1 -0
  32. package/dist/analytics/extractCorpus/sqliteSessions.js +275 -0
  33. package/dist/analytics/extractCorpus/sqliteSessions.js.map +1 -0
  34. package/dist/analytics/extractCorpus.js +2 -1790
  35. package/dist/analytics/extractCorpus.js.map +1 -1
  36. package/dist/analytics/usageStats.js +1 -1
  37. package/dist/analytics/usageStats.js.map +1 -1
  38. package/dist/cli/capabilityContext/benchmark.js +557 -0
  39. package/dist/cli/capabilityContext/benchmark.js.map +1 -0
  40. package/dist/cli/capabilityContext/bespoke.js +25 -0
  41. package/dist/cli/capabilityContext/bespoke.js.map +1 -0
  42. package/dist/cli/capabilityContext/closeout.js +230 -0
  43. package/dist/cli/capabilityContext/closeout.js.map +1 -0
  44. package/dist/cli/capabilityContext/contract.js +186 -0
  45. package/dist/cli/capabilityContext/contract.js.map +1 -0
  46. package/dist/cli/capabilityContext/evidence.js +446 -0
  47. package/dist/cli/capabilityContext/evidence.js.map +1 -0
  48. package/dist/cli/capabilityContext/index.js +4 -0
  49. package/dist/cli/capabilityContext/index.js.map +1 -0
  50. package/dist/cli/capabilityContext/orchestration.js +107 -0
  51. package/dist/cli/capabilityContext/orchestration.js.map +1 -0
  52. package/dist/cli/capabilityContext/planState.js +271 -0
  53. package/dist/cli/capabilityContext/planState.js.map +1 -0
  54. package/dist/cli/capabilityContext/progress.js +96 -0
  55. package/dist/cli/capabilityContext/progress.js.map +1 -0
  56. package/dist/cli/capabilityContext/realisera.js +174 -0
  57. package/dist/cli/capabilityContext/realisera.js.map +1 -0
  58. package/dist/cli/capabilityContext/shared.js +94 -0
  59. package/dist/cli/capabilityContext/shared.js.map +1 -0
  60. package/dist/cli/capabilityContext/slim.js +106 -0
  61. package/dist/cli/capabilityContext/slim.js.map +1 -0
  62. package/dist/cli/capabilityContext/startup.js +208 -0
  63. package/dist/cli/capabilityContext/startup.js.map +1 -0
  64. package/dist/cli/capabilityContext/types.js +43 -0
  65. package/dist/cli/capabilityContext/types.js.map +1 -0
  66. package/dist/cli/capabilityContext.js +1 -2486
  67. package/dist/cli/capabilityContext.js.map +1 -1
  68. package/dist/cli/commands/backfill.js +84 -0
  69. package/dist/cli/commands/backfill.js.map +1 -0
  70. package/dist/cli/commands/compact.js +1 -1
  71. package/dist/cli/commands/compact.js.map +1 -1
  72. package/dist/cli/commands/doctor.js +24 -7
  73. package/dist/cli/commands/doctor.js.map +1 -1
  74. package/dist/cli/commands/lint.js +4 -36
  75. package/dist/cli/commands/lint.js.map +1 -1
  76. package/dist/cli/commands/query.js +1 -1
  77. package/dist/cli/commands/query.js.map +1 -1
  78. package/dist/cli/commands/report.js +11 -2
  79. package/dist/cli/commands/report.js.map +1 -1
  80. package/dist/cli/commands/schema.js +1 -2
  81. package/dist/cli/commands/schema.js.map +1 -1
  82. package/dist/cli/commands/state/decisions.js +397 -0
  83. package/dist/cli/commands/state/decisions.js.map +1 -0
  84. package/dist/cli/commands/state/docs.js +93 -0
  85. package/dist/cli/commands/state/docs.js.map +1 -0
  86. package/dist/cli/commands/state/experiments.js +67 -0
  87. package/dist/cli/commands/state/experiments.js.map +1 -0
  88. package/dist/cli/commands/state/health.js +114 -0
  89. package/dist/cli/commands/state/health.js.map +1 -0
  90. package/dist/cli/commands/state/index.js +51 -0
  91. package/dist/cli/commands/state/index.js.map +1 -0
  92. package/dist/cli/commands/state/objective.js +68 -0
  93. package/dist/cli/commands/state/objective.js.map +1 -0
  94. package/dist/cli/commands/state/plan.js +172 -0
  95. package/dist/cli/commands/state/plan.js.map +1 -0
  96. package/dist/cli/commands/state/progress.js +47 -0
  97. package/dist/cli/commands/state/progress.js.map +1 -0
  98. package/dist/cli/commands/state/shared.js +15 -0
  99. package/dist/cli/commands/state/shared.js.map +1 -0
  100. package/dist/cli/commands/state/todo.js +121 -0
  101. package/dist/cli/commands/state/todo.js.map +1 -0
  102. package/dist/cli/commands/state.js +7 -7
  103. package/dist/cli/commands/state.js.map +1 -1
  104. package/dist/cli/commands/validate.js +32 -18
  105. package/dist/cli/commands/validate.js.map +1 -1
  106. package/dist/cli/dispatch/check.js +328 -0
  107. package/dist/cli/dispatch/check.js.map +1 -0
  108. package/dist/cli/dispatch/index.js +177 -0
  109. package/dist/cli/dispatch/index.js.map +1 -0
  110. package/dist/cli/dispatch/lifecycle.js +492 -0
  111. package/dist/cli/dispatch/lifecycle.js.map +1 -0
  112. package/dist/cli/dispatch/prime.js +100 -0
  113. package/dist/cli/dispatch/prime.js.map +1 -0
  114. package/dist/cli/dispatch/shared.js +64 -0
  115. package/dist/cli/dispatch/shared.js.map +1 -0
  116. package/dist/cli/dispatch/state.js +149 -0
  117. package/dist/cli/dispatch/state.js.map +1 -0
  118. package/dist/cli/dispatch.js +1 -1293
  119. package/dist/cli/dispatch.js.map +1 -1
  120. package/dist/cli/help.js +0 -2
  121. package/dist/cli/help.js.map +1 -1
  122. package/dist/cli/orientation.js +1 -1
  123. package/dist/cli/orientation.js.map +1 -1
  124. package/dist/core/git.js +43 -0
  125. package/dist/core/git.js.map +1 -0
  126. package/dist/hooks/common.js +8 -23
  127. package/dist/hooks/common.js.map +1 -1
  128. package/dist/hooks/compaction/apply.js +244 -0
  129. package/dist/hooks/compaction/apply.js.map +1 -0
  130. package/dist/hooks/compaction/dryRun.js +181 -0
  131. package/dist/hooks/compaction/dryRun.js.map +1 -0
  132. package/dist/hooks/compaction/index.js +23 -0
  133. package/dist/hooks/compaction/index.js.map +1 -0
  134. package/dist/hooks/compaction/parse.js +129 -0
  135. package/dist/hooks/compaction/parse.js.map +1 -0
  136. package/dist/hooks/compaction/retention.js +197 -0
  137. package/dist/hooks/compaction/retention.js.map +1 -0
  138. package/dist/hooks/compaction/status.js +243 -0
  139. package/dist/hooks/compaction/status.js.map +1 -0
  140. package/dist/hooks/compaction/types.js +6 -0
  141. package/dist/hooks/compaction/types.js.map +1 -0
  142. package/dist/hooks/compaction.js +20 -20
  143. package/dist/hooks/compaction.js.map +1 -1
  144. package/dist/hooks/cursorPreToolUse.js +1 -1
  145. package/dist/hooks/cursorPreToolUse.js.map +1 -1
  146. package/dist/hooks/sessionStart.js +4 -4
  147. package/dist/hooks/sessionStart.js.map +1 -1
  148. package/dist/hooks/sessionStop.js +3 -12
  149. package/dist/hooks/sessionStop.js.map +1 -1
  150. package/dist/hooks/validateArtifact/agentFacing.js +10 -0
  151. package/dist/hooks/validateArtifact/agentFacing.js.map +1 -0
  152. package/dist/hooks/validateArtifact/index.js +149 -0
  153. package/dist/hooks/validateArtifact/index.js.map +1 -0
  154. package/dist/hooks/validateArtifact/markdown.js +95 -0
  155. package/dist/hooks/validateArtifact/markdown.js.map +1 -0
  156. package/dist/hooks/validateArtifact/runtime.js +83 -0
  157. package/dist/hooks/validateArtifact/runtime.js.map +1 -0
  158. package/dist/hooks/validateArtifact/schema.js +455 -0
  159. package/dist/hooks/validateArtifact/schema.js.map +1 -0
  160. package/dist/hooks/validateArtifact/traversal.js +105 -0
  161. package/dist/hooks/validateArtifact/traversal.js.map +1 -0
  162. package/dist/hooks/validateArtifact/violations.js +105 -0
  163. package/dist/hooks/validateArtifact/violations.js.map +1 -0
  164. package/dist/hooks/validateArtifact.js +29 -40
  165. package/dist/hooks/validateArtifact.js.map +1 -1
  166. package/dist/migrate/v2HandoffManifest.js +333 -0
  167. package/dist/migrate/v2HandoffManifest.js.map +1 -0
  168. package/dist/registries/artifactProtocolIds.js +77 -0
  169. package/dist/registries/artifactProtocolIds.js.map +1 -0
  170. package/dist/release/releaseMetadata.js +235 -0
  171. package/dist/release/releaseMetadata.js.map +1 -0
  172. package/dist/setup/codex/agents.js +96 -0
  173. package/dist/setup/codex/agents.js.map +1 -0
  174. package/dist/setup/codex/cli.js +161 -0
  175. package/dist/setup/codex/cli.js.map +1 -0
  176. package/dist/setup/codex/configToml.js +644 -0
  177. package/dist/setup/codex/configToml.js.map +1 -0
  178. package/dist/setup/codex/constants.js +29 -0
  179. package/dist/setup/codex/constants.js.map +1 -0
  180. package/dist/setup/codex/installRoot.js +64 -0
  181. package/dist/setup/codex/installRoot.js.map +1 -0
  182. package/dist/setup/codex/state.js +270 -0
  183. package/dist/setup/codex/state.js.map +1 -0
  184. package/dist/setup/codex.js +11 -1196
  185. package/dist/setup/codex.js.map +1 -1
  186. package/dist/setup/doctor/core.js +300 -0
  187. package/dist/setup/doctor/core.js.map +1 -0
  188. package/dist/setup/doctor/diagnostics.js +247 -0
  189. package/dist/setup/doctor/diagnostics.js.map +1 -0
  190. package/dist/setup/doctor/opencode.js +281 -0
  191. package/dist/setup/doctor/opencode.js.map +1 -0
  192. package/dist/setup/doctor/report.js +474 -0
  193. package/dist/setup/doctor/report.js.map +1 -0
  194. package/dist/setup/doctor.js +9 -1296
  195. package/dist/setup/doctor.js.map +1 -1
  196. package/dist/setup/opencode.js +13 -0
  197. package/dist/setup/opencode.js.map +1 -0
  198. package/dist/setup/smokeChecks.js +1 -1
  199. package/dist/setup/smokeChecks.js.map +1 -1
  200. package/dist/state/progressCommit.js +289 -0
  201. package/dist/state/progressCommit.js.map +1 -0
  202. package/dist/state/startupAnalysis/benchmark.js +367 -0
  203. package/dist/state/startupAnalysis/benchmark.js.map +1 -0
  204. package/dist/state/startupAnalysis/contract.js +122 -0
  205. package/dist/state/startupAnalysis/contract.js.map +1 -0
  206. package/dist/state/startupAnalysis/helpers.js +332 -0
  207. package/dist/state/startupAnalysis/helpers.js.map +1 -0
  208. package/dist/state/startupAnalysis/index.js +7 -0
  209. package/dist/state/startupAnalysis/index.js.map +1 -0
  210. package/dist/state/startupAnalysis/metrics.js +334 -0
  211. package/dist/state/startupAnalysis/metrics.js.map +1 -0
  212. package/dist/state/startupAnalysis/records.js +195 -0
  213. package/dist/state/startupAnalysis/records.js.map +1 -0
  214. package/dist/state/startupAnalysis/report.js +123 -0
  215. package/dist/state/startupAnalysis/report.js.map +1 -0
  216. package/dist/state/startupAnalysis/threshold.js +500 -0
  217. package/dist/state/startupAnalysis/threshold.js.map +1 -0
  218. package/dist/state/startupAnalysis.js +2 -1952
  219. package/dist/state/startupAnalysis.js.map +1 -1
  220. package/dist/upgrade/coexistenceProbe.js +83 -0
  221. package/dist/upgrade/coexistenceProbe.js.map +1 -0
  222. package/dist/upgrade/doctor.js +41 -2
  223. package/dist/upgrade/doctor.js.map +1 -1
  224. package/dist/upgrade/migrateArtifactsV2ToV3.js +5 -83
  225. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +1 -1
  226. package/dist/upgrade/nextMajorDoctor.js +16 -1
  227. package/dist/upgrade/nextMajorDoctor.js.map +1 -1
  228. package/dist/upgrade/projectIntegration.js +3 -1
  229. package/dist/upgrade/projectIntegration.js.map +1 -1
  230. package/dist/upgrade/runtimeMigration.js +13 -2
  231. package/dist/upgrade/runtimeMigration.js.map +1 -1
  232. package/dist/upgrade/v3CapabilitySurface.js +15 -0
  233. package/dist/upgrade/v3CapabilitySurface.js.map +1 -0
  234. package/dist/upgrade/versionResolution.js +8 -0
  235. package/dist/upgrade/versionResolution.js.map +1 -1
  236. package/dist/validate/appHomeContract.js +3 -3
  237. package/dist/validate/appHomeContract.js.map +1 -1
  238. package/dist/validate/selfAudit.js +62 -20
  239. package/dist/validate/selfAudit.js.map +1 -1
  240. package/dist/validate/vocabularyAuthority.js +298 -0
  241. package/dist/validate/vocabularyAuthority.js.map +1 -0
  242. package/package.json +3 -3
  243. package/bundle/references/v1-section-mapping.md +0 -47
  244. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  245. package/bundle/skills/hej/SKILL.md +0 -69
  246. package/bundle/skills/hej/agents/hej.toml +0 -11
  247. package/bundle/skills/hej/agents/openai.yaml +0 -8
@@ -0,0 +1,333 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { isFile, pathExists, resolvePath } from "../core/paths.js";
4
+ import { doctorRoots, loadSuiteVersion } from "../upgrade/appModel.js";
5
+ import { AGENTERA_USER_STATE_NAMES, ROOT_USER_STATE_DIR_NAMES, ROOT_USER_STATE_FILE_NAMES, } from "../upgrade/doctor.js";
6
+ /** Contract authority: references/cli/v3-handoff-manifest.schema.yaml */
7
+ export const V2_HANDOFF_MANIFEST_SCHEMA_REL = "references/cli/v3-handoff-manifest.schema.yaml";
8
+ export const V2_HANDOFF_MANIFEST_FILENAME = "v3-handoff.json";
9
+ export const V2_HANDOFF_SCHEMA_VERSION = "agentera.v3_handoff_manifest.v1";
10
+ export const READER_PREFLIGHT_BUDGET_MS = 100;
11
+ export const USER_DATA_CATALOG_DIRS = [
12
+ "benchmarks",
13
+ "intermediate",
14
+ "sessions",
15
+ "history",
16
+ "corpus",
17
+ ];
18
+ export const PROFILE_FILE_MEMBERS = ["PROFILE.md", "USAGE.md"];
19
+ function isRecord(value) {
20
+ return value !== null && typeof value === "object" && !Array.isArray(value);
21
+ }
22
+ function asNonEmptyString(value, field) {
23
+ if (typeof value !== "string" || !value.trim()) {
24
+ throw new Error(`${field} must be a non-empty string`);
25
+ }
26
+ return value.trim();
27
+ }
28
+ function parseDirectoryEntry(raw) {
29
+ const id = asNonEmptyString(raw.id, "user_data_inventory.id");
30
+ if (!USER_DATA_CATALOG_DIRS.includes(id)) {
31
+ throw new Error(`user_data_inventory id ${id} is not in the catalog`);
32
+ }
33
+ if (raw.kind !== "directory") {
34
+ throw new Error(`user_data_inventory entry ${id} must have kind=directory`);
35
+ }
36
+ if (typeof raw.exists !== "boolean") {
37
+ throw new Error(`user_data_inventory entry ${id} must have boolean exists`);
38
+ }
39
+ return {
40
+ id: id,
41
+ relative_path: asNonEmptyString(raw.relative_path, `user_data_inventory.${id}.relative_path`),
42
+ kind: "directory",
43
+ exists: raw.exists,
44
+ };
45
+ }
46
+ function parseProfileFilesEntry(raw) {
47
+ if (raw.id !== "profile_files") {
48
+ throw new Error("profile_files entry must have id=profile_files");
49
+ }
50
+ if (raw.kind !== "profile_files") {
51
+ throw new Error("profile_files entry must have kind=profile_files");
52
+ }
53
+ if (!Array.isArray(raw.members)) {
54
+ throw new Error("profile_files entry must have members array");
55
+ }
56
+ const members = raw.members.map((member, index) => {
57
+ if (!isRecord(member)) {
58
+ throw new Error(`profile_files.members[${index}] must be an object`);
59
+ }
60
+ if (member.kind !== "file") {
61
+ throw new Error(`profile_files.members[${index}] must have kind=file`);
62
+ }
63
+ if (typeof member.exists !== "boolean") {
64
+ throw new Error(`profile_files.members[${index}] must have boolean exists`);
65
+ }
66
+ return {
67
+ relative_path: asNonEmptyString(member.relative_path, `profile_files.members[${index}].relative_path`),
68
+ kind: "file",
69
+ exists: member.exists,
70
+ };
71
+ });
72
+ return { id: "profile_files", kind: "profile_files", members };
73
+ }
74
+ function parseUserDataInventory(raw) {
75
+ if (!Array.isArray(raw) || raw.length < 6) {
76
+ throw new Error("user_data_inventory must be an array with at least six entries");
77
+ }
78
+ const entries = raw.map((item, index) => {
79
+ if (!isRecord(item)) {
80
+ throw new Error(`user_data_inventory[${index}] must be an object`);
81
+ }
82
+ if (item.kind === "profile_files") {
83
+ return parseProfileFilesEntry(item);
84
+ }
85
+ return parseDirectoryEntry(item);
86
+ });
87
+ const ids = new Set(entries.map((entry) => entry.id));
88
+ for (const id of [...USER_DATA_CATALOG_DIRS, "profile_files"]) {
89
+ if (!ids.has(id)) {
90
+ throw new Error(`user_data_inventory missing catalog id ${id}`);
91
+ }
92
+ }
93
+ return entries;
94
+ }
95
+ export function parseV2HandoffManifest(raw) {
96
+ if (!isRecord(raw)) {
97
+ throw new Error("manifest must be a JSON object");
98
+ }
99
+ const schemaVersion = asNonEmptyString(raw.schema_version, "schema_version");
100
+ if (schemaVersion !== V2_HANDOFF_SCHEMA_VERSION) {
101
+ throw new Error(`schema_version must be ${V2_HANDOFF_SCHEMA_VERSION}`);
102
+ }
103
+ const writtenAt = asNonEmptyString(raw.written_at, "written_at");
104
+ if (Number.isNaN(Date.parse(writtenAt))) {
105
+ throw new Error("written_at must be an ISO-8601 UTC timestamp");
106
+ }
107
+ if (!Array.isArray(raw.runtime_adapters)) {
108
+ throw new Error("runtime_adapters must be an array");
109
+ }
110
+ const runtimeAdapters = raw.runtime_adapters.map((adapter, index) => asNonEmptyString(adapter, `runtime_adapters[${index}]`));
111
+ return {
112
+ schema_version: V2_HANDOFF_SCHEMA_VERSION,
113
+ written_at: writtenAt,
114
+ installed_v2_version: asNonEmptyString(raw.installed_v2_version, "installed_v2_version"),
115
+ app_home_path: asNonEmptyString(raw.app_home_path, "app_home_path"),
116
+ user_data_inventory: parseUserDataInventory(raw.user_data_inventory),
117
+ runtime_adapters: runtimeAdapters,
118
+ };
119
+ }
120
+ export function v2HandoffManifestPath(appHome) {
121
+ return path.join(resolvePath(appHome), V2_HANDOFF_MANIFEST_FILENAME);
122
+ }
123
+ export function readV2HandoffManifestFile(appHome) {
124
+ const manifestPath = v2HandoffManifestPath(appHome);
125
+ if (!isFile(manifestPath)) {
126
+ return null;
127
+ }
128
+ const started = performance.now();
129
+ let parsed;
130
+ try {
131
+ parsed = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
132
+ }
133
+ catch (exc) {
134
+ throw new Error(`failed to read ${V2_HANDOFF_MANIFEST_FILENAME}: ${exc.message}`);
135
+ }
136
+ const manifest = parseV2HandoffManifest(parsed);
137
+ const elapsedMs = performance.now() - started;
138
+ return { manifest, elapsedMs };
139
+ }
140
+ function agenteraUserStateDirIsRecognized(dir) {
141
+ if (!pathExists(dir) || !fs.statSync(dir).isDirectory()) {
142
+ return false;
143
+ }
144
+ for (const entry of fs.readdirSync(dir)) {
145
+ const full = path.join(dir, entry);
146
+ const st = fs.statSync(full);
147
+ if (AGENTERA_USER_STATE_NAMES.has(entry) && st.isFile()) {
148
+ continue;
149
+ }
150
+ if (entry === "optimera" && st.isDirectory()) {
151
+ continue;
152
+ }
153
+ return false;
154
+ }
155
+ return true;
156
+ }
157
+ function isPreservedUserStateEntry(appHome, entry) {
158
+ const full = path.join(appHome, entry);
159
+ if (!pathExists(full)) {
160
+ return false;
161
+ }
162
+ const st = fs.statSync(full);
163
+ if (ROOT_USER_STATE_FILE_NAMES.has(entry) && st.isFile()) {
164
+ return true;
165
+ }
166
+ if (ROOT_USER_STATE_DIR_NAMES.has(entry) && st.isDirectory()) {
167
+ return true;
168
+ }
169
+ if (entry === ".agentera" && agenteraUserStateDirIsRecognized(full)) {
170
+ return true;
171
+ }
172
+ if (USER_DATA_CATALOG_DIRS.includes(entry) &&
173
+ st.isDirectory()) {
174
+ return true;
175
+ }
176
+ return false;
177
+ }
178
+ function listPreservedTopLevelFromScan(appHome) {
179
+ if (!pathExists(appHome)) {
180
+ return [];
181
+ }
182
+ const preserved = [];
183
+ for (const entry of fs.readdirSync(appHome)) {
184
+ if (entry === "app" || entry === V2_HANDOFF_MANIFEST_FILENAME) {
185
+ continue;
186
+ }
187
+ if (isPreservedUserStateEntry(appHome, entry)) {
188
+ preserved.push(entry);
189
+ }
190
+ }
191
+ return preserved.sort();
192
+ }
193
+ function listPreservedAbsolutePathsFromScan(appHome) {
194
+ const preserved = [];
195
+ for (const entry of listPreservedTopLevelFromScan(appHome)) {
196
+ const full = path.join(appHome, entry);
197
+ preserved.push(full);
198
+ if (entry === ".agentera" && pathExists(full) && fs.statSync(full).isDirectory()) {
199
+ for (const name of AGENTERA_USER_STATE_NAMES) {
200
+ const nested = path.join(full, name);
201
+ if (isFile(nested)) {
202
+ preserved.push(nested);
203
+ }
204
+ }
205
+ }
206
+ }
207
+ return preserved.sort();
208
+ }
209
+ function listPreservedTopLevelFromManifest(manifest) {
210
+ const preserved = new Set();
211
+ for (const entry of manifest.user_data_inventory) {
212
+ if (entry.kind === "directory" && entry.exists) {
213
+ preserved.add(entry.relative_path);
214
+ }
215
+ if (entry.kind === "profile_files") {
216
+ for (const member of entry.members) {
217
+ if (member.exists) {
218
+ preserved.add(member.relative_path);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ return [...preserved].sort();
224
+ }
225
+ function listPreservedAbsolutePathsFromManifest(manifest, appHome) {
226
+ const root = resolvePath(appHome);
227
+ const preserved = [];
228
+ for (const rel of listPreservedTopLevelFromManifest(manifest)) {
229
+ preserved.push(path.join(root, rel));
230
+ }
231
+ const agenteraDir = path.join(root, ".agentera");
232
+ if (pathExists(agenteraDir) && fs.statSync(agenteraDir).isDirectory()) {
233
+ preserved.push(agenteraDir);
234
+ for (const name of AGENTERA_USER_STATE_NAMES) {
235
+ const nested = path.join(agenteraDir, name);
236
+ if (isFile(nested)) {
237
+ preserved.push(nested);
238
+ }
239
+ }
240
+ }
241
+ return preserved.sort();
242
+ }
243
+ export function isManifestCatalogEntryPreserved(manifest, entry) {
244
+ for (const item of manifest.user_data_inventory) {
245
+ if (item.kind === "directory" && item.relative_path === entry) {
246
+ return item.exists;
247
+ }
248
+ if (item.kind === "profile_files") {
249
+ for (const member of item.members) {
250
+ if (member.relative_path === entry) {
251
+ return member.exists;
252
+ }
253
+ }
254
+ }
255
+ }
256
+ if (entry === ".agentera") {
257
+ const agenteraDir = path.join(resolvePath(manifest.app_home_path), ".agentera");
258
+ return agenteraUserStateDirIsRecognized(agenteraDir);
259
+ }
260
+ return false;
261
+ }
262
+ export function resolveMigrationUserStatePreflight(appHome) {
263
+ const resolvedHome = resolvePath(appHome);
264
+ const manifestRead = readV2HandoffManifestFile(resolvedHome);
265
+ if (manifestRead) {
266
+ return {
267
+ source: "manifest",
268
+ elapsedMs: manifestRead.elapsedMs,
269
+ manifest: manifestRead.manifest,
270
+ preservedTopLevel: listPreservedTopLevelFromManifest(manifestRead.manifest),
271
+ preservedAbsolutePaths: listPreservedAbsolutePathsFromManifest(manifestRead.manifest, resolvedHome),
272
+ };
273
+ }
274
+ const started = performance.now();
275
+ const preservedTopLevel = listPreservedTopLevelFromScan(resolvedHome);
276
+ const preservedAbsolutePaths = listPreservedAbsolutePathsFromScan(resolvedHome);
277
+ return {
278
+ source: "scan",
279
+ elapsedMs: performance.now() - started,
280
+ manifest: null,
281
+ preservedTopLevel,
282
+ preservedAbsolutePaths,
283
+ };
284
+ }
285
+ export function appHomeHasUnrecognizedEntriesWithPreflight(appHome, preflight) {
286
+ if (!pathExists(appHome)) {
287
+ return [];
288
+ }
289
+ const unknown = [];
290
+ for (const entry of fs.readdirSync(appHome)) {
291
+ if (entry === "app" || entry === V2_HANDOFF_MANIFEST_FILENAME) {
292
+ continue;
293
+ }
294
+ if (preflight.source === "manifest" && preflight.manifest) {
295
+ if (isManifestCatalogEntryPreserved(preflight.manifest, entry)) {
296
+ continue;
297
+ }
298
+ }
299
+ else if (isPreservedUserStateEntry(appHome, entry)) {
300
+ continue;
301
+ }
302
+ unknown.push(entry);
303
+ }
304
+ return unknown;
305
+ }
306
+ export function isV2HandoffManifestStale(manifest, ctx) {
307
+ if (resolvePath(manifest.app_home_path) !== resolvePath(ctx.appHome)) {
308
+ return true;
309
+ }
310
+ if (manifest.installed_v2_version !== ctx.installedVersion) {
311
+ return true;
312
+ }
313
+ const writtenAtMs = Date.parse(manifest.written_at);
314
+ const markerMs = ctx.bundleMarkerMtimeMs;
315
+ if (Number.isNaN(writtenAtMs) || Math.floor(writtenAtMs / 1000) < Math.floor(markerMs / 1000)) {
316
+ return true;
317
+ }
318
+ return false;
319
+ }
320
+ export function bundleMarkerFreshnessContext(appHome, sourceRoot) {
321
+ const roots = doctorRoots(appHome);
322
+ const markerPath = path.join(roots.activeBundleRoot, ".agentera-bundle.json");
323
+ if (!isFile(markerPath)) {
324
+ return null;
325
+ }
326
+ const installedVersion = loadSuiteVersion(roots.activeBundleRoot) ?? loadSuiteVersion(sourceRoot) ?? "unknown";
327
+ return {
328
+ appHome: resolvePath(appHome),
329
+ installedVersion,
330
+ bundleMarkerMtimeMs: fs.statSync(markerPath).mtimeMs,
331
+ };
332
+ }
333
+ //# sourceMappingURL=v2HandoffManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2HandoffManifest.js","sourceRoot":"","sources":["../../src/migrate/v2HandoffManifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Decision 58 artifact protocol names: one `artifact_id` per artifact in CLI,
3
+ * hooks, validators, and JSON envelopes. Storage paths live here only.
4
+ */
5
+ export const ARTIFACT_PROTOCOL_PATHS = {
6
+ vision: ".agentera/vision.yaml",
7
+ decisions: ".agentera/decisions.yaml",
8
+ plan: ".agentera/plan.yaml",
9
+ progress: ".agentera/progress.yaml",
10
+ health: ".agentera/health.yaml",
11
+ docs: ".agentera/docs.yaml",
12
+ objective: ".agentera/objective.yaml",
13
+ experiments: ".agentera/experiments.yaml",
14
+ todo: "TODO.md",
15
+ changelog: "CHANGELOG.md",
16
+ design: "DESIGN.md",
17
+ };
18
+ export const HUMAN_FACING_ARTIFACT_IDS = new Set(["todo", "changelog", "design"]);
19
+ export const TRACKED_ARTIFACT_IDS = [
20
+ "progress",
21
+ "decisions",
22
+ "plan",
23
+ "health",
24
+ "design",
25
+ "docs",
26
+ "vision",
27
+ "todo",
28
+ "changelog",
29
+ ];
30
+ export const VALIDATE_ARTIFACT_PROTOCOL_IDS = [
31
+ "changelog",
32
+ "decisions",
33
+ "design",
34
+ "docs",
35
+ "health",
36
+ "plan",
37
+ "progress",
38
+ "todo",
39
+ "vision",
40
+ ];
41
+ function artifactProtocolStem(input) {
42
+ const lower = input.trim().toLowerCase();
43
+ return lower.endsWith(".md") ? lower.slice(0, -3) : lower;
44
+ }
45
+ export function normalizeArtifactProtocolId(input) {
46
+ const trimmed = input.trim();
47
+ if (trimmed in ARTIFACT_PROTOCOL_PATHS) {
48
+ return trimmed;
49
+ }
50
+ const lower = trimmed.toLowerCase();
51
+ if (lower in ARTIFACT_PROTOCOL_PATHS) {
52
+ return lower;
53
+ }
54
+ const stem = artifactProtocolStem(trimmed);
55
+ if (stem in ARTIFACT_PROTOCOL_PATHS) {
56
+ return stem;
57
+ }
58
+ return null;
59
+ }
60
+ export function requireArtifactProtocolId(input, context) {
61
+ const id = normalizeArtifactProtocolId(input);
62
+ if (id === null) {
63
+ const valid = VALIDATE_ARTIFACT_PROTOCOL_IDS.join(", ");
64
+ throw new Error(`unsupported artifact ${JSON.stringify(input)} in ${context}; valid artifact_id values: ${valid}`);
65
+ }
66
+ return id;
67
+ }
68
+ /** Normalize docs.yaml mapping keys to artifact_id. */
69
+ export function normalizeArtifactMappingKeys(mapping) {
70
+ const out = {};
71
+ for (const [key, value] of Object.entries(mapping)) {
72
+ const id = normalizeArtifactProtocolId(key);
73
+ out[id ?? key] = value;
74
+ }
75
+ return out;
76
+ }
77
+ //# sourceMappingURL=artifactProtocolIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactProtocolIds.js","sourceRoot":"","sources":["../../src/registries/artifactProtocolIds.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAqC;IACvE,MAAM,EAAE,uBAAuB;IAC/B,SAAS,EAAE,0BAA0B;IACrC,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,yBAAyB;IACnC,MAAM,EAAE,uBAAuB;IAC/B,IAAI,EAAE,qBAAqB;IAC3B,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,4BAA4B;IACzC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,UAAU;IACV,WAAW;IACX,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAsB;IAC/D,WAAW;IACX,WAAW;IACX,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,QAAQ;CACT,CAAC;AAEF,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,KAAK,IAAI,uBAAuB,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,IAAI,IAAI,uBAAuB,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,OAAe;IACtE,MAAM,EAAE,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,OAAO,+BAA+B,KAAK,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,4BAA4B,CAAC,OAA+B;IAC1E,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;QAC5C,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,235 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { resolvePath } from "../core/paths.js";
4
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
5
+ import { loadYamlMappingFile } from "../core/yaml.js";
6
+ export const RELEASE_METADATA_AUTHORITY_FILES = [
7
+ "registry.json",
8
+ "packages/cli/package.json",
9
+ "references/cli/update-channels.yaml",
10
+ ];
11
+ export const RELEASE_METADATA_ADVISORY_FILES = [
12
+ "packages/cli/bundle/.agentera-npx-bundle.json",
13
+ ];
14
+ const SEMVER_CORE_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
15
+ const SEMVER_STRICT_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
16
+ const PRE_RELEASE_RE = /-(.+)$/;
17
+ const GIT_REF_HEX_RE = /^[0-9a-f]{40}$/i;
18
+ function rootDefault() {
19
+ return resolveSourceRoot();
20
+ }
21
+ function readJson(pathname) {
22
+ try {
23
+ return JSON.parse(fs.readFileSync(pathname, "utf8"));
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ function readRegistryVersion(root) {
30
+ const source = "registry.json";
31
+ const data = readJson(path.join(root, source));
32
+ if (data === null) {
33
+ return { version: null, source };
34
+ }
35
+ const skills = data.skills;
36
+ if (!Array.isArray(skills) || skills.length === 0) {
37
+ return { version: null, source };
38
+ }
39
+ const first = skills[0];
40
+ if (!first || typeof first !== "object") {
41
+ return { version: null, source };
42
+ }
43
+ const version = first.version;
44
+ return { version: typeof version === "string" ? version : null, source };
45
+ }
46
+ function readPackageJson(root) {
47
+ const candidate = path.join(root, "packages/cli/package.json");
48
+ if (!fs.existsSync(candidate)) {
49
+ return null;
50
+ }
51
+ return readJson(candidate);
52
+ }
53
+ function readUpdateChannels(root) {
54
+ const candidate = path.join(root, "references/cli/update-channels.yaml");
55
+ if (!fs.existsSync(candidate)) {
56
+ return null;
57
+ }
58
+ try {
59
+ return loadYamlMappingFile(candidate);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ function readBundleSentinel(root) {
66
+ const source = "packages/cli/bundle/.agentera-npx-bundle.json";
67
+ const candidate = path.join(root, source);
68
+ if (!fs.existsSync(candidate)) {
69
+ return { version: null, source };
70
+ }
71
+ const data = readJson(candidate);
72
+ if (data === null) {
73
+ return { version: null, source };
74
+ }
75
+ const version = data.suiteVersion;
76
+ return { version: typeof version === "string" ? version : null, source };
77
+ }
78
+ /** Parse `X.Y.Z` core (ignore pre-release and build metadata). */
79
+ function parseSemverCore(version) {
80
+ const match = SEMVER_CORE_RE.exec(version);
81
+ if (!match) {
82
+ return null;
83
+ }
84
+ const core = `${match[1]}.${match[2]}.${match[3]}`;
85
+ const preMatch = PRE_RELEASE_RE.exec(version);
86
+ return { core, preRelease: preMatch ? preMatch[1] : null };
87
+ }
88
+ function pickChannelDefaults(authority) {
89
+ if (authority === null) {
90
+ return { development: null, stable: null };
91
+ }
92
+ const versionResolution = authority.version_resolution;
93
+ const latestOnChannel = versionResolution?.latest_on_channel;
94
+ const defaults = (latestOnChannel?.offline_defaults ?? {});
95
+ return {
96
+ development: typeof defaults.development === "string" ? defaults.development : null,
97
+ stable: typeof defaults.stable === "string" ? defaults.stable : null,
98
+ };
99
+ }
100
+ export function readReleaseMetadata(root = rootDefault()) {
101
+ const resolved = resolvePath(root);
102
+ const registry = readRegistryVersion(resolved);
103
+ const pkg = readPackageJson(resolved);
104
+ const channels = readUpdateChannels(resolved);
105
+ const bundle = readBundleSentinel(resolved);
106
+ const topVersion = pkg && typeof pkg.version === "string" ? pkg.version : null;
107
+ const agenteraBlock = pkg && typeof pkg.agentera === "object" && pkg.agentera !== null
108
+ ? pkg.agentera
109
+ : null;
110
+ const suiteVersion = agenteraBlock && typeof agenteraBlock.suiteVersion === "string"
111
+ ? agenteraBlock.suiteVersion
112
+ : null;
113
+ const gitRef = agenteraBlock && typeof agenteraBlock.gitRef === "string"
114
+ ? agenteraBlock.gitRef
115
+ : null;
116
+ const { development, stable } = pickChannelDefaults(channels);
117
+ return {
118
+ authoritativeVersion: registry.version,
119
+ authoritativeSource: registry.source,
120
+ packageVersion: topVersion,
121
+ packageSuiteVersion: suiteVersion,
122
+ packageGitRef: gitRef,
123
+ developmentChannelDefault: development,
124
+ stableChannelDefault: stable,
125
+ bundleSuiteVersion: bundle.version,
126
+ };
127
+ }
128
+ /**
129
+ * Validate release-metadata coherence. Returns an empty array when the
130
+ * source-tree version surfaces agree on a single release train.
131
+ */
132
+ export function validateReleaseMetadata(root = rootDefault()) {
133
+ const errors = [];
134
+ const snap = readReleaseMetadata(root);
135
+ const rootLabel = path.basename(resolvePath(root)) || "repo root";
136
+ // 1. registry.json must publish a valid semver `skills[0].version`.
137
+ if (snap.authoritativeVersion === null) {
138
+ errors.push("registry.json: skills[0].version is required for release-metadata validation");
139
+ }
140
+ else {
141
+ const parsed = parseSemverCore(snap.authoritativeVersion);
142
+ if (parsed === null) {
143
+ errors.push(`registry.json: skills[0].version ${JSON.stringify(snap.authoritativeVersion)} is not a valid semver`);
144
+ }
145
+ else if (parsed.preRelease !== null) {
146
+ // registry.json is the suite authority and stays on the released core;
147
+ // pre-release suffixes belong only to packages/cli/package.json.
148
+ errors.push(`registry.json: skills[0].version must be a released core version (no pre-release suffix); got ${JSON.stringify(snap.authoritativeVersion)}`);
149
+ }
150
+ }
151
+ // 2. packages/cli/package.json must exist and parse.
152
+ if (snap.packageVersion === null && snap.packageSuiteVersion === null && snap.packageGitRef === null) {
153
+ errors.push("packages/cli/package.json: missing or unreadable; cannot validate release-metadata");
154
+ }
155
+ else {
156
+ // 2a. top-level `version` must be valid semver and share its core with registry.
157
+ if (snap.packageVersion === null) {
158
+ errors.push("packages/cli/package.json: top-level `version` is required");
159
+ }
160
+ else {
161
+ const parsed = parseSemverCore(snap.packageVersion);
162
+ if (parsed === null) {
163
+ errors.push(`packages/cli/package.json: top-level version ${JSON.stringify(snap.packageVersion)} is not a valid semver`);
164
+ }
165
+ else if (snap.authoritativeVersion !== null &&
166
+ parseSemverCore(snap.authoritativeVersion)?.core !== parsed.core) {
167
+ errors.push(`release-metadata divergence: registry.json skills[0].version core is ${JSON.stringify(parseSemverCore(snap.authoritativeVersion)?.core)} ` +
168
+ `but packages/cli/package.json top-level version core is ${JSON.stringify(parsed.core)}; ` +
169
+ `the npm package version must share its major.minor.patch with the registry suite version`);
170
+ }
171
+ }
172
+ // 2b. `agentera.suiteVersion` must match registry exactly.
173
+ if (snap.packageSuiteVersion === null) {
174
+ errors.push("packages/cli/package.json: `agentera.suiteVersion` is required");
175
+ }
176
+ else if (snap.authoritativeVersion !== null &&
177
+ snap.packageSuiteVersion !== snap.authoritativeVersion) {
178
+ errors.push(`release-metadata divergence: registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)} ` +
179
+ `but packages/cli/package.json agentera.suiteVersion is ${JSON.stringify(snap.packageSuiteVersion)}; ` +
180
+ `the agentera.suiteVersion mirror must equal the registry version exactly`);
181
+ }
182
+ else if (!SEMVER_STRICT_RE.test(snap.packageSuiteVersion)) {
183
+ errors.push(`packages/cli/package.json: agentera.suiteVersion ${JSON.stringify(snap.packageSuiteVersion)} is not a released core semver`);
184
+ }
185
+ // 2c. `agentera.gitRef` must be a 40-character hex SHA.
186
+ if (snap.packageGitRef === null || snap.packageGitRef === "") {
187
+ errors.push("packages/cli/package.json: `agentera.gitRef` is required for release-metadata validation");
188
+ }
189
+ else if (!GIT_REF_HEX_RE.test(snap.packageGitRef)) {
190
+ errors.push(`packages/cli/package.json: agentera.gitRef ${JSON.stringify(snap.packageGitRef)} must be a 40-character hex SHA; ` +
191
+ `short SHAs and branch names are not reproducible release references`);
192
+ }
193
+ }
194
+ // 3. update-channels.yaml development default must equal the registry version.
195
+ if (snap.developmentChannelDefault === null) {
196
+ errors.push("references/cli/update-channels.yaml: version_resolution.latest_on_channel.offline_defaults.development is required");
197
+ }
198
+ else if (snap.authoritativeVersion !== null &&
199
+ snap.developmentChannelDefault !== snap.authoritativeVersion) {
200
+ errors.push(`release-metadata divergence: registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)} ` +
201
+ `but update-channels.yaml offline_defaults.development is ${JSON.stringify(snap.developmentChannelDefault)}; ` +
202
+ `the development channel default must match the registry version exactly`);
203
+ }
204
+ // 4. Stable channel default is informational on the @next branch; the
205
+ // validator surfaces it so maintainers can confirm the stable line still
206
+ // resolves to its declared 2.x version. A drift on the stable channel
207
+ // alone is not an error here — that lane is owned by the `main` branch
208
+ // compatibility boundary per `references/cli/update-channels.yaml`.
209
+ void snap.stableChannelDefault;
210
+ // 5. Advisory check on the local bundle sentinel.
211
+ if (snap.bundleSuiteVersion !== null) {
212
+ if (snap.authoritativeVersion !== null &&
213
+ snap.bundleSuiteVersion !== snap.authoritativeVersion) {
214
+ errors.push(`release-metadata drift (advisory): packages/cli/bundle/.agentera-npx-bundle.json suiteVersion is ${JSON.stringify(snap.bundleSuiteVersion)} ` +
215
+ `but registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)}; ` +
216
+ `run \`npm run bundle:data\` (or \`pnpm -C packages/cli run bundle:data\`) at ${rootLabel} to refresh the local bundle copy before publishing`);
217
+ }
218
+ }
219
+ return errors;
220
+ }
221
+ export function releaseMetadataMain(opts = {}) {
222
+ const root = resolvePath(opts.root ?? rootDefault());
223
+ const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
224
+ const err = opts.err ?? ((line) => process.stderr.write(line + "\n"));
225
+ const errors = validateReleaseMetadata(root);
226
+ if (errors.length > 0) {
227
+ out("release-metadata validation failed:");
228
+ for (const message of errors)
229
+ out(`- ${message}`);
230
+ return 1;
231
+ }
232
+ out("release-metadata ok");
233
+ return 0;
234
+ }
235
+ //# sourceMappingURL=releaseMetadata.js.map