skill-flow 1.0.8 → 1.3.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 (143) hide show
  1. package/README.md +208 -131
  2. package/README.zh.md +169 -131
  3. package/dist/bridge-command.d.ts +9 -0
  4. package/dist/bridge-command.js +385 -0
  5. package/dist/bridge-command.js.map +1 -0
  6. package/dist/cli.js +68 -8
  7. package/dist/cli.js.map +1 -1
  8. package/package.json +11 -2
  9. package/dist/adapters/channel-adapters.d.ts +0 -8
  10. package/dist/adapters/channel-adapters.js +0 -64
  11. package/dist/adapters/channel-adapters.js.map +0 -1
  12. package/dist/domain/types.d.ts +0 -234
  13. package/dist/domain/types.js +0 -2
  14. package/dist/domain/types.js.map +0 -1
  15. package/dist/services/config-coordinator.d.ts +0 -38
  16. package/dist/services/config-coordinator.js +0 -83
  17. package/dist/services/config-coordinator.js.map +0 -1
  18. package/dist/services/deployment-applier.d.ts +0 -10
  19. package/dist/services/deployment-applier.js +0 -84
  20. package/dist/services/deployment-applier.js.map +0 -1
  21. package/dist/services/deployment-planner.d.ts +0 -16
  22. package/dist/services/deployment-planner.js +0 -366
  23. package/dist/services/deployment-planner.js.map +0 -1
  24. package/dist/services/doctor-service.d.ts +0 -7
  25. package/dist/services/doctor-service.js +0 -204
  26. package/dist/services/doctor-service.js.map +0 -1
  27. package/dist/services/inventory-service.d.ts +0 -17
  28. package/dist/services/inventory-service.js +0 -216
  29. package/dist/services/inventory-service.js.map +0 -1
  30. package/dist/services/skill-flow.d.ts +0 -136
  31. package/dist/services/skill-flow.js +0 -1210
  32. package/dist/services/skill-flow.js.map +0 -1
  33. package/dist/services/source-service.d.ts +0 -57
  34. package/dist/services/source-service.js +0 -809
  35. package/dist/services/source-service.js.map +0 -1
  36. package/dist/services/workflow-service.d.ts +0 -5
  37. package/dist/services/workflow-service.js +0 -45
  38. package/dist/services/workflow-service.js.map +0 -1
  39. package/dist/services/workspace-bootstrap-service.d.ts +0 -25
  40. package/dist/services/workspace-bootstrap-service.js +0 -140
  41. package/dist/services/workspace-bootstrap-service.js.map +0 -1
  42. package/dist/state/store.d.ts +0 -35
  43. package/dist/state/store.js +0 -151
  44. package/dist/state/store.js.map +0 -1
  45. package/dist/tests/add-flow-model.test.d.ts +0 -1
  46. package/dist/tests/add-flow-model.test.js +0 -108
  47. package/dist/tests/add-flow-model.test.js.map +0 -1
  48. package/dist/tests/add-flow-ui.test.d.ts +0 -1
  49. package/dist/tests/add-flow-ui.test.js +0 -16
  50. package/dist/tests/add-flow-ui.test.js.map +0 -1
  51. package/dist/tests/add-prepare-flow.test.d.ts +0 -1
  52. package/dist/tests/add-prepare-flow.test.js +0 -166
  53. package/dist/tests/add-prepare-flow.test.js.map +0 -1
  54. package/dist/tests/add-selection-and-find-command.test.d.ts +0 -1
  55. package/dist/tests/add-selection-and-find-command.test.js +0 -89
  56. package/dist/tests/add-selection-and-find-command.test.js.map +0 -1
  57. package/dist/tests/clawhub.test.d.ts +0 -1
  58. package/dist/tests/clawhub.test.js +0 -63
  59. package/dist/tests/clawhub.test.js.map +0 -1
  60. package/dist/tests/cli-utils.test.d.ts +0 -1
  61. package/dist/tests/cli-utils.test.js +0 -24
  62. package/dist/tests/cli-utils.test.js.map +0 -1
  63. package/dist/tests/config-coordinator.test.d.ts +0 -1
  64. package/dist/tests/config-coordinator.test.js +0 -219
  65. package/dist/tests/config-coordinator.test.js.map +0 -1
  66. package/dist/tests/config-integration.test.d.ts +0 -1
  67. package/dist/tests/config-integration.test.js +0 -276
  68. package/dist/tests/config-integration.test.js.map +0 -1
  69. package/dist/tests/config-ui-utils.test.d.ts +0 -1
  70. package/dist/tests/config-ui-utils.test.js +0 -523
  71. package/dist/tests/config-ui-utils.test.js.map +0 -1
  72. package/dist/tests/find-and-naming-utils.test.d.ts +0 -1
  73. package/dist/tests/find-and-naming-utils.test.js +0 -127
  74. package/dist/tests/find-and-naming-utils.test.js.map +0 -1
  75. package/dist/tests/inventory-service-precedence.test.d.ts +0 -1
  76. package/dist/tests/inventory-service-precedence.test.js +0 -42
  77. package/dist/tests/inventory-service-precedence.test.js.map +0 -1
  78. package/dist/tests/skill-flow.test.d.ts +0 -1
  79. package/dist/tests/skill-flow.test.js +0 -991
  80. package/dist/tests/skill-flow.test.js.map +0 -1
  81. package/dist/tests/source-lifecycle.test.d.ts +0 -1
  82. package/dist/tests/source-lifecycle.test.js +0 -644
  83. package/dist/tests/source-lifecycle.test.js.map +0 -1
  84. package/dist/tests/source-parsing-compatibility.test.d.ts +0 -1
  85. package/dist/tests/source-parsing-compatibility.test.js +0 -72
  86. package/dist/tests/source-parsing-compatibility.test.js.map +0 -1
  87. package/dist/tests/target-definitions.test.d.ts +0 -1
  88. package/dist/tests/target-definitions.test.js +0 -51
  89. package/dist/tests/target-definitions.test.js.map +0 -1
  90. package/dist/tests/test-helpers.d.ts +0 -18
  91. package/dist/tests/test-helpers.js +0 -123
  92. package/dist/tests/test-helpers.js.map +0 -1
  93. package/dist/tui/add-flow-model.d.ts +0 -62
  94. package/dist/tui/add-flow-model.js +0 -206
  95. package/dist/tui/add-flow-model.js.map +0 -1
  96. package/dist/tui/add-flow.d.ts +0 -25
  97. package/dist/tui/add-flow.js +0 -534
  98. package/dist/tui/add-flow.js.map +0 -1
  99. package/dist/tui/config-app.d.ts +0 -178
  100. package/dist/tui/config-app.js +0 -1551
  101. package/dist/tui/config-app.js.map +0 -1
  102. package/dist/tui/find-app.d.ts +0 -9
  103. package/dist/tui/find-app.js +0 -150
  104. package/dist/tui/find-app.js.map +0 -1
  105. package/dist/tui/selection-state.d.ts +0 -8
  106. package/dist/tui/selection-state.js +0 -32
  107. package/dist/tui/selection-state.js.map +0 -1
  108. package/dist/utils/builtin-git-sources.d.ts +0 -5
  109. package/dist/utils/builtin-git-sources.js +0 -23
  110. package/dist/utils/builtin-git-sources.js.map +0 -1
  111. package/dist/utils/clawhub.d.ts +0 -41
  112. package/dist/utils/clawhub.js +0 -94
  113. package/dist/utils/clawhub.js.map +0 -1
  114. package/dist/utils/cli.d.ts +0 -2
  115. package/dist/utils/cli.js +0 -19
  116. package/dist/utils/cli.js.map +0 -1
  117. package/dist/utils/constants.d.ts +0 -23
  118. package/dist/utils/constants.js +0 -195
  119. package/dist/utils/constants.js.map +0 -1
  120. package/dist/utils/find-command.d.ts +0 -2
  121. package/dist/utils/find-command.js +0 -29
  122. package/dist/utils/find-command.js.map +0 -1
  123. package/dist/utils/format.d.ts +0 -7
  124. package/dist/utils/format.js +0 -68
  125. package/dist/utils/format.js.map +0 -1
  126. package/dist/utils/fs.d.ts +0 -16
  127. package/dist/utils/fs.js +0 -144
  128. package/dist/utils/fs.js.map +0 -1
  129. package/dist/utils/git.d.ts +0 -3
  130. package/dist/utils/git.js +0 -12
  131. package/dist/utils/git.js.map +0 -1
  132. package/dist/utils/github-catalog.d.ts +0 -1
  133. package/dist/utils/github-catalog.js +0 -25
  134. package/dist/utils/github-catalog.js.map +0 -1
  135. package/dist/utils/naming.d.ts +0 -29
  136. package/dist/utils/naming.js +0 -115
  137. package/dist/utils/naming.js.map +0 -1
  138. package/dist/utils/result.d.ts +0 -4
  139. package/dist/utils/result.js +0 -15
  140. package/dist/utils/result.js.map +0 -1
  141. package/dist/utils/source-id.d.ts +0 -2
  142. package/dist/utils/source-id.js +0 -49
  143. package/dist/utils/source-id.js.map +0 -1
