agents-inc 0.175.0 → 0.176.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 +67 -0
- package/dist/{chunk-EGC7PNDI.js → chunk-3F5LT433.js} +138 -41
- package/dist/chunk-3F5LT433.js.map +1 -0
- package/dist/chunk-5CFHP6Z5.js +109 -0
- package/dist/chunk-5CFHP6Z5.js.map +1 -0
- package/dist/{chunk-MFCZARV2.js → chunk-B7AVWSK2.js} +18 -8
- package/dist/chunk-B7AVWSK2.js.map +1 -0
- package/dist/{chunk-6HJVH27C.js → chunk-C2BSCEDN.js} +2 -2
- package/dist/{chunk-SNXEYAFP.js → chunk-CKBWEWHZ.js} +60 -30
- package/dist/chunk-CKBWEWHZ.js.map +1 -0
- package/dist/{chunk-SI2LLEIR.js → chunk-EC3JXT23.js} +4 -4
- package/dist/{chunk-YM3VEDAP.js → chunk-ENET4IF6.js} +440 -192
- package/dist/chunk-ENET4IF6.js.map +1 -0
- package/dist/{chunk-ICHWAFAC.js → chunk-FACDJH6O.js} +11 -104
- package/dist/chunk-FACDJH6O.js.map +1 -0
- package/dist/{chunk-P5XEK7HC.js → chunk-H6WUOW5F.js} +2 -2
- package/dist/{chunk-DQB3E2SX.js → chunk-JNRACLNS.js} +3 -3
- package/dist/{chunk-37QFHJUW.js → chunk-JTMSFBCA.js} +106 -28
- package/dist/chunk-JTMSFBCA.js.map +1 -0
- package/dist/{chunk-GNMRXXRY.js → chunk-MQZNDK5F.js} +3 -3
- package/dist/chunk-MQZNDK5F.js.map +1 -0
- package/dist/{chunk-SRII2GMF.js → chunk-SN64WNWE.js} +2 -2
- package/dist/{chunk-EHEBN4NB.js → chunk-U672FZVC.js} +2 -2
- package/dist/{chunk-TG3SPPZY.js → chunk-UE4Z3YMB.js} +1 -1
- package/dist/chunk-UE4Z3YMB.js.map +1 -0
- package/dist/{chunk-Q4NWATGH.js → chunk-XMQIWPIR.js} +58 -10
- package/dist/chunk-XMQIWPIR.js.map +1 -0
- package/dist/{chunk-YLFKFVQP.js → chunk-ZBI6GFJD.js} +2 -2
- package/dist/commands/build/marketplace.js +4 -3
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +6 -5
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +15 -11
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +38 -14
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +46 -25
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +12 -8
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +15 -14
- package/dist/commands/list.js +8 -6
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +4 -3
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +13 -8
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +14 -16
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +18 -14
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +97 -17
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/skill-agent-summary.js +3 -2
- package/dist/components/common/summary-panel.js +4 -3
- package/dist/hooks/init.js +15 -14
- package/dist/hooks/init.js.map +1 -1
- package/dist/load-agent-defs-5BSECHE6.js +14 -0
- package/dist/{recompile-project-agents-2QTFMYDC.js → recompile-project-agents-U3UGHPWG.js} +7 -7
- package/dist/{source-loader-I6SWWDUF.js → source-loader-E2Y5MMN5.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-37QFHJUW.js.map +0 -1
- package/dist/chunk-EGC7PNDI.js.map +0 -1
- package/dist/chunk-GNMRXXRY.js.map +0 -1
- package/dist/chunk-ICHWAFAC.js.map +0 -1
- package/dist/chunk-MFCZARV2.js.map +0 -1
- package/dist/chunk-Q4NWATGH.js.map +0 -1
- package/dist/chunk-SNXEYAFP.js.map +0 -1
- package/dist/chunk-TG3SPPZY.js.map +0 -1
- package/dist/chunk-YM3VEDAP.js.map +0 -1
- package/dist/load-agent-defs-BJ4KBKBA.js +0 -14
- /package/dist/{chunk-6HJVH27C.js.map → chunk-C2BSCEDN.js.map} +0 -0
- /package/dist/{chunk-SI2LLEIR.js.map → chunk-EC3JXT23.js.map} +0 -0
- /package/dist/{chunk-P5XEK7HC.js.map → chunk-H6WUOW5F.js.map} +0 -0
- /package/dist/{chunk-DQB3E2SX.js.map → chunk-JNRACLNS.js.map} +0 -0
- /package/dist/{chunk-SRII2GMF.js.map → chunk-SN64WNWE.js.map} +0 -0
- /package/dist/{chunk-EHEBN4NB.js.map → chunk-U672FZVC.js.map} +0 -0
- /package/dist/{chunk-YLFKFVQP.js.map → chunk-ZBI6GFJD.js.map} +0 -0
- /package/dist/{load-agent-defs-BJ4KBKBA.js.map → load-agent-defs-5BSECHE6.js.map} +0 -0
- /package/dist/{recompile-project-agents-2QTFMYDC.js.map → recompile-project-agents-U3UGHPWG.js.map} +0 -0
- /package/dist/{source-loader-I6SWWDUF.js.map → source-loader-E2Y5MMN5.js.map} +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
computeScopeDiff
|
|
4
|
+
} from "./chunk-FACDJH6O.js";
|
|
5
|
+
import {
|
|
6
|
+
getSkillEntryDisplayName
|
|
7
|
+
} from "./chunk-UE4Z3YMB.js";
|
|
8
|
+
import {
|
|
9
|
+
CLI_COLORS,
|
|
10
|
+
EJECT_SOURCE,
|
|
11
|
+
UI_SYMBOLS
|
|
12
|
+
} from "./chunk-U46LYYRA.js";
|
|
13
|
+
|
|
14
|
+
// src/cli/components/common/skill-agent-summary.tsx
|
|
15
|
+
import { Box, Text } from "ink";
|
|
16
|
+
import "react";
|
|
17
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
var TableHeader = ({ children }) => /* @__PURE__ */ jsx(Text, { bold: true, color: CLI_COLORS.WARNING, children });
|
|
19
|
+
var ScopeLabel = ({ children }) => /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WHITE, backgroundColor: CLI_COLORS.LABEL_BG, children: ` ${children} ` });
|
|
20
|
+
var EjectIcon = () => /* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.WARNING, children: [
|
|
21
|
+
" ",
|
|
22
|
+
UI_SYMBOLS.EJECT
|
|
23
|
+
] });
|
|
24
|
+
var DIFF_PREFIX = {
|
|
25
|
+
added: `${UI_SYMBOLS.ADDED} `,
|
|
26
|
+
"mode-changed": `${UI_SYMBOLS.CHANGED} `,
|
|
27
|
+
overwritten: `${UI_SYMBOLS.OVERWRITTEN} `,
|
|
28
|
+
changed: `${UI_SYMBOLS.CHANGED} `,
|
|
29
|
+
removed: `${UI_SYMBOLS.REMOVED} `,
|
|
30
|
+
unchanged: `${UI_SYMBOLS.BULLET} `
|
|
31
|
+
};
|
|
32
|
+
var DIFF_COLOR = {
|
|
33
|
+
added: CLI_COLORS.SUCCESS,
|
|
34
|
+
"mode-changed": CLI_COLORS.WARNING,
|
|
35
|
+
overwritten: CLI_COLORS.WARNING,
|
|
36
|
+
changed: CLI_COLORS.WARNING,
|
|
37
|
+
removed: CLI_COLORS.ERROR,
|
|
38
|
+
unchanged: CLI_COLORS.NEUTRAL
|
|
39
|
+
};
|
|
40
|
+
var NAME_GUTTER_COLUMNS = 3;
|
|
41
|
+
var SkillRow = ({ row }) => /* @__PURE__ */ jsxs(Box, { width: "50%", paddingRight: NAME_GUTTER_COLUMNS, children: [
|
|
42
|
+
/* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { color: DIFF_COLOR[row.status], children: DIFF_PREFIX[row.status] }) }),
|
|
43
|
+
/* @__PURE__ */ jsxs(Text, { color: DIFF_COLOR[row.status], children: [
|
|
44
|
+
getSkillEntryDisplayName(row),
|
|
45
|
+
row.source === EJECT_SOURCE && /* @__PURE__ */ jsx(EjectIcon, {})
|
|
46
|
+
] })
|
|
47
|
+
] });
|
|
48
|
+
var AgentRow = ({ row }) => /* @__PURE__ */ jsxs(Text, { color: DIFF_COLOR[row.status], children: [
|
|
49
|
+
DIFF_PREFIX[row.status],
|
|
50
|
+
row.name
|
|
51
|
+
] });
|
|
52
|
+
var skillRowKey = (row) => row.status === "removed" ? `removed-${row.id}` : row.id;
|
|
53
|
+
var agentRowKey = (row) => row.status === "removed" ? `removed-${row.name}` : row.name;
|
|
54
|
+
var SkillAgentSummary = ({
|
|
55
|
+
skillConfigs,
|
|
56
|
+
agentConfigs,
|
|
57
|
+
...baseline
|
|
58
|
+
}) => {
|
|
59
|
+
const diff = computeScopeDiff({
|
|
60
|
+
currentSkills: skillConfigs,
|
|
61
|
+
currentAgents: agentConfigs,
|
|
62
|
+
...baseline
|
|
63
|
+
});
|
|
64
|
+
if (!diff.hasContent) return null;
|
|
65
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", width: "100%", children: [
|
|
66
|
+
/* @__PURE__ */ jsxs(
|
|
67
|
+
Box,
|
|
68
|
+
{
|
|
69
|
+
flexDirection: "column",
|
|
70
|
+
borderStyle: "single",
|
|
71
|
+
flexGrow: 2,
|
|
72
|
+
flexBasis: 0,
|
|
73
|
+
borderRight: true,
|
|
74
|
+
borderTop: false,
|
|
75
|
+
borderBottom: false,
|
|
76
|
+
borderLeft: false,
|
|
77
|
+
borderColor: CLI_COLORS.NEUTRAL,
|
|
78
|
+
borderRightDimColor: true,
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsx(TableHeader, { children: "Skills" }),
|
|
81
|
+
diff.projectSkillRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
82
|
+
/* @__PURE__ */ jsx(ScopeLabel, { children: "Project" }),
|
|
83
|
+
/* @__PURE__ */ jsx(Box, { flexWrap: "wrap", children: diff.projectSkillRows.map((row) => /* @__PURE__ */ jsx(SkillRow, { row }, skillRowKey(row))) })
|
|
84
|
+
] }),
|
|
85
|
+
diff.globalSkillRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
86
|
+
/* @__PURE__ */ jsx(ScopeLabel, { children: "Global" }),
|
|
87
|
+
/* @__PURE__ */ jsx(Box, { flexWrap: "wrap", children: diff.globalSkillRows.map((row) => /* @__PURE__ */ jsx(SkillRow, { row }, skillRowKey(row))) })
|
|
88
|
+
] })
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginLeft: 1, paddingLeft: 1, children: [
|
|
93
|
+
/* @__PURE__ */ jsx(TableHeader, { children: "Agents" }),
|
|
94
|
+
diff.projectAgentRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
95
|
+
/* @__PURE__ */ jsx(ScopeLabel, { children: "Project" }),
|
|
96
|
+
/* @__PURE__ */ jsx(Box, { flexDirection: "column", children: diff.projectAgentRows.map((row) => /* @__PURE__ */ jsx(AgentRow, { row }, agentRowKey(row))) })
|
|
97
|
+
] }),
|
|
98
|
+
diff.globalAgentRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
99
|
+
/* @__PURE__ */ jsx(ScopeLabel, { children: "Global" }),
|
|
100
|
+
/* @__PURE__ */ jsx(Box, { flexDirection: "column", children: diff.globalAgentRows.map((row) => /* @__PURE__ */ jsx(AgentRow, { row }, agentRowKey(row))) })
|
|
101
|
+
] })
|
|
102
|
+
] })
|
|
103
|
+
] });
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export {
|
|
107
|
+
SkillAgentSummary
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=chunk-5CFHP6Z5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/common/skill-agent-summary.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS, EJECT_SOURCE, UI_SYMBOLS } from \"../../consts.js\";\nimport { computeScopeDiff } from \"../../lib/configuration/scope-diff.js\";\nimport type {\n AgentDiffRow,\n DiffRowStatus,\n ScopeDiffInput,\n SkillDiffRow,\n} from \"../../lib/configuration/scope-diff.js\";\nimport { getSkillEntryDisplayName } from \"../../lib/matrix/matrix-provider.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\n\nexport type SkillAgentSummaryProps = Pick<\n ScopeDiffInput,\n | \"installedSkillConfigs\"\n | \"installedAgentConfigs\"\n | \"isInitMode\"\n | \"overwrittenSkillIds\"\n | \"changedAgentNames\"\n> & {\n skillConfigs: SkillConfig[];\n agentConfigs: AgentScopeConfig[];\n};\n\nconst TableHeader: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Text bold color={CLI_COLORS.WARNING}>\n {children}\n </Text>\n);\n\nconst ScopeLabel: React.FC<{ children: string }> = ({ children }) => (\n <Text color={CLI_COLORS.WHITE} backgroundColor={CLI_COLORS.LABEL_BG}>\n {` ${children} `}\n </Text>\n);\n\nconst EjectIcon: React.FC = () => <Text color={CLI_COLORS.WARNING}> {UI_SYMBOLS.EJECT}</Text>;\n\nconst DIFF_PREFIX: Record<DiffRowStatus, string> = {\n added: `${UI_SYMBOLS.ADDED} `,\n \"mode-changed\": `${UI_SYMBOLS.CHANGED} `,\n overwritten: `${UI_SYMBOLS.OVERWRITTEN} `,\n changed: `${UI_SYMBOLS.CHANGED} `,\n removed: `${UI_SYMBOLS.REMOVED} `,\n unchanged: `${UI_SYMBOLS.BULLET} `,\n};\n\nconst DIFF_COLOR: Record<DiffRowStatus, string> = {\n added: CLI_COLORS.SUCCESS,\n \"mode-changed\": CLI_COLORS.WARNING,\n overwritten: CLI_COLORS.WARNING,\n changed: CLI_COLORS.WARNING,\n removed: CLI_COLORS.ERROR,\n unchanged: CLI_COLORS.NEUTRAL,\n};\n\n/**\n * Yoga widens a text to whole columns on both sides and Ink draws it from its rounded left, so a\n * name in a half that starts or ends mid-column draws up to two columns past the half: over the\n * next name, or over the table's border. The third column stays blank.\n */\nconst NAME_GUTTER_COLUMNS = 3;\n\n/**\n * A long name wraps under itself, beside a prefix that never shrinks, and carries its mark in its\n * own text: drawn beside the name, the mark covered its last letters.\n */\nconst SkillRow: React.FC<{ row: SkillDiffRow }> = ({ row }) => (\n <Box width=\"50%\" paddingRight={NAME_GUTTER_COLUMNS}>\n <Box flexShrink={0}>\n <Text color={DIFF_COLOR[row.status]}>{DIFF_PREFIX[row.status]}</Text>\n </Box>\n <Text color={DIFF_COLOR[row.status]}>\n {getSkillEntryDisplayName(row)}\n {row.source === EJECT_SOURCE && <EjectIcon />}\n </Text>\n </Box>\n);\n\nconst AgentRow: React.FC<{ row: AgentDiffRow }> = ({ row }) => (\n <Text color={DIFF_COLOR[row.status]}>\n {DIFF_PREFIX[row.status]}\n {row.name}\n </Text>\n);\n\nconst skillRowKey = (row: SkillDiffRow): string =>\n row.status === \"removed\" ? `removed-${row.id}` : row.id;\n\nconst agentRowKey = (row: AgentDiffRow): string =>\n row.status === \"removed\" ? `removed-${row.name}` : row.name;\n\nexport const SkillAgentSummary: React.FC<SkillAgentSummaryProps> = ({\n skillConfigs,\n agentConfigs,\n ...baseline\n}) => {\n const diff = computeScopeDiff({\n currentSkills: skillConfigs,\n currentAgents: agentConfigs,\n ...baseline,\n });\n\n if (!diff.hasContent) return null;\n\n return (\n <Box flexDirection=\"row\" width=\"100%\">\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n flexGrow={2}\n flexBasis={0}\n borderRight={true}\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderRightDimColor\n >\n <TableHeader>Skills</TableHeader>\n {diff.projectSkillRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Project</ScopeLabel>\n <Box flexWrap=\"wrap\">\n {diff.projectSkillRows.map((row) => (\n <SkillRow key={skillRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n {diff.globalSkillRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Global</ScopeLabel>\n <Box flexWrap=\"wrap\">\n {diff.globalSkillRows.map((row) => (\n <SkillRow key={skillRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginLeft={1} paddingLeft={1}>\n <TableHeader>Agents</TableHeader>\n {diff.projectAgentRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Project</ScopeLabel>\n <Box flexDirection=\"column\">\n {diff.projectAgentRows.map((row) => (\n <AgentRow key={agentRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n {diff.globalAgentRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Global</ScopeLabel>\n <Box flexDirection=\"column\">\n {diff.globalAgentRows.map((row) => (\n <AgentRow key={agentRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
|
|
@@ -4,13 +4,16 @@ import {
|
|
|
4
4
|
arrivedAsText,
|
|
5
5
|
jsonBodyOrUndefined,
|
|
6
6
|
retryAfterSeconds
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SN64WNWE.js";
|
|
8
8
|
import {
|
|
9
9
|
withoutExcludedAssignments
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-MQZNDK5F.js";
|
|
11
11
|
import {
|
|
12
12
|
readCarriedSkills
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-JTMSFBCA.js";
|
|
14
|
+
import {
|
|
15
|
+
namedByActiveEntries
|
|
16
|
+
} from "./chunk-FACDJH6O.js";
|
|
14
17
|
import {
|
|
15
18
|
ERROR_MESSAGES,
|
|
16
19
|
directoryExists,
|
|
@@ -21,13 +24,13 @@ import {
|
|
|
21
24
|
loadProjectConfigFromDir,
|
|
22
25
|
readForkedFromMetadata,
|
|
23
26
|
resolveInstallPaths
|
|
24
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-ENET4IF6.js";
|
|
25
28
|
import {
|
|
26
29
|
plural,
|
|
27
30
|
truncateText,
|
|
28
31
|
typedEntries,
|
|
29
32
|
typedValues
|
|
30
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-UE4Z3YMB.js";
|
|
31
34
|
import {
|
|
32
35
|
CLI_INVOKE_COMMAND,
|
|
33
36
|
DEFAULT_PUBLIC_SOURCE_NAME,
|
|
@@ -174,8 +177,15 @@ async function seedPayloadForInstallation(projectDir) {
|
|
|
174
177
|
const skills = Object.keys(payload.skills).length;
|
|
175
178
|
const agents = Object.keys(payload.agents).length;
|
|
176
179
|
if (skills === 0 && agents === 0) return { ok: false, error: ERROR_MESSAGES.NO_INSTALLATION };
|
|
177
|
-
|
|
178
|
-
|
|
180
|
+
return {
|
|
181
|
+
ok: true,
|
|
182
|
+
payload,
|
|
183
|
+
skills,
|
|
184
|
+
agents,
|
|
185
|
+
leftBehind: skillsItsMarketplaceLeavesBehind(roundTrip.config, payload),
|
|
186
|
+
namedBy: namedByActiveEntries(roundTrip.config.skills),
|
|
187
|
+
inProject: installed.inProject
|
|
188
|
+
};
|
|
179
189
|
}
|
|
180
190
|
async function editorPayloadForInstallation(projectDir) {
|
|
181
191
|
const prepared = await seedPayloadForInstallation(projectDir);
|
|
@@ -371,4 +381,4 @@ export {
|
|
|
371
381
|
skillsAuthoredHere,
|
|
372
382
|
publishSeedConfig
|
|
373
383
|
};
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
384
|
+
//# sourceMappingURL=chunk-B7AVWSK2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/seed/installation-payload.ts","../src/cli/lib/seed/config-to-seed.ts","../src/cli/lib/seed/publish-seed.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\n\nimport {\n configToSeedPayload,\n isInstalled,\n skillsItsMarketplaceLeavesBehind,\n} from \"./config-to-seed.js\";\nimport { readCarriedSkills } from \"./external-skills.js\";\nimport { EJECT_SOURCE } from \"../../consts.js\";\nimport { withoutExcludedAssignments } from \"../agents/agent-recompiler.js\";\nimport { loadConfigInPlay, loadProjectConfigFromDir } from \"../configuration/project-config.js\";\nimport { activeAgentScopeMap, activeSkillScopeMap } from \"../configuration/scope-predicates.js\";\nimport { namedByActiveEntries, type NamedBy } from \"../configuration/scope-diff.js\";\nimport { getProjectConfigPath, resolveInstallPaths } from \"../installation/install-base-dir.js\";\nimport { readForkedFromMetadata } from \"../skills/skill-metadata.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { directoryExists } from \"../../utils/fs.js\";\nimport { ERROR_MESSAGES } from \"../../utils/messages.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\n\nimport type { ContentReading, OwnedSkillDir } from \"./external-skills.js\";\nimport type { LoadedProjectConfig } from \"../configuration/project-config.js\";\nimport type { AgentScopeConfig, ProjectConfig, SkillConfig, SkillId } from \"../../types/index.js\";\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\n/**\n * Counts come off the payload, not the config, so what is announced matches what is posted.\n * `leftBehind`: carried skills the payload's one marketplace does not serve. `namedBy`: the entries\n * the payload was drawn from, since a plugin's payload entry records no name. `inProject`: read\n * from a project's config rather than HOME's.\n */\nexport type InstallationPayload =\n | {\n ok: true;\n payload: SeedPayload;\n skills: number;\n agents: number;\n leftBehind: SkillId[];\n namedBy: NamedBy;\n inProject: boolean;\n }\n | { ok: false; error: string };\n\n/** `inheritedFrom` is absent when the config read is the global one already. */\ntype InstalledConfig =\n | {\n ok: true;\n config: ProjectConfig;\n inheritedFrom: ProjectConfig | undefined;\n inProject: boolean;\n }\n | { ok: false; error: string };\n\ntype MappedPayload = { ok: true; payload: SeedPayload } | { ok: false; error: string };\n\ntype RoundTrip = { config: ProjectConfig; content: ContentReading };\n\ntype SkillJudgement = { skill: SkillConfig; owned: boolean; carried: OwnedSkillDir | null };\n\n/** `share`'s, and what `edit --ui` marks; fails as a message, never a throw. */\nexport async function seedPayloadForInstallation(projectDir: string): Promise<InstallationPayload> {\n const installed = await readInstalledConfig(projectDir);\n if (!installed.ok) return installed;\n\n const roundTrip = await readRoundTrip(installed.config, projectDir);\n const mapped = mapOrRefuse(roundTrip, installed.inheritedFrom);\n if (!mapped.ok) return mapped;\n\n const { payload } = mapped;\n const skills = Object.keys(payload.skills).length;\n const agents = Object.keys(payload.agents).length;\n\n // A sub-agent is installable without skills, so only neither-skills-nor-agents is empty.\n if (skills === 0 && agents === 0) return { ok: false, error: ERROR_MESSAGES.NO_INSTALLATION };\n\n return {\n ok: true,\n payload,\n skills,\n agents,\n leftBehind: skillsItsMarketplaceLeavesBehind(roundTrip.config, payload),\n namedBy: namedByActiveEntries(roundTrip.config.skills),\n inProject: installed.inProject,\n };\n}\n\n/**\n * Made in a project, the link says so: the editor holds its global entries, which a run there\n * cannot change. A share's recipient has a global install of their own, so `share` never marks.\n */\nexport async function editorPayloadForInstallation(\n projectDir: string,\n): Promise<InstallationPayload> {\n const prepared = await seedPayloadForInstallation(projectDir);\n if (!prepared.ok || !prepared.inProject) return prepared;\n\n return { ...prepared, payload: { ...prepared.payload, fromProject: true } };\n}\n\n/** An unloadable config, HOME's included, is reported as its own error, not \"not installed\". */\nasync function readInstalledConfig(projectDir: string): Promise<InstalledConfig> {\n try {\n const loaded = await loadConfigInPlay(projectDir);\n if (!loaded) return { ok: false, error: ERROR_MESSAGES.NO_INSTALLATION };\n const inheritedFrom = await readInheritedConfig(loaded);\n return {\n ok: true,\n config: withInheritedCuration(loaded.config, inheritedFrom),\n inheritedFrom,\n inProject: !isGlobalConfig(loaded),\n };\n } catch (error) {\n return { ok: false, error: getErrorMessage(error) };\n }\n}\n\nasync function readInheritedConfig(\n loaded: LoadedProjectConfig,\n): Promise<ProjectConfig | undefined> {\n if (isGlobalConfig(loaded)) return undefined;\n\n // Aborts: a throw reaches readInstalledConfig and refuses the share.\n const home = await loadProjectConfigFromDir(os.homedir(), loaded.provider);\n return home?.config;\n}\n\nfunction isGlobalConfig(loaded: LoadedProjectConfig): boolean {\n return loaded.configPath === getProjectConfigPath(os.homedir(), loaded.provider);\n}\n\n/**\n * A project file keeps stack rows for its own sub-agents only, so inherited sub-agents take their\n * rows from the global config (which wins, since it compiles them).\n */\nfunction withInheritedCuration(\n config: ProjectConfig,\n inheritedFrom: ProjectConfig | undefined,\n): ProjectConfig {\n if (inheritedFrom?.stack === undefined) return config;\n\n return { ...config, stack: { ...config.stack, ...inheritedRows(config, inheritedFrom.stack) } };\n}\n\n/** Narrowed to inherited sub-agents and skills, so no global row lands on a project-scoped entry. */\nfunction inheritedRows(\n config: ProjectConfig,\n globalStack: NonNullable<ProjectConfig[\"stack\"]>,\n): NonNullable<ProjectConfig[\"stack\"]> {\n const agents = inheritedAgents(config.agents);\n const rows = Object.fromEntries(typedEntries(globalStack).filter(([agent]) => agents.has(agent)));\n return withoutExcludedAssignments(rows, skillsNotInherited(config.skills));\n}\n\nfunction inheritedAgents(agents: AgentScopeConfig[]): Set<string> {\n const scopes = activeAgentScopeMap(agents);\n return new Set(agents.map((agent) => agent.name).filter((name) => scopes.get(name) === \"global\"));\n}\n\nfunction skillsNotInherited(skills: SkillConfig[]): Set<SkillId> {\n const scopes = activeSkillScopeMap(skills);\n return new Set(skills.map((skill) => skill.id).filter((id) => scopes.get(id) !== \"global\"));\n}\n\n/**\n * Drops skills the CLI did not write (no `forkedFrom`): a user-authored skill is outside the round\n * trip, neither carried nor refused.\n */\nasync function readRoundTrip(config: ProjectConfig, projectDir: string): Promise<RoundTrip> {\n const owned = (await judgeSkills(config, projectDir)).filter((entry) => entry.owned);\n\n return {\n config: { ...config, skills: owned.map((entry) => entry.skill) },\n content: await readCarriedSkills(owned.flatMap((entry) => entry.carried ?? [])),\n };\n}\n\nfunction judgeSkills(config: ProjectConfig, projectDir: string): Promise<SkillJudgement[]> {\n return Promise.all(config.skills.map((skill) => judgeSkill(skill, projectDir)));\n}\n\n/** User-authored skills, which `edit --from` must not read a payload's silence as deleting. */\nexport async function skillsAuthoredHere(\n config: ProjectConfig,\n projectDir: string,\n): Promise<Set<SkillId>> {\n const judged = await judgeSkills(config, projectDir);\n return new Set(judged.filter((entry) => !entry.owned).map((entry) => entry.skill.id));\n}\n\nfunction travelsAsAnId(skill: SkillConfig): SkillJudgement {\n return { skill, owned: true, carried: null };\n}\n\n/** Only an existing directory with no provenance is the user's own work. */\nasync function judgeSkill(skill: SkillConfig, projectDir: string): Promise<SkillJudgement> {\n if (skill.origin !== EJECT_SOURCE) return travelsAsAnId(skill);\n if (!isInstalled(skill)) return travelsAsAnId(skill);\n\n const skillsDir = resolveInstallPaths(projectDir, skill.scope).skillsDir;\n const skillDir = path.join(skillsDir, skill.id);\n if (!(await directoryExists(skillDir))) return travelsAsAnId(skill);\n\n const provenance = await readForkedFromMetadata(skillDir);\n if (provenance === null) return { skill, owned: false, carried: null };\n\n return { skill, owned: true, carried: { id: skill.id, skillDir, provenance } };\n}\n\nfunction mapOrRefuse(\n { config, content }: RoundTrip,\n inheritedFrom: ProjectConfig | undefined,\n): MappedPayload {\n try {\n return { ok: true, payload: configToSeedPayload(config, content, inheritedFrom) };\n } catch (error) {\n return { ok: false, error: getErrorMessage(error) };\n }\n}\n","import { MATRIX_VERSION } from \"@workspace/matrix\";\nimport { SEED_VERSION, seedModelSchema } from \"@workspace/matrix/seed\";\n\nimport { DEFAULT_PUBLIC_SOURCE_NAME, EJECT_SOURCE } from \"../../consts.js\";\nimport { isScopePairCompatible } from \"../configuration/config-generator.js\";\nimport { typedEntries, typedValues } from \"../../utils/typed-object.js\";\n\nimport type { ContentReading } from \"./external-skills.js\";\nimport type {\n AgentScopeConfig,\n ProjectConfig,\n SkillConfig,\n SkillScope,\n} from \"../../types/config.js\";\nimport type { ModelName } from \"../../types/matrix.js\";\nimport type { SkillId } from \"../../types/skills.js\";\nimport type {\n SeedAgent,\n SeedLoadState,\n SeedModel,\n SeedPayload,\n SeedSkill,\n} from \"@workspace/matrix/seed\";\n\ntype SeedAssignments = Record<string, SeedLoadState>;\n\ntype StackReading = {\n assignments: Map<SkillId, SeedAssignments>;\n unwritable: string[];\n};\n\n/** A tombstone describes something not installed, so it has nothing to say on the wire. */\nexport function isInstalled(entry: { excluded?: boolean }): boolean {\n return !entry.excluded;\n}\n\n/** An ejected copy travels with the project, and the default catalogue is what no ref means. */\nfunction needsMarketplaceNamed(origin: string): boolean {\n return origin !== EJECT_SOURCE && origin !== DEFAULT_PUBLIC_SOURCE_NAME;\n}\n\n/** The contract's own enum, so widening `MODEL_NAMES` alone cannot silently drop a pin. */\nfunction isSeedModel(model: ModelName): model is SeedModel {\n return seedModelSchema.safeParse(model).success;\n}\n\nfunction seedLoadState(preloaded: boolean | undefined): SeedLoadState {\n return preloaded === true ? \"preloaded\" : \"lazy\";\n}\n\nfunction unnameableOriginMessage(skill: SkillConfig): string {\n return `${skill.id} comes from the marketplace '${skill.origin}', and this installation does not record where that marketplace is fetched from`;\n}\n\nfunction unnameableModelMessage(agent: AgentScopeConfig[\"name\"], model: ModelName): string {\n return `${agent} pins model '${model}', which this contract has no word for — leaving it out would say \"keep the sub-agent's own metadata\", which is a different instruction`;\n}\n\nfunction unwritablePairMessage(skillId: SkillId, agent: string): string {\n return `${skillId} -> ${agent}: a project-scoped skill never reaches a sub-agent that rests at global scope`;\n}\n\nfunction unshareableConfigError(unshareable: string[]): string {\n return [\n \"This installation cannot be shared as it stands — a shared configuration has no way to carry:\",\n ...unshareable.map((line) => ` ${line}`),\n \"Sharing it anyway would mint an id that installs something else.\",\n ].join(\"\\n\");\n}\n\ntype MarketplaceReading = {\n ref: string | undefined;\n unnameable: string[];\n};\n\ntype MarketplaceRecord = Pick<ProjectConfig, \"marketplace\" | \"marketplaceName\">;\n\n/** `origin` is a marketplace name, `marketplace` its ref, and `marketplaceName` joins them. */\nfunction isRecordedMarketplace(record: MarketplaceRecord | undefined, skill: SkillConfig): boolean {\n return record?.marketplace !== undefined && skill.origin === record.marketplaceName;\n}\n\n/** A payload names one marketplace; only a skill whose marketplace neither config records is refused. */\nfunction readMarketplace(\n config: ProjectConfig,\n skills: SkillConfig[],\n inheritedFrom: MarketplaceRecord | undefined,\n): MarketplaceReading {\n const served = skills.filter((skill) => needsMarketplaceNamed(skill.origin));\n const unaccounted = served.filter(\n (skill) =>\n !isRecordedMarketplace(config, skill) && !isRecordedMarketplace(inheritedFrom, skill),\n );\n if (unaccounted.length > 0) {\n return { ref: undefined, unnameable: unaccounted.map(unnameableOriginMessage) };\n }\n\n const servesItsOwn = served.some((skill) => isRecordedMarketplace(config, skill));\n return { ref: servesItsOwn ? config.marketplace : undefined, unnameable: [] };\n}\n\n/** Plugins from a marketplace other than the payload's one, which an install will skip. */\nexport function skillsItsMarketplaceLeavesBehind(\n config: ProjectConfig,\n payload: SeedPayload,\n): SkillId[] {\n const namedMarketplace =\n payload.marketplace === undefined ? DEFAULT_PUBLIC_SOURCE_NAME : config.marketplaceName;\n const isPluginFromElsewhere = (skill: SkillConfig): boolean =>\n skill.origin !== EJECT_SOURCE && skill.origin !== namedMarketplace;\n\n return config.skills\n .filter(isInstalled)\n .filter(isPluginFromElsewhere)\n .map((skill) => skill.id);\n}\n\nfunction unnameableModels(agents: AgentScopeConfig[]): string[] {\n return agents.flatMap((agent) =>\n agent.model !== undefined && !isSeedModel(agent.model)\n ? [unnameableModelMessage(agent.name, agent.model)]\n : [],\n );\n}\n\n/** Re-keys rows by skill; rows the decoder would refuse are collected for the refusal. */\nfunction readStack(\n stack: ProjectConfig[\"stack\"],\n skillScopes: Map<SkillId, SkillScope>,\n agentScopes: Map<string, SkillScope>,\n): StackReading {\n const assignments = new Map<SkillId, SeedAssignments>();\n const unwritable: string[] = [];\n\n for (const [agent, agentStack] of typedEntries(stack ?? {})) {\n const agentScope = agentScopes.get(agent);\n if (agentScope === undefined) continue;\n\n for (const { id, preloaded } of typedValues(agentStack).flat()) {\n const skillScope = skillScopes.get(id);\n if (skillScope === undefined) continue;\n\n if (!isScopePairCompatible(skillScope, agentScope)) {\n unwritable.push(unwritablePairMessage(id, agent));\n continue;\n }\n\n const forSkill = assignments.get(id) ?? {};\n forSkill[agent] = seedLoadState(preloaded);\n assignments.set(id, forSkill);\n }\n }\n\n return { assignments, unwritable };\n}\n\nfunction toSeedSkill(skill: SkillConfig, assignments: SeedAssignments | undefined): SeedSkill {\n return {\n // A plugin's marketplace has already been checked against the envelope's ref.\n install: skill.origin === EJECT_SOURCE ? \"eject\" : \"plugin\",\n scope: skill.scope,\n assignments: assignments ?? {},\n };\n}\n\n/** Always `on`: it carries a sub-agent that owns no skill, which assignments cannot. */\nfunction toSeedAgent(agent: AgentScopeConfig): SeedAgent {\n return {\n on: true,\n scope: agent.scope,\n ...(agent.model !== undefined && isSeedModel(agent.model) && { model: agent.model }),\n ...(agent.codexModel !== undefined && { codexModel: agent.codexModel }),\n ...(agent.effort !== undefined && { effort: agent.effort }),\n };\n}\n\n/** Inverse of `seedToInstallSelection`; anything the contract cannot state is refused by name. */\nexport function configToSeedPayload(\n config: ProjectConfig,\n carried: ContentReading,\n inheritedFrom?: MarketplaceRecord,\n): SeedPayload {\n const skills = config.skills.filter(isInstalled);\n const agents = config.agents.filter(isInstalled);\n const skillScopes = new Map(skills.map((skill) => [skill.id, skill.scope]));\n const agentScopes = new Map<string, SkillScope>(agents.map((agent) => [agent.name, agent.scope]));\n\n const { assignments, unwritable } = readStack(config.stack, skillScopes, agentScopes);\n const marketplace = readMarketplace(config, skills, inheritedFrom);\n\n const unshareable = [\n ...marketplace.unnameable,\n ...unnameableModels(agents),\n ...unwritable,\n ...carried.uncarryable,\n ];\n if (unshareable.length > 0) throw new Error(unshareableConfigError(unshareable));\n\n return {\n v: SEED_VERSION,\n matrixVersion: MATRIX_VERSION,\n stackId: null,\n // Absent rather than empty: an id is the hash of its body.\n ...(config.description !== undefined && { description: config.description }),\n ...(marketplace.ref !== undefined && { marketplace: marketplace.ref }),\n skills: Object.fromEntries(\n skills.map((skill) => [skill.id, toSeedSkill(skill, assignments.get(skill.id))]),\n ),\n ...(Object.keys(carried.external).length > 0 && { external: carried.external }),\n agents: Object.fromEntries(agents.map((agent) => [agent.name, toSeedAgent(agent)])),\n };\n}\n","import { STATUS_CODES } from \"node:http\";\n\nimport { retryAfterSeconds } from \"@workspace/api\";\nimport { z } from \"zod\";\n\nimport { SEED_API_URL } from \"../../consts.js\";\nimport { arrivedAsText, jsonBodyOrUndefined, SEED_USER_AGENT } from \"./fetch-seed.js\";\nimport { CLI_INVOKE_COMMAND } from \"../../consts.js\";\nimport { plural, truncateText } from \"../../utils/string.js\";\n\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\n/** Revalidated: the deployed worker may not match the one this CLI was built against. */\nconst mintedSchema = z.object({ id: z.string().min(1) });\n\n/** `@hono/zod-validator` sends the `safeParse` result; its error crosses as `{ name, message }`. */\nconst refusalSchema = z.object({ error: z.object({ message: z.string() }) });\n\n/** Zod renders its issues into `message` as JSON; the readable sentences are inside. */\nconst refusedIssuesSchema = z\n .array(\n z.object({\n path: z.array(z.union([z.string(), z.number()])),\n message: z.string().min(1),\n }),\n )\n .min(1);\n\n/** Holds about two of the store's refusal sentences; a longer body must not paint the terminal. */\nconst EXPLANATION_BUDGET = 300;\n\nconst CONTRACT_MISMATCH = 409;\n\nconst RATE_LIMITED = 429;\n\n/** The editor's `limitReachedNote` wording, so both front doors say it alike. */\nconst LIMIT_REACHED = \"rate limit reached — try again in\";\n\nconst SECONDS_PER_MINUTE = 60;\n\n/**\n * The store's 409 body says \"Reload the page\", which a terminal cannot do. The seed version is\n * bundled into the CLI, so only a newer CLI fixes it.\n */\nconst OUT_OF_DATE_AGAINST_STORE =\n `This CLI is out of date against the configuration store: it writes a version of the sharing ` +\n `contract the store does not serve, and that version travels inside the CLI rather than with ` +\n `the configuration. Re-run this command through '${CLI_INVOKE_COMMAND}@latest'.`;\n\nexport type PublishSeedResult = { ok: true; id: string } | { ok: false; error: string };\n\n/** Every failure is a message rather than a throw. */\nexport async function publishSeedConfig(payload: SeedPayload): Promise<PublishSeedResult> {\n const response = await postToStore(payload);\n if (response === null) {\n return { ok: false, error: `Could not reach ${SEED_API_URL} — check your connection.` };\n }\n\n if (!response.ok) return { ok: false, error: await refusalMessage(response) };\n\n return mintedIdIn(await jsonBodyOrUndefined(response));\n}\n\n/** Null where the store could not be reached at all. */\nasync function postToStore(payload: SeedPayload): Promise<Response | null> {\n try {\n return await fetch(`${SEED_API_URL}/configs`, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n // Tells the store the configuration came from the CLI rather than a browser.\n \"user-agent\": SEED_USER_AGENT,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n return null;\n }\n}\n\nfunction mintedIdIn(body: unknown): PublishSeedResult {\n if (body === undefined) {\n return { ok: false, error: \"The configuration store returned something that is not JSON.\" };\n }\n\n const minted = mintedSchema.safeParse(body);\n if (!minted.success) {\n return { ok: false, error: \"The configuration store did not return an id for this share.\" };\n }\n\n return { ok: true, id: minted.data.id };\n}\n\n/** Always names the status, and quotes the store's own explanation when it gives one. */\nasync function refusalMessage(response: Response): Promise<string> {\n const failed = `Sharing this configuration failed (HTTP ${response.status})`;\n const refused = `${failed}.`;\n\n if (response.status === CONTRACT_MISMATCH) return `${refused} ${OUT_OF_DATE_AGAINST_STORE}`;\n\n const window = rateLimitWindow(response);\n if (window !== null) return `${failed}: ${LIMIT_REACHED} ${waitOf(window)}.`;\n\n const explanation = explanationOf(response, await refusalBody(response));\n\n return explanation === undefined ? refused : `${refused} The store said: ${explanation}`;\n}\n\n/** Seconds to wait out, or `null` where this is no 429 or its window is unreadable. */\nfunction rateLimitWindow(response: Response): number | null {\n return response.status === RATE_LIMITED ? retryAfterSeconds(response) : null;\n}\n\n/** Minutes round up, so nobody is sent back early. */\nfunction waitOf(seconds: number): string {\n return seconds < SECONDS_PER_MINUTE\n ? plural(seconds, \"second\")\n : plural(Math.ceil(seconds / SECONDS_PER_MINUTE), \"minute\");\n}\n\n/** Not gated on content type: this route refuses as JSON and as plain text. */\nasync function refusalBody(response: Response): Promise<string | undefined> {\n try {\n return await response.text();\n } catch {\n return undefined;\n }\n}\n\nfunction jsonOf(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction explanationOf(response: Response, body: string | undefined): string | undefined {\n if (body === undefined) return undefined;\n\n const said = schemaIssuesIn(body) ?? quotableProseIn(response, body);\n\n return said === undefined ? undefined : truncateText(said, EXPLANATION_BUDGET);\n}\n\nfunction schemaIssuesIn(body: string): string | undefined {\n const refusal = refusalSchema.safeParse(jsonOf(body));\n if (!refusal.success) return undefined;\n\n const issues = refusedIssuesSchema.safeParse(jsonOf(refusal.data.error.message));\n if (!issues.success) return undefined;\n\n return issues.data.map(sentenceOf).join(\"; \");\n}\n\n/** Quoted only when it adds something to the status printed beside it. */\nfunction quotableProseIn(response: Response, body: string): string | undefined {\n if (!arrivedAsText(response)) return undefined;\n\n const said = body.trim();\n if (said === \"\") return undefined;\n if (restatesItsOwnStatus(said, response.status)) return undefined;\n\n return said;\n}\n\n/** Case-insensitive: the worker writes sentence case where the reason phrase is title case. */\nfunction restatesItsOwnStatus(said: string, status: number): boolean {\n const reason = STATUS_CODES[status];\n\n return reason !== undefined && said.toLowerCase() === reason.toLowerCase();\n}\n\ntype RefusedIssue = z.infer<typeof refusedIssuesSchema>[number];\n\n/** Renders like `formatZodIssue`, which cannot take a plain object read off the wire. */\nfunction sentenceOf(issue: RefusedIssue): string {\n const path = issue.path.join(\".\");\n return path === \"\" ? issue.message : `${path}: ${issue.message}`;\n}\n"],"mappings":"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","names":["path"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SkillAgentSummary
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5CFHP6Z5.js";
|
|
5
5
|
import {
|
|
6
6
|
ALL_SKILLS_EJECTED_LABEL,
|
|
7
7
|
CLI_COLORS,
|
|
@@ -111,4 +111,4 @@ export {
|
|
|
111
111
|
summaryPanelText,
|
|
112
112
|
summaryPanelBlock
|
|
113
113
|
};
|
|
114
|
-
//# sourceMappingURL=chunk-
|
|
114
|
+
//# sourceMappingURL=chunk-C2BSCEDN.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
compileAgents,
|
|
4
4
|
withCatalogueSeatedFor
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-XMQIWPIR.js";
|
|
6
6
|
import {
|
|
7
7
|
loadAgentDefs
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JNRACLNS.js";
|
|
9
9
|
import {
|
|
10
10
|
ConfigLoadError,
|
|
11
11
|
EXTRACTED_FIELDS,
|
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
providerInUse,
|
|
44
44
|
quoteText,
|
|
45
45
|
readFile,
|
|
46
|
+
remove,
|
|
46
47
|
renderKey,
|
|
47
48
|
renderTypeImportLine,
|
|
48
49
|
renderUnionBody,
|
|
@@ -57,12 +58,12 @@ import {
|
|
|
57
58
|
warn,
|
|
58
59
|
withGateToken,
|
|
59
60
|
writeFile
|
|
60
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-ENET4IF6.js";
|
|
61
62
|
import {
|
|
62
63
|
matrix,
|
|
63
64
|
typedEntries,
|
|
64
65
|
typedKeys
|
|
65
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-UE4Z3YMB.js";
|
|
66
67
|
import {
|
|
67
68
|
CLI_INVOKE_COMMAND,
|
|
68
69
|
CODEX_MODEL_NAMES,
|
|
@@ -675,8 +676,8 @@ function activeEntriesNotIn(incoming, existing, keyOf) {
|
|
|
675
676
|
return incoming.filter((entry) => !entry.excluded && !held.has(keyOf(entry)));
|
|
676
677
|
}
|
|
677
678
|
function marketplaceIdentityFilledFrom(existing, arriving) {
|
|
678
|
-
const
|
|
679
|
-
const marketplace =
|
|
679
|
+
const fillsFromArriving = arriving !== null && existing.marketplace === void 0;
|
|
680
|
+
const { marketplace, marketplaceName } = fillsFromArriving ? arriving : existing;
|
|
680
681
|
return {
|
|
681
682
|
...marketplaceName !== void 0 && { marketplaceName },
|
|
682
683
|
...marketplace !== void 0 && { marketplace }
|
|
@@ -1238,7 +1239,7 @@ var NOTHING_RECOMPILED = {
|
|
|
1238
1239
|
};
|
|
1239
1240
|
async function recompilePropagated(projectDirs, pairsRewritten) {
|
|
1240
1241
|
if (projectDirs.length === 0) return NOTHING_RECOMPILED;
|
|
1241
|
-
const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-
|
|
1242
|
+
const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-U3UGHPWG.js");
|
|
1242
1243
|
return recompilePropagatedProjectAgents(projectDirs, pairsRewritten);
|
|
1243
1244
|
}
|
|
1244
1245
|
function pairRewriteSummary(projectDirs, pairsRewritten) {
|
|
@@ -1278,6 +1279,21 @@ async function pairsRewrittenSince(before, projectDirs, provider) {
|
|
|
1278
1279
|
);
|
|
1279
1280
|
return new Set(judged.filter(({ rewritten }) => rewritten).map(({ dir }) => dir));
|
|
1280
1281
|
}
|
|
1282
|
+
async function restoreProjectPairs(before, provider) {
|
|
1283
|
+
await Promise.all([...before].map(([dir, pair]) => restorePair(dir, pair, provider)));
|
|
1284
|
+
}
|
|
1285
|
+
async function restorePair(dir, [config, types], provider) {
|
|
1286
|
+
const configPath = getProjectConfigPath(dir, provider);
|
|
1287
|
+
await Promise.all([
|
|
1288
|
+
restoreHalf(configPath, config),
|
|
1289
|
+
restoreHalf(typesPathFor(configPath), types)
|
|
1290
|
+
]);
|
|
1291
|
+
}
|
|
1292
|
+
async function restoreHalf(filePath, before) {
|
|
1293
|
+
if (await readHalf(filePath) === before) return;
|
|
1294
|
+
if (before === null) return remove(filePath);
|
|
1295
|
+
if (typeof before === "string") return writeFile(filePath, before);
|
|
1296
|
+
}
|
|
1281
1297
|
function snapshotOf(before, dir) {
|
|
1282
1298
|
const pair = before.get(dir);
|
|
1283
1299
|
if (pair === void 0) throw new Error(`No snapshot of ${dir} was taken before the fan-out`);
|
|
@@ -1334,7 +1350,7 @@ async function applyConsequences(globalConfig, changes, deps, provider, currentP
|
|
|
1334
1350
|
function lazyGateDeps(projectDir) {
|
|
1335
1351
|
return {
|
|
1336
1352
|
loadMatrix: async () => {
|
|
1337
|
-
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-
|
|
1353
|
+
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-E2Y5MMN5.js");
|
|
1338
1354
|
const { matrix: matrix2 } = await loadSkillsMatrixFromSource2({
|
|
1339
1355
|
projectDir,
|
|
1340
1356
|
skipExtraSources: true,
|
|
@@ -1343,7 +1359,7 @@ function lazyGateDeps(projectDir) {
|
|
|
1343
1359
|
return matrix2;
|
|
1344
1360
|
},
|
|
1345
1361
|
loadAgents: async () => {
|
|
1346
|
-
const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-
|
|
1362
|
+
const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-5BSECHE6.js");
|
|
1347
1363
|
return (await loadAgentDefs2()).agents;
|
|
1348
1364
|
}
|
|
1349
1365
|
};
|
|
@@ -1361,11 +1377,10 @@ async function writeFromHome(args, homeDir, deps) {
|
|
|
1361
1377
|
const provider = providerInUse(homeDir);
|
|
1362
1378
|
const priorGlobal = await loadProjectConfigFromDir(homeDir, provider);
|
|
1363
1379
|
const changes = classifyGlobalChange(priorGlobal?.config, finalConfig);
|
|
1364
|
-
const globalWritten = await
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
deps.matrix,
|
|
1368
|
-
deps.agents
|
|
1380
|
+
const globalWritten = await restoringThePairsOnFailure(
|
|
1381
|
+
[homeDir],
|
|
1382
|
+
provider,
|
|
1383
|
+
() => writeGlobalPair(finalConfig, projectConfigPath, deps.matrix, deps.agents)
|
|
1369
1384
|
);
|
|
1370
1385
|
const { propagated, recompile } = await applyConsequences(finalConfig, changes, deps, provider);
|
|
1371
1386
|
return report(globalWritten, changes, propagated, recompile);
|
|
@@ -1375,6 +1390,7 @@ async function writeFromProjectContext(args, homeDir, deps) {
|
|
|
1375
1390
|
const { global: globalConfig, project: projectSplitConfig } = splitConfigByScope(finalConfig);
|
|
1376
1391
|
const provider = providerInUse(projectDir);
|
|
1377
1392
|
const globalConfigPath = getProjectConfigPath(homeDir, provider);
|
|
1393
|
+
await ensureBlankPair(provider);
|
|
1378
1394
|
const existingGlobal = await loadProjectConfigFromDir(homeDir, provider);
|
|
1379
1395
|
const effective = await resolveEffectiveGlobalConfig(
|
|
1380
1396
|
globalConfig,
|
|
@@ -1384,28 +1400,45 @@ async function writeFromProjectContext(args, homeDir, deps) {
|
|
|
1384
1400
|
);
|
|
1385
1401
|
const effectiveGlobalConfig = effective.config;
|
|
1386
1402
|
const changes = classifyGlobalChange(existingGlobal?.config, effectiveGlobalConfig);
|
|
1387
|
-
const globalWritten = await writeGlobalPairWhenChanged(effective, globalConfigPath, deps);
|
|
1388
|
-
const { propagated, recompile } = await applyConsequences(
|
|
1389
|
-
effectiveGlobalConfig,
|
|
1390
|
-
changes,
|
|
1391
|
-
deps,
|
|
1392
|
-
provider,
|
|
1393
|
-
projectDir
|
|
1394
|
-
);
|
|
1395
1403
|
const reconciledProjectConfig = reconcileProjectSplitAgainstGlobal(
|
|
1396
1404
|
projectSplitConfig,
|
|
1397
1405
|
effectiveGlobalConfig,
|
|
1398
1406
|
deps.matrix
|
|
1399
1407
|
);
|
|
1400
|
-
await
|
|
1401
|
-
|
|
1408
|
+
const globalWritten = await restoringThePairsOnFailure(
|
|
1409
|
+
[projectDir, homeDir],
|
|
1402
1410
|
provider,
|
|
1403
|
-
|
|
1411
|
+
async () => {
|
|
1412
|
+
await writeProjectPairWhenOwed(
|
|
1413
|
+
args,
|
|
1414
|
+
provider,
|
|
1415
|
+
reconciledProjectConfig,
|
|
1416
|
+
effectiveGlobalConfig,
|
|
1417
|
+
deps
|
|
1418
|
+
);
|
|
1419
|
+
return writeGlobalPairWhenChanged(effective, globalConfigPath, deps);
|
|
1420
|
+
}
|
|
1421
|
+
);
|
|
1422
|
+
const { propagated, recompile } = await applyConsequences(
|
|
1404
1423
|
effectiveGlobalConfig,
|
|
1405
|
-
|
|
1424
|
+
changes,
|
|
1425
|
+
deps,
|
|
1426
|
+
provider,
|
|
1427
|
+
projectDir
|
|
1406
1428
|
);
|
|
1407
1429
|
return report(globalWritten, changes, propagated, recompile);
|
|
1408
1430
|
}
|
|
1431
|
+
async function restoringThePairsOnFailure(dirs, provider, write) {
|
|
1432
|
+
const before = await snapshotProjectPairs(dirs, provider);
|
|
1433
|
+
try {
|
|
1434
|
+
return await write();
|
|
1435
|
+
} catch (error) {
|
|
1436
|
+
await restoreProjectPairs(before, provider).catch((restoreError) => {
|
|
1437
|
+
verbose(`Could not restore a config pair: ${getErrorMessage(restoreError)}`);
|
|
1438
|
+
});
|
|
1439
|
+
throw error;
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1409
1442
|
async function writeGlobalPairWhenChanged(effective, globalConfigPath, deps) {
|
|
1410
1443
|
if (!effective.changed) {
|
|
1411
1444
|
verbose("Global config unchanged, skipping write");
|
|
@@ -1587,9 +1620,6 @@ async function writeProjectConfig(options) {
|
|
|
1587
1620
|
);
|
|
1588
1621
|
const finalConfig = mergeResult.config;
|
|
1589
1622
|
const isProjectContext = !isHomeDirectory(projectDir);
|
|
1590
|
-
if (isProjectContext) {
|
|
1591
|
-
await ensureBlankPair2(providerInUse(projectDir));
|
|
1592
|
-
}
|
|
1593
1623
|
const propagation = await writeConfigByScope({
|
|
1594
1624
|
finalConfig,
|
|
1595
1625
|
matrix: sourceResult.matrix,
|
|
@@ -1679,4 +1709,4 @@ export {
|
|
|
1679
1709
|
compileAgentsAllScopes,
|
|
1680
1710
|
compileProjectScope
|
|
1681
1711
|
};
|
|
1682
|
-
//# sourceMappingURL=chunk-
|
|
1712
|
+
//# sourceMappingURL=chunk-CKBWEWHZ.js.map
|