@iowarp/clio-coder 0.3.0
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 +407 -0
- package/CODE_OF_CONDUCT.md +21 -0
- package/CONTRIBUTING.md +224 -0
- package/LICENSE +202 -0
- package/NOTICE +9 -0
- package/README.md +798 -0
- package/SECURITY.md +72 -0
- package/assets/clio-coder-logo-128.webp +0 -0
- package/damage-control-rules.yaml +419 -0
- package/dist/acp-UMLFVA3F.js +92 -0
- package/dist/agents-Q4MYPMUW.js +91 -0
- package/dist/auth-O6HYIJ6J.js +521 -0
- package/dist/chunk-262G75JS.js +35 -0
- package/dist/chunk-26BZQOAD.js +1281 -0
- package/dist/chunk-2J63S4SF.js +508 -0
- package/dist/chunk-3DANZDGR.js +717 -0
- package/dist/chunk-4UQA7NCT.js +29 -0
- package/dist/chunk-527KG6XR.js +497 -0
- package/dist/chunk-5LDRNKX2.js +1063 -0
- package/dist/chunk-5N2FG33Q.js +25 -0
- package/dist/chunk-67MTHP2E.js +135 -0
- package/dist/chunk-6CWDTGUC.js +20 -0
- package/dist/chunk-7BHLZB3A.js +2115 -0
- package/dist/chunk-7RBKDI66.js +348 -0
- package/dist/chunk-AMFR5YA3.js +541 -0
- package/dist/chunk-BBUH4VAA.js +1224 -0
- package/dist/chunk-BYEU76JP.js +899 -0
- package/dist/chunk-CLJ5HLUD.js +458 -0
- package/dist/chunk-D5YD55AR.js +116 -0
- package/dist/chunk-DXQNI4PC.js +61 -0
- package/dist/chunk-E3NYWENM.js +1004 -0
- package/dist/chunk-GNGDQYDU.js +34688 -0
- package/dist/chunk-GOTUR54M.js +9 -0
- package/dist/chunk-HBU5MTAM.js +41 -0
- package/dist/chunk-HMYNFFY4.js +28 -0
- package/dist/chunk-JPOWPFCU.js +1010 -0
- package/dist/chunk-JWHCJDCI.js +1215 -0
- package/dist/chunk-KBR4MZZR.js +41 -0
- package/dist/chunk-KKKPTZLM.js +93 -0
- package/dist/chunk-ME6DNWIU.js +66 -0
- package/dist/chunk-NI4DEJMC.js +88 -0
- package/dist/chunk-O4EJEDHO.js +659 -0
- package/dist/chunk-PIDUD6M2.js +31 -0
- package/dist/chunk-PS4PFJQP.js +29459 -0
- package/dist/chunk-QV47YRF4.js +48 -0
- package/dist/chunk-RQDWMVRB.js +279 -0
- package/dist/chunk-TFSSEXL6.js +136 -0
- package/dist/chunk-TKHQ4DGZ.js +8290 -0
- package/dist/chunk-TPOCL34A.js +2876 -0
- package/dist/chunk-UGYAX5YI.js +565 -0
- package/dist/chunk-UHTSULZS.js +461 -0
- package/dist/chunk-UU3R62TT.js +128 -0
- package/dist/chunk-UWIJNAOB.js +3906 -0
- package/dist/chunk-VOO7NYPP.js +914 -0
- package/dist/chunk-VPAWTYLY.js +117 -0
- package/dist/chunk-WD6AJM35.js +1216 -0
- package/dist/chunk-X3BR7HWV.js +115 -0
- package/dist/chunk-X3NE4WVW.js +120 -0
- package/dist/chunk-XNISANGE.js +1395 -0
- package/dist/chunk-XV4ZJ6ZM.js +3177 -0
- package/dist/cli/index.js +236 -0
- package/dist/clio-KIQ5SNDS.js +53 -0
- package/dist/components-JVHMUBEB.js +653 -0
- package/dist/config-ZFCDBMDC.js +372 -0
- package/dist/configure-G4E3A2PG.js +27 -0
- package/dist/context-CDXTP2MP.js +293 -0
- package/dist/context-E3KIFVXI.js +185 -0
- package/dist/context-clear-3F4PLXOS.js +102 -0
- package/dist/context-index-Q7YSYTR3.js +106 -0
- package/dist/docs-YIETIWZI.js +280 -0
- package/dist/doctor-M5HJJZOL.js +61 -0
- package/dist/domains/agents/builtins/architect.md +33 -0
- package/dist/domains/agents/builtins/coder.md +31 -0
- package/dist/domains/agents/builtins/context-bootstrap.md +38 -0
- package/dist/domains/agents/builtins/debugger.md +30 -0
- package/dist/domains/agents/builtins/documenter.md +31 -0
- package/dist/domains/agents/builtins/git-master.md +30 -0
- package/dist/domains/agents/builtins/provenance.md +30 -0
- package/dist/domains/agents/builtins/researcher.md +71 -0
- package/dist/domains/agents/builtins/scout.md +42 -0
- package/dist/domains/agents/builtins/tester.md +31 -0
- package/dist/domains/agents/builtins/verifier.md +30 -0
- package/dist/domains/agents/builtins/wiki-writer.md +41 -0
- package/dist/eval-B3KZZESM.js +2674 -0
- package/dist/evidence-V67CHM35.js +233 -0
- package/dist/evolve-YDZSUQYA.js +518 -0
- package/dist/extensions-SRG7XCAH.js +207 -0
- package/dist/fleet-CA2CRTVG.js +760 -0
- package/dist/fleet-preflight-CLIAX7YR.js +21 -0
- package/dist/init-2OZDJE2D.js +227 -0
- package/dist/memory-3PIQQAKX.js +207 -0
- package/dist/models-DY35XI7Y.js +237 -0
- package/dist/paths-5OMXW7Z4.js +57 -0
- package/dist/preload-KZVHET2B.js +11 -0
- package/dist/reset-PIFYNOS3.js +216 -0
- package/dist/run-3VSPP24F.js +735 -0
- package/dist/share-D36RQCXM.js +241 -0
- package/dist/skills-F2MRLELY.js +445 -0
- package/dist/skills-eval-E2ZTW4PL.js +932 -0
- package/dist/targets-DZMEZAH4.js +977 -0
- package/dist/trace-7NYCUI2J.js +250 -0
- package/dist/uninstall-AD3JWHBB.js +322 -0
- package/dist/upgrade-WYYBKGDY.js +301 -0
- package/dist/usage-ULIDAGFF.js +755 -0
- package/dist/version-ROZ6CZKH.js +16 -0
- package/dist/wiki-generate-PKFIX6OB.js +377 -0
- package/dist/worker/entry.js +1739 -0
- package/docs/README.md +93 -0
- package/docs/acp.md +120 -0
- package/docs/alcf-provider.md +72 -0
- package/docs/architecture.md +172 -0
- package/docs/artifact-versions.md +54 -0
- package/docs/built-in-agents.md +265 -0
- package/docs/capacity-and-scheduling.md +97 -0
- package/docs/commands-and-modes.md +554 -0
- package/docs/config-knobs-audit.md +115 -0
- package/docs/configuration-and-targets.md +812 -0
- package/docs/context-engine.md +236 -0
- package/docs/dispatch-architecture-rationale.md +126 -0
- package/docs/documentation-coverage.md +46 -0
- package/docs/documentation-guide.md +166 -0
- package/docs/environment-variables.md +105 -0
- package/docs/eval-runner.md +205 -0
- package/docs/evals-internal.md +298 -0
- package/docs/evidence-and-memory.md +243 -0
- package/docs/evolution.md +143 -0
- package/docs/exit-codes-and-output.md +74 -0
- package/docs/extensions-and-sharing.md +306 -0
- package/docs/fleet-demo-runbook.md +179 -0
- package/docs/fleet-dispatch.md +591 -0
- package/docs/glossary.md +75 -0
- package/docs/html/agents_blueprint.html +936 -0
- package/docs/html/alcf_blueprint.html +324 -0
- package/docs/html/architecture_blueprint.html +850 -0
- package/docs/html/commands_blueprint.html +794 -0
- package/docs/html/config_knobs_audit_blueprint.html +178 -0
- package/docs/html/configuration_blueprint.html +1080 -0
- package/docs/html/context_blueprint.html +603 -0
- package/docs/html/documentation_blueprint.html +832 -0
- package/docs/html/environment_blueprint.html +404 -0
- package/docs/html/eval_blueprint.html +743 -0
- package/docs/html/evals_internal_blueprint.html +190 -0
- package/docs/html/evolution_blueprint.html +674 -0
- package/docs/html/extensions_blueprint.html +2065 -0
- package/docs/html/fleet_dispatch_blueprint.html +286 -0
- package/docs/html/index.html +919 -0
- package/docs/html/lifecycle_blueprint.html +723 -0
- package/docs/html/memory_blueprint.html +699 -0
- package/docs/html/middleware_blueprint.html +664 -0
- package/docs/html/models_blueprint.html +2366 -0
- package/docs/html/observability_blueprint.html +683 -0
- package/docs/html/provider_adapter_blueprint.html +245 -0
- package/docs/html/safety_blueprint.html +1386 -0
- package/docs/html/shared.css +571 -0
- package/docs/html/shared.js +143 -0
- package/docs/html/skills_blueprint.html +671 -0
- package/docs/html/soak_blueprint.html +182 -0
- package/docs/html/tool_usage_blueprint.html +350 -0
- package/docs/html/tools_blueprint.html +2249 -0
- package/docs/html/trace_blueprint.html +235 -0
- package/docs/html/tui_design_blueprint.html +314 -0
- package/docs/html/validation_blueprint.html +961 -0
- package/docs/html/worker_dispatch_blueprint.html +231 -0
- package/docs/installation-and-lifecycle.md +308 -0
- package/docs/middleware-and-components.md +148 -0
- package/docs/model-catalog.md +189 -0
- package/docs/observability.md +233 -0
- package/docs/proactive-memory.md +452 -0
- package/docs/prompt-envelope-and-tools.md +142 -0
- package/docs/provider-adapter-cookbook.md +148 -0
- package/docs/release-cut-checklist.md +138 -0
- package/docs/safety-model.md +357 -0
- package/docs/scientific-validation.md +105 -0
- package/docs/session-lifecycle.md +156 -0
- package/docs/skills-marketplace.md +46 -0
- package/docs/tool-usage.md +527 -0
- package/docs/trace-store.md +132 -0
- package/docs/troubleshooting.md +33 -0
- package/docs/tui-design.md +239 -0
- package/docs/worker-dispatch-mechanics.md +242 -0
- package/package.json +132 -0
- package/skills/README.md +408 -0
- package/skills/git/commit-crafting/SKILL.md +79 -0
- package/skills/git/commit-crafting/evals.md +92 -0
- package/skills/git/create-pr/SKILL.md +116 -0
- package/skills/git/create-pr/evals.md +114 -0
- package/skills/git/investigate-issue/SKILL.md +139 -0
- package/skills/git/investigate-issue/evals.md +94 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +96 -0
- package/skills/git/resolve-merge-conflicts/evals.md +58 -0
- package/skills/git/review-changes/SKILL.md +103 -0
- package/skills/git/review-changes/evals.md +85 -0
- package/skills/git/worktree-create/SKILL.md +92 -0
- package/skills/git/worktree-create/evals.md +97 -0
- package/skills/git/worktree-create/references/worktree-setup.md +66 -0
- package/skills/git/worktree-merge/SKILL.md +95 -0
- package/skills/git/worktree-merge/evals.md +114 -0
- package/skills/skill-marketplace.json +261 -0
- package/skills/workflow/cut-it/SKILL.md +86 -0
- package/skills/workflow/cut-it/evals.md +42 -0
- package/src/domains/agents/builtins/architect.md +33 -0
- package/src/domains/agents/builtins/coder.md +31 -0
- package/src/domains/agents/builtins/context-bootstrap.md +38 -0
- package/src/domains/agents/builtins/debugger.md +30 -0
- package/src/domains/agents/builtins/documenter.md +31 -0
- package/src/domains/agents/builtins/git-master.md +30 -0
- package/src/domains/agents/builtins/provenance.md +30 -0
- package/src/domains/agents/builtins/researcher.md +71 -0
- package/src/domains/agents/builtins/scout.md +42 -0
- package/src/domains/agents/builtins/tester.md +31 -0
- package/src/domains/agents/builtins/verifier.md +30 -0
- package/src/domains/agents/builtins/wiki-writer.md +41 -0
- package/src/domains/agents/fleets/build-review.md +34 -0
- package/src/domains/agents/fleets/build-test.md +35 -0
- package/src/domains/agents/fleets/sdlc.md +86 -0
- package/src/domains/prompts/fragments/identity/clio-worker.md +11 -0
- package/src/domains/prompts/fragments/identity/clio.md +26 -0
- package/src/domains/prompts/fragments/operating/contract.md +64 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +14 -0
- package/src/domains/prompts/fragments/safety/full-auto.md +14 -0
- package/src/domains/prompts/fragments/safety/read-only.md +13 -0
- package/src/domains/prompts/fragments/safety/suggest.md +13 -0
- package/src/domains/prompts/fragments/wiki/page.md +75 -0
- package/src/domains/prompts/fragments/wiki/plan.md +48 -0
- package/src/domains/providers/models/cloud-models/alcf.yaml +40 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +993 -0
|
@@ -0,0 +1,653 @@
|
|
|
1
|
+
import "./chunk-PIDUD6M2.js";
|
|
2
|
+
import {
|
|
3
|
+
printError,
|
|
4
|
+
printOk
|
|
5
|
+
} from "./chunk-67MTHP2E.js";
|
|
6
|
+
import "./chunk-5LDRNKX2.js";
|
|
7
|
+
import "./chunk-VPAWTYLY.js";
|
|
8
|
+
import "./chunk-X3NE4WVW.js";
|
|
9
|
+
import {
|
|
10
|
+
resolvePackageRoot
|
|
11
|
+
} from "./chunk-DXQNI4PC.js";
|
|
12
|
+
|
|
13
|
+
// src/cli/components.ts
|
|
14
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
15
|
+
import { dirname, resolve as resolve2 } from "node:path";
|
|
16
|
+
|
|
17
|
+
// src/domains/components/diff.ts
|
|
18
|
+
var COMPONENT_FIELDS = [
|
|
19
|
+
"id",
|
|
20
|
+
"kind",
|
|
21
|
+
"path",
|
|
22
|
+
"ownerDomain",
|
|
23
|
+
"mutable",
|
|
24
|
+
"authority",
|
|
25
|
+
"reloadClass",
|
|
26
|
+
"contentHash",
|
|
27
|
+
"description"
|
|
28
|
+
];
|
|
29
|
+
function diffComponentSnapshots(from, to) {
|
|
30
|
+
const fromById = indexComponents(from.components, "from");
|
|
31
|
+
const toById = indexComponents(to.components, "to");
|
|
32
|
+
const added = [];
|
|
33
|
+
const removed = [];
|
|
34
|
+
const changed = [];
|
|
35
|
+
let unchanged = 0;
|
|
36
|
+
for (const before of from.components) {
|
|
37
|
+
const after = toById.get(before.id);
|
|
38
|
+
if (!after) {
|
|
39
|
+
removed.push(before);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const changedFields = changedComponentFields(before, after);
|
|
43
|
+
if (changedFields.length === 0) {
|
|
44
|
+
unchanged += 1;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
changed.push({ id: before.id, before, after, changedFields });
|
|
48
|
+
}
|
|
49
|
+
for (const after of to.components) {
|
|
50
|
+
if (!fromById.has(after.id)) added.push(after);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
version: 1,
|
|
54
|
+
from: {
|
|
55
|
+
root: from.root,
|
|
56
|
+
generatedAt: from.generatedAt,
|
|
57
|
+
componentCount: from.components.length
|
|
58
|
+
},
|
|
59
|
+
to: {
|
|
60
|
+
root: to.root,
|
|
61
|
+
generatedAt: to.generatedAt,
|
|
62
|
+
componentCount: to.components.length
|
|
63
|
+
},
|
|
64
|
+
summary: {
|
|
65
|
+
added: added.length,
|
|
66
|
+
removed: removed.length,
|
|
67
|
+
changed: changed.length,
|
|
68
|
+
unchanged
|
|
69
|
+
},
|
|
70
|
+
added: sortComponents(added),
|
|
71
|
+
removed: sortComponents(removed),
|
|
72
|
+
changed: changed.sort((a, b) => a.id.localeCompare(b.id))
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function indexComponents(components, label) {
|
|
76
|
+
const map = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const component of components) {
|
|
78
|
+
if (map.has(component.id)) {
|
|
79
|
+
throw new Error(`component diff ${label} snapshot has duplicate id: ${component.id}`);
|
|
80
|
+
}
|
|
81
|
+
map.set(component.id, component);
|
|
82
|
+
}
|
|
83
|
+
return map;
|
|
84
|
+
}
|
|
85
|
+
function changedComponentFields(before, after) {
|
|
86
|
+
const changed = [];
|
|
87
|
+
for (const field of COMPONENT_FIELDS) {
|
|
88
|
+
if (before[field] !== after[field]) changed.push(field);
|
|
89
|
+
}
|
|
90
|
+
return changed;
|
|
91
|
+
}
|
|
92
|
+
function sortComponents(components) {
|
|
93
|
+
return [...components].sort((a, b) => {
|
|
94
|
+
const idOrder = a.id.localeCompare(b.id);
|
|
95
|
+
if (idOrder !== 0) return idOrder;
|
|
96
|
+
return a.path.localeCompare(b.path);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// src/domains/components/scan.ts
|
|
101
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
102
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
103
|
+
import { parse as parseYaml } from "yaml";
|
|
104
|
+
|
|
105
|
+
// src/domains/components/hash.ts
|
|
106
|
+
import { createHash } from "node:crypto";
|
|
107
|
+
function sha256Hex(content) {
|
|
108
|
+
return createHash("sha256").update(content).digest("hex");
|
|
109
|
+
}
|
|
110
|
+
function stableJson(value) {
|
|
111
|
+
if (value === null) return "null";
|
|
112
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
113
|
+
if (typeof value === "number" || typeof value === "boolean") return JSON.stringify(value);
|
|
114
|
+
if (Array.isArray(value)) return `[${value.map((item) => stableJson(item)).join(",")}]`;
|
|
115
|
+
if (isRecord(value)) {
|
|
116
|
+
const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
|
|
117
|
+
return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`).join(",")}}`;
|
|
118
|
+
}
|
|
119
|
+
return JSON.stringify(null);
|
|
120
|
+
}
|
|
121
|
+
function isRecord(value) {
|
|
122
|
+
return typeof value === "object" && value !== null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/domains/components/scan.ts
|
|
126
|
+
var KIND_ORDER = [
|
|
127
|
+
"prompt-fragment",
|
|
128
|
+
"agent-recipe",
|
|
129
|
+
"tool-implementation",
|
|
130
|
+
"tool-helper",
|
|
131
|
+
"runtime-descriptor",
|
|
132
|
+
"safety-rule-pack",
|
|
133
|
+
"config-schema",
|
|
134
|
+
"session-schema",
|
|
135
|
+
"receipt-schema",
|
|
136
|
+
"context-file",
|
|
137
|
+
"doc-spec",
|
|
138
|
+
"middleware",
|
|
139
|
+
"memory",
|
|
140
|
+
"eval-suite"
|
|
141
|
+
];
|
|
142
|
+
var AUTHORITY_BY_KIND = {
|
|
143
|
+
"prompt-fragment": "advisory",
|
|
144
|
+
"context-file": "advisory",
|
|
145
|
+
"tool-implementation": "enforcing",
|
|
146
|
+
"tool-helper": "enforcing",
|
|
147
|
+
middleware: "enforcing",
|
|
148
|
+
"agent-recipe": "advisory",
|
|
149
|
+
"runtime-descriptor": "runtime-critical",
|
|
150
|
+
"safety-rule-pack": "enforcing",
|
|
151
|
+
"config-schema": "runtime-critical",
|
|
152
|
+
"session-schema": "runtime-critical",
|
|
153
|
+
"receipt-schema": "runtime-critical",
|
|
154
|
+
memory: "advisory",
|
|
155
|
+
"eval-suite": "descriptive",
|
|
156
|
+
"doc-spec": "descriptive"
|
|
157
|
+
};
|
|
158
|
+
var RELOAD_BY_KIND = {
|
|
159
|
+
"prompt-fragment": "hot",
|
|
160
|
+
"context-file": "hot",
|
|
161
|
+
"tool-implementation": "hot",
|
|
162
|
+
"tool-helper": "restart-required",
|
|
163
|
+
middleware: "restart-required",
|
|
164
|
+
"agent-recipe": "next-dispatch",
|
|
165
|
+
"runtime-descriptor": "restart-required",
|
|
166
|
+
"safety-rule-pack": "restart-required",
|
|
167
|
+
"config-schema": "restart-required",
|
|
168
|
+
"session-schema": "restart-required",
|
|
169
|
+
"receipt-schema": "restart-required",
|
|
170
|
+
memory: "hot",
|
|
171
|
+
"eval-suite": "static",
|
|
172
|
+
"doc-spec": "static"
|
|
173
|
+
};
|
|
174
|
+
var OWNER_BY_KIND = {
|
|
175
|
+
"prompt-fragment": "prompts",
|
|
176
|
+
"context-file": "repository",
|
|
177
|
+
"tool-implementation": "tools",
|
|
178
|
+
"tool-helper": "tools",
|
|
179
|
+
middleware: "middleware",
|
|
180
|
+
"agent-recipe": "agents",
|
|
181
|
+
"runtime-descriptor": "providers",
|
|
182
|
+
"safety-rule-pack": "safety",
|
|
183
|
+
"config-schema": "config",
|
|
184
|
+
"session-schema": "session",
|
|
185
|
+
"receipt-schema": "dispatch",
|
|
186
|
+
memory: "memory",
|
|
187
|
+
"eval-suite": "eval",
|
|
188
|
+
"doc-spec": "docs"
|
|
189
|
+
};
|
|
190
|
+
var TOOL_HELPER_FILES = /* @__PURE__ */ new Set(["src/tools/bootstrap.ts", "src/tools/registry.ts", "src/tools/truncate-utf8.ts"]);
|
|
191
|
+
var CONFIG_SCHEMA_FILES = [
|
|
192
|
+
"src/core/defaults.ts",
|
|
193
|
+
"src/core/config.ts",
|
|
194
|
+
"src/domains/config/schema.ts"
|
|
195
|
+
];
|
|
196
|
+
var SESSION_SCHEMA_FILES = [
|
|
197
|
+
"src/domains/session/entries.ts",
|
|
198
|
+
"src/domains/session/contract.ts",
|
|
199
|
+
"src/engine/session.ts"
|
|
200
|
+
];
|
|
201
|
+
var RECEIPT_SCHEMA_FILES = [
|
|
202
|
+
"src/domains/dispatch/types.ts",
|
|
203
|
+
"src/domains/dispatch/receipt-integrity.ts"
|
|
204
|
+
];
|
|
205
|
+
var CONTEXT_FILES = ["CLIO-CODER.md", "CONTRIBUTING.md", "SECURITY.md"];
|
|
206
|
+
async function scanComponents(root) {
|
|
207
|
+
const absoluteRoot = resolve(root);
|
|
208
|
+
const components = [];
|
|
209
|
+
components.push(...await collectRecursive(absoluteRoot, "src/domains/prompts/fragments", ".md", "prompt-fragment"));
|
|
210
|
+
components.push(...await collectRecursive(absoluteRoot, "src/domains/agents/builtins", ".md", "agent-recipe"));
|
|
211
|
+
components.push(...await collectTools(absoluteRoot));
|
|
212
|
+
components.push(
|
|
213
|
+
...await collectRecursive(absoluteRoot, "src/domains/providers/runtimes", ".ts", "runtime-descriptor")
|
|
214
|
+
);
|
|
215
|
+
components.push(...await collectSafetyRulePacks(absoluteRoot));
|
|
216
|
+
components.push(...await collectKnownFiles(absoluteRoot, CONFIG_SCHEMA_FILES, "config-schema"));
|
|
217
|
+
components.push(...await collectKnownFiles(absoluteRoot, SESSION_SCHEMA_FILES, "session-schema"));
|
|
218
|
+
components.push(...await collectKnownFiles(absoluteRoot, RECEIPT_SCHEMA_FILES, "receipt-schema"));
|
|
219
|
+
components.push(...await collectKnownFiles(absoluteRoot, CONTEXT_FILES, "context-file"));
|
|
220
|
+
components.push(...await collectRecursive(absoluteRoot, "docs/specs", ".md", "doc-spec"));
|
|
221
|
+
return sortComponents2(components);
|
|
222
|
+
}
|
|
223
|
+
async function createComponentSnapshot(options) {
|
|
224
|
+
const root = resolve(options.root);
|
|
225
|
+
const generatedAt = (options.generatedAt ?? /* @__PURE__ */ new Date()).toISOString();
|
|
226
|
+
return {
|
|
227
|
+
version: 1,
|
|
228
|
+
generatedAt,
|
|
229
|
+
root,
|
|
230
|
+
components: await scanComponents(root)
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
async function collectRecursive(root, dirPath, extension, kind) {
|
|
234
|
+
const files = await listFiles(join(root, dirPath));
|
|
235
|
+
const matching = files.map((filePath) => toRepoPath(root, filePath)).filter((repoPath) => repoPath.endsWith(extension)).sort((a, b) => a.localeCompare(b));
|
|
236
|
+
return collectKnownFiles(root, matching, kind);
|
|
237
|
+
}
|
|
238
|
+
async function collectTools(root) {
|
|
239
|
+
const files = await listFiles(join(root, "src/tools"));
|
|
240
|
+
const repoPaths = files.map((filePath) => toRepoPath(root, filePath)).filter((repoPath) => repoPath.startsWith("src/tools/") && repoPath.endsWith(".ts")).sort((a, b) => a.localeCompare(b));
|
|
241
|
+
const components = [];
|
|
242
|
+
for (const repoPath of repoPaths) {
|
|
243
|
+
const kind = TOOL_HELPER_FILES.has(repoPath) ? "tool-helper" : "tool-implementation";
|
|
244
|
+
const component = await componentFromFile(root, repoPath, kind);
|
|
245
|
+
if (component) components.push(component);
|
|
246
|
+
}
|
|
247
|
+
return components;
|
|
248
|
+
}
|
|
249
|
+
async function collectKnownFiles(root, paths, kind) {
|
|
250
|
+
const components = [];
|
|
251
|
+
for (const repoPath of [...paths].sort((a, b) => a.localeCompare(b))) {
|
|
252
|
+
const component = await componentFromFile(root, repoPath, kind);
|
|
253
|
+
if (component) components.push(component);
|
|
254
|
+
}
|
|
255
|
+
return components;
|
|
256
|
+
}
|
|
257
|
+
async function componentFromFile(root, repoPath, kind) {
|
|
258
|
+
const absolutePath = join(root, repoPath);
|
|
259
|
+
if (!await isFile(absolutePath)) return null;
|
|
260
|
+
const content = await readFile(absolutePath);
|
|
261
|
+
return baseComponent({
|
|
262
|
+
id: `${kind}:${repoPath}`,
|
|
263
|
+
kind,
|
|
264
|
+
path: repoPath,
|
|
265
|
+
contentHash: sha256Hex(content)
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
async function collectSafetyRulePacks(root) {
|
|
269
|
+
const repoPath = "damage-control-rules.yaml";
|
|
270
|
+
const absolutePath = join(root, repoPath);
|
|
271
|
+
if (!await isFile(absolutePath)) return [];
|
|
272
|
+
const content = await readFile(absolutePath, "utf8");
|
|
273
|
+
const packs = parseSafetyPacks(content);
|
|
274
|
+
return packs.map(
|
|
275
|
+
(pack) => baseComponent({
|
|
276
|
+
id: `safety-rule-pack:${pack.id}`,
|
|
277
|
+
kind: "safety-rule-pack",
|
|
278
|
+
path: repoPath,
|
|
279
|
+
contentHash: sha256Hex(stableJson(pack.value)),
|
|
280
|
+
description: `damage-control rule pack: ${pack.id}`
|
|
281
|
+
})
|
|
282
|
+
).sort((a, b) => a.id.localeCompare(b.id));
|
|
283
|
+
}
|
|
284
|
+
function parseSafetyPacks(content) {
|
|
285
|
+
let parsed;
|
|
286
|
+
try {
|
|
287
|
+
parsed = parseYaml(content);
|
|
288
|
+
} catch {
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
if (!isRecord2(parsed)) return [];
|
|
292
|
+
const version = parsed.version;
|
|
293
|
+
if (version === 1) {
|
|
294
|
+
return [{ id: "base", value: { version, rules: parsed.rules ?? [] } }];
|
|
295
|
+
}
|
|
296
|
+
if (version !== 2 || !Array.isArray(parsed.packs)) return [];
|
|
297
|
+
const packs = [];
|
|
298
|
+
for (const pack of parsed.packs) {
|
|
299
|
+
if (!isRecord2(pack) || typeof pack.id !== "string" || pack.id.length === 0) continue;
|
|
300
|
+
packs.push({ id: pack.id, value: pack });
|
|
301
|
+
}
|
|
302
|
+
return packs.sort((a, b) => a.id.localeCompare(b.id));
|
|
303
|
+
}
|
|
304
|
+
function baseComponent(input) {
|
|
305
|
+
const component = {
|
|
306
|
+
id: input.id,
|
|
307
|
+
kind: input.kind,
|
|
308
|
+
path: input.path,
|
|
309
|
+
ownerDomain: OWNER_BY_KIND[input.kind],
|
|
310
|
+
mutable: true,
|
|
311
|
+
authority: AUTHORITY_BY_KIND[input.kind],
|
|
312
|
+
reloadClass: RELOAD_BY_KIND[input.kind],
|
|
313
|
+
contentHash: input.contentHash
|
|
314
|
+
};
|
|
315
|
+
if (input.description !== void 0) component.description = input.description;
|
|
316
|
+
return component;
|
|
317
|
+
}
|
|
318
|
+
async function listFiles(dirPath) {
|
|
319
|
+
let entries;
|
|
320
|
+
try {
|
|
321
|
+
entries = await readdir(dirPath, { withFileTypes: true });
|
|
322
|
+
} catch {
|
|
323
|
+
return [];
|
|
324
|
+
}
|
|
325
|
+
const files = [];
|
|
326
|
+
for (const entry of [...entries].sort((a, b) => a.name.localeCompare(b.name))) {
|
|
327
|
+
const fullPath = join(dirPath, entry.name);
|
|
328
|
+
if (entry.isDirectory()) {
|
|
329
|
+
files.push(...await listFiles(fullPath));
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
if (entry.isFile()) files.push(fullPath);
|
|
333
|
+
}
|
|
334
|
+
return files;
|
|
335
|
+
}
|
|
336
|
+
async function isFile(path) {
|
|
337
|
+
try {
|
|
338
|
+
return (await stat(path)).isFile();
|
|
339
|
+
} catch {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function toRepoPath(root, filePath) {
|
|
344
|
+
const rel = relative(root, filePath);
|
|
345
|
+
const normalized = rel.split(sep).join("/");
|
|
346
|
+
return isAbsolute(normalized) ? normalized : normalized;
|
|
347
|
+
}
|
|
348
|
+
function sortComponents2(components) {
|
|
349
|
+
const kindRank = new Map(KIND_ORDER.map((kind, index) => [kind, index]));
|
|
350
|
+
return [...components].sort((a, b) => {
|
|
351
|
+
const rankA = kindRank.get(a.kind) ?? KIND_ORDER.length;
|
|
352
|
+
const rankB = kindRank.get(b.kind) ?? KIND_ORDER.length;
|
|
353
|
+
if (rankA !== rankB) return rankA - rankB;
|
|
354
|
+
const pathOrder = a.path.localeCompare(b.path);
|
|
355
|
+
if (pathOrder !== 0) return pathOrder;
|
|
356
|
+
return a.id.localeCompare(b.id);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
function isRecord2(value) {
|
|
360
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// src/domains/components/snapshot.ts
|
|
364
|
+
import { readFile as readFile2 } from "node:fs/promises";
|
|
365
|
+
|
|
366
|
+
// src/domains/components/types.ts
|
|
367
|
+
var COMPONENT_KINDS = [
|
|
368
|
+
"prompt-fragment",
|
|
369
|
+
"context-file",
|
|
370
|
+
"tool-implementation",
|
|
371
|
+
"tool-helper",
|
|
372
|
+
"middleware",
|
|
373
|
+
"agent-recipe",
|
|
374
|
+
"runtime-descriptor",
|
|
375
|
+
"safety-rule-pack",
|
|
376
|
+
"config-schema",
|
|
377
|
+
"session-schema",
|
|
378
|
+
"receipt-schema",
|
|
379
|
+
"memory",
|
|
380
|
+
"eval-suite",
|
|
381
|
+
"doc-spec"
|
|
382
|
+
];
|
|
383
|
+
var COMPONENT_AUTHORITIES = ["advisory", "descriptive", "enforcing", "runtime-critical"];
|
|
384
|
+
var COMPONENT_RELOAD_CLASSES = ["hot", "next-dispatch", "restart-required", "static"];
|
|
385
|
+
|
|
386
|
+
// src/domains/components/snapshot.ts
|
|
387
|
+
async function loadComponentSnapshot(path) {
|
|
388
|
+
let raw;
|
|
389
|
+
try {
|
|
390
|
+
raw = await readFile2(path, "utf8");
|
|
391
|
+
} catch (error) {
|
|
392
|
+
if (error.code === "ENOENT") throw new Error(`component snapshot not found: ${path}`);
|
|
393
|
+
throw error;
|
|
394
|
+
}
|
|
395
|
+
let parsed;
|
|
396
|
+
try {
|
|
397
|
+
parsed = JSON.parse(raw);
|
|
398
|
+
} catch (error) {
|
|
399
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
400
|
+
throw new Error(`${path}: invalid JSON: ${message}`);
|
|
401
|
+
}
|
|
402
|
+
return parseComponentSnapshot(parsed, path);
|
|
403
|
+
}
|
|
404
|
+
function parseComponentSnapshot(value, source = "snapshot") {
|
|
405
|
+
if (!isRecord3(value)) throw new Error(`${source}: expected object`);
|
|
406
|
+
if (value.version !== 1) throw new Error(`${source}: expected version 1`);
|
|
407
|
+
if (typeof value.generatedAt !== "string" || value.generatedAt.length === 0) {
|
|
408
|
+
throw new Error(`${source}: expected generatedAt string`);
|
|
409
|
+
}
|
|
410
|
+
if (typeof value.root !== "string" || value.root.length === 0) {
|
|
411
|
+
throw new Error(`${source}: expected root string`);
|
|
412
|
+
}
|
|
413
|
+
if (!Array.isArray(value.components)) throw new Error(`${source}: expected components array`);
|
|
414
|
+
return {
|
|
415
|
+
version: 1,
|
|
416
|
+
generatedAt: value.generatedAt,
|
|
417
|
+
root: value.root,
|
|
418
|
+
components: value.components.map(
|
|
419
|
+
(component, index) => parseHarnessComponent(component, `${source}:components[${index}]`)
|
|
420
|
+
)
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
function parseHarnessComponent(value, source) {
|
|
424
|
+
if (!isRecord3(value)) throw new Error(`${source}: expected object`);
|
|
425
|
+
const id = readString(value, source, "id");
|
|
426
|
+
const kind = readEnum(value, source, "kind", COMPONENT_KINDS);
|
|
427
|
+
const path = readString(value, source, "path");
|
|
428
|
+
const ownerDomain = readString(value, source, "ownerDomain");
|
|
429
|
+
const mutable = readBoolean(value, source, "mutable");
|
|
430
|
+
const authority = readEnum(value, source, "authority", COMPONENT_AUTHORITIES);
|
|
431
|
+
const reloadClass = readEnum(value, source, "reloadClass", COMPONENT_RELOAD_CLASSES);
|
|
432
|
+
const contentHash = readString(value, source, "contentHash");
|
|
433
|
+
if (!/^[a-f0-9]{64}$/.test(contentHash)) throw new Error(`${source}: expected contentHash sha256 hex`);
|
|
434
|
+
const component = {
|
|
435
|
+
id,
|
|
436
|
+
kind,
|
|
437
|
+
path,
|
|
438
|
+
ownerDomain,
|
|
439
|
+
mutable,
|
|
440
|
+
authority,
|
|
441
|
+
reloadClass,
|
|
442
|
+
contentHash
|
|
443
|
+
};
|
|
444
|
+
if (Object.hasOwn(value, "description")) {
|
|
445
|
+
if (typeof value.description !== "string") throw new Error(`${source}: expected description string`);
|
|
446
|
+
component.description = value.description;
|
|
447
|
+
}
|
|
448
|
+
return component;
|
|
449
|
+
}
|
|
450
|
+
function readString(record, source, field) {
|
|
451
|
+
const value = record[field];
|
|
452
|
+
if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected ${field} string`);
|
|
453
|
+
return value;
|
|
454
|
+
}
|
|
455
|
+
function readBoolean(record, source, field) {
|
|
456
|
+
const value = record[field];
|
|
457
|
+
if (typeof value !== "boolean") throw new Error(`${source}: expected ${field} boolean`);
|
|
458
|
+
return value;
|
|
459
|
+
}
|
|
460
|
+
function readEnum(record, source, field, values) {
|
|
461
|
+
const value = record[field];
|
|
462
|
+
if (typeof value !== "string" || !values.includes(value)) {
|
|
463
|
+
throw new Error(`${source}: expected ${field} to be one of ${values.join(", ")}`);
|
|
464
|
+
}
|
|
465
|
+
return value;
|
|
466
|
+
}
|
|
467
|
+
function isRecord3(value) {
|
|
468
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// src/cli/components.ts
|
|
472
|
+
var HELP = `clio-coder components [list] [--json]
|
|
473
|
+
clio-coder components snapshot --out <path>
|
|
474
|
+
clio-coder components diff --from <snapshot-a.json> --to <snapshot-b.json> [--json]
|
|
475
|
+
|
|
476
|
+
List read-only Clio Coder harness components, write a snapshot, or diff two snapshots. The bare \`clio-coder components\` form and \`clio-coder components list\` are equivalent.
|
|
477
|
+
`;
|
|
478
|
+
function parseComponentsArgs(args) {
|
|
479
|
+
const parsed = { command: "list", json: false, help: false };
|
|
480
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
481
|
+
const arg = args[i];
|
|
482
|
+
if (arg === void 0) continue;
|
|
483
|
+
if (arg === "--help" || arg === "-h") {
|
|
484
|
+
parsed.help = true;
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
if (arg === "--json") {
|
|
488
|
+
parsed.json = true;
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
if (arg === "list") {
|
|
492
|
+
parsed.command = "list";
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
if (arg === "snapshot") {
|
|
496
|
+
parsed.command = "snapshot";
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
if (arg === "diff") {
|
|
500
|
+
parsed.command = "diff";
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
if (arg === "--out") {
|
|
504
|
+
const value = args[i + 1];
|
|
505
|
+
if (!value || value.startsWith("-")) throw new Error("--out requires a path");
|
|
506
|
+
parsed.out = value;
|
|
507
|
+
i += 1;
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
if (arg === "--from") {
|
|
511
|
+
const value = args[i + 1];
|
|
512
|
+
if (!value || value.startsWith("-")) throw new Error("--from requires a path");
|
|
513
|
+
parsed.from = value;
|
|
514
|
+
i += 1;
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
if (arg === "--to") {
|
|
518
|
+
const value = args[i + 1];
|
|
519
|
+
if (!value || value.startsWith("-")) throw new Error("--to requires a path");
|
|
520
|
+
parsed.to = value;
|
|
521
|
+
i += 1;
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
if (arg.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
525
|
+
throw new Error(`unknown components argument: ${arg}`);
|
|
526
|
+
}
|
|
527
|
+
if (parsed.command !== "snapshot" && parsed.out !== void 0) throw new Error("--out is only valid with snapshot");
|
|
528
|
+
if (parsed.command !== "diff" && parsed.from !== void 0) throw new Error("--from is only valid with diff");
|
|
529
|
+
if (parsed.command !== "diff" && parsed.to !== void 0) throw new Error("--to is only valid with diff");
|
|
530
|
+
if (parsed.command === "snapshot" && parsed.json) throw new Error("--json is only valid with list");
|
|
531
|
+
if (parsed.command === "snapshot" && parsed.out === void 0) throw new Error("snapshot requires --out <path>");
|
|
532
|
+
if (parsed.command === "diff" && (parsed.from === void 0 || parsed.to === void 0)) {
|
|
533
|
+
throw new Error("diff requires --from <path> and --to <path>");
|
|
534
|
+
}
|
|
535
|
+
return parsed;
|
|
536
|
+
}
|
|
537
|
+
async function runComponentsCommand(args) {
|
|
538
|
+
let parsed;
|
|
539
|
+
try {
|
|
540
|
+
parsed = parseComponentsArgs(args);
|
|
541
|
+
} catch (error) {
|
|
542
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
543
|
+
process.stderr.write(HELP);
|
|
544
|
+
return 2;
|
|
545
|
+
}
|
|
546
|
+
if (parsed.help) {
|
|
547
|
+
process.stdout.write(HELP);
|
|
548
|
+
return 0;
|
|
549
|
+
}
|
|
550
|
+
if (parsed.command === "diff") return runDiff(parsed);
|
|
551
|
+
const snapshot = await createComponentSnapshot({ root: resolvePackageRoot() });
|
|
552
|
+
if (parsed.command === "snapshot") {
|
|
553
|
+
const out = parsed.out;
|
|
554
|
+
if (out === void 0) {
|
|
555
|
+
printError("snapshot requires --out <path>");
|
|
556
|
+
return 2;
|
|
557
|
+
}
|
|
558
|
+
const outPath = resolve2(out);
|
|
559
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
560
|
+
await writeFile(outPath, `${formatSnapshotJson(snapshot)}
|
|
561
|
+
`, "utf8");
|
|
562
|
+
printOk(`wrote ${outPath}`);
|
|
563
|
+
return 0;
|
|
564
|
+
}
|
|
565
|
+
if (parsed.json) {
|
|
566
|
+
process.stdout.write(`${formatSnapshotJson(snapshot)}
|
|
567
|
+
`);
|
|
568
|
+
return 0;
|
|
569
|
+
}
|
|
570
|
+
renderComponents(snapshot.components);
|
|
571
|
+
return 0;
|
|
572
|
+
}
|
|
573
|
+
async function runDiff(parsed) {
|
|
574
|
+
const fromPath = parsed.from;
|
|
575
|
+
const toPath = parsed.to;
|
|
576
|
+
if (fromPath === void 0 || toPath === void 0) {
|
|
577
|
+
printError("diff requires --from <path> and --to <path>");
|
|
578
|
+
return 2;
|
|
579
|
+
}
|
|
580
|
+
let diff;
|
|
581
|
+
try {
|
|
582
|
+
const from = await loadComponentSnapshot(resolve2(fromPath));
|
|
583
|
+
const to = await loadComponentSnapshot(resolve2(toPath));
|
|
584
|
+
diff = diffComponentSnapshots(from, to);
|
|
585
|
+
} catch (error) {
|
|
586
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
587
|
+
return 1;
|
|
588
|
+
}
|
|
589
|
+
if (parsed.json) {
|
|
590
|
+
process.stdout.write(`${JSON.stringify(diff, null, 2)}
|
|
591
|
+
`);
|
|
592
|
+
} else {
|
|
593
|
+
renderComponentDiff(diff);
|
|
594
|
+
}
|
|
595
|
+
return 0;
|
|
596
|
+
}
|
|
597
|
+
function formatSnapshotJson(snapshot) {
|
|
598
|
+
return JSON.stringify(snapshot, null, 2);
|
|
599
|
+
}
|
|
600
|
+
function renderComponents(components) {
|
|
601
|
+
process.stdout.write(`${components.length} components
|
|
602
|
+
|
|
603
|
+
`);
|
|
604
|
+
for (const component of components) {
|
|
605
|
+
const description = component.description ? ` ${component.description}` : "";
|
|
606
|
+
const line = [
|
|
607
|
+
component.kind.padEnd(21),
|
|
608
|
+
component.authority.padEnd(17),
|
|
609
|
+
component.reloadClass.padEnd(18),
|
|
610
|
+
component.path
|
|
611
|
+
].join("");
|
|
612
|
+
process.stdout.write(`${line}${description}
|
|
613
|
+
`);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
function renderComponentDiff(diff) {
|
|
617
|
+
const { summary } = diff;
|
|
618
|
+
process.stdout.write(
|
|
619
|
+
[
|
|
620
|
+
`${summary.added} added`,
|
|
621
|
+
`${summary.removed} removed`,
|
|
622
|
+
`${summary.changed} changed`,
|
|
623
|
+
`${summary.unchanged} unchanged`
|
|
624
|
+
].join(", ")
|
|
625
|
+
);
|
|
626
|
+
process.stdout.write("\n\n");
|
|
627
|
+
if (summary.added + summary.removed + summary.changed === 0) {
|
|
628
|
+
process.stdout.write("no component changes\n");
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
for (const component of diff.added) process.stdout.write(`${formatDiffLine("+", component)}
|
|
632
|
+
`);
|
|
633
|
+
for (const component of diff.removed) process.stdout.write(`${formatDiffLine("-", component)}
|
|
634
|
+
`);
|
|
635
|
+
for (const change of diff.changed) {
|
|
636
|
+
process.stdout.write(`${formatDiffLine("~", change.after)} [${change.changedFields.join(",")}]
|
|
637
|
+
`);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
function formatDiffLine(marker, component) {
|
|
641
|
+
return [
|
|
642
|
+
marker,
|
|
643
|
+
" ",
|
|
644
|
+
component.kind.padEnd(21),
|
|
645
|
+
component.authority.padEnd(17),
|
|
646
|
+
component.reloadClass.padEnd(18),
|
|
647
|
+
component.path
|
|
648
|
+
].join("");
|
|
649
|
+
}
|
|
650
|
+
export {
|
|
651
|
+
runComponentsCommand
|
|
652
|
+
};
|
|
653
|
+
//# sourceMappingURL=components-JVHMUBEB.js.map
|