owlrunkit 0.22.0 → 0.22.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.
- package/CHANGELOG.md +30 -0
- package/README.md +20 -4
- package/integrations/codex/skills/owlcoda-runkit/SKILL.md +30 -13
- package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
- package/package.json +1 -1
- package/packages/attest/distribution-manifest-v1.json +5 -0
- package/packages/attest/src/quick.mjs +5 -0
- package/registry-release-policy-v2.json +5 -5
- package/sbom.spdx.json +4 -4
- package/scripts/runkit-contract/core-contract.mjs +1 -1
- package/scripts/runkit-contract/fleet-skill-plan.mjs +14 -66
- package/scripts/runkit-contract/formal-workflow.mjs +1 -1
- package/scripts/runkit-contract/install-codex-skill.mjs +2097 -196
- package/scripts/runkit-contract/project-cli-resolver.mjs +4 -0
- package/scripts/runkit-contract/schemas/fleet-skill-upgrade-plan-v1.schema.json +16 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.22.1
|
|
4
|
+
|
|
5
|
+
- Makes process-wide Codex Skill activation require every discovered project
|
|
6
|
+
to already have an exact package, lockfile, installed CLI/Core, Config, and
|
|
7
|
+
official-registry adoption binding for the target RunKit version.
|
|
8
|
+
- Removes project migration from the shared Skill installer. Skill activation
|
|
9
|
+
now replaces only the shared Skill bytes and emits V2 upgrade/rollback
|
|
10
|
+
receipts proving that the package manifest, lockfile, installed package
|
|
11
|
+
manifest, Config, and adoption evidence were unchanged.
|
|
12
|
+
- Adds canonical project control locks, a fleet-registry transaction lock,
|
|
13
|
+
frozen-fleet revalidation, and recoverable install and rollback journals so
|
|
14
|
+
interruption cannot leave a silent half-upgrade or partial legacy Config
|
|
15
|
+
rollback.
|
|
16
|
+
- Gives upgrade receipts and transaction journals independent, writer-enforced
|
|
17
|
+
byte bounds before Skill mutation. Legacy V1 Config preimages are stored as
|
|
18
|
+
transaction-scoped, hash-bound files instead of duplicated base64 journal
|
|
19
|
+
payloads, and terminal rollback recovery cannot rewrite a newly active
|
|
20
|
+
project after its control lock is released.
|
|
21
|
+
- Binds V2 upgrade receipts to the exact fleet discovery source and frozen
|
|
22
|
+
membership. Rollback rediscovers the current fleet and refuses newly added,
|
|
23
|
+
active, or identity-drifted projects; legacy receipts require an explicit
|
|
24
|
+
current fleet source.
|
|
25
|
+
- Makes both first activation and the read-only plan fail closed on an existing
|
|
26
|
+
incompatible default fleet or any path-level discovery issue.
|
|
27
|
+
- Makes the read-only fleet Skill plan report package/adoption mismatches as
|
|
28
|
+
blocking, with a project-local install/bootstrap or adoption repair boundary,
|
|
29
|
+
instead of presenting Config-only projects as safe to activate.
|
|
30
|
+
- Preserves legacy V1 rollback receipts while keeping all Git, release,
|
|
31
|
+
deployment, production, business, automation, and money authority false.
|
|
32
|
+
|
|
3
33
|
## 0.22.0
|
|
4
34
|
|
|
5
35
|
- Adds the independent `OwlCodaRunKitHookRecoveryV1` public contract and
|
package/README.md
CHANGED
|
@@ -124,7 +124,7 @@ separate authority boundaries.
|
|
|
124
124
|
|
|
125
125
|
## Install
|
|
126
126
|
|
|
127
|
-
This package is the lifecycle-stable, registry-gated `owlrunkit@0.22.
|
|
127
|
+
This package is the lifecycle-stable, registry-gated `owlrunkit@0.22.1`
|
|
128
128
|
artifact. Registry adoption remains fail-closed until its exact official npm
|
|
129
129
|
version, shasum, integrity, and tarball URL are independently verified. Local
|
|
130
130
|
tarballs remain candidate-test inputs and are never adoption provenance. Until
|
|
@@ -132,7 +132,7 @@ that registry evidence exists, use the package only for isolated candidate
|
|
|
132
132
|
verification; do not treat the command below as available release truth.
|
|
133
133
|
|
|
134
134
|
```bash
|
|
135
|
-
npm install --save-exact owlrunkit@0.22.
|
|
135
|
+
npm install --save-exact owlrunkit@0.22.1
|
|
136
136
|
```
|
|
137
137
|
|
|
138
138
|
Use `npx --no-install owlrunkit` for project commands. The package bootstrap
|
|
@@ -148,9 +148,9 @@ the project Config must independently bind the same Core.
|
|
|
148
148
|
```bash
|
|
149
149
|
npx --no-install owlrunkit --version
|
|
150
150
|
npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
|
|
151
|
-
--exact owlrunkit@0.22.
|
|
151
|
+
--exact owlrunkit@0.22.1 --dry-run
|
|
152
152
|
npx --no-install owlrunkit bootstrap --workspace /absolute/path/to/project \
|
|
153
|
-
--exact owlrunkit@0.22.
|
|
153
|
+
--exact owlrunkit@0.22.1 --apply
|
|
154
154
|
npx --no-install owlrunkit init --workspace /absolute/path/to/project
|
|
155
155
|
npx --no-install owlrunkit doctor --workspace /absolute/path/to/project
|
|
156
156
|
npx --no-install owlrunkit inspect --workspace /absolute/path/to/project --json --compact
|
|
@@ -736,6 +736,22 @@ auditable but are never interpreted as active writers.
|
|
|
736
736
|
|
|
737
737
|
RunKit rejects an unreachable root and freezes the exact active workspace list
|
|
738
738
|
before a shared Skill or Core change.
|
|
739
|
+
Shared Skill activation is the final fleet step: every discovered project must
|
|
740
|
+
already bind the target release through its exact package declaration,
|
|
741
|
+
lockfile, installed CLI/Core, Config, and official-registry adoption evidence.
|
|
742
|
+
The installer replaces only the process-wide Skill. It locks every project
|
|
743
|
+
control root in canonical order and proves the workspace package manifest,
|
|
744
|
+
lockfile, installed package manifest, Config, and adoption evidence unchanged;
|
|
745
|
+
it never upgrades project dependencies or Core. An interruption journal
|
|
746
|
+
restores the exact prior Skill before a later installer action continues. The
|
|
747
|
+
fleet registry remains transaction-locked through final receipt commit.
|
|
748
|
+
Receipt and journal byte bounds are enforced by both writers and readers before
|
|
749
|
+
Skill mutation; legacy Config preimages use transaction-scoped, hash-bound
|
|
750
|
+
files so a large fleet does not make its recovery journal unreadable. V2
|
|
751
|
+
receipts always bind their discovery source and frozen membership, so rollback
|
|
752
|
+
must rediscover the same current fleet and also recovers atomically after an
|
|
753
|
+
interruption. Legacy V1 rollback remains supported only when the operator
|
|
754
|
+
supplies an explicit current fleet source.
|
|
739
755
|
Explicit `--fleet-root` and `--fleet-manifest` remain available for bounded
|
|
740
756
|
one-off operations. Completeness is intentionally limited to registered roots;
|
|
741
757
|
RunKit does not claim machine-wide protection for an unregistered location.
|
|
@@ -7,14 +7,14 @@ description: Run receipt-backed, project-owned work with OwlCoda RunKit. Use whe
|
|
|
7
7
|
|
|
8
8
|
Use the bundled deterministic Core to coordinate work through project artifacts rather than chat memory. Require Node.js 20 or later.
|
|
9
9
|
|
|
10
|
-
Bundled registry-gated artifact: standalone `owlrunkit@0.22.
|
|
11
|
-
`0.2` and Core `0.22.
|
|
12
|
-
`sha256:
|
|
10
|
+
Bundled registry-gated artifact: standalone `owlrunkit@0.22.1`, bundling Contract
|
|
11
|
+
`0.2` and Core `0.22.1` with manifest
|
|
12
|
+
`sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4`.
|
|
13
13
|
Registry adoption remains fail-closed until exact official npm registry
|
|
14
|
-
provenance for `owlrunkit@0.22.
|
|
15
|
-
rollback baseline for this artifact is `owlrunkit@0.
|
|
16
|
-
`
|
|
17
|
-
`https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.
|
|
14
|
+
provenance for `owlrunkit@0.22.1` is independently verified. The published
|
|
15
|
+
rollback baseline for this artifact is `owlrunkit@0.22.0`, with SHA-1
|
|
16
|
+
`23fb305f24b2487a2a1de3c8e407d7e4606a3b86` and canonical npm tarball URL
|
|
17
|
+
`https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.22.0.tgz`.
|
|
18
18
|
The root `owlcoda` package has a separate version lifecycle.
|
|
19
19
|
|
|
20
20
|
The session is an execution interface. Project artifacts are the system of record.
|
|
@@ -86,6 +86,17 @@ npx --no-install owlrunkit fleet skill-plan \
|
|
|
86
86
|
--skill-root "$RUNKIT_SKILL_TARGET" --archive-root "$RUNKIT_SKILL_ARCHIVE_ROOT"
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
+
Activate the process-wide Skill only after every discovered project already
|
|
90
|
+
binds the target release through its exact package, lockfile, installed
|
|
91
|
+
CLI/Core, Config, and official-registry adoption evidence. The Skill installer
|
|
92
|
+
must not install project dependencies, initialize Core, or rewrite project
|
|
93
|
+
state; its V2 receipt proves the package manifest, lockfile, installed package
|
|
94
|
+
manifest, Config, and adoption evidence stayed unchanged. V2 restore always
|
|
95
|
+
uses the receipt's frozen fleet binding; only a legacy V1 receipt may accept an
|
|
96
|
+
explicit current fleet source. Receipt and recovery-journal bounds are checked
|
|
97
|
+
before Skill mutation, and interruption recovery remains terminal before
|
|
98
|
+
project control locks are released.
|
|
99
|
+
|
|
89
100
|
Doctor reports both the package-bound and discovered shared Skill absolute
|
|
90
101
|
paths and versions. Shared drift is visible but non-blocking for a valid
|
|
91
102
|
project-local CLI. `loadedSkillVersion=unknown` is deliberate: RunKit cannot
|
|
@@ -304,9 +315,9 @@ below has no CLI entry.
|
|
|
304
315
|
|
|
305
316
|
```bash
|
|
306
317
|
npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
|
|
307
|
-
--exact owlrunkit@0.22.
|
|
318
|
+
--exact owlrunkit@0.22.1 --dry-run
|
|
308
319
|
npx --no-install owlrunkit bootstrap --workspace "$PROJECT_ROOT" \
|
|
309
|
-
--exact owlrunkit@0.22.
|
|
320
|
+
--exact owlrunkit@0.22.1 --apply
|
|
310
321
|
npx --no-install owlrunkit init --workspace "$PROJECT_ROOT"
|
|
311
322
|
npx --no-install owlrunkit inspect --json --workspace "$PROJECT_ROOT"
|
|
312
323
|
npx --no-install owlrunkit inspect --json --compact --workspace "$PROJECT_ROOT"
|
|
@@ -489,10 +500,16 @@ project has an active execution, an active writer lease, ambiguous control
|
|
|
489
500
|
state, or invalid configuration. A missing registry is an error; do not use
|
|
490
501
|
partial explicit coverage to bypass this guard.
|
|
491
502
|
|
|
492
|
-
A successful update archives the exact prior Skill
|
|
493
|
-
project
|
|
494
|
-
|
|
495
|
-
an
|
|
503
|
+
A successful update archives the exact prior Skill without migrating any
|
|
504
|
+
project. It holds each project control lock while proving the package manifest,
|
|
505
|
+
lockfile, installed package manifest, Config, and adoption evidence unchanged,
|
|
506
|
+
then writes an append-only upgrade receipt. An interrupted swap is recovered
|
|
507
|
+
from its bounded transaction journal before a later installer action proceeds.
|
|
508
|
+
The registry transaction lock remains held through receipt commit. A V2
|
|
509
|
+
receipt binds the exact fleet source and frozen membership; rollback
|
|
510
|
+
rediscovers that fleet and uses its own interruption journal. Legacy V1
|
|
511
|
+
receipts require an explicit current fleet source. Use the upgrade receipt for
|
|
512
|
+
an exact Skill rollback:
|
|
496
513
|
|
|
497
514
|
```bash
|
|
498
515
|
node "$RUNKIT_PACKAGE_ROOT/scripts/runkit-contract/install-codex-skill.mjs" \
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"schemaVersion": "OwlCodaRunKitConfigV2",
|
|
3
3
|
"core": {
|
|
4
4
|
"contractVersion": "0.2",
|
|
5
|
-
"coreVersion": "0.22.
|
|
6
|
-
"coreManifestSha256": "sha256:
|
|
7
|
-
"coreSourceRef": "artifact:sha256:
|
|
5
|
+
"coreVersion": "0.22.1",
|
|
6
|
+
"coreManifestSha256": "sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4",
|
|
7
|
+
"coreSourceRef": "artifact:sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4"
|
|
8
8
|
},
|
|
9
9
|
"authorizationPolicy": "external_explicit_authority_required"
|
|
10
10
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "owlrunkit",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.1",
|
|
4
4
|
"description": "Project Driver for cross-Agent project continuity and progression; execution, evidence, verification, and recovery are the underlying trust substrate.",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"author": "yeemio <owlclaw@163.com>",
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
"sha256": "sha256:3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986"
|
|
43
43
|
},
|
|
44
44
|
"supportedProducerCoreIdentities": [
|
|
45
|
+
{
|
|
46
|
+
"contractVersion": "0.2",
|
|
47
|
+
"coreVersion": "0.22.1",
|
|
48
|
+
"coreManifestSha256": "sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4"
|
|
49
|
+
},
|
|
45
50
|
{
|
|
46
51
|
"contractVersion": "0.2",
|
|
47
52
|
"coreVersion": "0.22.0",
|
|
@@ -23,6 +23,11 @@ import {
|
|
|
23
23
|
export { validQuickReceiptShape } from "./quick-receipt-contract.mjs";
|
|
24
24
|
|
|
25
25
|
export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
|
|
26
|
+
{
|
|
27
|
+
contractVersion: "0.2",
|
|
28
|
+
coreVersion: "0.22.1",
|
|
29
|
+
coreManifestSha256: "sha256:41447517f78b74a070802bd67c8b066a833eedde72e2606e3127fa1258c289a4",
|
|
30
|
+
},
|
|
26
31
|
{
|
|
27
32
|
contractVersion: "0.2",
|
|
28
33
|
coreVersion: "0.22.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV2",
|
|
3
3
|
"status": "release_artifact_registry_gated",
|
|
4
4
|
"packageName": "owlrunkit",
|
|
5
|
-
"artifactVersion": "0.22.
|
|
5
|
+
"artifactVersion": "0.22.1",
|
|
6
6
|
"registry": "https://registry.npmjs.org",
|
|
7
7
|
"registryRequiredBeforeAdoption": true,
|
|
8
8
|
"exactVersionRequired": true,
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
],
|
|
24
24
|
"rollbackRelease": {
|
|
25
25
|
"packageName": "owlrunkit",
|
|
26
|
-
"version": "0.
|
|
27
|
-
"shasum": "
|
|
28
|
-
"integrity": "sha512-
|
|
29
|
-
"tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.
|
|
26
|
+
"version": "0.22.0",
|
|
27
|
+
"shasum": "23fb305f24b2487a2a1de3c8e407d7e4606a3b86",
|
|
28
|
+
"integrity": "sha512-sQVFAOvOT7/qLWj5xwLkTvx2g2CGXT3JtRgQDK5Ku2okHGXN6FsgERYKv21IYOxRbEjABamhUwENTflw8ipeSQ==",
|
|
29
|
+
"tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.22.0.tgz"
|
|
30
30
|
},
|
|
31
31
|
"registryEvidenceMustBeExternal": true,
|
|
32
32
|
"registryEvidenceSchemaVersion": "OwlCodaRunKitRegistryReleaseEvidenceV1",
|
package/sbom.spdx.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"spdxVersion": "SPDX-2.3",
|
|
3
3
|
"dataLicense": "CC0-1.0",
|
|
4
4
|
"SPDXID": "SPDXRef-DOCUMENT",
|
|
5
|
-
"name": "owlrunkit-0.22.
|
|
6
|
-
"documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.22.
|
|
5
|
+
"name": "owlrunkit-0.22.1",
|
|
6
|
+
"documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.22.1",
|
|
7
7
|
"creationInfo": {
|
|
8
8
|
"created": "2026-07-29T00:00:00Z",
|
|
9
9
|
"creators": [
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
{
|
|
15
15
|
"name": "owlrunkit",
|
|
16
16
|
"SPDXID": "SPDXRef-Package-OwlRunKit",
|
|
17
|
-
"versionInfo": "0.22.
|
|
17
|
+
"versionInfo": "0.22.1",
|
|
18
18
|
"downloadLocation": "NOASSERTION",
|
|
19
19
|
"filesAnalyzed": false,
|
|
20
20
|
"licenseConcluded": "GPL-3.0-or-later",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{
|
|
25
25
|
"referenceCategory": "PACKAGE-MANAGER",
|
|
26
26
|
"referenceType": "purl",
|
|
27
|
-
"referenceLocator": "pkg:npm/owlrunkit@0.22.
|
|
27
|
+
"referenceLocator": "pkg:npm/owlrunkit@0.22.1"
|
|
28
28
|
}
|
|
29
29
|
]
|
|
30
30
|
}
|
|
@@ -14,7 +14,7 @@ import { fileURLToPath } from "node:url";
|
|
|
14
14
|
import { parseProjectControlState } from "./project-control-parser.mjs";
|
|
15
15
|
|
|
16
16
|
export const CONTRACT_VERSION = "0.2";
|
|
17
|
-
export const CORE_VERSION = "0.22.
|
|
17
|
+
export const CORE_VERSION = "0.22.1";
|
|
18
18
|
export const RUNTIME_ROOT = ".owlcoda/runkit";
|
|
19
19
|
|
|
20
20
|
const CORE_FILES = [
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
currentCoreIdentity,
|
|
6
|
-
validateProjectConfigV2,
|
|
7
|
-
} from "./core-contract.mjs";
|
|
3
|
+
import { currentCoreIdentity } from "./core-contract.mjs";
|
|
8
4
|
import { discoverFleet } from "./fleet-discovery.mjs";
|
|
9
|
-
import {
|
|
10
|
-
|
|
5
|
+
import {
|
|
6
|
+
inspectInstalledSkillCompatibility,
|
|
7
|
+
inspectProjectForSkillChange,
|
|
8
|
+
} from "./install-codex-skill.mjs";
|
|
11
9
|
|
|
12
10
|
function shellQuote(value) {
|
|
13
11
|
return `'${String(value).replaceAll("'", `'"'"'`)}'`;
|
|
@@ -34,63 +32,6 @@ function fleetSourceArguments({
|
|
|
34
32
|
: "";
|
|
35
33
|
}
|
|
36
34
|
|
|
37
|
-
function validLegacyConfigV1(config) {
|
|
38
|
-
return config?.schemaVersion === "OwlCodaRunKitConfigV1"
|
|
39
|
-
&& config?.core?.contractVersion === "0.1"
|
|
40
|
-
&& config?.authorizationPolicy === "external_explicit_authority_required";
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async function inspectAffectedProject(workspaceRoot) {
|
|
44
|
-
const blockers = [];
|
|
45
|
-
const control = inspectProjectControlState({ workspaceRoot }).upgradeSafety;
|
|
46
|
-
for (const artifactId of control.activeRunIds) {
|
|
47
|
-
blockers.push({ code: "active_execution", workspaceRoot, artifactId });
|
|
48
|
-
}
|
|
49
|
-
for (const artifactId of control.activeLeaseIds) {
|
|
50
|
-
blockers.push({ code: "active_lease", workspaceRoot, artifactId });
|
|
51
|
-
}
|
|
52
|
-
for (const issue of control.issues) {
|
|
53
|
-
blockers.push({ code: "control_state_invalid", workspaceRoot, detail: issue });
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const configPath = path.join(workspaceRoot, ".owlcoda/runkit/config.json");
|
|
57
|
-
let config = null;
|
|
58
|
-
try {
|
|
59
|
-
config = JSON.parse((await readFile(configPath)).toString("utf8"));
|
|
60
|
-
} catch (error) {
|
|
61
|
-
blockers.push({
|
|
62
|
-
code: "project_config_invalid",
|
|
63
|
-
workspaceRoot,
|
|
64
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
if (config !== null) {
|
|
68
|
-
const validation = config.schemaVersion === "OwlCodaRunKitConfigV2"
|
|
69
|
-
? validateProjectConfigV2(config)
|
|
70
|
-
: null;
|
|
71
|
-
if ((validation !== null && !validation.valid)
|
|
72
|
-
|| (validation === null && !validLegacyConfigV1(config))) {
|
|
73
|
-
blockers.push({
|
|
74
|
-
code: "project_config_invalid",
|
|
75
|
-
workspaceRoot,
|
|
76
|
-
detail: validation?.issues?.join(",") ?? "unsupported_config",
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
project: {
|
|
83
|
-
workspaceRoot,
|
|
84
|
-
configPath,
|
|
85
|
-
configCoreVersion: config?.core?.coreVersion ?? null,
|
|
86
|
-
activeRunIds: [...control.activeRunIds],
|
|
87
|
-
activeLeaseIds: [...control.activeLeaseIds],
|
|
88
|
-
upgradeSafe: blockers.length === 0,
|
|
89
|
-
},
|
|
90
|
-
blockers,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
35
|
export async function planFleetSkillUpgradeV1({
|
|
95
36
|
repositoryRoot,
|
|
96
37
|
targetRoot,
|
|
@@ -125,11 +66,17 @@ export async function planFleetSkillUpgradeV1({
|
|
|
125
66
|
for (const workspaceRoot of discovery.unreachableRoots) {
|
|
126
67
|
blockers.push({ code: "fleet_root_unreachable", workspaceRoot });
|
|
127
68
|
}
|
|
69
|
+
for (const issue of discovery.issues) {
|
|
70
|
+
blockers.push({
|
|
71
|
+
code: "fleet_discovery_issue",
|
|
72
|
+
detail: `${issue.code}:${issue.path}`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
128
75
|
}
|
|
129
76
|
|
|
130
77
|
const affectedProjects = [];
|
|
131
78
|
for (const workspaceRoot of discovery?.workspaceRoots ?? []) {
|
|
132
|
-
const inspected = await
|
|
79
|
+
const inspected = await inspectProjectForSkillChange(workspaceRoot);
|
|
133
80
|
affectedProjects.push(inspected.project);
|
|
134
81
|
blockers.push(...inspected.blockers);
|
|
135
82
|
}
|
|
@@ -187,6 +134,7 @@ export async function planFleetSkillUpgradeV1({
|
|
|
187
134
|
complete: discovery.complete,
|
|
188
135
|
workspaceCount: discovery.workspaceRoots.length,
|
|
189
136
|
unreachableRoots: discovery.unreachableRoots,
|
|
137
|
+
issues: discovery.issues,
|
|
190
138
|
},
|
|
191
139
|
affectedProjects,
|
|
192
140
|
blockers,
|
|
@@ -209,7 +157,7 @@ export function formatFleetSkillUpgradePlanHumanV1(plan) {
|
|
|
209
157
|
if (plan.blockers.length > 0) {
|
|
210
158
|
lines.push("Blockers:");
|
|
211
159
|
for (const blocker of plan.blockers) {
|
|
212
|
-
lines.push(`- ${blocker.code}${blocker.workspaceRoot ? `: ${blocker.workspaceRoot}` : ""}${blocker.artifactId ? ` (${blocker.artifactId})` : ""}`);
|
|
160
|
+
lines.push(`- ${blocker.code}${blocker.workspaceRoot ? `: ${blocker.workspaceRoot}` : ""}${blocker.artifactId ? ` (${blocker.artifactId})` : ""}${blocker.detail ? `: ${blocker.detail}` : ""}`);
|
|
213
161
|
}
|
|
214
162
|
}
|
|
215
163
|
lines.push(
|
|
@@ -1394,7 +1394,7 @@ export function resumeCompletedFormalFinishV1({
|
|
|
1394
1394
|
};
|
|
1395
1395
|
}
|
|
1396
1396
|
if (
|
|
1397
|
-
new Set(["0.19.2", "0.20.0", "0.20.1", "0.21.0", "0.21.1", "0.22.0"]).has(
|
|
1397
|
+
new Set(["0.19.2", "0.20.0", "0.20.1", "0.21.0", "0.21.1", "0.22.0", "0.22.1"]).has(
|
|
1398
1398
|
closeout.artifact.core?.coreVersion,
|
|
1399
1399
|
)
|
|
1400
1400
|
&& (
|