@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,508 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defaultScopedResourceRoots,
|
|
3
|
+
expandSkillInvocationInput,
|
|
4
|
+
loadSkills,
|
|
5
|
+
parsePendingSkillRequests,
|
|
6
|
+
readRootEntries,
|
|
7
|
+
sourceInfoForRoot,
|
|
8
|
+
splitYamlFrontmatter,
|
|
9
|
+
stringField
|
|
10
|
+
} from "./chunk-26BZQOAD.js";
|
|
11
|
+
import {
|
|
12
|
+
expandConfigPath
|
|
13
|
+
} from "./chunk-5LDRNKX2.js";
|
|
14
|
+
|
|
15
|
+
// src/domains/resources/skills/evals.ts
|
|
16
|
+
var SCENARIO_HEADING = /^##\s+([A-Z])(\d+)\s*[-:–—]\s*(.+?)\s*$/;
|
|
17
|
+
function parseSkillEvals(markdown) {
|
|
18
|
+
const lines = markdown.split("\n");
|
|
19
|
+
const scenarios = [];
|
|
20
|
+
const diagnostics = [];
|
|
21
|
+
let index = 0;
|
|
22
|
+
while (index < lines.length) {
|
|
23
|
+
const heading = SCENARIO_HEADING.exec(lines[index] ?? "");
|
|
24
|
+
if (heading === null) {
|
|
25
|
+
index += 1;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const blockStart = index + 1;
|
|
29
|
+
let blockEnd = blockStart;
|
|
30
|
+
while (blockEnd < lines.length && !/^##\s+/.test(lines[blockEnd] ?? "")) blockEnd += 1;
|
|
31
|
+
const block = lines.slice(blockStart, blockEnd);
|
|
32
|
+
const number = Number.parseInt(heading[2] ?? "", 10);
|
|
33
|
+
const id = `${heading[1] ?? "S"}${number}`;
|
|
34
|
+
const title = heading[3] ?? "";
|
|
35
|
+
const setup = extractSetup(block);
|
|
36
|
+
const fixtureCommands = extractFixtureCommands(block);
|
|
37
|
+
const expected = extractExpected(block);
|
|
38
|
+
if (setup === null) diagnostics.push(`${id} (${title}): no "Setup:" or "Prompt:" paragraph found; scenario skipped`);
|
|
39
|
+
else if (expected.length === 0) diagnostics.push(`${id} (${title}): no "Expected:" bullets found; scenario skipped`);
|
|
40
|
+
else scenarios.push({ id, number, title, setup, ...fixtureCommands ? { fixtureCommands } : {}, expected });
|
|
41
|
+
index = blockEnd;
|
|
42
|
+
}
|
|
43
|
+
return { scenarios, diagnostics };
|
|
44
|
+
}
|
|
45
|
+
function extractSetup(block) {
|
|
46
|
+
return extractLabeledParagraph(block, /^Setup:\s*(.*)$/i) ?? extractLabeledParagraph(block, /^(Prompt:.*)$/i);
|
|
47
|
+
}
|
|
48
|
+
function isScenarioLabel(line) {
|
|
49
|
+
const trimmed = line.trim();
|
|
50
|
+
return /^(Expected|Fixture|Setup commands):/i.test(trimmed) || /^Expected$/i.test(trimmed);
|
|
51
|
+
}
|
|
52
|
+
function extractLabeledParagraph(block, label) {
|
|
53
|
+
for (let i = 0; i < block.length; i += 1) {
|
|
54
|
+
const line = block[i] ?? "";
|
|
55
|
+
const match = label.exec(line.trim());
|
|
56
|
+
if (match === null) continue;
|
|
57
|
+
const parts = [];
|
|
58
|
+
if ((match[1] ?? "").length > 0) parts.push(match[1] ?? "");
|
|
59
|
+
for (let j = i + 1; j < block.length; j += 1) {
|
|
60
|
+
const next = (block[j] ?? "").trim();
|
|
61
|
+
if (next.length === 0) break;
|
|
62
|
+
if (isScenarioLabel(next)) break;
|
|
63
|
+
parts.push(next);
|
|
64
|
+
}
|
|
65
|
+
const setup = parts.join(" ").trim();
|
|
66
|
+
return setup.length > 0 ? setup : null;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
function extractFixtureCommands(block) {
|
|
71
|
+
for (let i = 0; i < block.length; i += 1) {
|
|
72
|
+
const line = (block[i] ?? "").trim();
|
|
73
|
+
const match = /^(?:Fixture|Setup commands):\s*(.*)$/i.exec(line);
|
|
74
|
+
if (match === null) continue;
|
|
75
|
+
const inline = (match[1] ?? "").trim();
|
|
76
|
+
let cursor = i + 1;
|
|
77
|
+
while (cursor < block.length && (block[cursor] ?? "").trim().length === 0) cursor += 1;
|
|
78
|
+
const first = block[cursor] ?? "";
|
|
79
|
+
const fence = /^```\w*\s*$/.test(first.trim());
|
|
80
|
+
if (fence) {
|
|
81
|
+
const commands2 = [];
|
|
82
|
+
for (let j = cursor + 1; j < block.length; j += 1) {
|
|
83
|
+
const current = block[j] ?? "";
|
|
84
|
+
if (/^```\s*$/.test(current.trim())) {
|
|
85
|
+
const script2 = commands2.join("\n").trim();
|
|
86
|
+
return script2.length > 0 ? script2 : null;
|
|
87
|
+
}
|
|
88
|
+
commands2.push(current);
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const commands = [];
|
|
93
|
+
if (inline.length > 0) commands.push(inline);
|
|
94
|
+
for (let j = cursor; j < block.length; j += 1) {
|
|
95
|
+
const current = block[j] ?? "";
|
|
96
|
+
const trimmed = current.trim();
|
|
97
|
+
if (trimmed.length === 0) break;
|
|
98
|
+
if (isScenarioLabel(trimmed)) break;
|
|
99
|
+
commands.push(current);
|
|
100
|
+
}
|
|
101
|
+
const script = commands.join("\n").trim();
|
|
102
|
+
return script.length > 0 ? script : null;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
function extractExpected(block) {
|
|
107
|
+
let start = -1;
|
|
108
|
+
for (let i = 0; i < block.length; i += 1) {
|
|
109
|
+
if (/^Expected:?\s*$/i.test((block[i] ?? "").trim())) {
|
|
110
|
+
start = i + 1;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (start < 0) return [];
|
|
115
|
+
const bullets = [];
|
|
116
|
+
let current = null;
|
|
117
|
+
for (let i = start; i < block.length; i += 1) {
|
|
118
|
+
const raw = block[i] ?? "";
|
|
119
|
+
const trimmed = raw.trim();
|
|
120
|
+
if (trimmed.length === 0) {
|
|
121
|
+
if (current !== null) {
|
|
122
|
+
bullets.push(current.join(" "));
|
|
123
|
+
current = null;
|
|
124
|
+
}
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const bullet = /^[-*]\s+(.*)$/.exec(raw);
|
|
128
|
+
if (bullet !== null) {
|
|
129
|
+
if (current !== null) bullets.push(current.join(" "));
|
|
130
|
+
current = [bullet[1] ?? ""];
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (current !== null && /^\s+\S/.test(raw)) {
|
|
134
|
+
current.push(trimmed);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
if (current !== null) bullets.push(current.join(" "));
|
|
140
|
+
return bullets.map((bullet) => bullet.trim()).filter((bullet) => bullet.length > 0);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/domains/resources/prompts/loader.ts
|
|
144
|
+
import { readFileSync } from "node:fs";
|
|
145
|
+
import path from "node:path";
|
|
146
|
+
|
|
147
|
+
// src/domains/resources/collision.ts
|
|
148
|
+
var SCOPE_RANK = {
|
|
149
|
+
package: 0,
|
|
150
|
+
user: 1,
|
|
151
|
+
project: 2,
|
|
152
|
+
cli: 3
|
|
153
|
+
};
|
|
154
|
+
function compareCandidates(a, b) {
|
|
155
|
+
const rankDelta = SCOPE_RANK[a.source.scope] - SCOPE_RANK[b.source.scope];
|
|
156
|
+
if (rankDelta !== 0) return rankDelta;
|
|
157
|
+
return a.source.path.localeCompare(b.source.path);
|
|
158
|
+
}
|
|
159
|
+
function resolveResourceCollisions(candidates) {
|
|
160
|
+
const byName = /* @__PURE__ */ new Map();
|
|
161
|
+
for (const candidate of candidates) {
|
|
162
|
+
const key = candidate.name.trim();
|
|
163
|
+
if (key.length === 0) continue;
|
|
164
|
+
const list = byName.get(key) ?? [];
|
|
165
|
+
list.push(candidate);
|
|
166
|
+
byName.set(key, list);
|
|
167
|
+
}
|
|
168
|
+
const winners = [];
|
|
169
|
+
const diagnostics = [];
|
|
170
|
+
for (const [name, entries] of byName.entries()) {
|
|
171
|
+
const sorted = [...entries].sort(compareCandidates);
|
|
172
|
+
const winner = sorted[sorted.length - 1];
|
|
173
|
+
if (!winner) continue;
|
|
174
|
+
winners.push(winner.value);
|
|
175
|
+
for (const loser of sorted.slice(0, -1)) {
|
|
176
|
+
diagnostics.push({
|
|
177
|
+
type: "collision",
|
|
178
|
+
message: `${name} from ${winner.source.scope} overrides ${loser.source.scope}`,
|
|
179
|
+
path: loser.source.path,
|
|
180
|
+
collision: {
|
|
181
|
+
name,
|
|
182
|
+
winnerPath: winner.source.path,
|
|
183
|
+
loserPath: loser.source.path,
|
|
184
|
+
winnerScope: winner.source.scope,
|
|
185
|
+
loserScope: loser.source.scope
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return { winners, diagnostics };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/domains/resources/prompts/substitute.ts
|
|
194
|
+
function parseCommandArgs(input) {
|
|
195
|
+
const args = [];
|
|
196
|
+
let current = "";
|
|
197
|
+
let hasToken = false;
|
|
198
|
+
let quote = null;
|
|
199
|
+
const push = () => {
|
|
200
|
+
if (!hasToken) return;
|
|
201
|
+
args.push(current);
|
|
202
|
+
current = "";
|
|
203
|
+
hasToken = false;
|
|
204
|
+
};
|
|
205
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
206
|
+
const ch = input[i];
|
|
207
|
+
if (!ch) continue;
|
|
208
|
+
if (quote) {
|
|
209
|
+
if (ch === quote) {
|
|
210
|
+
quote = null;
|
|
211
|
+
} else {
|
|
212
|
+
current += ch;
|
|
213
|
+
}
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (ch === "'" || ch === `"`) {
|
|
217
|
+
quote = ch;
|
|
218
|
+
hasToken = true;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (/\s/.test(ch)) {
|
|
222
|
+
push();
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
current += ch;
|
|
226
|
+
hasToken = true;
|
|
227
|
+
}
|
|
228
|
+
push();
|
|
229
|
+
return args;
|
|
230
|
+
}
|
|
231
|
+
function sliceArgs(args, startText, lengthText) {
|
|
232
|
+
const start = Number.parseInt(startText, 10);
|
|
233
|
+
if (!Number.isFinite(start) || start <= 0) return "";
|
|
234
|
+
const zeroBased = start - 1;
|
|
235
|
+
if (lengthText === void 0) return args.slice(zeroBased).join(" ");
|
|
236
|
+
const length = Number.parseInt(lengthText, 10);
|
|
237
|
+
if (!Number.isFinite(length) || length <= 0) return "";
|
|
238
|
+
return args.slice(zeroBased, zeroBased + length).join(" ");
|
|
239
|
+
}
|
|
240
|
+
function substituteArgs(content, args) {
|
|
241
|
+
const allArgs = args.join(" ");
|
|
242
|
+
return content.replace(
|
|
243
|
+
/\$\{@:(\d+)(?::(\d+))?\}/g,
|
|
244
|
+
(_match, start, length) => sliceArgs(args, start, length)
|
|
245
|
+
).replace(/\$ARGUMENTS/g, allArgs).replace(/\$@/g, allArgs).replace(/\$(\d+)/g, (_match, indexText) => {
|
|
246
|
+
const index = Number.parseInt(indexText, 10);
|
|
247
|
+
if (!Number.isFinite(index) || index <= 0) return "";
|
|
248
|
+
return args[index - 1] ?? "";
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// src/domains/resources/prompts/loader.ts
|
|
253
|
+
function defaultPromptTemplateRoots(cwd) {
|
|
254
|
+
return defaultScopedResourceRoots("prompts", cwd);
|
|
255
|
+
}
|
|
256
|
+
function splitOptionalFrontmatter(raw, filePath, diagnostics) {
|
|
257
|
+
const split = splitYamlFrontmatter(raw);
|
|
258
|
+
if (split.ok) return split;
|
|
259
|
+
if (split.reason === "missing") return { frontmatter: {}, body: raw };
|
|
260
|
+
const message = split.reason === "missing closing delimiter" ? "prompt template frontmatter is missing a closing delimiter; treating the file as plain markdown" : split.reason === "must be a YAML object" ? "prompt template frontmatter must be a YAML object" : `prompt template frontmatter is ${split.reason}`;
|
|
261
|
+
diagnostics.push({ type: "warning", message, path: filePath });
|
|
262
|
+
return { frontmatter: {}, body: split.body };
|
|
263
|
+
}
|
|
264
|
+
function fallbackDescription(body) {
|
|
265
|
+
const line = body.split(/\r?\n/).map((entry) => entry.trim()).find((entry) => entry.length > 0);
|
|
266
|
+
if (!line) return "Prompt template";
|
|
267
|
+
const normalized = line.replace(/^#{1,6}\s+/, "");
|
|
268
|
+
return normalized.length > 60 ? `${normalized.slice(0, 57)}...` : normalized;
|
|
269
|
+
}
|
|
270
|
+
function loadPromptFile(filePath, root, diagnostics) {
|
|
271
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
272
|
+
if (ext !== ".md") return null;
|
|
273
|
+
let raw;
|
|
274
|
+
try {
|
|
275
|
+
raw = readFileSync(filePath, "utf8");
|
|
276
|
+
} catch (err) {
|
|
277
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
278
|
+
diagnostics.push({ type: "warning", message: `prompt template could not be read: ${reason}`, path: filePath });
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const name = path.basename(filePath, ext);
|
|
282
|
+
if (name.trim().length === 0) return null;
|
|
283
|
+
const { frontmatter, body } = splitOptionalFrontmatter(raw, filePath, diagnostics);
|
|
284
|
+
const description = stringField(frontmatter, "description") ?? fallbackDescription(body);
|
|
285
|
+
const argumentHint = stringField(frontmatter, "argument-hint") ?? stringField(frontmatter, "argumentHint");
|
|
286
|
+
const sourceInfo = sourceInfoForRoot(root, filePath);
|
|
287
|
+
const template = {
|
|
288
|
+
name,
|
|
289
|
+
description,
|
|
290
|
+
content: body.trim(),
|
|
291
|
+
filePath,
|
|
292
|
+
sourceInfo
|
|
293
|
+
};
|
|
294
|
+
if (argumentHint) template.argumentHint = argumentHint;
|
|
295
|
+
return { name, value: template, source: sourceInfo };
|
|
296
|
+
}
|
|
297
|
+
function loadPromptRoot(root, diagnostics) {
|
|
298
|
+
const candidates = [];
|
|
299
|
+
for (const entry of readRootEntries(root, "prompt template", diagnostics)) {
|
|
300
|
+
if (!entry.isFile()) continue;
|
|
301
|
+
const candidate = loadPromptFile(path.join(root.path, entry.name), root, diagnostics);
|
|
302
|
+
if (candidate) candidates.push(candidate);
|
|
303
|
+
}
|
|
304
|
+
return candidates;
|
|
305
|
+
}
|
|
306
|
+
function loadPromptTemplates(input = {}) {
|
|
307
|
+
const cwd = input.cwd ?? process.cwd();
|
|
308
|
+
const roots = input.roots ?? defaultPromptTemplateRoots(cwd);
|
|
309
|
+
const diagnostics = [];
|
|
310
|
+
const candidates = roots.flatMap((root) => loadPromptRoot(root, diagnostics));
|
|
311
|
+
const resolved = resolveResourceCollisions(candidates);
|
|
312
|
+
return {
|
|
313
|
+
items: [...resolved.winners].sort((a, b) => a.name.localeCompare(b.name)),
|
|
314
|
+
diagnostics: [...diagnostics, ...resolved.diagnostics]
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function parsePromptCommand(input) {
|
|
318
|
+
const trimmed = input.trim();
|
|
319
|
+
if (!trimmed.startsWith("/")) return null;
|
|
320
|
+
const withoutSlash = trimmed.slice(1);
|
|
321
|
+
const separator = withoutSlash.search(/\s/);
|
|
322
|
+
const name = separator === -1 ? withoutSlash : withoutSlash.slice(0, separator);
|
|
323
|
+
if (name.length === 0 || name.includes("/")) return null;
|
|
324
|
+
const rest = separator === -1 ? "" : withoutSlash.slice(separator).trim();
|
|
325
|
+
return { name, rest };
|
|
326
|
+
}
|
|
327
|
+
function expandPromptTemplateInput(input, templates) {
|
|
328
|
+
const command = parsePromptCommand(input);
|
|
329
|
+
if (!command) return { expanded: false, text: input, args: [], diagnostics: templates.diagnostics };
|
|
330
|
+
const template = templates.items.find((entry) => entry.name === command.name);
|
|
331
|
+
if (!template) return { expanded: false, text: input, args: [], diagnostics: templates.diagnostics };
|
|
332
|
+
const args = parseCommandArgs(command.rest);
|
|
333
|
+
return {
|
|
334
|
+
expanded: true,
|
|
335
|
+
text: substituteArgs(template.content, args),
|
|
336
|
+
args,
|
|
337
|
+
template,
|
|
338
|
+
diagnostics: templates.diagnostics
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// src/domains/resources/loader.ts
|
|
343
|
+
function createResourcesLoader(options = {}) {
|
|
344
|
+
const defaultCwd = options.cwd ?? process.cwd();
|
|
345
|
+
const skillOptions2 = () => options.skills?.() ?? {};
|
|
346
|
+
return {
|
|
347
|
+
skills(cwd = defaultCwd) {
|
|
348
|
+
return loadSkills({ cwd, ...skillOptions2() });
|
|
349
|
+
},
|
|
350
|
+
expandSkillInvocation(text, cwd = defaultCwd, expansionOptions = {}) {
|
|
351
|
+
return expandSkillInvocationInput(text, loadSkills({ cwd, ...skillOptions2() }), expansionOptions);
|
|
352
|
+
},
|
|
353
|
+
parsePendingSkillRequests(text, cwd = defaultCwd, expansionOptions = {}) {
|
|
354
|
+
return parsePendingSkillRequests(text, loadSkills({ cwd, ...skillOptions2() }), { cwd, ...expansionOptions });
|
|
355
|
+
},
|
|
356
|
+
prompts(cwd = defaultCwd) {
|
|
357
|
+
return loadPromptTemplates({ cwd });
|
|
358
|
+
},
|
|
359
|
+
expandPromptTemplate(text, cwd = defaultCwd) {
|
|
360
|
+
return expandPromptTemplateInput(text, loadPromptTemplates({ cwd }));
|
|
361
|
+
},
|
|
362
|
+
themes() {
|
|
363
|
+
return { items: [], diagnostics: [] };
|
|
364
|
+
},
|
|
365
|
+
resolvePath(value, cwd = defaultCwd) {
|
|
366
|
+
return expandConfigPath(value, { cwd });
|
|
367
|
+
},
|
|
368
|
+
async reload() {
|
|
369
|
+
return void 0;
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// src/domains/resources/extension.ts
|
|
375
|
+
function createResourcesBundle(context, options = {}) {
|
|
376
|
+
const config = () => context.getContract("config");
|
|
377
|
+
const loader = createResourcesLoader({
|
|
378
|
+
...options.cwd !== void 0 ? { cwd: options.cwd } : {},
|
|
379
|
+
skills: () => ({
|
|
380
|
+
...skillOptions(config()?.get().skills.trustProjectCompatRoots === true, options)
|
|
381
|
+
})
|
|
382
|
+
});
|
|
383
|
+
const extension = {
|
|
384
|
+
start() {
|
|
385
|
+
return void 0;
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
const contract = {
|
|
389
|
+
skills(cwd) {
|
|
390
|
+
return loader.skills(cwd);
|
|
391
|
+
},
|
|
392
|
+
expandSkillInvocation(text, cwd, options2) {
|
|
393
|
+
return loader.expandSkillInvocation(text, cwd, options2);
|
|
394
|
+
},
|
|
395
|
+
parsePendingSkillRequests(text, cwd, options2) {
|
|
396
|
+
return loader.parsePendingSkillRequests(text, cwd, options2);
|
|
397
|
+
},
|
|
398
|
+
prompts(cwd) {
|
|
399
|
+
return loader.prompts(cwd);
|
|
400
|
+
},
|
|
401
|
+
expandPromptTemplate(text, cwd) {
|
|
402
|
+
return loader.expandPromptTemplate(text, cwd);
|
|
403
|
+
},
|
|
404
|
+
themes() {
|
|
405
|
+
return loader.themes();
|
|
406
|
+
},
|
|
407
|
+
resolvePath(value, cwd) {
|
|
408
|
+
return loader.resolvePath(value, cwd);
|
|
409
|
+
},
|
|
410
|
+
reload() {
|
|
411
|
+
return loader.reload();
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
return { extension, contract };
|
|
415
|
+
}
|
|
416
|
+
function skillOptions(trustProjectCompatRoots, options) {
|
|
417
|
+
const runtime = options.skills?.() ?? {};
|
|
418
|
+
return {
|
|
419
|
+
trustProjectCompatRoots: runtime.trustProjectCompatRoots ?? trustProjectCompatRoots,
|
|
420
|
+
...runtime.disableDiscovery !== void 0 ? { disableDiscovery: runtime.disableDiscovery } : {},
|
|
421
|
+
...runtime.explicitSkillPaths !== void 0 ? { explicitSkillPaths: runtime.explicitSkillPaths } : {}
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// src/domains/resources/manifest.ts
|
|
426
|
+
var ResourcesManifest = {
|
|
427
|
+
name: "resources",
|
|
428
|
+
dependsOn: ["config"]
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
// src/domains/resources/skills/provenance-pin.ts
|
|
432
|
+
import { existsSync, readFileSync as readFileSync2 } from "node:fs";
|
|
433
|
+
import path2 from "node:path";
|
|
434
|
+
import yaml from "yaml";
|
|
435
|
+
var SKILL_PIN_MANIFEST_FILENAME = "registry.yaml";
|
|
436
|
+
function isPlainObject(value) {
|
|
437
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
438
|
+
}
|
|
439
|
+
function resolveSkillPinManifestPath(cwd) {
|
|
440
|
+
const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
|
|
441
|
+
const catalogDir = fromEnv && fromEnv.trim().length > 0 ? path2.resolve(fromEnv.trim()) : path2.join(cwd, "skills");
|
|
442
|
+
const manifestPath = path2.join(catalogDir, SKILL_PIN_MANIFEST_FILENAME);
|
|
443
|
+
return existsSync(manifestPath) ? manifestPath : null;
|
|
444
|
+
}
|
|
445
|
+
function loadSkillPinManifest(manifestPath) {
|
|
446
|
+
let parsed;
|
|
447
|
+
try {
|
|
448
|
+
parsed = yaml.parse(readFileSync2(manifestPath, "utf8"));
|
|
449
|
+
} catch {
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
452
|
+
if (!isPlainObject(parsed) || !Array.isArray(parsed.skills)) return null;
|
|
453
|
+
const entries = /* @__PURE__ */ new Map();
|
|
454
|
+
for (const raw of parsed.skills) {
|
|
455
|
+
if (!isPlainObject(raw)) continue;
|
|
456
|
+
const name = typeof raw.name === "string" ? raw.name.trim() : "";
|
|
457
|
+
const sha256 = typeof raw.sha256 === "string" ? raw.sha256.trim().toLowerCase() : "";
|
|
458
|
+
if (name.length === 0 || !/^[0-9a-f]{64}$/.test(sha256)) continue;
|
|
459
|
+
entries.set(name, {
|
|
460
|
+
name,
|
|
461
|
+
version: typeof raw.version === "string" && raw.version.trim().length > 0 ? raw.version.trim() : null,
|
|
462
|
+
sha256
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
return entries;
|
|
466
|
+
}
|
|
467
|
+
function checkSkillDrift(skill, cwd) {
|
|
468
|
+
const actual = skill.normalizedHash.toLowerCase();
|
|
469
|
+
const manifestPath = resolveSkillPinManifestPath(cwd);
|
|
470
|
+
const manifest = manifestPath === null ? null : loadSkillPinManifest(manifestPath);
|
|
471
|
+
const pinned = manifest?.get(skill.name);
|
|
472
|
+
if (pinned !== void 0) {
|
|
473
|
+
return {
|
|
474
|
+
verdict: pinned.sha256 === actual ? "match" : "mismatch",
|
|
475
|
+
authority: "pinned-manifest",
|
|
476
|
+
expected: pinned.sha256
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
const recorded = skill.provenance?.installedHash?.trim().toLowerCase();
|
|
480
|
+
if (recorded !== void 0 && /^[0-9a-f]{64}$/.test(recorded)) {
|
|
481
|
+
return {
|
|
482
|
+
verdict: recorded === actual ? "match" : "mismatch",
|
|
483
|
+
authority: "install-record",
|
|
484
|
+
expected: recorded
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// src/domains/resources/index.ts
|
|
491
|
+
var ResourcesDomainModule = {
|
|
492
|
+
manifest: ResourcesManifest,
|
|
493
|
+
createExtension: createResourcesBundle
|
|
494
|
+
};
|
|
495
|
+
function createResourcesDomainModule(options = {}) {
|
|
496
|
+
return {
|
|
497
|
+
manifest: ResourcesManifest,
|
|
498
|
+
createExtension: (context) => createResourcesBundle(context, options)
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
export {
|
|
503
|
+
parseSkillEvals,
|
|
504
|
+
checkSkillDrift,
|
|
505
|
+
ResourcesDomainModule,
|
|
506
|
+
createResourcesDomainModule
|
|
507
|
+
};
|
|
508
|
+
//# sourceMappingURL=chunk-2J63S4SF.js.map
|