skill-flow 1.0.4 → 1.0.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.
- package/README.md +2 -2
- package/README.zh.md +1 -1
- package/dist/adapters/channel-adapters.js +11 -3
- package/dist/adapters/channel-adapters.js.map +1 -1
- package/dist/cli.js +64 -6
- package/dist/cli.js.map +1 -1
- package/dist/domain/types.d.ts +42 -0
- package/dist/services/config-coordinator.d.ts +38 -0
- package/dist/services/config-coordinator.js +81 -0
- package/dist/services/config-coordinator.js.map +1 -0
- package/dist/services/doctor-service.d.ts +2 -0
- package/dist/services/doctor-service.js +62 -0
- package/dist/services/doctor-service.js.map +1 -1
- package/dist/services/inventory-service.d.ts +4 -1
- package/dist/services/inventory-service.js +54 -26
- package/dist/services/inventory-service.js.map +1 -1
- package/dist/services/skill-flow.d.ts +38 -16
- package/dist/services/skill-flow.js +484 -194
- package/dist/services/skill-flow.js.map +1 -1
- package/dist/services/source-service.d.ts +14 -11
- package/dist/services/source-service.js +389 -81
- package/dist/services/source-service.js.map +1 -1
- package/dist/services/workspace-bootstrap-service.js +2 -10
- package/dist/services/workspace-bootstrap-service.js.map +1 -1
- package/dist/state/store.d.ts +16 -0
- package/dist/state/store.js +93 -19
- package/dist/state/store.js.map +1 -1
- package/dist/tests/add-selection-and-find-command.test.d.ts +1 -0
- package/dist/tests/add-selection-and-find-command.test.js +89 -0
- package/dist/tests/add-selection-and-find-command.test.js.map +1 -0
- package/dist/tests/clawhub.test.d.ts +1 -0
- package/dist/tests/clawhub.test.js +63 -0
- package/dist/tests/clawhub.test.js.map +1 -0
- package/dist/tests/cli-utils.test.d.ts +1 -0
- package/dist/tests/cli-utils.test.js +15 -0
- package/dist/tests/cli-utils.test.js.map +1 -0
- package/dist/tests/config-coordinator.test.d.ts +1 -0
- package/dist/tests/config-coordinator.test.js +172 -0
- package/dist/tests/config-coordinator.test.js.map +1 -0
- package/dist/tests/config-integration.test.d.ts +1 -0
- package/dist/tests/config-integration.test.js +238 -0
- package/dist/tests/config-integration.test.js.map +1 -0
- package/dist/tests/config-ui-utils.test.d.ts +1 -0
- package/dist/tests/config-ui-utils.test.js +473 -0
- package/dist/tests/config-ui-utils.test.js.map +1 -0
- package/dist/tests/find-and-naming-utils.test.d.ts +1 -0
- package/dist/tests/find-and-naming-utils.test.js +127 -0
- package/dist/tests/find-and-naming-utils.test.js.map +1 -0
- package/dist/tests/inventory-service-precedence.test.d.ts +1 -0
- package/dist/tests/inventory-service-precedence.test.js +42 -0
- package/dist/tests/inventory-service-precedence.test.js.map +1 -0
- package/dist/tests/skill-flow.test.js +311 -889
- package/dist/tests/skill-flow.test.js.map +1 -1
- package/dist/tests/source-lifecycle.test.d.ts +1 -0
- package/dist/tests/source-lifecycle.test.js +605 -0
- package/dist/tests/source-lifecycle.test.js.map +1 -0
- package/dist/tests/source-parsing-compatibility.test.d.ts +1 -0
- package/dist/tests/source-parsing-compatibility.test.js +71 -0
- package/dist/tests/source-parsing-compatibility.test.js.map +1 -0
- package/dist/tests/target-definitions.test.d.ts +1 -0
- package/dist/tests/target-definitions.test.js +51 -0
- package/dist/tests/target-definitions.test.js.map +1 -0
- package/dist/tests/test-helpers.d.ts +18 -0
- package/dist/tests/test-helpers.js +123 -0
- package/dist/tests/test-helpers.js.map +1 -0
- package/dist/tui/config-app.d.ts +150 -24
- package/dist/tui/config-app.js +1034 -338
- package/dist/tui/config-app.js.map +1 -1
- package/dist/utils/clawhub.d.ts +3 -0
- package/dist/utils/clawhub.js +32 -3
- package/dist/utils/clawhub.js.map +1 -1
- package/dist/utils/cli.d.ts +1 -0
- package/dist/utils/cli.js +15 -0
- package/dist/utils/cli.js.map +1 -0
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.js +31 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/find-command.js +10 -2
- package/dist/utils/find-command.js.map +1 -1
- package/dist/utils/fs.d.ts +5 -0
- package/dist/utils/fs.js +52 -1
- package/dist/utils/fs.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ As your AI agent skills grow, management gets messy: one Git repo has a bunch of
|
|
|
16
16
|
|
|
17
17
|
## Key Features
|
|
18
18
|
|
|
19
|
-