@@ -1,64 +0,0 @@
1
- import path from "node:path";
2
- import { getTargetDetectionCandidates, TARGET_DEFINITIONS, } from "../utils/constants.js";
3
- import { pathExists } from "../utils/fs.js";
4
- class DefaultChannelAdapter {
5
- target;
6
- strategy;
7
- constructor(target) {
8
- this.target = target;
9
- this.strategy = TARGET_DEFINITIONS[target].strategy;
10
- }
11
- async detect() {
12
- const definition = TARGET_DEFINITIONS[this.target];
13
- const envVar = definition.envVar;
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
- }
24
- for (const candidate of candidates) {
25
- const rootPath = path.resolve(candidate);
26
- if (await pathExists(rootPath)) {
27
- return {
28
- target: this.target,
29
- strategy: this.strategy,
30
- available: true,
31
- rootPath,
32
- };
33
- }
34
- }
35
- return {
36
- target: this.target,
37
- strategy: this.strategy,
38
- available: false,
39
- rootPath: path.resolve(candidates[0] ?? "."),
40
- reason: `Target directory not found. Set ${envVar} or create the agent directory first.`,
41
- };
42
- }
43
- resolveTargetPath(rootPath, linkName) {
44
- return path.join(rootPath, linkName);
45
- }
46
- }
47
- export function createChannelAdapters() {
48
- return [
49
- new DefaultChannelAdapter("claude-code"),
50
- new DefaultChannelAdapter("codex"),
51
- new DefaultChannelAdapter("cursor"),
52
- new DefaultChannelAdapter("github-copilot"),
53
- new DefaultChannelAdapter("gemini-cli"),
54
- new DefaultChannelAdapter("opencode"),
55
- new DefaultChannelAdapter("openclaw"),
56
- new DefaultChannelAdapter("pi"),
57
- new DefaultChannelAdapter("windsurf"),
58
- new DefaultChannelAdapter("roo-code"),
59
- new DefaultChannelAdapter("cline"),
60
- new DefaultChannelAdapter("amp"),
61
- new DefaultChannelAdapter("kiro"),
62
- ];
63
- }
64
- //# sourceMappingURL=channel-adapters.js.map
@@ -1 +0,0 @@
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"}
@@ -1,234 +0,0 @@
1
- export type Warning = {
2
- code: string;
3
- message: string;
4
- };
5
- export type Failure = {
6
- code: string;
7
- message: string;
8
- };
9
- export type Result<T> = {
10
- ok: true;
11
- data: T;
12
- warnings: Warning[];
13
- errors: [];
14
- } | {
15
- ok: false;
16
- data?: T;
17
- warnings: Warning[];
18
- errors: Failure[];
19
- };
20
- export type SourceKind = "local" | "git" | "clawhub";
21
- export type DeploymentTargetName = "claude-code" | "codex" | "cursor" | "github-copilot" | "gemini-cli" | "opencode" | "openclaw" | "pi" | "windsurf" | "roo-code" | "cline" | "amp" | "kiro";
22
- export type DeploymentStrategy = "symlink" | "copy";
23
- export type HealthStatus = "HEALTHY" | "ACTIVE" | "INACTIVE" | "PARTIAL" | "BLOCKED" | "INVALID" | "UPDATE AVAILABLE" | "UP TO DATE" | "DRIFT DETECTED";
24
- export type SourceManifestRecord = {
25
- id: string;
26
- locator: string;
27
- kind: SourceKind;
28
- displayName: string;
29
- addedAt: string;
30
- requestedPath?: string;
31
- selectionMode?: "all" | "partial";
32
- originLocator?: string;
33
- originRequestedPath?: string;
34
- };
35
- export type TargetBinding = {
36
- enabled: boolean;
37
- leafIds: string[];
38
- };
39
- export type SourceBinding = {
40
- selectedLeafIds?: string[];
41
- targets: Partial<Record<DeploymentTargetName, TargetBinding>>;
42
- };
43
- export type DraftBinding = {
44
- enabledTargets: DeploymentTargetName[];
45
- selectedLeafIds: string[];
46
- };
47
- export type AddSourceDraftOptions = {
48
- skillNames?: string[];
49
- agentTargets?: DeploymentTargetName[];
50
- draft?: DraftBinding;
51
- skipTargetDetection?: boolean;
52
- };
53
- export type AddSourcePreparation = {
54
- sourceId: string;
55
- availableTargets: DeploymentTargetName[];
56
- draft: DraftBinding;
57
- leafs: LeafRecord[];
58
- };
59
- export type Manifest = {
60
- schemaVersion: 1;
61
- sources: SourceManifestRecord[];
62
- bindings: Record<string, SourceBinding>;
63
- };
64
- export type InvalidLeafRecord = {
65
- path: string;
66
- reason: string;
67
- };
68
- export type DuplicateLeafRecord = {
69
- path: string;
70
- keptPath: string;
71
- };
72
- export type SourceLockRecord = {
73
- id: string;
74
- locator: string;
75
- kind: SourceKind;
76
- displayName: string;
77
- checkoutPath: string;
78
- updatedAt: string;
79
- leafIds: string[];
80
- invalidLeafs: InvalidLeafRecord[];
81
- commitSha?: string;
82
- packageSlug?: string;
83
- resolvedVersion?: string;
84
- contentHash?: string;
85
- versionMode?: "pinned" | "floating";
86
- originBranch?: string;
87
- importedFromTargets?: DeploymentTargetName[];
88
- importMode?: "explicit-add" | "bootstrap-detected";
89
- };
90
- export type LeafRecord = {
91
- id: string;
92
- sourceId: string;
93
- name: string;
94
- linkName: string;
95
- title: string;
96
- description: string;
97
- relativePath: string;
98
- absolutePath: string;
99
- skillFilePath: string;
100
- contentHash: string;
101
- metadataWarnings: string[];
102
- valid: true;
103
- };
104
- export type DeploymentRecord = {
105
- sourceId: string;
106
- leafId: string;
107
- target: DeploymentTargetName;
108
- targetPath: string;
109
- targetRootPath?: string;
110
- strategy: DeploymentStrategy;
111
- status: "active" | "drifted" | "blocked" | "removed";
112
- contentHash: string;
113
- appliedAt: string;
114
- };
115
- export type LockFile = {
116
- schemaVersion: 1;
117
- sources: SourceLockRecord[];
118
- leafInventory: LeafRecord[];
119
- deployments: DeploymentRecord[];
120
- };
121
- export type SourceUpdateDiffKind = "added" | "removed" | "moved" | "invalidated" | "changed";
122
- export type SourceUpdateDiff = {
123
- kind: SourceUpdateDiffKind;
124
- sourceId: string;
125
- leafId: string;
126
- relativePath: string;
127
- contentHash: string;
128
- requestedPath?: string;
129
- previousLeafId?: string;
130
- previousRelativePath?: string;
131
- previousContentHash?: string;
132
- };
133
- export type SourceUpdateResultItem = {
134
- sourceId: string;
135
- changed: boolean;
136
- requestedPath?: string;
137
- selectionMode?: "all" | "partial";
138
- addedLeafIds: string[];
139
- removedLeafIds: string[];
140
- invalidatedLeafIds: string[];
141
- diffs: SourceUpdateDiff[];
142
- };
143
- export type SourceUpdateResult = {
144
- updated: SourceUpdateResultItem[];
145
- };
146
- export type ChannelDetection = {
147
- target: DeploymentTargetName;
148
- strategy: DeploymentStrategy;
149
- available: boolean;
150
- rootPath: string;
151
- reason?: string;
152
- };
153
- export type DeploymentActionKind = "create" | "update" | "remove" | "noop" | "blocked";
154
- export type DeploymentAction = {
155
- kind: DeploymentActionKind;
156
- sourceId: string;
157
- leafId: string;
158
- target: DeploymentTargetName;
159
- strategy: DeploymentStrategy;
160
- sourcePath: string;
161
- targetPath: string;
162
- targetRootPath?: string;
163
- previousTargetPath?: string;
164
- previousTargetRootPath?: string;
165
- relocateExternalToTargetPath?: string;
166
- reason?: string;
167
- contentHash: string;
168
- };
169
- export type DeploymentPlan = {
170
- actions: DeploymentAction[];
171
- warnings: Warning[];
172
- blocked: DeploymentAction[];
173
- };
174
- export type DoctorIssueSeverity = "info" | "warning" | "error";
175
- export type DoctorIssue = {
176
- severity: DoctorIssueSeverity;
177
- sourceId: string;
178
- sourceLabel?: string;
179
- target?: DeploymentTargetName;
180
- leafId?: string;
181
- leafLabel?: string;
182
- code: string;
183
- message: string;
184
- };
185
- export type DoctorReport = {
186
- status: "HEALTHY" | "PARTIAL" | "BLOCKED";
187
- issues: DoctorIssue[];
188
- };
189
- export type ConfigBootFailure = {
190
- sourceId: string;
191
- message: string;
192
- };
193
- export type ConfigBootStatus = {
194
- phase: "success" | "partial_failure";
195
- updatedSourceIds: string[];
196
- failedSources: ConfigBootFailure[];
197
- };
198
- export type WorkflowSummary = {
199
- source: SourceManifestRecord;
200
- lock: SourceLockRecord | undefined;
201
- leafs: LeafRecord[];
202
- bindings: SourceBinding;
203
- activeTargetCount: number;
204
- health: HealthStatus;
205
- issueCounts?: {
206
- warning: number;
207
- error: number;
208
- };
209
- healthReason?: string;
210
- };
211
- export type SkillCandidateAction = {
212
- type: "none";
213
- } | {
214
- type: "add-git";
215
- locator: string;
216
- requestedPath?: string;
217
- } | {
218
- type: "add-clawhub";
219
- slug: string;
220
- version?: string;
221
- };
222
- export type SkillCandidate = {
223
- id: string;
224
- title: string;
225
- description: string;
226
- source: "local" | "builtin-git" | "clawhub";
227
- sourceLabel: string;
228
- sourceId: string;
229
- sourceKind: SourceKind;
230
- locator: string;
231
- relativePath?: string;
232
- installed: boolean;
233
- action: SkillCandidateAction;
234
- };
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":""}
@@ -1,38 +0,0 @@
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 {};
@@ -1,83 +0,0 @@
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((summary.bindings.selectedLeafIds && summary.bindings.selectedLeafIds.length > 0
77
- ? summary.bindings.selectedLeafIds
78
- : enabledTargets.flatMap((target) => summary.bindings.targets[target]?.leafIds ?? []))),
79
- ];
80
- return [summary.source.id, { enabledTargets, selectedLeafIds }];
81
- }));
82
- }
83
- //# sourceMappingURL=config-coordinator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-coordinator.js","sourceRoot":"","sources":["../../src/services/config-coordinator.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { DeploymentAction, LockFile, Result } from "../domain/types.js";
2
- import type { ChannelAdapter } from "../adapters/channel-adapters.js";
3
- export declare class DeploymentApplier {
4
- private readonly adapters;
5
- constructor(adapters?: ChannelAdapter[]);
6
- applyPlan(lockFile: LockFile, actions: DeploymentAction[]): Promise<Result<{
7
- applied: DeploymentAction[];
8
- }>>;
9
- private assertManagedTargetPath;
10
- }
@@ -1,84 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- import { copyDirectory, createSymlink, ensureDir, isPathInside, pathExists, removePath } from "../utils/fs.js";
4
- import { ok } from "../utils/result.js";
5
- export class DeploymentApplier {
6
- adapters;
7
- constructor(adapters = []) {
8
- this.adapters = adapters;
9
- }
10
- async applyPlan(lockFile, actions) {
11
- const applied = [];
12
- const targetRoots = new Map(await Promise.all(this.adapters.map(async (adapter) => {
13
- const detection = await adapter.detect();
14
- return [adapter.target, detection.rootPath];
15
- })));
16
- for (const action of actions) {
17
- if (action.kind === "blocked" || action.kind === "noop") {
18
- continue;
19
- }
20
- this.assertManagedTargetPath(action.target, action.targetPath, targetRoots, action.targetRootPath);
21
- if (action.kind === "remove") {
22
- if (await pathExists(action.targetPath)) {
23
- await removePath(action.targetPath);
24
- }
25
- lockFile.deployments = lockFile.deployments.filter((deployment) => !(deployment.sourceId === action.sourceId &&
26
- deployment.leafId === action.leafId &&
27
- deployment.target === action.target));
28
- applied.push(action);
29
- continue;
30
- }
31
- await ensureDir(path.dirname(action.targetPath));
32
- if (action.previousTargetPath &&
33
- action.previousTargetPath !== action.targetPath &&
34
- (await pathExists(action.previousTargetPath))) {
35
- this.assertManagedTargetPath(action.target, action.previousTargetPath, targetRoots, action.previousTargetRootPath);
36
- await removePath(action.previousTargetPath);
37
- }
38
- if (action.relocateExternalToTargetPath &&
39
- (await pathExists(action.targetPath))) {
40
- this.assertManagedTargetPath(action.target, action.relocateExternalToTargetPath, targetRoots, action.targetRootPath);
41
- await ensureDir(path.dirname(action.relocateExternalToTargetPath));
42
- await fs.rename(action.targetPath, action.relocateExternalToTargetPath);
43
- }
44
- if (action.strategy === "symlink") {
45
- await createSymlink(action.sourcePath, action.targetPath);
46
- }
47
- else {
48
- await copyDirectory(action.sourcePath, action.targetPath);
49
- }
50
- const nextRecord = {
51
- sourceId: action.sourceId,
52
- leafId: action.leafId,
53
- target: action.target,
54
- targetPath: action.targetPath,
55
- ...(action.targetRootPath ? { targetRootPath: action.targetRootPath } : {}),
56
- strategy: action.strategy,
57
- status: "active",
58
- contentHash: action.contentHash,
59
- appliedAt: new Date().toISOString(),
60
- };
61
- lockFile.deployments = [
62
- ...lockFile.deployments.filter((deployment) => !(deployment.sourceId === action.sourceId &&
63
- deployment.leafId === action.leafId &&
64
- deployment.target === action.target)),
65
- nextRecord,
66
- ];
67
- applied.push(action);
68
- }
69
- return ok({ applied });
70
- }
71
- assertManagedTargetPath(target, targetPath, targetRoots, explicitRootPath) {
72
- const roots = [
73
- explicitRootPath,
74
- targetRoots.get(target),
75
- ].filter((value) => Boolean(value));
76
- if (roots.length === 0) {
77
- throw new Error(`Managed target root is unavailable for ${target}.`);
78
- }
79
- if (!roots.some((rootPath) => isPathInside(rootPath, targetPath))) {
80
- throw new Error(`Refusing to modify path outside managed root for ${target}: ${targetPath}`);
81
- }
82
- }
83
- }
84
- //# sourceMappingURL=deployment-applier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deployment-applier.js","sourceRoot":"","sources":["../../src/services/deployment-applier.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import type { DeploymentPlan, LockFile, Manifest, Result } from "../domain/types.js";
2
- import type { ChannelAdapter } from "../adapters/channel-adapters.js";
3
- export declare class DeploymentPlanner {
4
- private readonly adapters;
5
- constructor(adapters: ChannelAdapter[]);
6
- planForSource(sourceId: string, manifest: Manifest, lockFile: LockFile): Promise<Result<DeploymentPlan>>;
7
- private planTarget;
8
- private resolveDesiredAction;
9
- private inspectTargetPath;
10
- private buildExternalIdentityState;
11
- private readSkillIdentity;
12
- private buildExternalRelocationCandidate;
13
- private buildExternalRelocationLinkNames;
14
- private inspectExistingTargetPath;
15
- private buildProjectedLinkNameMap;
16
- }