agentera 3.0.0-dev.6 → 3.0.0-next.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 (195) hide show
  1. package/bundle/extract-corpus-parity.json +23 -0
  2. package/bundle/references/adapters/cursor.md +9 -8
  3. package/bundle/references/analysis/startup-measurement-contract.yaml +4 -4
  4. package/bundle/references/cli/parity-expected-actual-template.md +30 -0
  5. package/bundle/references/cli/update-channels.yaml +15 -0
  6. package/bundle/references/cli/vocabulary-index.yaml +6 -4
  7. package/bundle/references/cli/vocabulary.md +305 -301
  8. package/bundle/skills/agentera/SKILL.md +35 -27
  9. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +4 -1
  10. package/bundle/skills/agentera/capabilities/profilera/schemas/exit.yaml +2 -1
  11. package/bundle/skills/agentera/capability_schema_contract.yaml +28 -0
  12. package/bundle/skills/agentera/references/contract.md +324 -315
  13. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +38 -33
  14. package/dist/analytics/extractCorpus/cli.js +49 -1
  15. package/dist/analytics/extractCorpus/cli.js.map +1 -1
  16. package/dist/analytics/extractCorpus/copilotSessions.js +47 -5
  17. package/dist/analytics/extractCorpus/copilotSessions.js.map +1 -1
  18. package/dist/analytics/extractCorpus/core.js +11 -5
  19. package/dist/analytics/extractCorpus/core.js.map +1 -1
  20. package/dist/analytics/extractCorpus/corpus.js +26 -13
  21. package/dist/analytics/extractCorpus/corpus.js.map +1 -1
  22. package/dist/analytics/extractCorpus/coverageAudit.js +261 -0
  23. package/dist/analytics/extractCorpus/coverageAudit.js.map +1 -0
  24. package/dist/analytics/extractCorpus/cursorSessions.js +6 -3
  25. package/dist/analytics/extractCorpus/cursorSessions.js.map +1 -1
  26. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  27. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +1 -0
  28. package/dist/analytics/extractCorpus/index.js +3 -0
  29. package/dist/analytics/extractCorpus/index.js.map +1 -1
  30. package/dist/analytics/extractCorpus/sqliteCaps.js +44 -0
  31. package/dist/analytics/extractCorpus/sqliteCaps.js.map +1 -0
  32. package/dist/analytics/extractCorpus/sqliteSessions.js +98 -5
  33. package/dist/analytics/extractCorpus/sqliteSessions.js.map +1 -1
  34. package/dist/capabilities/inspirera/instructions.js +1 -1
  35. package/dist/capabilities/inspirera/instructions.js.map +1 -1
  36. package/dist/capabilities/planera/instructions.js +1 -1
  37. package/dist/capabilities/planera/instructions.js.map +1 -1
  38. package/dist/capabilities/profilera/instructions.js +1 -1
  39. package/dist/capabilities/profilera/instructions.js.map +1 -1
  40. package/dist/capabilities/realisera/instructions.js +1 -1
  41. package/dist/capabilities/realisera/instructions.js.map +1 -1
  42. package/dist/capabilities/resonera/instructions.js +1 -1
  43. package/dist/capabilities/resonera/instructions.js.map +1 -1
  44. package/dist/capabilities/visionera/instructions.js +1 -1
  45. package/dist/capabilities/visionera/instructions.js.map +1 -1
  46. package/dist/capabilities/visualisera/instructions.js +3 -4
  47. package/dist/capabilities/visualisera/instructions.js.map +1 -1
  48. package/dist/cli/appContext.js +2 -14
  49. package/dist/cli/appContext.js.map +1 -1
  50. package/dist/cli/capabilityContext/benchmark.js +2 -2
  51. package/dist/cli/capabilityContext/benchmark.js.map +1 -1
  52. package/dist/cli/capabilityContext/closeout.js +5 -5
  53. package/dist/cli/capabilityContext/closeout.js.map +1 -1
  54. package/dist/cli/capabilityContext/evidence.js +6 -6
  55. package/dist/cli/capabilityContext/evidence.js.map +1 -1
  56. package/dist/cli/capabilityContext/orchestration.js +5 -5
  57. package/dist/cli/capabilityContext/orchestration.js.map +1 -1
  58. package/dist/cli/capabilityContext/realisera.js +8 -8
  59. package/dist/cli/capabilityContext/realisera.js.map +1 -1
  60. package/dist/cli/capabilityContext/startup.js +8 -8
  61. package/dist/cli/capabilityContext/startup.js.map +1 -1
  62. package/dist/cli/capabilityContext/types.js +9 -9
  63. package/dist/cli/capabilityContext/types.js.map +1 -1
  64. package/dist/cli/commands/appHome.js +23 -0
  65. package/dist/cli/commands/appHome.js.map +1 -0
  66. package/dist/cli/commands/doctor.js +10 -105
  67. package/dist/cli/commands/doctor.js.map +1 -1
  68. package/dist/cli/commands/prime/bundleStatus.js +126 -0
  69. package/dist/cli/commands/prime/bundleStatus.js.map +1 -0
  70. package/dist/cli/commands/prime/collectOrientationState.js +143 -0
  71. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -0
  72. package/dist/cli/commands/prime/orientationOutput.js +172 -0
  73. package/dist/cli/commands/prime/orientationOutput.js.map +1 -0
  74. package/dist/cli/commands/prime/types.js +2 -0
  75. package/dist/cli/commands/prime/types.js.map +1 -0
  76. package/dist/cli/commands/prime/v1Migration.js +39 -0
  77. package/dist/cli/commands/prime/v1Migration.js.map +1 -0
  78. package/dist/cli/commands/prime.js +10 -549
  79. package/dist/cli/commands/prime.js.map +1 -1
  80. package/dist/cli/commands/report.js +8 -2
  81. package/dist/cli/commands/report.js.map +1 -1
  82. package/dist/cli/commands/state/docs.js +2 -2
  83. package/dist/cli/commands/state/docs.js.map +1 -1
  84. package/dist/cli/commands/state/todo.js +1 -1
  85. package/dist/cli/commands/state/todo.js.map +1 -1
  86. package/dist/cli/commands/validate.js +9 -9
  87. package/dist/cli/commands/validate.js.map +1 -1
  88. package/dist/cli/contracts/bundleStatus.js +2 -0
  89. package/dist/cli/contracts/bundleStatus.js.map +1 -0
  90. package/dist/cli/contracts/orientationState.js +2 -0
  91. package/dist/cli/contracts/orientationState.js.map +1 -0
  92. package/dist/cli/dispatch/argvParser.js +33 -0
  93. package/dist/cli/dispatch/argvParser.js.map +1 -0
  94. package/dist/cli/dispatch/check.js +18 -18
  95. package/dist/cli/dispatch/check.js.map +1 -1
  96. package/dist/cli/dispatch/commands.js +27 -0
  97. package/dist/cli/dispatch/commands.js.map +1 -0
  98. package/dist/cli/dispatch/index.js +3 -1
  99. package/dist/cli/dispatch/index.js.map +1 -1
  100. package/dist/cli/dispatch/lifecycle.js +100 -55
  101. package/dist/cli/dispatch/lifecycle.js.map +1 -1
  102. package/dist/cli/dispatch/prime.js +31 -27
  103. package/dist/cli/dispatch/prime.js.map +1 -1
  104. package/dist/cli/dispatch/state.js +11 -16
  105. package/dist/cli/dispatch/state.js.map +1 -1
  106. package/dist/cli/help.js +30 -0
  107. package/dist/cli/help.js.map +1 -1
  108. package/dist/cli/orientation/attention.js +57 -0
  109. package/dist/cli/orientation/attention.js.map +1 -0
  110. package/dist/cli/orientation/corpusCoverage.js +71 -0
  111. package/dist/cli/orientation/corpusCoverage.js.map +1 -0
  112. package/dist/cli/orientation.js +40 -27
  113. package/dist/cli/orientation.js.map +1 -1
  114. package/dist/cli/startupCompletenessContract.js +49 -0
  115. package/dist/cli/startupCompletenessContract.js.map +1 -0
  116. package/dist/cli/todoSeverity.js +19 -0
  117. package/dist/cli/todoSeverity.js.map +1 -0
  118. package/dist/core/jsonValue.js +6 -0
  119. package/dist/core/jsonValue.js.map +1 -0
  120. package/dist/core/pyjson.js +67 -2
  121. package/dist/core/pyjson.js.map +1 -1
  122. package/dist/hooks/compaction/apply.js +25 -6
  123. package/dist/hooks/compaction/apply.js.map +1 -1
  124. package/dist/hooks/compaction/dryRun.js +3 -3
  125. package/dist/hooks/compaction/dryRun.js.map +1 -1
  126. package/dist/hooks/compaction/index.js +2 -2
  127. package/dist/hooks/compaction/index.js.map +1 -1
  128. package/dist/hooks/compaction/parse.js +132 -3
  129. package/dist/hooks/compaction/parse.js.map +1 -1
  130. package/dist/hooks/compaction/status.js +3 -5
  131. package/dist/hooks/compaction/status.js.map +1 -1
  132. package/dist/hooks/cursorSessionStart.js +10 -2
  133. package/dist/hooks/cursorSessionStart.js.map +1 -1
  134. package/dist/hooks/validateArtifact/markdown.js +57 -6
  135. package/dist/hooks/validateArtifact/markdown.js.map +1 -1
  136. package/dist/setup/cursor.js +1 -1
  137. package/dist/setup/cursor.js.map +1 -1
  138. package/dist/setup/doctor/report.js +2 -58
  139. package/dist/setup/doctor/report.js.map +1 -1
  140. package/dist/state/installRoot.js +49 -18
  141. package/dist/state/installRoot.js.map +1 -1
  142. package/dist/state/startupAnalysis/helpers.js +7 -52
  143. package/dist/state/startupAnalysis/helpers.js.map +1 -1
  144. package/dist/state/startupAnalysis/report.js +9 -31
  145. package/dist/state/startupAnalysis/report.js.map +1 -1
  146. package/dist/state/startupAnalysis/threshold.js +1 -1
  147. package/dist/state/startupAnalysis/threshold.js.map +1 -1
  148. package/dist/upgrade/appModel.js +1 -4
  149. package/dist/upgrade/appModel.js.map +1 -1
  150. package/dist/upgrade/bundleEvidence.js +34 -0
  151. package/dist/upgrade/bundleEvidence.js.map +1 -0
  152. package/dist/upgrade/channels.js +8 -1
  153. package/dist/upgrade/channels.js.map +1 -1
  154. package/dist/upgrade/cliProbe.js +22 -0
  155. package/dist/upgrade/cliProbe.js.map +1 -0
  156. package/dist/upgrade/coexistenceProbe.js +1 -4
  157. package/dist/upgrade/coexistenceProbe.js.map +1 -1
  158. package/dist/upgrade/compatibility.js +1 -4
  159. package/dist/upgrade/compatibility.js.map +1 -1
  160. package/dist/upgrade/doctor.js +168 -173
  161. package/dist/upgrade/doctor.js.map +1 -1
  162. package/dist/upgrade/doctorClassifier.js +208 -0
  163. package/dist/upgrade/doctorClassifier.js.map +1 -0
  164. package/dist/upgrade/migrateArtifactsV2ToV3.js +1 -1
  165. package/dist/upgrade/nextMajorDoctor.js +7 -3
  166. package/dist/upgrade/nextMajorDoctor.js.map +1 -1
  167. package/dist/upgrade/npxPlatformStatus.js +24 -0
  168. package/dist/upgrade/npxPlatformStatus.js.map +1 -0
  169. package/dist/upgrade/projectIntegration.js +54 -71
  170. package/dist/upgrade/projectIntegration.js.map +1 -1
  171. package/dist/upgrade/projectIntegrationDecision.js +93 -0
  172. package/dist/upgrade/projectIntegrationDecision.js.map +1 -0
  173. package/dist/upgrade/versionResolution.js +1 -1
  174. package/dist/upgrade/versionResolution.js.map +1 -1
  175. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +93 -0
  176. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +1 -0
  177. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +488 -0
  178. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +1 -0
  179. package/dist/validate/lifecycleAdapters/shared.js +198 -0
  180. package/dist/validate/lifecycleAdapters/shared.js.map +1 -0
  181. package/dist/validate/lifecycleAdapters.js +12 -722
  182. package/dist/validate/lifecycleAdapters.js.map +1 -1
  183. package/package.json +1 -1
  184. package/dist/cli/commands/backfill.js +0 -84
  185. package/dist/cli/commands/backfill.js.map +0 -1
  186. package/dist/cli/commands/state.js +0 -1023
  187. package/dist/cli/commands/state.js.map +0 -1
  188. package/dist/core/git.js +0 -43
  189. package/dist/core/git.js.map +0 -1
  190. package/dist/hooks/compaction.js +0 -935
  191. package/dist/hooks/compaction.js.map +0 -1
  192. package/dist/hooks/validateArtifact.js +0 -924
  193. package/dist/hooks/validateArtifact.js.map +0 -1
  194. package/dist/state/progressCommit.js +0 -289
  195. package/dist/state/progressCommit.js.map +0 -1