|
|
20
20
|
|
|
21
21
|
**Skill-Based Grouping**
|
|
22
22
|
One Git repo = one skills group. Related skills stay together, updates and maintenance happen at the group level.
|
|
@@ -87,7 +87,7 @@ skill-flow uninstall my-source-id
|
|
|
87
87
|
|
|
88
88
|
`add <source>` supports local paths, `owner/repo`, full https/ssh Git URLs, GitHub tree URLs, and `clawhub:<slug>[@version]`.
|
|
89
89
|
|
|
90
|
-
By default, `add` preselects all discovered skills and all detected agent targets. When `--path <repoSubpath>` is provided, the full repo is still imported, but only skills under that path are preselected.
|
|
90
|
+
By default, `add` preselects all discovered skills and all detected agent targets. When `--path <repoSubpath>` is provided, the full repo is still imported, but only skills under that path are preselected. `--path` values are normalized, so `./skills/` and `skills/` behave the same, and the CLI prints a preselection warning when the import only scopes the default selection.
|
|
91
91
|
|
|
92
92
|
Examples:
|
|
93
93
|
|
package/README.zh.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
`skill-flow` 用 Skill 视角重新组织管理:以 Github 仓库作为 Skill 分组依据,选择部署目标,统一更新,快速诊断问题。让 Skill 管理清晰、可控、高效。
|
|
16
16
|
|
|
17
17
|
## 核心特性
|
|
18
|
-

