agentera 3.0.0-dev.22 → 3.0.0-dev.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/bundle/.cursor/agents/agentera.md +1 -1
- package/bundle/.opencode/agents/agentera.md +1 -1
- package/bundle/CHANGELOG.md +2 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +109 -3
- package/bundle/references/cli/agent-ready-state-contract.yaml +22 -14
- package/bundle/references/cli/prime-consumer-compatibility.yaml +676 -0
- package/bundle/references/cli/vocabulary-index.yaml +3 -3
- package/bundle/references/cli/vocabulary.md +10 -3
- package/bundle/skills/agentera/SKILL.md +7 -6
- package/bundle/skills/agentera/agents/audit.toml +1 -1
- package/bundle/skills/agentera/agents/build.toml +1 -1
- package/bundle/skills/agentera/agents/design.toml +1 -1
- package/bundle/skills/agentera/agents/discuss.toml +1 -1
- package/bundle/skills/agentera/agents/document.toml +1 -1
- package/bundle/skills/agentera/agents/optimize.toml +1 -1
- package/bundle/skills/agentera/agents/orchestrate.toml +1 -1
- package/bundle/skills/agentera/agents/plan.toml +1 -1
- package/bundle/skills/agentera/agents/profile.toml +1 -1
- package/bundle/skills/agentera/agents/research.toml +1 -1
- package/bundle/skills/agentera/agents/status.toml +1 -1
- package/bundle/skills/agentera/agents/vision.toml +1 -1
- package/dist/capabilities/index.js +2 -1
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilities/status/startupInstructions.js +35 -0
- package/dist/capabilities/status/startupInstructions.js.map +1 -0
- package/dist/cli/capabilityContext/build.js +3 -3
- package/dist/cli/capabilityContext/build.js.map +1 -1
- package/dist/cli/capabilityContext/closeout.js +5 -5
- package/dist/cli/capabilityContext/closeout.js.map +1 -1
- package/dist/cli/capabilityContext/contract.js +4 -4
- package/dist/cli/capabilityContext/contract.js.map +1 -1
- package/dist/cli/capabilityContext/evidence.js +4 -4
- package/dist/cli/capabilityContext/evidence.js.map +1 -1
- package/dist/cli/capabilityContext/planState.js +7 -6
- package/dist/cli/capabilityContext/planState.js.map +1 -1
- package/dist/cli/capabilityContext/startup.js +4 -4
- package/dist/cli/capabilityContext/startup.js.map +1 -1
- package/dist/cli/commands/prime/briefOrientation.js +582 -0
- package/dist/cli/commands/prime/briefOrientation.js.map +1 -0
- package/dist/cli/commands/prime/orientationOutput.js +117 -23
- package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
- package/dist/cli/commands/prime.js +30 -3
- package/dist/cli/commands/prime.js.map +1 -1
- package/dist/cli/commands/schema.js +3 -29
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/state/plan.js +3 -2
- package/dist/cli/commands/state/plan.js.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/orientation.js +3 -3
- package/dist/cli/orientation.js.map +1 -1
- package/dist/cli/startupCompletenessContract.js +3 -3
- package/dist/cli/startupCompletenessContract.js.map +1 -1
- package/dist/cli/stateQuery.js +37 -0
- package/dist/cli/stateQuery.js.map +1 -1
- package/dist/state/decisionLegacyValidation.js +185 -0
- package/dist/state/decisionLegacyValidation.js.map +1 -0
- package/dist/state/decisionOverlay.js +24 -1
- package/dist/state/decisionOverlay.js.map +1 -1
- package/dist/state/decisionRevision.js +622 -0
- package/dist/state/decisionRevision.js.map +1 -0
- package/dist/state/decisionRevisionPublication.js +532 -0
- package/dist/state/decisionRevisionPublication.js.map +1 -0
- package/dist/state/directRetrieval.js +55 -4
- package/dist/state/directRetrieval.js.map +1 -1
- package/dist/state/listRetrieval.js +42 -11
- package/dist/state/listRetrieval.js.map +1 -1
- package/dist/state/startupProjection.js +68 -1
- package/dist/state/startupProjection.js.map +1 -1
- package/dist/state/write/candidateMutation.js +331 -0
- package/dist/state/write/candidateMutation.js.map +1 -0
- package/dist/state/write/explain.js +36 -12
- package/dist/state/write/explain.js.map +1 -1
- package/dist/state/write/helpers.js +22 -0
- package/dist/state/write/helpers.js.map +1 -1
- package/dist/state/write/mutation.js +42 -0
- package/dist/state/write/mutation.js.map +1 -1
- package/dist/state/write/operations.js +49 -1
- package/dist/state/write/operations.js.map +1 -1
- package/dist/state/write/transaction.js +23 -357
- package/dist/state/write/transaction.js.map +1 -1
- package/dist/validate/lifecycleAdapters/lifecycleMain.js +154 -0
- package/dist/validate/lifecycleAdapters/lifecycleMain.js.map +1 -0
- package/dist/validate/lifecycleAdapters.js +5 -156
- package/dist/validate/lifecycleAdapters.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolvePath } from "../../core/paths.js";
|
|
4
|
+
import { RegistryError, RUNTIME_ADAPTER_CONSUMERS, loadRegistry as loadRuntimeRegistry, } from "../../registries/runtimeAdapterRegistry.js";
|
|
5
|
+
import { loadLifecycleAuthority, validateLifecycleAuthorityRoot, } from "../../runtime/lifecycleAuthority.js";
|
|
6
|
+
import { loadRuntimeLifecycleAdapterContract, validateRuntimeLifecycleAdapterContractRoot, } from "../../runtime/lifecycleAdapterContract.js";
|
|
7
|
+
import { validateRetiredRuntimeCleanupContractRoot } from "../../runtime/retiredRuntimeCleanup.js";
|
|
8
|
+
import { parseSemverCore } from "../../release/releaseMetadata.js";
|
|
9
|
+
import { legacyPythonParityEnabled, runLegacyPythonParityChecks, } from "./legacyPythonParity.js";
|
|
10
|
+
import { validateCodex, validateCodexProfileMetadata, validateCopilot, validateCopilotHooks, validateCursor, validateCursorHooks, validateHardGateDocs, validateOpencode, validateSuiteBundleSurface, } from "./nodeFormChecks.js";
|
|
11
|
+
import { loadJson, packageManifest, registryContractError, rootDefault } from "./shared.js";
|
|
12
|
+
function sameMembers(left, right) {
|
|
13
|
+
return JSON.stringify([...left].sort()) === JSON.stringify([...right].sort());
|
|
14
|
+
}
|
|
15
|
+
export function validateRuntimeIdParity(activeIds, adapterIds, packageRuntimeIds) {
|
|
16
|
+
const errors = [];
|
|
17
|
+
if (!sameMembers(adapterIds, activeIds)) {
|
|
18
|
+
errors.push(`runtime adapter registry IDs must match lifecycle authority: ${activeIds.join(", ")}`);
|
|
19
|
+
}
|
|
20
|
+
if (!sameMembers(packageRuntimeIds, activeIds)) {
|
|
21
|
+
errors.push(`runtime package manifests must cover lifecycle authority exactly: ${activeIds.join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
return errors;
|
|
24
|
+
}
|
|
25
|
+
/** Every active runtime must remain addressable through every declared consumer view. */
|
|
26
|
+
export function validateRuntimeConsumerWiring(activeIds, registry) {
|
|
27
|
+
const errors = [];
|
|
28
|
+
for (const runtimeId of activeIds) {
|
|
29
|
+
for (const consumer of RUNTIME_ADAPTER_CONSUMERS) {
|
|
30
|
+
try {
|
|
31
|
+
const view = registry.consumerView(consumer, runtimeId);
|
|
32
|
+
const identity = view.identity;
|
|
33
|
+
if (identity?.runtime_id !== runtimeId) {
|
|
34
|
+
errors.push(`${runtimeId}: ${consumer} consumer wiring resolved the wrong runtime identity`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
errors.push(`${runtimeId}: missing ${consumer} consumer wiring`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return errors;
|
|
43
|
+
}
|
|
44
|
+
function bundleCovers(relativePath, directories, files) {
|
|
45
|
+
if (files.has(relativePath))
|
|
46
|
+
return true;
|
|
47
|
+
return directories.some((directory) => {
|
|
48
|
+
const relative = path.relative(directory, relativePath);
|
|
49
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function validateReleaseRuntimeParity(root, registry) {
|
|
53
|
+
const errors = [];
|
|
54
|
+
const authority = loadLifecycleAuthority(path.join(root, "references/adapters/runtime-lifecycle-authority.yaml"));
|
|
55
|
+
const activeIds = authority.runtimes.map((runtime) => runtime.id);
|
|
56
|
+
for (const runtime of authority.runtimes) {
|
|
57
|
+
const record = registry.records.find((candidate) => candidate.identity.runtime_id === runtime.id);
|
|
58
|
+
const displayName = record?.identity?.display_name;
|
|
59
|
+
if (displayName !== runtime.displayName) {
|
|
60
|
+
errors.push(`${runtime.id}: runtime adapter display name must match lifecycle authority (${runtime.displayName})`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const packageRegistry = packageManifest(root);
|
|
64
|
+
const packageRuntimeIds = Object.keys(packageRegistry.runtimeManifestPaths());
|
|
65
|
+
errors.push(...validateRuntimeIdParity(activeIds, registry.adapterIds, packageRuntimeIds));
|
|
66
|
+
errors.push(...validateRuntimeConsumerWiring(activeIds, registry));
|
|
67
|
+
const suiteVersion = packageRegistry.suiteVersion();
|
|
68
|
+
for (const [surface, version] of Object.entries(packageRegistry.versionSurfaceValues())) {
|
|
69
|
+
const developmentPackage = surface === "cli-package";
|
|
70
|
+
const parsed = typeof version === "string" ? parseSemverCore(version) : null;
|
|
71
|
+
const matchesSuite = version === suiteVersion || (developmentPackage && parsed?.core === suiteVersion && parsed.preRelease !== null);
|
|
72
|
+
if (!matchesSuite) {
|
|
73
|
+
errors.push(`${surface}: version ${String(version)} must match suite version ${suiteVersion}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const packageRecord = packageRegistry.get();
|
|
77
|
+
const bundleSurfaces = packageRecord.bundle_surfaces;
|
|
78
|
+
const directories = bundleSurfaces.directories.map((entry) => entry.path);
|
|
79
|
+
const files = new Set(bundleSurfaces.files.map((entry) => entry.path));
|
|
80
|
+
const lifecycle = loadRuntimeLifecycleAdapterContract(path.join(root, "references/adapters/runtime-lifecycle-adapters.yaml"), authority);
|
|
81
|
+
for (const resource of lifecycle.resources) {
|
|
82
|
+
const prefix = "{source_root}/";
|
|
83
|
+
if (!resource.source.startsWith(prefix))
|
|
84
|
+
continue;
|
|
85
|
+
const source = resource.source.slice(prefix.length);
|
|
86
|
+
if (!bundleCovers(source, directories, files)) {
|
|
87
|
+
errors.push(`${resource.id}: lifecycle source ${source} is absent from npm bundle surfaces`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const manifestPath of Object.values(packageRegistry.runtimeManifestPaths())) {
|
|
91
|
+
if (!bundleCovers(manifestPath, directories, files)) {
|
|
92
|
+
errors.push(`runtime package manifest ${manifestPath} is absent from npm bundle surfaces`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (fs.existsSync(path.join(root, ".claude-plugin", "marketplace.json"))) {
|
|
96
|
+
errors.push("retired Claude marketplace manifest must be absent");
|
|
97
|
+
}
|
|
98
|
+
return errors;
|
|
99
|
+
}
|
|
100
|
+
export function lifecycleMain(opts = {}) {
|
|
101
|
+
const root = resolvePath(opts.root ?? rootDefault());
|
|
102
|
+
const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
|
|
103
|
+
const errors = [
|
|
104
|
+
...validateLifecycleAuthorityRoot(root),
|
|
105
|
+
...validateRuntimeLifecycleAdapterContractRoot(root),
|
|
106
|
+
...validateRetiredRuntimeCleanupContractRoot(root),
|
|
107
|
+
];
|
|
108
|
+
let registry = null;
|
|
109
|
+
try {
|
|
110
|
+
registry = loadRuntimeRegistry(path.join(root, "references/adapters/runtime-adapter-registry.yaml"));
|
|
111
|
+
}
|
|
112
|
+
catch (exc) {
|
|
113
|
+
if (exc instanceof RegistryError || exc instanceof Error) {
|
|
114
|
+
errors.push(registryContractError(exc));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
throw exc;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (errors.length > 0) {
|
|
121
|
+
out("lifecycle adapter validation failed:");
|
|
122
|
+
for (const error of errors)
|
|
123
|
+
out(`- ${error}`);
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
const reg = registry;
|
|
127
|
+
errors.push(...validateReleaseRuntimeParity(root, reg));
|
|
128
|
+
const copilot = loadJson(path.join(root, "plugin.json"));
|
|
129
|
+
errors.push(...validateCopilot(copilot, root, reg));
|
|
130
|
+
errors.push(...validateCopilotHooks(root, copilot, reg));
|
|
131
|
+
const cursorPlugin = loadJson(path.join(root, ".cursor-plugin/plugin.json"));
|
|
132
|
+
errors.push(...validateCursor(root, cursorPlugin, reg));
|
|
133
|
+
errors.push(...validateCursorHooks(root, reg));
|
|
134
|
+
const codex = loadJson(path.join(root, ".codex-plugin/plugin.json"));
|
|
135
|
+
errors.push(...validateCodex(codex, reg));
|
|
136
|
+
errors.push(...validateCodexProfileMetadata(root, codex));
|
|
137
|
+
errors.push(...validateOpencode(root, reg));
|
|
138
|
+
const packageManifestReg = packageManifest(root);
|
|
139
|
+
const authority = loadLifecycleAuthority(path.join(root, "references/adapters/runtime-lifecycle-authority.yaml"));
|
|
140
|
+
errors.push(...validateSuiteBundleSurface(root, new Set(authority.runtimes.map((runtime) => runtime.id)), packageManifestReg));
|
|
141
|
+
if (legacyPythonParityEnabled(opts)) {
|
|
142
|
+
errors.push(...runLegacyPythonParityChecks(root));
|
|
143
|
+
}
|
|
144
|
+
errors.push(...validateHardGateDocs(root, reg));
|
|
145
|
+
if (errors.length > 0) {
|
|
146
|
+
out("lifecycle adapter validation failed:");
|
|
147
|
+
for (const error of errors)
|
|
148
|
+
out(`- ${error}`);
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
out("lifecycle adapter metadata ok");
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=lifecycleMain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycleMain.js","sourceRoot":"","sources":["../../../src/validate/lifecycleAdapters/lifecycleMain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,161 +1,10 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { resolvePath } from "../core/paths.js";
|
|
4
|
-
import { RegistryError, RUNTIME_ADAPTER_CONSUMERS, loadRegistry as loadRuntimeRegistry, } from "../registries/runtimeAdapterRegistry.js";
|
|
5
|
-
import { loadLifecycleAuthority, validateLifecycleAuthorityRoot, } from "../runtime/lifecycleAuthority.js";
|
|
6
|
-
import { loadRuntimeLifecycleAdapterContract, validateRuntimeLifecycleAdapterContractRoot, } from "../runtime/lifecycleAdapterContract.js";
|
|
7
|
-
import { validateRetiredRuntimeCleanupContractRoot } from "../runtime/retiredRuntimeCleanup.js";
|
|
8
|
-
import { parseSemverCore } from "../release/releaseMetadata.js";
|
|
9
|
-
import { legacyPythonParityEnabled, runLegacyPythonParityChecks, } from "./lifecycleAdapters/legacyPythonParity.js";
|
|
10
|
-
import { validateCodex, validateCodexProfileMetadata, validateCopilot, validateCopilotHooks, validateCursor, validateCursorHooks, validateHardGateDocs, validateOpencode, validateSuiteBundleSurface, } from "./lifecycleAdapters/nodeFormChecks.js";
|
|
11
|
-
import { loadJson, packageManifest, registryContractError, rootDefault } from "./lifecycleAdapters/shared.js";
|
|
12
1
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
2
|
+
* Public re-export surface for lifecycle validation. The node-form checks, legacy
|
|
3
|
+
* Python parity probes, and the orchestration entry (`lifecycleMain`) live in
|
|
4
|
+
* dedicated modules under `./lifecycleAdapters/`. This barrel keeps the historical
|
|
5
|
+
* import path (`../validate/lifecycleAdapters.js`) stable for consumers.
|
|
16
6
|
*/
|
|
17
7
|
export { validateCodex, validateCodexProfileMetadata, validateCopilot, validateCopilotHooks, validateCursor, validateCursorHooks, validateHardGateDocs, validateOpencode, validateSuiteBundleSurface, } from "./lifecycleAdapters/nodeFormChecks.js";
|
|
18
8
|
export { LEGACY_PYTHON_PARITY_ENV, LEGACY_PYTHON_PARITY_FLAG, legacyPythonParityEnabled, validatePackagedPythonScripts, validateUvRuntime, } from "./lifecycleAdapters/legacyPythonParity.js";
|
|
19
|
-
|
|
20
|
-
return JSON.stringify([...left].sort()) === JSON.stringify([...right].sort());
|
|
21
|
-
}
|
|
22
|
-
export function validateRuntimeIdParity(activeIds, adapterIds, packageRuntimeIds) {
|
|
23
|
-
const errors = [];
|
|
24
|
-
if (!sameMembers(adapterIds, activeIds)) {
|
|
25
|
-
errors.push(`runtime adapter registry IDs must match lifecycle authority: ${activeIds.join(", ")}`);
|
|
26
|
-
}
|
|
27
|
-
if (!sameMembers(packageRuntimeIds, activeIds)) {
|
|
28
|
-
errors.push(`runtime package manifests must cover lifecycle authority exactly: ${activeIds.join(", ")}`);
|
|
29
|
-
}
|
|
30
|
-
return errors;
|
|
31
|
-
}
|
|
32
|
-
/** Every active runtime must remain addressable through every declared consumer view. */
|
|
33
|
-
export function validateRuntimeConsumerWiring(activeIds, registry) {
|
|
34
|
-
const errors = [];
|
|
35
|
-
for (const runtimeId of activeIds) {
|
|
36
|
-
for (const consumer of RUNTIME_ADAPTER_CONSUMERS) {
|
|
37
|
-
try {
|
|
38
|
-
const view = registry.consumerView(consumer, runtimeId);
|
|
39
|
-
const identity = view.identity;
|
|
40
|
-
if (identity?.runtime_id !== runtimeId) {
|
|
41
|
-
errors.push(`${runtimeId}: ${consumer} consumer wiring resolved the wrong runtime identity`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
errors.push(`${runtimeId}: missing ${consumer} consumer wiring`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return errors;
|
|
50
|
-
}
|
|
51
|
-
function bundleCovers(relativePath, directories, files) {
|
|
52
|
-
if (files.has(relativePath))
|
|
53
|
-
return true;
|
|
54
|
-
return directories.some((directory) => {
|
|
55
|
-
const relative = path.relative(directory, relativePath);
|
|
56
|
-
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
function validateReleaseRuntimeParity(root, registry) {
|
|
60
|
-
const errors = [];
|
|
61
|
-
const authority = loadLifecycleAuthority(path.join(root, "references/adapters/runtime-lifecycle-authority.yaml"));
|
|
62
|
-
const activeIds = authority.runtimes.map((runtime) => runtime.id);
|
|
63
|
-
for (const runtime of authority.runtimes) {
|
|
64
|
-
const record = registry.records.find((candidate) => candidate.identity.runtime_id === runtime.id);
|
|
65
|
-
const displayName = record?.identity?.display_name;
|
|
66
|
-
if (displayName !== runtime.displayName) {
|
|
67
|
-
errors.push(`${runtime.id}: runtime adapter display name must match lifecycle authority (${runtime.displayName})`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
const packageRegistry = packageManifest(root);
|
|
71
|
-
const packageRuntimeIds = Object.keys(packageRegistry.runtimeManifestPaths());
|
|
72
|
-
errors.push(...validateRuntimeIdParity(activeIds, registry.adapterIds, packageRuntimeIds));
|
|
73
|
-
errors.push(...validateRuntimeConsumerWiring(activeIds, registry));
|
|
74
|
-
const suiteVersion = packageRegistry.suiteVersion();
|
|
75
|
-
for (const [surface, version] of Object.entries(packageRegistry.versionSurfaceValues())) {
|
|
76
|
-
const developmentPackage = surface === "cli-package";
|
|
77
|
-
const parsed = typeof version === "string" ? parseSemverCore(version) : null;
|
|
78
|
-
const matchesSuite = version === suiteVersion || (developmentPackage && parsed?.core === suiteVersion && parsed.preRelease !== null);
|
|
79
|
-
if (!matchesSuite) {
|
|
80
|
-
errors.push(`${surface}: version ${String(version)} must match suite version ${suiteVersion}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
const packageRecord = packageRegistry.get();
|
|
84
|
-
const bundleSurfaces = packageRecord.bundle_surfaces;
|
|
85
|
-
const directories = bundleSurfaces.directories.map((entry) => entry.path);
|
|
86
|
-
const files = new Set(bundleSurfaces.files.map((entry) => entry.path));
|
|
87
|
-
const lifecycle = loadRuntimeLifecycleAdapterContract(path.join(root, "references/adapters/runtime-lifecycle-adapters.yaml"), authority);
|
|
88
|
-
for (const resource of lifecycle.resources) {
|
|
89
|
-
const prefix = "{source_root}/";
|
|
90
|
-
if (!resource.source.startsWith(prefix))
|
|
91
|
-
continue;
|
|
92
|
-
const source = resource.source.slice(prefix.length);
|
|
93
|
-
if (!bundleCovers(source, directories, files)) {
|
|
94
|
-
errors.push(`${resource.id}: lifecycle source ${source} is absent from npm bundle surfaces`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
for (const manifestPath of Object.values(packageRegistry.runtimeManifestPaths())) {
|
|
98
|
-
if (!bundleCovers(manifestPath, directories, files)) {
|
|
99
|
-
errors.push(`runtime package manifest ${manifestPath} is absent from npm bundle surfaces`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (fs.existsSync(path.join(root, ".claude-plugin", "marketplace.json"))) {
|
|
103
|
-
errors.push("retired Claude marketplace manifest must be absent");
|
|
104
|
-
}
|
|
105
|
-
return errors;
|
|
106
|
-
}
|
|
107
|
-
export function lifecycleMain(opts = {}) {
|
|
108
|
-
const root = resolvePath(opts.root ?? rootDefault());
|
|
109
|
-
const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
|
|
110
|
-
const errors = [
|
|
111
|
-
...validateLifecycleAuthorityRoot(root),
|
|
112
|
-
...validateRuntimeLifecycleAdapterContractRoot(root),
|
|
113
|
-
...validateRetiredRuntimeCleanupContractRoot(root),
|
|
114
|
-
];
|
|
115
|
-
let registry = null;
|
|
116
|
-
try {
|
|
117
|
-
registry = loadRuntimeRegistry(path.join(root, "references/adapters/runtime-adapter-registry.yaml"));
|
|
118
|
-
}
|
|
119
|
-
catch (exc) {
|
|
120
|
-
if (exc instanceof RegistryError || exc instanceof Error) {
|
|
121
|
-
errors.push(registryContractError(exc));
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
throw exc;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (errors.length > 0) {
|
|
128
|
-
out("lifecycle adapter validation failed:");
|
|
129
|
-
for (const error of errors)
|
|
130
|
-
out(`- ${error}`);
|
|
131
|
-
return 1;
|
|
132
|
-
}
|
|
133
|
-
const reg = registry;
|
|
134
|
-
errors.push(...validateReleaseRuntimeParity(root, reg));
|
|
135
|
-
const copilot = loadJson(path.join(root, "plugin.json"));
|
|
136
|
-
errors.push(...validateCopilot(copilot, root, reg));
|
|
137
|
-
errors.push(...validateCopilotHooks(root, copilot, reg));
|
|
138
|
-
const cursorPlugin = loadJson(path.join(root, ".cursor-plugin/plugin.json"));
|
|
139
|
-
errors.push(...validateCursor(root, cursorPlugin, reg));
|
|
140
|
-
errors.push(...validateCursorHooks(root, reg));
|
|
141
|
-
const codex = loadJson(path.join(root, ".codex-plugin/plugin.json"));
|
|
142
|
-
errors.push(...validateCodex(codex, reg));
|
|
143
|
-
errors.push(...validateCodexProfileMetadata(root, codex));
|
|
144
|
-
errors.push(...validateOpencode(root, reg));
|
|
145
|
-
const packageManifestReg = packageManifest(root);
|
|
146
|
-
const authority = loadLifecycleAuthority(path.join(root, "references/adapters/runtime-lifecycle-authority.yaml"));
|
|
147
|
-
errors.push(...validateSuiteBundleSurface(root, new Set(authority.runtimes.map((runtime) => runtime.id)), packageManifestReg));
|
|
148
|
-
if (legacyPythonParityEnabled(opts)) {
|
|
149
|
-
errors.push(...runLegacyPythonParityChecks(root));
|
|
150
|
-
}
|
|
151
|
-
errors.push(...validateHardGateDocs(root, reg));
|
|
152
|
-
if (errors.length > 0) {
|
|
153
|
-
out("lifecycle adapter validation failed:");
|
|
154
|
-
for (const error of errors)
|
|
155
|
-
out(`- ${error}`);
|
|
156
|
-
return 1;
|
|
157
|
-
}
|
|
158
|
-
out("lifecycle adapter metadata ok");
|
|
159
|
-
return 0;
|
|
160
|
-
}
|
|
9
|
+
export { validateRuntimeIdParity, validateRuntimeConsumerWiring, lifecycleMain, } from "./lifecycleAdapters/lifecycleMain.js";
|
|
161
10
|
//# sourceMappingURL=lifecycleAdapters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycleAdapters.js","sourceRoot":"","sources":["../../src/validate/lifecycleAdapters.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lifecycleAdapters.js","sourceRoot":"","sources":["../../src/validate/lifecycleAdapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAEL,uBAAuB,EACvB,6BAA6B,EAC7B,aAAa,GACd,MAAM,sCAAsC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentera",
|
|
3
|
-
"version": "3.0.0-dev.
|
|
3
|
+
"version": "3.0.0-dev.23",
|
|
4
4
|
"description": "One CLI, many capabilities: project state, artifact validation, and capability routing for AI coding agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentera",
|
|
@@ -54,6 +54,6 @@
|
|
|
54
54
|
},
|
|
55
55
|
"agentera": {
|
|
56
56
|
"suiteVersion": "3.0.0",
|
|
57
|
-
"gitRef": "
|
|
57
|
+
"gitRef": "c006147d58df551a14ebdcc21e3a4bc3ba094f79"
|
|
58
58
|
}
|
|
59
59
|
}
|