@@ -133,7 +133,7 @@ export function classifyUpgradeOutcome(args) {
133
133
  message: "stable channel tracks the 2.x support line; switch to the development channel to preview v2→v3 migration",
134
134
  };
135
135
  }
136
- if (!isStableSuccessorAnnounced(args.sourceRoot)) {
136
+ if (!isStableSuccessorAnnounced(args.sourceRoot, args.channel.channel)) {
137
137
  return {
138
138
  ...base,
139
139
  kind: "up_to_date",
@@ -1 +1 @@
1
- {"version":3,"file":"versionResolution.js","sourceRoot":"","sources":["../../src/upgrade/versionResolution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"versionResolution.js","sourceRoot":"","sources":["../../src/upgrade/versionResolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { isDir, isFile } from "./shared.js";
5
+ /** Maintainer-only seam: opt in via CLI flag or env for Python oracle parity. */
6
+ export const LEGACY_PYTHON_PARITY_ENV = "AGENTERA_LEGACY_PYTHON_PARITY";
7
+ export const LEGACY_PYTHON_PARITY_FLAG = "--legacy-python-parity";
8
+ const UV_SCRIPT_SHEBANG = "#!/usr/bin/env -S uv run --script";
9
+ const UV_INSTALL_GUIDANCE = "uv is required to run packaged Agentera Python scripts; install it from " +
10
+ "https://docs.astral.sh/uv/getting-started/installation/ and then rerun the check";
11
+ export function legacyPythonParityEnabled(opts = {}) {
12
+ if (opts.legacyPythonParity || opts.checkUvRuntime)
13
+ return true;
14
+ const env = process.env[LEGACY_PYTHON_PARITY_ENV];
15
+ return env === "1" || env === "true";
16
+ }
17
+ function isPackagedPythonScript(p) {
18
+ if (!isFile(p))
19
+ return false;
20
+ const suffix = path.extname(p);
21
+ if (suffix === ".py")
22
+ return true;
23
+ if (suffix)
24
+ return false;
25
+ const firstLine = fs.readFileSync(p, "utf8").split(/\r\n|\r|\n/)[0] ?? "";
26
+ return Boolean(firstLine) && (firstLine.includes("python") || firstLine.includes("uv run --script"));
27
+ }
28
+ function packagedPythonScripts(root) {
29
+ const paths = [];
30
+ for (const directory of ["scripts", "hooks"]) {
31
+ const scriptRoot = path.join(root, directory);
32
+ if (!isDir(scriptRoot))
33
+ continue;
34
+ for (const name of fs.readdirSync(scriptRoot)) {
35
+ const p = path.join(scriptRoot, name);
36
+ if (isPackagedPythonScript(p))
37
+ paths.push(p);
38
+ }
39
+ }
40
+ return paths.sort();
41
+ }
42
+ function extractInlineScriptMetadata(text) {
43
+ const lines = text.split(/\r\n|\r|\n/);
44
+ const start = lines.indexOf("# /// script");
45
+ if (start === -1)
46
+ return null;
47
+ for (let index = start + 1; index < lines.length; index++) {
48
+ if (lines[index] === "# ///") {
49
+ return lines.slice(start + 1, index);
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ function metadataDeclaresRequiresPython(metadata) {
55
+ return metadata.some((line) => line.trim().startsWith("# requires-python = "));
56
+ }
57
+ function metadataDeclaresDependencies(metadata) {
58
+ return metadata.some((line) => line.trim().startsWith("# dependencies = ["));
59
+ }
60
+ export function validatePackagedPythonScripts(root) {
61
+ const errors = [];
62
+ for (const p of packagedPythonScripts(root)) {
63
+ const relative = path.relative(root, p);
64
+ const text = fs.readFileSync(p, "utf8");
65
+ const lines = text.split(/\r\n|\r|\n/);
66
+ const firstLine = lines.length > 0 ? lines[0] : "";
67
+ if (firstLine !== UV_SCRIPT_SHEBANG) {
68
+ errors.push(`${relative}: packaged Python script must use uv script shebang`);
69
+ }
70
+ const metadata = extractInlineScriptMetadata(text);
71
+ if (metadata === null) {
72
+ errors.push(`${relative}: packaged Python script must declare inline script metadata`);
73
+ continue;
74
+ }
75
+ if (!metadataDeclaresRequiresPython(metadata)) {
76
+ errors.push(`${relative}: packaged Python script must declare requires-python`);
77
+ }
78
+ if (!metadataDeclaresDependencies(metadata)) {
79
+ errors.push(`${relative}: packaged Python script must declare dependencies`);
80
+ }
81
+ }
82
+ return errors;
83
+ }
84
+ export function validateUvRuntime() {
85
+ const result = spawnSync(process.platform === "win32" ? "where" : "which", ["uv"], { encoding: "utf8" });
86
+ if (result.status !== 0)
87
+ return [UV_INSTALL_GUIDANCE];
88
+ return [];
89
+ }
90
+ export function runLegacyPythonParityChecks(root) {
91
+ return [...validatePackagedPythonScripts(root), ...validateUvRuntime()];
92
+ }
93
+ //# sourceMappingURL=legacyPythonParity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacyPythonParity.js","sourceRoot":"","sources":["../../../src/validate/lifecycleAdapters/legacyPythonParity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,488 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { resolvePath } from "../../core/paths.js";
4
+ import { loadRegistry as loadRuntimeRegistry, } from "../../registries/runtimeAdapterRegistry.js";
5
+ import { CODEX_AGENTERA_METADATA_TERMS, CODEX_PROFILERA_STATUS_VALUES, CODEX_PROFILERA_TERMS, HARD_GATE_DOC_REQUIREMENTS, codexLifecycleStatusValues, codexLimitationTerms, copilotProfileraTerms, handlerCommandText, hardGateDocTerms, isDir, isFile, isMapping, loadJson, objectField, stringArrayField, stringField, opencodeEventPayloadTypes, packageManifest, resolveFromManifest, resolveInside, runtimeView, setsEqual, stringPaths, supportedEvents, unsupportedEvents, validateCommandHandler, validationEvents, } from "./shared.js";
6
+ export function validateSuiteBundleSurface(root, runtimeNames = null, packageRegistry = null) {
7
+ const errors = [];
8
+ const pkg = packageRegistry ?? packageManifest(root);
9
+ const runtimePackageSurfaces = pkg.runtimeManifestPaths();
10
+ const requiredPaths = pkg.sharedPathRequirements();
11
+ const packageShapes = pkg.runtimePackageShapes();
12
+ const active = runtimeNames ?? new Set(Object.keys(runtimePackageSurfaces));
13
+ for (const runtime of [...active].sort()) {
14
+ const relativeManifest = runtimePackageSurfaces[runtime];
15
+ if (relativeManifest === undefined) {
16
+ errors.push(`${runtime}: unknown runtime package surface`);
17
+ continue;
18
+ }
19
+ const manifest = path.join(root, relativeManifest);
20
+ if (!isFile(manifest)) {
21
+ errors.push(`${runtime}: missing package metadata ${relativeManifest}`);
22
+ continue;
23
+ }
24
+ let pkgJson;
25
+ try {
26
+ pkgJson = loadJson(manifest);
27
+ }
28
+ catch (exc) {
29
+ errors.push(`${runtime}: could not read package metadata ${relativeManifest}: ${exc.message}`);
30
+ continue;
31
+ }
32
+ let metadata = isMapping(pkgJson.agentera) ? pkgJson.agentera : null;
33
+ if (!isMapping(metadata) && runtime === "claude") {
34
+ const plugins = pkgJson.plugins;
35
+ if (Array.isArray(plugins)) {
36
+ const pluginRecord = plugins.find((plugin) => isMapping(plugin) && stringField(plugin, "name") === "agentera" && isMapping(plugin.agentera));
37
+ metadata = pluginRecord && isMapping(pluginRecord) ? objectField(pluginRecord, "agentera") : null;
38
+ }
39
+ }
40
+ if (!isMapping(metadata)) {
41
+ errors.push(`${runtime}: missing agentera app metadata`);
42
+ continue;
43
+ }
44
+ const expectedShape = packageShapes[runtime];
45
+ if (metadata.packageShape !== expectedShape) {
46
+ errors.push(`${runtime}: agentera.packageShape must be ${expectedShape}`);
47
+ }
48
+ const installRootValue = metadata.installRoot;
49
+ if (typeof installRootValue !== "string" || !installRootValue) {
50
+ errors.push(`${runtime}: agentera.installRoot must point at the Agentera app root`);
51
+ continue;
52
+ }
53
+ const installRoot = resolveFromManifest(root, manifest, installRootValue);
54
+ if (installRoot === null) {
55
+ errors.push(`${runtime}: agentera.installRoot must stay inside package root`);
56
+ continue;
57
+ }
58
+ if (installRoot !== resolvePath(root)) {
59
+ errors.push(`${runtime}: AGENTERA_HOME must resolve to the package root`);
60
+ }
61
+ const sharedPaths = metadata.sharedPaths;
62
+ if (!Array.isArray(sharedPaths) || !sharedPaths.every((p) => typeof p === "string")) {
63
+ errors.push(`${runtime}: agentera.sharedPaths must list app paths`);
64
+ continue;
65
+ }
66
+ const listed = new Set(sharedPaths);
67
+ for (const [p, expectedKind] of Object.entries(requiredPaths)) {
68
+ if (!listed.has(p)) {
69
+ errors.push(`${runtime}: shared tool path ${p} missing from package metadata`);
70
+ continue;
71
+ }
72
+ const resolved = resolveInside(installRoot, p);
73
+ if (resolved === null) {
74
+ errors.push(`${runtime}: shared tool path ${p} must stay inside the Agentera app root`);
75
+ }
76
+ else if (expectedKind === "dir" && !isDir(resolved)) {
77
+ errors.push(`${runtime}: shared tool path ${p} must resolve to a directory`);
78
+ }
79
+ else if (expectedKind === "file" && !isFile(resolved)) {
80
+ errors.push(`${runtime}: shared tool path ${p} must resolve to a file`);
81
+ }
82
+ }
83
+ const singleSkill = metadata.singleSkillInstall;
84
+ if (typeof singleSkill !== "string" || !singleSkill.includes("core") || !singleSkill.includes("suite")) {
85
+ errors.push(`${runtime}: agentera.singleSkillInstall must state core skill behavior does not require suite tools`);
86
+ }
87
+ }
88
+ return errors;
89
+ }
90
+ export function validateCopilot(plugin, pluginRoot, registry = loadRuntimeRegistry()) {
91
+ const errors = [];
92
+ if ("lifecycleHooks" in plugin) {
93
+ errors.push("copilot: use supported hooks component field, not lifecycleHooks");
94
+ }
95
+ const skills = plugin.skills;
96
+ if (!(typeof skills === "string" || Array.isArray(skills))) {
97
+ errors.push("copilot.skills must be a string or string array path");
98
+ }
99
+ else if (Array.isArray(skills) && !skills.every((p) => typeof p === "string")) {
100
+ errors.push("copilot.skills entries must be path strings");
101
+ }
102
+ else {
103
+ for (const p of stringPaths(skills)) {
104
+ const resolved = resolveInside(pluginRoot, p);
105
+ if (resolved === null)
106
+ errors.push("copilot.skills paths must stay inside plugin root");
107
+ else if (!isDir(resolved))
108
+ errors.push("copilot.skills paths must resolve to skill directories");
109
+ }
110
+ }
111
+ const hooks = plugin.hooks;
112
+ if (!(typeof hooks === "string" || Array.isArray(hooks))) {
113
+ errors.push("copilot.hooks must be a string or string array path");
114
+ }
115
+ else if (Array.isArray(hooks) && !hooks.every((p) => typeof p === "string")) {
116
+ errors.push("copilot.hooks entries must be path strings");
117
+ }
118
+ else {
119
+ for (const p of stringPaths(hooks)) {
120
+ const resolved = resolveInside(pluginRoot, p);
121
+ if (resolved === null)
122
+ errors.push("copilot.hooks paths must stay inside plugin root");
123
+ else if (!isDir(resolved))
124
+ errors.push("copilot.hooks paths must resolve to a hook directory");
125
+ }
126
+ }
127
+ const description = plugin.description;
128
+ const profileraTerms = copilotProfileraTerms(registry);
129
+ if (typeof description !== "string" || profileraTerms.some((term) => !description.includes(term))) {
130
+ errors.push("copilot.profilera: description must expose bounded corpus metadata limits");
131
+ }
132
+ return errors;
133
+ }
134
+ export function validateCopilotHooks(pluginRoot, plugin, registry = loadRuntimeRegistry()) {
135
+ const errors = [];
136
+ const copilotEvents = supportedEvents(registry, "copilot");
137
+ const requiredPrewriteHook = validationEvents(registry, "copilot")[0] ?? "";
138
+ const hookPaths = stringPaths(plugin.hooks);
139
+ if (hookPaths.length === 0)
140
+ return errors;
141
+ for (const hooks of hookPaths) {
142
+ const hookDir = resolveInside(pluginRoot, hooks);
143
+ if (hookDir === null) {
144
+ errors.push("copilot.hooks paths must stay inside plugin root");
145
+ continue;
146
+ }
147
+ if (!isDir(hookDir)) {
148
+ errors.push("copilot.hooks must resolve to a hook directory");
149
+ continue;
150
+ }
151
+ const seenEvents = new Set();
152
+ const jsonFiles = fs
153
+ .readdirSync(hookDir)
154
+ .filter((n) => n.endsWith(".json"))
155
+ .sort();
156
+ for (const name of jsonFiles) {
157
+ const hook = loadJson(path.join(hookDir, name));
158
+ const stem = name.replace(/\.json$/, "");
159
+ const event = hook.name;
160
+ if (!copilotEvents.has(stem)) {
161
+ errors.push(`copilot: unsupported lifecycle hook file configured: ${name}`);
162
+ }
163
+ if (typeof event !== "string") {
164
+ errors.push(`copilot.${name}: hook name must be a string`);
165
+ continue;
166
+ }
167
+ if (!copilotEvents.has(event)) {
168
+ errors.push(`copilot: unsupported lifecycle event configured: ${event}`);
169
+ continue;
170
+ }
171
+ if (stem !== event) {
172
+ errors.push(`copilot.${name}: hook filename must match event name ${event}`);
173
+ }
174
+ if (event !== event.slice(0, 1).toLowerCase() + event.slice(1)) {
175
+ errors.push(`copilot: event must be lower-camel: ${event}`);
176
+ }
177
+ validateCommandHandler(errors, "copilot", event, 0, hook);
178
+ seenEvents.add(event);
179
+ if (event === requiredPrewriteHook) {
180
+ const commandText = handlerCommandText(hook);
181
+ if (!commandText.includes("hook validate-artifact")) {
182
+ errors.push("copilot.preToolUse: artifact hard gate must run agentera hook validate-artifact");
183
+ }
184
+ }
185
+ }
186
+ if (!seenEvents.has(requiredPrewriteHook)) {
187
+ errors.push("copilot: missing required preToolUse artifact validation hook");
188
+ }
189
+ }
190
+ return errors;
191
+ }
192
+ export function validateCursor(root, plugin, registry = loadRuntimeRegistry()) {
193
+ void registry;
194
+ const errors = [];
195
+ const cursorMeta = plugin.cursor;
196
+ if (!isMapping(cursorMeta)) {
197
+ errors.push("cursor: missing cursor metadata object");
198
+ }
199
+ else {
200
+ const limitations = cursorMeta.limitations;
201
+ if (!Array.isArray(limitations) || limitations.length === 0) {
202
+ errors.push("cursor: limitations must document cloud agents, bare hej, and hard-gate gating");
203
+ }
204
+ else {
205
+ const joined = limitations.map((item) => String(item)).join(" ");
206
+ for (const term of ["Cloud agents", "bare hej", "hard-gate", "smoke"]) {
207
+ if (!joined.toLowerCase().includes(term.toLowerCase())) {
208
+ errors.push(`cursor: limitations must mention '${term}'`);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ const skillPaths = stringPaths(plugin.skills);
214
+ if (skillPaths.length === 0) {
215
+ errors.push("cursor.skills must be a string or string array path");
216
+ }
217
+ for (const skillPath of skillPaths) {
218
+ const resolved = resolveInside(root, skillPath.replace(/^\.\//, ""));
219
+ if (resolved === null) {
220
+ errors.push("cursor.skills paths must stay inside repository root");
221
+ }
222
+ }
223
+ const hookPaths = stringPaths(plugin.hooks);
224
+ if (hookPaths.length === 0) {
225
+ errors.push("cursor.hooks must reference bundled hooks.json");
226
+ }
227
+ for (const hookPath of hookPaths) {
228
+ const resolved = resolveInside(root, hookPath.replace(/^\.\//, ""));
229
+ if (resolved === null || !isFile(resolved)) {
230
+ errors.push("cursor.hooks must resolve to .cursor/hooks.json");
231
+ }
232
+ }
233
+ const agentPaths = stringPaths(plugin.agents);
234
+ if (agentPaths.length === 0) {
235
+ errors.push("cursor.agents must reference managed capability agents");
236
+ }
237
+ else {
238
+ for (const agentPath of agentPaths) {
239
+ const resolved = resolveInside(root, agentPath.replace(/^\.\//, ""));
240
+ if (resolved === null || !isDir(resolved)) {
241
+ errors.push("cursor.agents must resolve to .cursor/agents");
242
+ }
243
+ else if (fs.readdirSync(resolved).filter((n) => n.endsWith(".md")).length < 12) {
244
+ errors.push("cursor.agents must expose twelve managed capability descriptors");
245
+ }
246
+ }
247
+ }
248
+ const reference = path.join(root, "references/adapters/cursor.md");
249
+ if (!isFile(reference)) {
250
+ errors.push("cursor: missing references/adapters/cursor.md");
251
+ }
252
+ else {
253
+ const text = fs.readFileSync(reference, "utf8").toLowerCase();
254
+ for (const term of ["cloud agents", "cursor-agent", "metadata-only", "live pretooluse write smoke"]) {
255
+ if (!text.includes(term)) {
256
+ errors.push(`cursor.md must document '${term}'`);
257
+ }
258
+ }
259
+ }
260
+ return errors;
261
+ }
262
+ export function validateCursorHooks(root, registry = loadRuntimeRegistry()) {
263
+ const errors = [];
264
+ const cursorEvents = supportedEvents(registry, "cursor");
265
+ const requiredPrewriteHook = validationEvents(registry, "cursor")[0] ?? "";
266
+ const hooksPath = path.join(root, ".cursor", "hooks.json");
267
+ if (!isFile(hooksPath))
268
+ return ["cursor: missing .cursor/hooks.json"];
269
+ const payload = loadJson(hooksPath);
270
+ const hooks = payload.hooks;
271
+ if (!isMapping(hooks))
272
+ return [...errors, "cursor: hooks.json must contain a hooks object"];
273
+ const configured = new Set();
274
+ for (const [event, entries] of Object.entries(hooks)) {
275
+ if (!cursorEvents.has(event)) {
276
+ errors.push(`cursor: unsupported lifecycle event configured: ${event}`);
277
+ continue;
278
+ }
279
+ if (!Array.isArray(entries)) {
280
+ errors.push(`cursor.${event}: hook entries must be a list`);
281
+ continue;
282
+ }
283
+ configured.add(event);
284
+ entries.forEach((entry, index) => {
285
+ if (!isMapping(entry)) {
286
+ errors.push(`cursor.${event}[${index}]: hook entry must be an object`);
287
+ return;
288
+ }
289
+ const command = entry.command;
290
+ if (typeof command !== "string" || !command.trim()) {
291
+ errors.push(`cursor.${event}[${index}]: command must be a string`);
292
+ return;
293
+ }
294
+ if (event === "sessionStart" && !command.includes("hook cursor-session-start")) {
295
+ errors.push("cursor.sessionStart: must run agentera hook cursor-session-start");
296
+ }
297
+ if (event === requiredPrewriteHook && !command.includes("hook cursor-pre-tool-use")) {
298
+ errors.push("cursor.preToolUse: artifact hard gate must run agentera hook cursor-pre-tool-use");
299
+ }
300
+ });
301
+ }
302
+ for (const required of ["sessionStart", "sessionEnd", requiredPrewriteHook, "postToolUse"]) {
303
+ if (required && !configured.has(required)) {
304
+ errors.push(`cursor: missing required lifecycle hook ${required}`);
305
+ }
306
+ }
307
+ return errors;
308
+ }
309
+ export function validateCodex(plugin, registry = loadRuntimeRegistry()) {
310
+ const errors = [];
311
+ const codexEvents = supportedEvents(registry, "codex");
312
+ const unsupportedCodexEvents = unsupportedEvents(registry, "codex");
313
+ const lifecycleStatusValues = codexLifecycleStatusValues(registry);
314
+ const limitationTerms = codexLimitationTerms(registry);
315
+ const lifecycle = objectField(plugin, "lifecycleHooks");
316
+ if (Object.keys(lifecycle).length === 0)
317
+ return ["codex: missing lifecycleHooks limitation metadata"];
318
+ if (lifecycle.configured !== false)
319
+ errors.push("codex: lifecycleHooks.configured must be false");
320
+ const lifecycleStatus = stringField(lifecycle, "status");
321
+ if (!lifecycleStatusValues.includes(lifecycleStatus)) {
322
+ errors.push("codex: lifecycleHooks.status must be one of " + lifecycleStatusValues.join(", "));
323
+ }
324
+ const events = objectField(lifecycle, "events");
325
+ if (!isMapping(events)) {
326
+ errors.push("codex: lifecycleHooks.events must be an object when present");
327
+ }
328
+ else {
329
+ for (const event of Object.keys(events)) {
330
+ if (!codexEvents.has(event))
331
+ errors.push(`codex: unsupported lifecycle event configured: ${event}`);
332
+ }
333
+ }
334
+ const supported = lifecycle.supportedEvents;
335
+ const codexSupportedList = stringArrayField(objectField(runtimeView(registry, "codex"), "lifecycle_events"), "supported_events");
336
+ if (!Array.isArray(supported) || !setsEqual(new Set(supported.filter((entry) => typeof entry === "string")), codexEvents)) {
337
+ errors.push("codex: supportedEvents must list every Codex codex_hooks event (" + codexSupportedList.join(", ") + ")");
338
+ }
339
+ const unsupported = lifecycle.unsupportedEvents;
340
+ if (!Array.isArray(unsupported) || unsupported.length === 0) {
341
+ errors.push("codex: unsupportedEvents must list Claude-Code-specific events with no Codex equivalent");
342
+ }
343
+ else {
344
+ for (const entry of unsupported) {
345
+ if (!isMapping(entry)) {
346
+ errors.push("codex: unsupportedEvents entries must be objects with event and reason fields");
347
+ continue;
348
+ }
349
+ const event = stringField(entry, "event");
350
+ if (codexEvents.has(event)) {
351
+ errors.push(`codex: unsupportedEvents must not list event '${event}' that codex_hooks now supports`);
352
+ }
353
+ else if (!unsupportedCodexEvents.has(event)) {
354
+ errors.push(`codex: unsupportedEvents entry '${event}' is not claimed by the registry`);
355
+ }
356
+ }
357
+ }
358
+ const limitations = lifecycle.limitations;
359
+ if (!Array.isArray(limitations) || limitations.length === 0) {
360
+ errors.push("codex: limitations must document codex_hooks status and apply_patch interception");
361
+ }
362
+ else {
363
+ const joined = limitations.filter((item) => typeof item === "string").join(" ");
364
+ for (const term of limitationTerms) {
365
+ if (!joined.includes(term)) {
366
+ errors.push(`codex: limitations must cite '${term}' so apply_patch interception ground truth stays surfaced`);
367
+ }
368
+ }
369
+ for (const marker of ["experimental, require host config opt-in", "experimental-disabled", "no real-time"]) {
370
+ if (joined.includes(marker)) {
371
+ errors.push(`codex: limitations carry stale wording '${marker}'; remove it`);
372
+ }
373
+ }
374
+ }
375
+ return errors;
376
+ }
377
+ export function validateCodexProfileraMetadata(root, plugin) {
378
+ const errors = [];
379
+ const skillMetadata = Array.isArray(plugin.skillMetadata) ? plugin.skillMetadata : [];
380
+ const agentera = skillMetadata.find((skill) => isMapping(skill) && stringField(skill, "name") === "agentera");
381
+ if (!isMapping(agentera))
382
+ return ["codex.agentera: missing aggregate Agentera app metadata"];
383
+ if (stringField(agentera, "runtimeSupport") !== "portable") {
384
+ errors.push("codex.agentera: runtimeSupport must stay portable");
385
+ }
386
+ if (objectField(agentera, "policy").allow_implicit_invocation !== true) {
387
+ errors.push("codex.agentera: Agentera app entry must allow implicit invocation");
388
+ }
389
+ const invocationHint = stringField(agentera, "invocationHint");
390
+ if (typeof invocationHint !== "string" || !invocationHint.includes("$agentera")) {
391
+ errors.push("codex.agentera: invocation hint must name $agentera");
392
+ }
393
+ const codex = objectField(plugin, "codex");
394
+ const codexText = stringArrayField(codex, "limitations").join(" ");
395
+ for (const term of CODEX_AGENTERA_METADATA_TERMS) {
396
+ if (!`${invocationHint || ""} ${codexText}`.includes(term)) {
397
+ errors.push(`codex.agentera: metadata must surface '${term}'`);
398
+ }
399
+ }
400
+ for (const rel of ["agents/openai.yaml"]) {
401
+ const p = path.join(root, rel);
402
+ if (!isFile(p)) {
403
+ errors.push(`codex.agentera: missing metadata surface ${rel}`);
404
+ continue;
405
+ }
406
+ const text = fs.readFileSync(p, "utf8");
407
+ if (!text.includes("path: ./skills/agentera")) {
408
+ errors.push(`codex.agentera: ${rel} must point at installed skills/agentera`);
409
+ }
410
+ for (const stalePath of ["path: ./skills/hej", "metadata: ./skills/hej", "skills/<name>/agents"]) {
411
+ if (text.includes(stalePath)) {
412
+ errors.push(`codex.agentera: ${rel} carries stale v1 skill path '${stalePath}'`);
413
+ }
414
+ }
415
+ for (const term of CODEX_PROFILERA_TERMS) {
416
+ if (!text.includes(term))
417
+ errors.push(`codex.agentera: ${rel} missing '${term}'`);
418
+ }
419
+ if (!CODEX_PROFILERA_STATUS_VALUES.some((value) => text.includes(`status: ${value}`))) {
420
+ errors.push(`codex.agentera: ${rel} missing status declaration (expected one of ` +
421
+ CODEX_PROFILERA_STATUS_VALUES.join(", ") +
422
+ ")");
423
+ }
424
+ if (text.includes("collector exists") || text.includes("not implemented")) {
425
+ errors.push(`codex.agentera: ${rel} contains stale missing-collector wording`);
426
+ }
427
+ }
428
+ return errors;
429
+ }
430
+ export function validateOpencode(root, registry = loadRuntimeRegistry()) {
431
+ const errors = [];
432
+ const pluginPath = path.join(root, ".opencode/plugins/agentera.js");
433
+ if (!isFile(pluginPath))
434
+ return ["opencode: missing .opencode/plugins/agentera.js"];
435
+ const text = fs.readFileSync(pluginPath, "utf8");
436
+ if (!text.includes("event: async")) {
437
+ errors.push("opencode: session lifecycle must use the generic event hook");
438
+ }
439
+ for (const eventType of opencodeEventPayloadTypes(registry)) {
440
+ if (!text.includes(`event.type !== "${eventType}"`) && !text.includes(`event.type === "${eventType}"`)) {
441
+ errors.push(`opencode: event hook must handle or explicitly skip ${eventType}`);
442
+ }
443
+ if (text.includes(`"${eventType}":`)) {
444
+ errors.push(`opencode: must not register direct hook ${eventType}`);
445
+ }
446
+ }
447
+ for (const eventType of unsupportedEvents(registry, "opencode")) {
448
+ if (text.includes(`"${eventType}":`)) {
449
+ errors.push(`opencode: must not register unsupported direct hook ${eventType}`);
450
+ }
451
+ }
452
+ const payloadTypes = opencodeEventPayloadTypes(registry);
453
+ const directHooks = [...supportedEvents(registry, "opencode")].filter((e) => !payloadTypes.has(e));
454
+ for (const event of directHooks) {
455
+ if (!text.includes(`"${event}"`)) {
456
+ errors.push(`opencode: missing "${event}" hook`);
457
+ }
458
+ }
459
+ if (!text.includes("validateArtifactCandidate")) {
460
+ errors.push("opencode: tool.execute.before must validate artifact candidates");
461
+ }
462
+ return errors;
463
+ }
464
+ function normalizedDocText(p) {
465
+ return fs.readFileSync(p, "utf8").replace(/`/g, "");
466
+ }
467
+ export function validateHardGateDocs(root, registry = loadRuntimeRegistry()) {
468
+ const errors = [];
469
+ for (const [relativePath, runtimes] of Object.entries(HARD_GATE_DOC_REQUIREMENTS)) {
470
+ const p = path.join(root, relativePath);
471
+ if (!isFile(p)) {
472
+ errors.push(`${relativePath}: missing hard-gate documentation surface`);
473
+ continue;
474
+ }
475
+ const text = normalizedDocText(p);
476
+ for (const runtime of runtimes) {
477
+ const displayName = stringField(objectField(runtimeView(registry, runtime), "identity"), "display_name").replace(/ CLI$/, "");
478
+ for (const term of hardGateDocTerms(registry, runtime, relativePath)) {
479
+ const normalizedTerm = term.replace(/`/g, "").replace(/\.$/, "");
480
+ if (!text.includes(normalizedTerm)) {
481
+ errors.push(`${relativePath}: ${displayName} hard-gate docs must keep scoped claim term '${term}'`);
482
+ }
483
+ }
484
+ }
485
+ }
486
+ return errors;
487
+ }
488
+ //# sourceMappingURL=nodeFormChecks.js.map