|
|
19
19
|
|
|
20
20
|
**Skill 分组管理**
|
|
21
21
|
一个 Github 仓库 = 一个 Skill 分组。相关 Skills 保持在一起,更新和维护以分组为单位进行。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { TARGET_DEFINITIONS, } from "../utils/constants.js";
|
|
2
|
+
import { getTargetDetectionCandidates, TARGET_DEFINITIONS, } from "../utils/constants.js";
|
|
3
3
|
import { pathExists } from "../utils/fs.js";
|
|
4
4
|
class DefaultChannelAdapter {
|
|
5
5
|
target;
|
|
@@ -11,8 +11,16 @@ class DefaultChannelAdapter {
|
|
|
11
11
|
async detect() {
|
|
12
12
|
const definition = TARGET_DEFINITIONS[this.target];
|
|
13
13
|
const envVar = definition.envVar;
|
|
14
|
-
const
|
|
15
|
-
|
|
14
|
+
const candidates = getTargetDetectionCandidates(this.target);
|
|
15
|
+
if (candidates.length === 0) {
|
|
16
|
+
return {
|
|
17
|
+
target: this.target,
|
|
18
|
+
strategy: this.strategy,
|
|
19
|
+
available: false,
|
|
20
|
+
rootPath: path.resolve("."),
|
|
21
|
+
reason: `Target is disabled in explicit target mode. Set ${envVar} to enable it.`,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
16
24
|
for (const candidate of candidates) {
|
|
17
25
|
const rootPath = path.resolve(candidate);
|
|
18
26
|
if (await pathExists(rootPath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-adapters.js","sourceRoot":"","sources":["../../src/adapters/channel-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,EACL,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAS5C,MAAM,qBAAqB;IAGJ;IAFZ,QAAQ,CAAqB;IAEtC,YAAqB,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;QAC/C,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,
|
|
1
|
+
{"version":3,"file":"channel-adapters.js","sourceRoot":"","sources":["../../src/adapters/channel-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAS5C,MAAM,qBAAqB;IAGJ;IAFZ,QAAQ,CAAqB;IAEtC,YAAqB,MAA4B;QAA5B,WAAM,GAAN,MAAM,CAAsB;QAC/C,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;gBAC3B,MAAM,EAAE,mDAAmD,MAAM,gBAAgB;aAClF,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,SAAS,EAAE,IAAI;oBACf,QAAQ;iBACT,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAC5C,MAAM,EAAE,mCAAmC,MAAM,uCAAuC;SACzF,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,IAAI,qBAAqB,CAAC,aAAa,CAAC;QACxC,IAAI,qBAAqB,CAAC,OAAO,CAAC;QAClC,IAAI,qBAAqB,CAAC,QAAQ,CAAC;QACnC,IAAI,qBAAqB,CAAC,gBAAgB,CAAC;QAC3C,IAAI,qBAAqB,CAAC,YAAY,CAAC;QACvC,IAAI,qBAAqB,CAAC,UAAU,CAAC;QACrC,IAAI,qBAAqB,CAAC,UAAU,CAAC;QACrC,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC/B,IAAI,qBAAqB,CAAC,UAAU,CAAC;QACrC,IAAI,qBAAqB,CAAC,UAAU,CAAC;QACrC,IAAI,qBAAqB,CAAC,OAAO,CAAC;QAClC,IAAI,qBAAqB,CAAC,KAAK,CAAC;QAChC,IAAI,qBAAqB,CAAC,MAAM,CAAC;KAClC,CAAC;AACJ,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -2,31 +2,43 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { render } from "ink";
|
|
5
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
5
6
|
import { SkillFlowApp } from "./services/skill-flow.js";
|
|
6
7
|
import { ConfigBootstrapApp } from "./tui/config-app.js";
|
|
7
8
|
import { FindApp } from "./tui/find-app.js";
|
|
8
9
|
import { formatGroupRef } from "./utils/naming.js";
|
|
9
|
-
import { formatDoctorIssue, formatWorkflowList, } from "./utils/format.js";
|
|
10
|
+
import { formatActionSummary, formatDoctorIssue, formatWorkflowList, } from "./utils/format.js";
|
|
11
|
+
import { resolveAddSourceLocator } from "./utils/cli.js";
|
|
10
12
|
import { buildFindCommand } from "./utils/find-command.js";
|
|
11
13
|
const program = new Command();
|
|
12
14
|
const app = new SkillFlowApp();
|
|
13
15
|
program
|
|
14
16
|
.name("skill-flow")
|
|
15
17
|
.description("Workflow-first skill projection manager")
|
|
16
|
-
.version(
|
|
18
|
+
.version(packageJson.version);
|
|
17
19
|
program
|
|
18
20
|
.command("add")
|
|
19
21
|
.argument("<source>", "Source locator")
|
|
20
22
|
.option("--path <repoSubpath>", "Filter Git sources to a specific repo subpath")
|
|
23
|
+
.option("--from <catalog>", "Interpret source using a named catalog")
|
|
21
24
|
.action(async (source, options) => {
|
|
22
|
-
|
|
25
|
+
let resolvedSource;
|
|
26
|
+
try {
|
|
27
|
+
resolvedSource = resolveAddSourceLocator(source, options.from);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
printErrors([{ message: error instanceof Error ? error.message : String(error) }]);
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const result = await app.addSource(resolvedSource, options.path ? { path: options.path } : undefined);
|
|
23
35
|
if (!result.ok) {
|
|
24
36
|
printErrors(result.errors);
|
|
25
37
|
process.exitCode = 1;
|
|
26
38
|
return;
|
|
27
39
|
}
|
|
28
|
-
const duplicateSkipCount = result.warnings.filter((warning) => warning.
|
|
29
|
-
const visibleWarnings = result.warnings.filter((warning) =>
|
|
40
|
+
const duplicateSkipCount = result.warnings.filter((warning) => warning.code === "DUPLICATE_LEAF").length;
|
|
41
|
+
const visibleWarnings = result.warnings.filter((warning) => warning.code !== "DUPLICATE_LEAF");
|
|
30
42
|
const duplicateSummary = duplicateSkipCount > 0
|
|
31
43
|
? `, skipped ${duplicateSkipCount} duplicate skill${duplicateSkipCount === 1 ? "" : "s"}`
|
|
32
44
|
: "";
|
|
@@ -59,7 +71,6 @@ program
|
|
|
59
71
|
...candidate,
|
|
60
72
|
nextCommand: buildFindCommand(candidate),
|
|
61
73
|
})), null, 2));
|
|
62
|
-
printWarnings(result.warnings.map((warning) => warning.message));
|
|
63
74
|
return;
|
|
64
75
|
}
|
|
65
76
|
const instance = render(_jsx(FindApp, { app: app, query: query }));
|
|
@@ -69,6 +80,38 @@ program.command("config").action(async () => {
|
|
|
69
80
|
const instance = render(_jsx(ConfigBootstrapApp, { app: app }));
|
|
70
81
|
await instance.waitUntilExit();
|
|
71
82
|
});
|
|
83
|
+
program
|
|
84
|
+
.command("repair-source")
|
|
85
|
+
.argument("[sourceId]", "Optional skills group id")
|
|
86
|
+
.option("--all", "Repair owned source checkouts for all registered skills groups")
|
|
87
|
+
.action(async (sourceId, options) => {
|
|
88
|
+
const ids = options.all || !sourceId ? undefined : [sourceId];
|
|
89
|
+
const result = await app.repairSource(ids);
|
|
90
|
+
if (!result.ok) {
|
|
91
|
+
printErrors(result.errors);
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const item of result.data.updated) {
|
|
96
|
+
console.log(`${item.sourceId} changed:${item.changed} +${item.addedLeafIds.length} -${item.removedLeafIds.length} invalidated:${item.invalidatedLeafIds.length}`);
|
|
97
|
+
}
|
|
98
|
+
printWarnings(result.warnings.map((warning) => warning.message));
|
|
99
|
+
});
|
|
100
|
+
program
|
|
101
|
+
.command("repair-state")
|
|
102
|
+
.argument("[sourceId]", "Optional skills group id")
|
|
103
|
+
.option("--all", "Rebuild source-side state for all registered skills groups")
|
|
104
|
+
.action(async (sourceId, options) => {
|
|
105
|
+
const ids = options.all || !sourceId ? undefined : [sourceId];
|
|
106
|
+
const result = await app.repairState(ids);
|
|
107
|
+
if (!result.ok) {
|
|
108
|
+
printErrors(result.errors);
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
console.log(`repaired sources:${result.data.repairedSourceIds.length} removed deployments:${result.data.removedDeploymentCount}`);
|
|
113
|
+
printWarnings(result.warnings.map((warning) => warning.message));
|
|
114
|
+
});
|
|
72
115
|
program
|
|
73
116
|
.command("update")
|
|
74
117
|
.argument("[sourceId]", "Optional skills group id")
|
|
@@ -90,6 +133,21 @@ program
|
|
|
90
133
|
}
|
|
91
134
|
printWarnings(result.warnings.map((warning) => warning.message));
|
|
92
135
|
});
|
|
136
|
+
program
|
|
137
|
+
.command("repair-targets")
|
|
138
|
+
.argument("[sourceId]", "Optional skills group id")
|
|
139
|
+
.option("--all", "Repair targets for all registered skills groups")
|
|
140
|
+
.action(async (sourceId, options) => {
|
|
141
|
+
const ids = options.all || !sourceId ? undefined : [sourceId];
|
|
142
|
+
const result = await app.repairTargets(ids);
|
|
143
|
+
if (!result.ok) {
|
|
144
|
+
printErrors(result.errors);
|
|
145
|
+
process.exitCode = 1;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
console.log(formatActionSummary(result.data.actions));
|
|
149
|
+
printWarnings(result.warnings.map((warning) => warning.message));
|
|
150
|
+
});
|
|
93
151
|
program.command("doctor").action(async () => {
|
|
94
152
|
const result = await app.doctor();
|
|
95
153
|
if (!result.ok) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"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"}
|
package/dist/domain/types.d.ts
CHANGED
|
@@ -39,6 +39,10 @@ export type TargetBinding = {
|
|
|
39
39
|
export type SourceBinding = {
|
|
40
40
|
targets: Partial<Record<DeploymentTargetName, TargetBinding>>;
|
|
41
41
|
};
|
|
42
|
+
export type DraftBinding = {
|
|
43
|
+
enabledTargets: DeploymentTargetName[];
|
|
44
|
+
selectedLeafIds: string[];
|
|
45
|
+
};
|
|
42
46
|
export type Manifest = {
|
|
43
47
|
schemaVersion: 1;
|
|
44
48
|
sources: SourceManifestRecord[];
|
|
@@ -48,6 +52,10 @@ export type InvalidLeafRecord = {
|
|
|
48
52
|
path: string;
|
|
49
53
|
reason: string;
|
|
50
54
|
};
|
|
55
|
+
export type DuplicateLeafRecord = {
|
|
56
|
+
path: string;
|
|
57
|
+
keptPath: string;
|
|
58
|
+
};
|
|
51
59
|
export type SourceLockRecord = {
|
|
52
60
|
id: string;
|
|
53
61
|
locator: string;
|
|
@@ -96,6 +104,31 @@ export type LockFile = {
|
|
|
96
104
|
leafInventory: LeafRecord[];
|
|
97
105
|
deployments: DeploymentRecord[];
|
|
98
106
|
};
|
|
107
|
+
export type SourceUpdateDiffKind = "added" | "removed" | "moved" | "invalidated" | "changed";
|
|
108
|
+
export type SourceUpdateDiff = {
|
|
109
|
+
kind: SourceUpdateDiffKind;
|
|
110
|
+
sourceId: string;
|
|
111
|
+
leafId: string;
|
|
112
|
+
relativePath: string;
|
|
113
|
+
contentHash: string;
|
|
114
|
+
requestedPath?: string;
|
|
115
|
+
previousLeafId?: string;
|
|
116
|
+
previousRelativePath?: string;
|
|
117
|
+
previousContentHash?: string;
|
|
118
|
+
};
|
|
119
|
+
export type SourceUpdateResultItem = {
|
|
120
|
+
sourceId: string;
|
|
121
|
+
changed: boolean;
|
|
122
|
+
requestedPath?: string;
|
|
123
|
+
selectionMode?: "all" | "partial";
|
|
124
|
+
addedLeafIds: string[];
|
|
125
|
+
removedLeafIds: string[];
|
|
126
|
+
invalidatedLeafIds: string[];
|
|
127
|
+
diffs: SourceUpdateDiff[];
|
|
128
|
+
};
|
|
129
|
+
export type SourceUpdateResult = {
|
|
130
|
+
updated: SourceUpdateResultItem[];
|
|
131
|
+
};
|
|
99
132
|
export type ChannelDetection = {
|
|
100
133
|
target: DeploymentTargetName;
|
|
101
134
|
strategy: DeploymentStrategy;
|
|
@@ -137,6 +170,15 @@ export type DoctorReport = {
|
|
|
137
170
|
status: "HEALTHY" | "PARTIAL" | "BLOCKED";
|
|
138
171
|
issues: DoctorIssue[];
|
|
139
172
|
};
|
|
173
|
+
export type ConfigBootFailure = {
|
|
174
|
+
sourceId: string;
|
|
175
|
+
message: string;
|
|
176
|
+
};
|
|
177
|
+
export type ConfigBootStatus = {
|
|
178
|
+
phase: "success" | "partial_failure";
|
|
179
|
+
updatedSourceIds: string[];
|
|
180
|
+
failedSources: ConfigBootFailure[];
|
|
181
|
+
};
|
|
140
182
|
export type WorkflowSummary = {
|
|
141
183
|
source: SourceManifestRecord;
|
|
142
184
|
lock: SourceLockRecord | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ConfigBootStatus, DeploymentTargetName, DoctorReport, DraftBinding, LockFile, Manifest, Result, WorkflowSummary } from "../domain/types.js";
|
|
2
|
+
import type { BootstrapEvent } from "./workspace-bootstrap-service.js";
|
|
3
|
+
type ConfigCoordinatorDeps = {
|
|
4
|
+
store: {
|
|
5
|
+
init(): Promise<void>;
|
|
6
|
+
readManifest(): Promise<Manifest>;
|
|
7
|
+
};
|
|
8
|
+
doctorService: {
|
|
9
|
+
run(manifest: Manifest, lockFile: LockFile): Promise<Result<DoctorReport>>;
|
|
10
|
+
};
|
|
11
|
+
workflowService: {
|
|
12
|
+
getSummaries(manifest: Manifest, lockFile: LockFile, audit?: DoctorReport): WorkflowSummary[];
|
|
13
|
+
};
|
|
14
|
+
getAvailableTargets(): Promise<DeploymentTargetName[]>;
|
|
15
|
+
pruneMissingCheckouts(): Promise<Result<{
|
|
16
|
+
removedSourceIds: string[];
|
|
17
|
+
}>>;
|
|
18
|
+
getConfigData(): Promise<Result<{
|
|
19
|
+
manifest: Manifest;
|
|
20
|
+
lockFile: LockFile;
|
|
21
|
+
summaries: WorkflowSummary[];
|
|
22
|
+
}>>;
|
|
23
|
+
};
|
|
24
|
+
export type ConfigBootstrapData = {
|
|
25
|
+
availableTargets: DeploymentTargetName[];
|
|
26
|
+
manifest: Manifest;
|
|
27
|
+
lockFile: LockFile;
|
|
28
|
+
summaries: WorkflowSummary[];
|
|
29
|
+
initialDrafts: Record<string, DraftBinding>;
|
|
30
|
+
audit: DoctorReport;
|
|
31
|
+
bootStatus: ConfigBootStatus;
|
|
32
|
+
};
|
|
33
|
+
export declare class ConfigCoordinator {
|
|
34
|
+
private readonly deps;
|
|
35
|
+
constructor(deps: ConfigCoordinatorDeps);
|
|
36
|
+
bootstrapWorkspaceState(onEvent?: (event: BootstrapEvent) => void): Promise<Result<ConfigBootstrapData>>;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { fail, ok } from "../utils/result.js";
|
|
2
|
+
export class ConfigCoordinator {
|
|
3
|
+
deps;
|
|
4
|
+
constructor(deps) {
|
|
5
|
+
this.deps = deps;
|
|
6
|
+
}
|
|
7
|
+
async bootstrapWorkspaceState(onEvent) {
|
|
8
|
+
onEvent?.({
|
|
9
|
+
phase: "detect-targets",
|
|
10
|
+
level: "info",
|
|
11
|
+
message: "Detecting available agent targets...",
|
|
12
|
+
});
|
|
13
|
+
const availableTargets = await this.deps.getAvailableTargets();
|
|
14
|
+
const pruned = await this.deps.pruneMissingCheckouts();
|
|
15
|
+
if (!pruned.ok) {
|
|
16
|
+
return fail(pruned.errors, pruned.warnings);
|
|
17
|
+
}
|
|
18
|
+
if (pruned.data.removedSourceIds.length > 0) {
|
|
19
|
+
onEvent?.({
|
|
20
|
+
phase: "refresh-sources",
|
|
21
|
+
level: "warning",
|
|
22
|
+
message: `Removed ${pruned.data.removedSourceIds.length} missing group${pruned.data.removedSourceIds.length === 1 ? "" : "s"} from config state.`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
onEvent?.({
|
|
26
|
+
phase: "normalize-bindings",
|
|
27
|
+
level: "info",
|
|
28
|
+
message: "Loading config state...",
|
|
29
|
+
});
|
|
30
|
+
const configData = await this.deps.getConfigData();
|
|
31
|
+
if (!configData.ok) {
|
|
32
|
+
return fail(configData.errors, configData.warnings);
|
|
33
|
+
}
|
|
34
|
+
onEvent?.({
|
|
35
|
+
phase: "audit-projections",
|
|
36
|
+
level: "info",
|
|
37
|
+
message: "Auditing current projections...",
|
|
38
|
+
});
|
|
39
|
+
const audit = await this.deps.doctorService.run(configData.data.manifest, configData.data.lockFile);
|
|
40
|
+
if (!audit.ok) {
|
|
41
|
+
return fail(audit.errors, audit.warnings);
|
|
42
|
+
}
|
|
43
|
+
onEvent?.({
|
|
44
|
+
phase: "build-summaries",
|
|
45
|
+
level: "info",
|
|
46
|
+
message: "Building config summaries...",
|
|
47
|
+
});
|
|
48
|
+
const summaries = this.deps.workflowService.getSummaries(configData.data.manifest, configData.data.lockFile, audit.data);
|
|
49
|
+
const bootStatus = {
|
|
50
|
+
phase: "success",
|
|
51
|
+
updatedSourceIds: [],
|
|
52
|
+
failedSources: [],
|
|
53
|
+
};
|
|
54
|
+
onEvent?.({
|
|
55
|
+
phase: "done",
|
|
56
|
+
level: "success",
|
|
57
|
+
message: "Config bootstrap complete.",
|
|
58
|
+
});
|
|
59
|
+
return ok({
|
|
60
|
+
availableTargets,
|
|
61
|
+
manifest: configData.data.manifest,
|
|
62
|
+
lockFile: configData.data.lockFile,
|
|
63
|
+
summaries,
|
|
64
|
+
initialDrafts: buildInitialDrafts(summaries),
|
|
65
|
+
audit: audit.data,
|
|
66
|
+
bootStatus,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function buildInitialDrafts(summaries) {
|
|
71
|
+
return Object.fromEntries(summaries.map((summary) => {
|
|
72
|
+
const enabledTargets = Object.entries(summary.bindings.targets)
|
|
73
|
+
.filter(([, value]) => value?.enabled)
|
|
74
|
+
.map(([target]) => target);
|
|
75
|
+
const selectedLeafIds = [
|
|
76
|
+
...new Set(enabledTargets.flatMap((target) => summary.bindings.targets[target]?.leafIds ?? [])),
|
|
77
|
+
];
|
|
78
|
+
return [summary.source.id, { enabledTargets, selectedLeafIds }];
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=config-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-coordinator.js","sourceRoot":"","sources":["../../src/services/config-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,6 @@ import type { DoctorReport, LockFile, Manifest, Result } from "../domain/types.j
|
|
|
2
2
|
export declare class DoctorService {
|
|
3
3
|
private readonly adapters;
|
|
4
4
|
run(manifest: Manifest, lockFile: LockFile): Promise<Result<DoctorReport>>;
|
|
5
|
+
private getLeafPath;
|
|
6
|
+
private reportUnmanagedExternalSkills;
|
|
5
7
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import fs from "node:fs/promises";
|
|
2
3
|
import { createChannelAdapters } from "../adapters/channel-adapters.js";
|
|
3
4
|
import { hashDirectory, isBrokenSymlink, pathExists } from "../utils/fs.js";
|
|
@@ -9,6 +10,8 @@ export class DoctorService {
|
|
|
9
10
|
const issues = [];
|
|
10
11
|
for (const source of manifest.sources) {
|
|
11
12
|
const binding = manifest.bindings[source.id] ?? { targets: {} };
|
|
13
|
+
const sourceLock = lockFile.sources.find((item) => item.id === source.id);
|
|
14
|
+
const invalidLeafPaths = new Set(sourceLock?.invalidLeafs.map((leaf) => leaf.path) ?? []);
|
|
12
15
|
for (const adapter of this.adapters) {
|
|
13
16
|
const configured = binding.targets[adapter.target];
|
|
14
17
|
if (!configured?.enabled) {
|
|
@@ -27,6 +30,20 @@ export class DoctorService {
|
|
|
27
30
|
continue;
|
|
28
31
|
}
|
|
29
32
|
for (const leafId of configured.leafIds) {
|
|
33
|
+
const selectedPath = this.getLeafPath(source.id, leafId);
|
|
34
|
+
if (selectedPath && invalidLeafPaths.has(selectedPath)) {
|
|
35
|
+
issues.push({
|
|
36
|
+
severity: "error",
|
|
37
|
+
sourceId: source.id,
|
|
38
|
+
sourceLabel: formatGroupLabel(source),
|
|
39
|
+
target: adapter.target,
|
|
40
|
+
leafId,
|
|
41
|
+
leafLabel: path.basename(selectedPath) || selectedPath,
|
|
42
|
+
code: "INVALIDATED_SELECTED_LEAF",
|
|
43
|
+
message: "This selected skill is invalid in the current source inventory.",
|
|
44
|
+
});
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
30
47
|
const leaf = lockFile.leafInventory.find((item) => item.id === leafId);
|
|
31
48
|
const deployment = lockFile.deployments.find((item) => item.sourceId === source.id &&
|
|
32
49
|
item.leafId === leafId &&
|
|
@@ -116,6 +133,7 @@ export class DoctorService {
|
|
|
116
133
|
}
|
|
117
134
|
}
|
|
118
135
|
}
|
|
136
|
+
await this.reportUnmanagedExternalSkills(lockFile, issues);
|
|
119
137
|
for (const deployment of lockFile.deployments) {
|
|
120
138
|
const sourceStillExists = manifest.sources.some((source) => source.id === deployment.sourceId);
|
|
121
139
|
if (!sourceStillExists) {
|
|
@@ -138,5 +156,49 @@ export class DoctorService {
|
|
|
138
156
|
: "HEALTHY";
|
|
139
157
|
return ok({ status, issues });
|
|
140
158
|
}
|
|
159
|
+
getLeafPath(sourceId, leafId) {
|
|
160
|
+
const prefix = `${sourceId}:`;
|
|
161
|
+
if (!leafId.startsWith(prefix)) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
return leafId.slice(prefix.length);
|
|
165
|
+
}
|
|
166
|
+
async reportUnmanagedExternalSkills(lockFile, issues) {
|
|
167
|
+
const managedTargetPaths = new Set(lockFile.deployments.map((deployment) => path.resolve(deployment.targetPath)));
|
|
168
|
+
const seenPaths = new Set();
|
|
169
|
+
for (const adapter of this.adapters) {
|
|
170
|
+
const detection = await adapter.detect();
|
|
171
|
+
if (!detection.available) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const entries = await fs.readdir(detection.rootPath, { withFileTypes: true });
|
|
175
|
+
for (const entry of entries) {
|
|
176
|
+
const skillDir = path.join(detection.rootPath, entry.name);
|
|
177
|
+
const isDirectoryLike = entry.isDirectory() ||
|
|
178
|
+
(entry.isSymbolicLink() &&
|
|
179
|
+
(await fs.stat(skillDir).then((stats) => stats.isDirectory()).catch(() => false)));
|
|
180
|
+
if (!isDirectoryLike) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (!(await pathExists(path.join(skillDir, "SKILL.md")))) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const resolvedPath = await fs.realpath(skillDir).catch(() => path.resolve(skillDir));
|
|
187
|
+
if (managedTargetPaths.has(path.resolve(skillDir)) || seenPaths.has(resolvedPath)) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
seenPaths.add(resolvedPath);
|
|
191
|
+
issues.push({
|
|
192
|
+
severity: "warning",
|
|
193
|
+
sourceId: `unmanaged:${adapter.target}:${entry.name}`,
|
|
194
|
+
sourceLabel: "Unmanaged external skill",
|
|
195
|
+
target: adapter.target,
|
|
196
|
+
leafLabel: entry.name,
|
|
197
|
+
code: "UNMANAGED_EXTERNAL_TARGET_SKILL",
|
|
198
|
+
message: `Unmanaged skill discovered at ${resolvedPath}.`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
141
203
|
}
|
|
142
204
|
//# sourceMappingURL=doctor-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-service.js","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAQxE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,MAAM,OAAO,aAAa;IACP,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IAEpD,KAAK,CAAC,GAAG,CAAC,QAAkB,EAAE,QAAkB;QAC9C,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-service.js","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import type { InvalidLeafRecord, LeafRecord } from "../domain/types.js";
|
|
1
|
+
import type { DuplicateLeafRecord, InvalidLeafRecord, LeafRecord } from "../domain/types.js";
|
|
2
2
|
type InventoryScan = {
|
|
3
3
|
leafs: LeafRecord[];
|
|
4
4
|
invalidLeafs: InvalidLeafRecord[];
|
|
5
|
+
duplicateLeafs: DuplicateLeafRecord[];
|
|
6
|
+
skillFileCount: number;
|
|
5
7
|
};
|
|
6
8
|
export declare class InventoryService {
|
|
7
9
|
private static readonly IGNORED_DIRECTORIES;
|
|
8
10
|
scanSource(sourceId: string, checkoutPath: string, rootLinkName?: string): Promise<InventoryScan>;
|
|
9
11
|
private findSkillFiles;
|
|
12
|
+
private walkSkillTree;
|
|
10
13
|
private parseSkillFile;
|
|
11
14
|
private dedupeCandidates;
|
|
12
15
|
private parseFrontmatter;
|