agents-inc 0.170.1 → 0.170.2
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 +9 -0
- package/dist/{chunk-BMRUNMPV.js → chunk-2YA4DDRM.js} +35 -35
- package/dist/chunk-2YA4DDRM.js.map +1 -0
- package/dist/{chunk-44TE3RKH.js → chunk-3ED3KHHD.js} +5 -4
- package/dist/chunk-3ED3KHHD.js.map +1 -0
- package/dist/{chunk-3G7X2WKI.js → chunk-5BNX73OU.js} +18 -38
- package/dist/chunk-5BNX73OU.js.map +1 -0
- package/dist/{chunk-7RDMTR64.js → chunk-66AEVERM.js} +785 -256
- package/dist/chunk-66AEVERM.js.map +1 -0
- package/dist/{chunk-PJWGTNOX.js → chunk-7C3PFRBU.js} +144 -186
- package/dist/chunk-7C3PFRBU.js.map +1 -0
- package/dist/{chunk-52HDHJ7I.js → chunk-AUNRHWH4.js} +32 -21
- package/dist/chunk-AUNRHWH4.js.map +1 -0
- package/dist/{chunk-KOLDW6SF.js → chunk-BBDGYJHX.js} +2 -2
- package/dist/chunk-BBDGYJHX.js.map +1 -0
- package/dist/{chunk-SZYQISA2.js → chunk-ELV5WDS3.js} +43 -29
- package/dist/chunk-ELV5WDS3.js.map +1 -0
- package/dist/{chunk-MQ6CGZNJ.js → chunk-GAKVZNTX.js} +1879 -2019
- package/dist/chunk-GAKVZNTX.js.map +1 -0
- package/dist/chunk-GEMW5RQ2.js +1169 -0
- package/dist/chunk-GEMW5RQ2.js.map +1 -0
- package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
- package/dist/chunk-GHHJYNAN.js.map +1 -0
- package/dist/{chunk-WTWMGH2C.js → chunk-HACRR422.js} +2 -2
- package/dist/chunk-HACRR422.js.map +1 -0
- package/dist/{chunk-F2BHT5C4.js → chunk-IWY5IR4F.js} +129 -151
- package/dist/chunk-IWY5IR4F.js.map +1 -0
- package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
- package/dist/chunk-KIK5EZYD.js.map +1 -0
- package/dist/{chunk-USVBYQSQ.js → chunk-O4LN3HFI.js} +16 -6
- package/dist/chunk-O4LN3HFI.js.map +1 -0
- package/dist/{chunk-RIPSGNLU.js → chunk-OCAVW6N5.js} +3 -3
- package/dist/chunk-OCAVW6N5.js.map +1 -0
- package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
- package/dist/chunk-P6CYS4JK.js.map +1 -0
- package/dist/chunk-PLFANHRZ.js +35 -0
- package/dist/chunk-PLFANHRZ.js.map +1 -0
- package/dist/{chunk-6ZRH5RHC.js → chunk-PMUZR4XO.js} +4 -4
- package/dist/chunk-PMUZR4XO.js.map +1 -0
- package/dist/{chunk-F5EBEATU.js → chunk-PSUTNOQ2.js} +34 -46
- package/dist/chunk-PSUTNOQ2.js.map +1 -0
- package/dist/chunk-RIK45Q4I.js +103 -0
- package/dist/chunk-RIK45Q4I.js.map +1 -0
- package/dist/{chunk-HED2DAXZ.js → chunk-THO7LO5B.js} +5 -5
- package/dist/chunk-THO7LO5B.js.map +1 -0
- package/dist/{chunk-OYJQUA3D.js → chunk-YGDWHDOY.js} +31 -13
- package/dist/chunk-YGDWHDOY.js.map +1 -0
- package/dist/{chunk-NCWDK6L7.js → chunk-YXKTY5WM.js} +254 -379
- package/dist/chunk-YXKTY5WM.js.map +1 -0
- package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
- package/dist/chunk-ZEGM3MVR.js.map +1 -0
- package/dist/commands/build/marketplace.js +46 -46
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +25 -28
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +87 -178
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +510 -360
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +451 -357
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +144 -125
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +20 -27
- package/dist/commands/list.js +39 -55
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +6 -11
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +35 -32
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +17 -77
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +159 -222
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +9 -32
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/prompt-confirm.js +2 -2
- package/dist/components/common/removal-plan-confirm.js +2 -2
- package/dist/components/common/scroll-affordance.js +2 -2
- package/dist/components/common/select-list.js +2 -2
- package/dist/components/common/skill-agent-summary.js +4 -4
- package/dist/components/common/spinner.js +2 -4
- package/dist/components/common/summary-panel.js +5 -5
- package/dist/components/common/summary-panel.js.map +1 -1
- package/dist/config-exports.js +7 -3
- package/dist/config-exports.js.map +1 -1
- package/dist/hooks/init.js +18 -19
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/load-agent-defs-6QUUMGHK.js +14 -0
- package/dist/recompile-project-agents-I33KQJFB.js +65 -0
- package/dist/recompile-project-agents-I33KQJFB.js.map +1 -0
- package/dist/{source-loader-C5SQXZXI.js → source-loader-TTJVW2ER.js} +5 -5
- package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
- package/dist/src/agents/developer/api-developer/playbook.md +2 -5
- package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
- package/dist/src/agents/developer/web-developer/playbook.md +2 -5
- package/dist/src/agents/meta/agent-summoner/output.md +2 -2
- package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
- package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
- package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
- package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
- package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/api-tester/playbook.md +2 -0
- package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
- package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/web-tester/playbook.md +2 -0
- package/package.json +9 -8
- package/src/agents/developer/ai-developer/playbook.md +2 -5
- package/src/agents/developer/api-developer/playbook.md +2 -5
- package/src/agents/developer/cli-developer/playbook.md +2 -5
- package/src/agents/developer/web-developer/playbook.md +2 -5
- package/src/agents/meta/agent-summoner/output.md +2 -2
- package/src/agents/meta/agent-summoner/playbook.md +1 -13
- package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
- package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
- package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
- package/src/agents/tester/ai-tester/playbook.md +2 -0
- package/src/agents/tester/api-tester/critical-requirements.md +1 -2
- package/src/agents/tester/api-tester/playbook.md +2 -0
- package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
- package/src/agents/tester/cli-tester/playbook.md +2 -0
- package/src/agents/tester/web-tester/critical-requirements.md +1 -2
- package/src/agents/tester/web-tester/playbook.md +2 -0
- package/src/schemas/project-config.schema.json +0 -3
- package/src/schemas/project-source-config.schema.json +0 -6
- package/dist/chunk-3G7X2WKI.js.map +0 -1
- package/dist/chunk-44TE3RKH.js.map +0 -1
- package/dist/chunk-4AAOOAIN.js.map +0 -1
- package/dist/chunk-52HDHJ7I.js.map +0 -1
- package/dist/chunk-6HNXYYVF.js +0 -373
- package/dist/chunk-6HNXYYVF.js.map +0 -1
- package/dist/chunk-6ZRH5RHC.js.map +0 -1
- package/dist/chunk-7RDMTR64.js.map +0 -1
- package/dist/chunk-BMRUNMPV.js.map +0 -1
- package/dist/chunk-CLPUWOSA.js +0 -46
- package/dist/chunk-CLPUWOSA.js.map +0 -1
- package/dist/chunk-F2BHT5C4.js.map +0 -1
- package/dist/chunk-F5EBEATU.js.map +0 -1
- package/dist/chunk-HED2DAXZ.js.map +0 -1
- package/dist/chunk-JFLVEFFP.js.map +0 -1
- package/dist/chunk-KOLDW6SF.js.map +0 -1
- package/dist/chunk-MQ6CGZNJ.js.map +0 -1
- package/dist/chunk-NCWDK6L7.js.map +0 -1
- package/dist/chunk-NEZ4OAOL.js.map +0 -1
- package/dist/chunk-NIHUOWE4.js +0 -106
- package/dist/chunk-NIHUOWE4.js.map +0 -1
- package/dist/chunk-NQW25DCF.js.map +0 -1
- package/dist/chunk-OYJQUA3D.js.map +0 -1
- package/dist/chunk-PJWGTNOX.js.map +0 -1
- package/dist/chunk-RIPSGNLU.js.map +0 -1
- package/dist/chunk-SZYQISA2.js.map +0 -1
- package/dist/chunk-USVBYQSQ.js.map +0 -1
- package/dist/chunk-V3KTSP3Q.js +0 -940
- package/dist/chunk-V3KTSP3Q.js.map +0 -1
- package/dist/chunk-WTWMGH2C.js.map +0 -1
- package/dist/load-agent-defs-YMDWBFDP.js +0 -14
- package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
- package/dist/source-loader-C5SQXZXI.js.map +0 -1
- /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-6QUUMGHK.js.map} +0 -0
- /package/dist/{recompile-project-agents-SZ76WNTW.js.map → source-loader-TTJVW2ER.js.map} +0 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
// ../compile/src/string.ts
|
|
4
|
+
function bytewise(a, b) {
|
|
5
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
6
|
+
}
|
|
7
|
+
function inAnEnglishList(items) {
|
|
8
|
+
const last = items.at(-1);
|
|
9
|
+
if (last === void 0) return "";
|
|
10
|
+
if (items.length === 1) return last;
|
|
11
|
+
return `${items.slice(0, -1).join(", ")} and ${last}`;
|
|
12
|
+
}
|
|
13
|
+
|
|
3
14
|
// ../compile/src/paths.ts
|
|
4
15
|
var CLAUDE_DIR = ".claude";
|
|
5
16
|
var SOURCE_ROOT_DIR = ".agents-inc";
|
|
@@ -7,7 +18,7 @@ var SOURCE_SRC_DIR = "src";
|
|
|
7
18
|
var SKILLS_DIR_PATH = `${SOURCE_SRC_DIR}/skills`;
|
|
8
19
|
var LOCAL_SKILLS_PATH = ".claude/skills";
|
|
9
20
|
var DEFAULT_PLUGIN_NAME = "agents-inc";
|
|
10
|
-
var DEFAULT_PUBLIC_SOURCE_NAME =
|
|
21
|
+
var DEFAULT_PUBLIC_SOURCE_NAME = "agents-inc";
|
|
11
22
|
var GITHUB_PREFIX = "github:";
|
|
12
23
|
var DEFAULT_SOURCE = `${GITHUB_PREFIX}agents-inc/skills`;
|
|
13
24
|
var CLI_INVOKE_COMMAND = "npx agents-inc";
|
|
@@ -50,7 +61,7 @@ var STANDARD_DIRS = {
|
|
|
50
61
|
SCRIPTS: "scripts",
|
|
51
62
|
SKILLS: "skills",
|
|
52
63
|
AGENTS: "agents",
|
|
53
|
-
/** Legacy per-project template override directory
|
|
64
|
+
/** Legacy per-project template override directory. */
|
|
54
65
|
TEMPLATES: "templates"
|
|
55
66
|
};
|
|
56
67
|
|
|
@@ -87,11 +98,6 @@ function effectivelyExcludedSkillIds(skills) {
|
|
|
87
98
|
);
|
|
88
99
|
}
|
|
89
100
|
|
|
90
|
-
// src/cli/consts.ts
|
|
91
|
-
import os from "os";
|
|
92
|
-
import path from "path";
|
|
93
|
-
import { fileURLToPath } from "url";
|
|
94
|
-
|
|
95
101
|
// ../compile/src/catalog.ts
|
|
96
102
|
function isExclusiveCategory(catalog, category) {
|
|
97
103
|
return catalog.categories[category]?.exclusive === true;
|
|
@@ -501,8 +507,7 @@ var groupBy = (items, keyOf) => {
|
|
|
501
507
|
return groups;
|
|
502
508
|
};
|
|
503
509
|
var indexById = (items) => (
|
|
504
|
-
//
|
|
505
|
-
// these is the item's own id, which is the key type being claimed.
|
|
510
|
+
// Cast: `Object.fromEntries` widens keys to `string`; each is the item's own id.
|
|
506
511
|
Object.fromEntries(items.map((item) => [item.id, item]))
|
|
507
512
|
);
|
|
508
513
|
|
|
@@ -9820,8 +9825,7 @@ var categoryDefinitionSchema = z.object({
|
|
|
9820
9825
|
id: categorySchema,
|
|
9821
9826
|
displayName: z.string(),
|
|
9822
9827
|
description: z.string(),
|
|
9823
|
-
//
|
|
9824
|
-
// one cannot be placed in the UI, so the read model drops it rather than failing the whole boot.
|
|
9828
|
+
// A category without one is dropped by the read model, not rejected.
|
|
9825
9829
|
domain: domainIdSchema.exactOptional(),
|
|
9826
9830
|
exclusive: z.boolean(),
|
|
9827
9831
|
order: z.number()
|
|
@@ -9840,12 +9844,8 @@ var resolvedSkillSchema = z.object({
|
|
|
9840
9844
|
slug: z.string(),
|
|
9841
9845
|
displayName: z.string(),
|
|
9842
9846
|
description: z.string(),
|
|
9843
|
-
//
|
|
9844
|
-
// on the CLI's `SkillCore`, so a catalogue entry without one falls back to its
|
|
9845
|
-
// category — but a schema that omits the field STRIPS it, which is the same value
|
|
9846
|
-
// arriving by a route nothing can tell apart from the skill stating nothing.
|
|
9847
|
+
// Declared so parsing does not strip it.
|
|
9847
9848
|
usageGuidance: z.string().exactOptional(),
|
|
9848
|
-
// The SKILL.md description compile renders — see `SkillCore.activationDescription`.
|
|
9849
9849
|
activationDescription: z.string().exactOptional(),
|
|
9850
9850
|
category: categorySchema,
|
|
9851
9851
|
conflictsWith: z.array(skillRelationSchema),
|
|
@@ -9856,20 +9856,16 @@ var resolvedStackSchema = z.object({
|
|
|
9856
9856
|
id: z.string(),
|
|
9857
9857
|
name: z.string(),
|
|
9858
9858
|
description: z.string(),
|
|
9859
|
-
// agent id → category id → skill ids
|
|
9860
|
-
// agents it staffs, not the whole roster; the category keys are the one level
|
|
9861
|
-
// nothing here reads, so they stay unvalidated strings.
|
|
9859
|
+
// agent id → category id → skill ids; a stack names only the agents it staffs.
|
|
9862
9860
|
skills: z.partialRecord(
|
|
9863
9861
|
agentNameSchema,
|
|
9864
9862
|
z.record(z.string(), z.array(skillIdSchema))
|
|
9865
9863
|
),
|
|
9866
9864
|
allSkillIds: z.array(skillIdSchema),
|
|
9867
9865
|
philosophy: z.string(),
|
|
9868
|
-
// Never populated by the CLI today; the stack rail groups by it when it appears.
|
|
9869
9866
|
group: z.string().exactOptional()
|
|
9870
9867
|
});
|
|
9871
9868
|
var builtInMatrixSchema = z.object({
|
|
9872
|
-
// Stamped into every seed payload so a consumer can explain skipped ids.
|
|
9873
9869
|
version: z.string(),
|
|
9874
9870
|
categories: z.record(z.string(), categoryDefinitionSchema),
|
|
9875
9871
|
skills: z.record(z.string(), resolvedSkillSchema),
|
|
@@ -9923,7 +9919,8 @@ var agentDomainOf = (agentId) => {
|
|
|
9923
9919
|
var DOMAIN_POSITION = new Map(
|
|
9924
9920
|
DOMAIN_ORDER.map((domain, index) => [domain, index])
|
|
9925
9921
|
);
|
|
9926
|
-
var
|
|
9922
|
+
var positionOf = (domain) => DOMAIN_POSITION.get(domain) ?? DOMAIN_ORDER.length;
|
|
9923
|
+
var compareDomains = (a, b) => positionOf(a) - positionOf(b);
|
|
9927
9924
|
|
|
9928
9925
|
// ../matrix/src/read-model/catalog.ts
|
|
9929
9926
|
var toCatalogSkill = (skill, domainId) => ({
|
|
@@ -10175,9 +10172,7 @@ var agentDefinitionSchema = z2.object({
|
|
|
10175
10172
|
description: z2.string(),
|
|
10176
10173
|
model: modelNameSchema.exactOptional(),
|
|
10177
10174
|
tools: z2.array(z2.string()),
|
|
10178
|
-
//
|
|
10179
|
-
// preload table — so the check lives where the list does, in `flavorOf`,
|
|
10180
|
-
// rather than the list being imported back into the boundary.
|
|
10175
|
+
// Narrowed by `flavorOf`, where the role list lives.
|
|
10181
10176
|
flavor: z2.string()
|
|
10182
10177
|
});
|
|
10183
10178
|
var agentDefinitionsSchema = z2.record(
|
|
@@ -10195,7 +10190,6 @@ var ROLE_FLAVORS = [
|
|
|
10195
10190
|
"meta"
|
|
10196
10191
|
];
|
|
10197
10192
|
var PRELOAD_DEFAULTS = {
|
|
10198
|
-
// Web — frameworks, the concerns built on them, and the tests
|
|
10199
10193
|
"web-framework-angular-standalone": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10200
10194
|
"web-framework-react": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10201
10195
|
"web-framework-solidjs": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
@@ -10255,7 +10249,6 @@ var PRELOAD_DEFAULTS = {
|
|
|
10255
10249
|
"web-testing-vue-test-utils": ["tester"],
|
|
10256
10250
|
"web-utilities-native-js": ["developer"],
|
|
10257
10251
|
"web-utilities-vueuse": ["developer"],
|
|
10258
|
-
// API — frameworks, data, auth, and the safety around them
|
|
10259
10252
|
"api-framework-express": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10260
10253
|
"api-framework-fastify": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10261
10254
|
"api-framework-hono": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
@@ -10292,7 +10285,6 @@ var PRELOAD_DEFAULTS = {
|
|
|
10292
10285
|
"api-performance-api-performance": ["developer", "researcher"],
|
|
10293
10286
|
"api-specs-openapi": ["developer"],
|
|
10294
10287
|
"api-observability-axiom-pino-sentry": ["developer"],
|
|
10295
|
-
// Mobile
|
|
10296
10288
|
"mobile-framework-react-native": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10297
10289
|
"mobile-framework-expo": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10298
10290
|
"mobile-navigation-expo-router": ["developer"],
|
|
@@ -10306,7 +10298,6 @@ var PRELOAD_DEFAULTS = {
|
|
|
10306
10298
|
"mobile-performance-react-native": ["developer", "researcher"],
|
|
10307
10299
|
"mobile-testing-detox": ["tester"],
|
|
10308
10300
|
"mobile-testing-maestro": ["tester"],
|
|
10309
|
-
// Desktop
|
|
10310
10301
|
"desktop-framework-electron": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10311
10302
|
"desktop-framework-tauri": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10312
10303
|
"desktop-backend-tauri": ["developer", "researcher"],
|
|
@@ -10315,8 +10306,6 @@ var PRELOAD_DEFAULTS = {
|
|
|
10315
10306
|
"desktop-plugins-tauri": ["developer"],
|
|
10316
10307
|
"desktop-testing-electron": ["tester"],
|
|
10317
10308
|
"desktop-storage-electron": ["developer", "researcher"],
|
|
10318
|
-
// AI — the provider and the orchestration around it are what the project is
|
|
10319
|
-
// built on, so they carry the planner too; evals and tracing test
|
|
10320
10309
|
"ai-infrastructure-huggingface-inference": ["developer", "researcher"],
|
|
10321
10310
|
"ai-infrastructure-ollama": ["developer", "researcher"],
|
|
10322
10311
|
"ai-infrastructure-replicate": ["developer", "researcher"],
|
|
@@ -10332,19 +10321,14 @@ var PRELOAD_DEFAULTS = {
|
|
|
10332
10321
|
"ai-provider-google-gemini-sdk": ["developer", "planning", "researcher"],
|
|
10333
10322
|
"ai-provider-mistral-sdk": ["developer", "planning", "researcher"],
|
|
10334
10323
|
"ai-provider-openai-sdk": ["developer", "planning", "researcher"],
|
|
10335
|
-
// CLI — the framework and its prompts are the whole surface
|
|
10336
10324
|
"cli-framework-cli-commander": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10337
10325
|
"cli-framework-oclif-ink": ["developer", "planning", "researcher", "reviewer", "tester"],
|
|
10338
10326
|
"cli-prompts-clack": ["developer", "researcher", "tester"],
|
|
10339
|
-
// Infra — deployment is occasional, so almost nothing preloads
|
|
10340
10327
|
"infra-platform-cloudflare-workers": ["developer"],
|
|
10341
|
-
// Meta — the review PROCESS is every review session's material; the domain
|
|
10342
|
-
// checklists are one diff's, so they carry no row and arrive per diff
|
|
10343
10328
|
"meta-design-composable-components": ["developer"],
|
|
10344
10329
|
"meta-design-expressive-typescript": ["developer", "meta"],
|
|
10345
10330
|
"meta-methodology-research-methodology": ["researcher", "meta"],
|
|
10346
10331
|
"meta-reviewing-reviewing": ["reviewer"],
|
|
10347
|
-
// Shared — carried across every implementation domain
|
|
10348
10332
|
"shared-security-auth-security": ["developer", "researcher"]
|
|
10349
10333
|
};
|
|
10350
10334
|
var KNOWN_SKILL_IDS = new Set(SKILL_IDS);
|
|
@@ -10398,9 +10382,6 @@ var toSubAgent = (definition) => {
|
|
|
10398
10382
|
description: definition.description,
|
|
10399
10383
|
...definition.model !== void 0 && { model: definition.model },
|
|
10400
10384
|
domainId,
|
|
10401
|
-
// The same string the definition carries, read back through the preload
|
|
10402
|
-
// table's list of sayable roles — a role no entry could name is an error
|
|
10403
|
-
// there, so it is one here rather than a flavor nothing routes on.
|
|
10404
10385
|
flavor: flavorOf(definition.id)
|
|
10405
10386
|
};
|
|
10406
10387
|
};
|
|
@@ -10427,9 +10408,8 @@ var subAgentById = (agentId) => isAgentName(agentId) ? SUB_AGENTS_BY_ID[agentId]
|
|
|
10427
10408
|
var ROSTER = SUB_AGENT_GROUPS.flatMap(
|
|
10428
10409
|
(group) => group.agents
|
|
10429
10410
|
);
|
|
10430
|
-
var isCrossDomainRoleAgent = (agent) => agent.domainId === "meta" && agent.flavor !== "meta";
|
|
10431
10411
|
var implementationDomainReach = (domainId) => ROSTER.filter(
|
|
10432
|
-
(agent) => agent.domainId === domainId ||
|
|
10412
|
+
(agent) => agent.domainId === domainId || isDomainlessRoleAgent(agent.id)
|
|
10433
10413
|
);
|
|
10434
10414
|
var CRAFT_CATEGORIES_BY_FLAVOR = {
|
|
10435
10415
|
meta: ["meta-design", "meta-methodology"],
|
|
@@ -10497,17 +10477,18 @@ var toAgentsBySkill = (stack) => {
|
|
|
10497
10477
|
var toLoadByAgent = (skillId) => new Map(
|
|
10498
10478
|
resolveAssignment(skillId).map(({ agentId, load }) => [agentId, load])
|
|
10499
10479
|
);
|
|
10480
|
+
var toAssignmentTargets = (skillId, agentIds) => {
|
|
10481
|
+
const loadByAgent = toLoadByAgent(skillId);
|
|
10482
|
+
return agentIds.map((agentId) => ({
|
|
10483
|
+
agentId,
|
|
10484
|
+
load: loadByAgent.get(agentId) ?? "lazy"
|
|
10485
|
+
}));
|
|
10486
|
+
};
|
|
10500
10487
|
var toAssignmentsBySkill = (stack) => Object.fromEntries(
|
|
10501
|
-
Object.entries(toAgentsBySkill(stack)).map(([skillId, agentIds]) =>
|
|
10502
|
-
|
|
10503
|
-
|
|
10504
|
-
|
|
10505
|
-
agentIds.map((agentId) => ({
|
|
10506
|
-
agentId,
|
|
10507
|
-
load: loadByAgent.get(agentId) ?? "lazy"
|
|
10508
|
-
}))
|
|
10509
|
-
];
|
|
10510
|
-
})
|
|
10488
|
+
Object.entries(toAgentsBySkill(stack)).map(([skillId, agentIds]) => [
|
|
10489
|
+
skillId,
|
|
10490
|
+
toAssignmentTargets(skillId, agentIds)
|
|
10491
|
+
])
|
|
10511
10492
|
);
|
|
10512
10493
|
var createStackExpander = (matrix) => (stackId) => {
|
|
10513
10494
|
const stack = matrix.suggestedStacks.find(
|
|
@@ -10530,6 +10511,7 @@ var DEFAULT_SELECTION_OPTIONS = {
|
|
|
10530
10511
|
|
|
10531
10512
|
// ../matrix/src/read-model/selection-semantics.ts
|
|
10532
10513
|
var isAmbiguous = (requirement) => requirement.needsAny && requirement.skillIds.length > 1;
|
|
10514
|
+
var reasonDiscouraging = (declarer, otherId) => declarer?.discourages.find((relation) => relation.skillId === otherId)?.reason;
|
|
10533
10515
|
var createSelectionSemantics = (catalog) => {
|
|
10534
10516
|
const skillsById = new Map(catalog.skills.map((skill) => [skill.id, skill]));
|
|
10535
10517
|
const conflictIdsBySkill = /* @__PURE__ */ new Map();
|
|
@@ -10610,12 +10592,8 @@ var createSelectionSemantics = (catalog) => {
|
|
|
10610
10592
|
const discourageAgainst = (skill, sets) => {
|
|
10611
10593
|
for (const reachedId of sets.reached) {
|
|
10612
10594
|
if (reachedId === skill.id) continue;
|
|
10613
|
-
const
|
|
10614
|
-
if (
|
|
10615
|
-
const declaredBack = skill.discourages.find(
|
|
10616
|
-
(relation) => relation.skillId === reachedId
|
|
10617
|
-
);
|
|
10618
|
-
if (declaredBack) return declaredBack.reason;
|
|
10595
|
+
const reason = reasonDiscouraging(skillsById.get(reachedId), skill.id) ?? reasonDiscouraging(skill, reachedId);
|
|
10596
|
+
if (reason !== void 0) return reason;
|
|
10619
10597
|
}
|
|
10620
10598
|
return void 0;
|
|
10621
10599
|
};
|
|
@@ -10700,20 +10678,16 @@ var seedScopeSchema = z3.enum(["project", "global"]);
|
|
|
10700
10678
|
var seedSkillSchema = z3.object({
|
|
10701
10679
|
install: z3.enum(["plugin", "eject"]),
|
|
10702
10680
|
scope: seedScopeSchema,
|
|
10703
|
-
// Sub-agent id → load state; presence is assignment.
|
|
10704
|
-
// matching the granularity of the CLI's stack config.
|
|
10681
|
+
// Sub-agent id → load state; presence is assignment.
|
|
10705
10682
|
assignments: z3.record(z3.string(), seedLoadStateSchema)
|
|
10706
10683
|
});
|
|
10707
10684
|
var seedAgentSchema = z3.object({
|
|
10708
10685
|
on: z3.boolean().exactOptional(),
|
|
10709
10686
|
model: seedModelSchema.exactOptional(),
|
|
10710
|
-
//
|
|
10711
|
-
// turn each retirement into a version bump. Each consumer drops an id it does
|
|
10712
|
-
// not offer.
|
|
10687
|
+
// Not an enum: Codex retires ids; consumers drop ones they do not offer.
|
|
10713
10688
|
codexModel: z3.string().min(1).exactOptional(),
|
|
10714
10689
|
effort: seedEffortSchema.exactOptional(),
|
|
10715
|
-
// Absent means `DEFAULT_SELECTION_OPTIONS.scope
|
|
10716
|
-
// travels.
|
|
10690
|
+
// Absent means `DEFAULT_SELECTION_OPTIONS.scope`.
|
|
10717
10691
|
scope: seedScopeSchema.exactOptional()
|
|
10718
10692
|
});
|
|
10719
10693
|
var MAX_EXTERNAL_SKILL_BYTES = 262144;
|
|
@@ -10733,45 +10707,45 @@ var seedSkillTreeSchema = z3.record(z3.string().min(1), z3.string()).refine((fil
|
|
|
10733
10707
|
var seedExternalSkillSchema = z3.object({
|
|
10734
10708
|
displayName: z3.string().min(1),
|
|
10735
10709
|
description: z3.string(),
|
|
10736
|
-
//
|
|
10710
|
+
// Confirmed by the user at add time, never derived.
|
|
10737
10711
|
categoryId: z3.string().min(1),
|
|
10738
|
-
//
|
|
10712
|
+
// `owner/name`.
|
|
10739
10713
|
repo: z3.string().min(1),
|
|
10740
|
-
// The skill's
|
|
10714
|
+
// The skill's directory (`skills/docx`), not its SKILL.md.
|
|
10741
10715
|
path: z3.string().min(1),
|
|
10742
10716
|
files: seedSkillTreeSchema
|
|
10743
10717
|
});
|
|
10744
10718
|
var seedPayloadSchema = z3.object({
|
|
10745
10719
|
v: z3.literal(SEED_VERSION),
|
|
10746
|
-
// Diagnostics only
|
|
10747
|
-
// decode — it explains why some ids were skipped.
|
|
10720
|
+
// Diagnostics only; a mismatch must not fail the decode.
|
|
10748
10721
|
matrixVersion: z3.string(),
|
|
10749
10722
|
stackId: z3.string().nullable(),
|
|
10750
|
-
//
|
|
10751
|
-
// of a stack id, which would bring back the stack's whole roster on install.
|
|
10723
|
+
// Travels instead of a stack id, which would reinstall the stack's whole roster.
|
|
10752
10724
|
description: z3.string().exactOptional(),
|
|
10753
|
-
//
|
|
10754
|
-
// the default public catalogue.
|
|
10725
|
+
// As `--marketplace` takes it; absent is the public catalogue.
|
|
10755
10726
|
marketplace: z3.string().exactOptional(),
|
|
10756
|
-
//
|
|
10727
|
+
// Presence is selection.
|
|
10757
10728
|
skills: z3.record(z3.string(), seedSkillSchema),
|
|
10758
|
-
//
|
|
10729
|
+
// For ids no catalogue can resolve.
|
|
10759
10730
|
external: z3.record(z3.string(), seedExternalSkillSchema).exactOptional(),
|
|
10760
|
-
//
|
|
10761
|
-
// install — assignments and `on: true` decide that.
|
|
10731
|
+
// Presence is not an install; assignments and `on: true` decide that.
|
|
10762
10732
|
agents: z3.record(z3.string(), seedAgentSchema)
|
|
10763
10733
|
});
|
|
10764
10734
|
var isSeedScopePairWritable = (skillScope, agentScope) => !(skillScope === "project" && agentScope === "global");
|
|
10765
10735
|
var seedAgentScope = (entry) => entry?.scope ?? DEFAULT_SELECTION_OPTIONS.scope;
|
|
10766
|
-
var isSwitchedOff = (entry) => entry?.on === false;
|
|
10767
10736
|
var isUnwritablePair = (agents, skillScope, agent) => {
|
|
10768
10737
|
const entry = agents[agent];
|
|
10769
|
-
if (
|
|
10738
|
+
if (entry?.on === false) return false;
|
|
10770
10739
|
return !isSeedScopePairWritable(skillScope, seedAgentScope(entry));
|
|
10771
10740
|
};
|
|
10772
10741
|
var unwritableSeedAssignments = (payload) => Object.entries(payload.skills).flatMap(
|
|
10773
10742
|
([skillId, skill]) => Object.keys(skill.assignments).filter((agent) => isUnwritablePair(payload.agents, skill.scope, agent)).map((agent) => ({ skillId, agent }))
|
|
10774
10743
|
);
|
|
10744
|
+
var PATH_SEPARATOR = /[/\\]/;
|
|
10745
|
+
var isControlCode = (code) => code <= 31 || code >= 127 && code <= 159;
|
|
10746
|
+
var holdsAControl = (id) => Array.from(id, (character) => character.charCodeAt(0)).some(isControlCode);
|
|
10747
|
+
var namesOneDirectory = (id) => id !== "" && id !== "." && id !== ".." && !PATH_SEPARATOR.test(id) && !holdsAControl(id);
|
|
10748
|
+
var externalIdsNamingNoDirectory = (payload) => Object.keys(payload.external ?? {}).filter((id) => !namesOneDirectory(id));
|
|
10775
10749
|
var installableSeedPayloadSchema = seedPayloadSchema.superRefine(
|
|
10776
10750
|
(payload, ctx) => {
|
|
10777
10751
|
for (const { skillId, agent } of unwritableSeedAssignments(payload)) {
|
|
@@ -10781,6 +10755,13 @@ var installableSeedPayloadSchema = seedPayloadSchema.superRefine(
|
|
|
10781
10755
|
message: `a project-scoped skill has nowhere to be written on '${agent}', which rests at global scope`
|
|
10782
10756
|
});
|
|
10783
10757
|
}
|
|
10758
|
+
for (const id of externalIdsNamingNoDirectory(payload)) {
|
|
10759
|
+
ctx.addIssue({
|
|
10760
|
+
code: "custom",
|
|
10761
|
+
path: ["external", id],
|
|
10762
|
+
message: "a carried skill's id is the directory it is written into, so it must name exactly one directory and hold no control character"
|
|
10763
|
+
});
|
|
10764
|
+
}
|
|
10784
10765
|
}
|
|
10785
10766
|
);
|
|
10786
10767
|
|
|
@@ -10791,8 +10772,7 @@ var matrixCategorySchema = z4.object({
|
|
|
10791
10772
|
id: idSchema,
|
|
10792
10773
|
displayName: z4.string(),
|
|
10793
10774
|
description: z4.string(),
|
|
10794
|
-
//
|
|
10795
|
-
// UI, so a consumer drops it rather than failing the whole catalogue.
|
|
10775
|
+
// A category without one is dropped by consumers, not rejected.
|
|
10796
10776
|
domain: z4.string().exactOptional(),
|
|
10797
10777
|
exclusive: z4.boolean(),
|
|
10798
10778
|
order: z4.number()
|
|
@@ -10811,14 +10791,9 @@ var matrixSkillSchema = z4.object({
|
|
|
10811
10791
|
slug: z4.string(),
|
|
10812
10792
|
displayName: z4.string(),
|
|
10813
10793
|
description: z4.string(),
|
|
10814
|
-
//
|
|
10815
|
-
// the editor's preview renders verbatim. Optional because a marketplace's own
|
|
10816
|
-
// skills may state none; omitting it here would strip it from every fetched
|
|
10817
|
-
// `catalog.json` and make every marketplace look like it states none.
|
|
10794
|
+
// A compiled sub-agent's cue to load the skill.
|
|
10818
10795
|
usageGuidance: z4.string().exactOptional(),
|
|
10819
|
-
// The SKILL.md description
|
|
10820
|
-
// `description` is the short label. The preview renders this one so
|
|
10821
|
-
// it shows what the install writes (CLI-898); absent on older catalogues.
|
|
10796
|
+
// The SKILL.md description the activation table shows; `description` is the short label.
|
|
10822
10797
|
activationDescription: z4.string().exactOptional(),
|
|
10823
10798
|
category: idSchema,
|
|
10824
10799
|
conflictsWith: z4.array(skillRelationSchema2),
|
|
@@ -10829,13 +10804,10 @@ var matrixStackSchema = z4.object({
|
|
|
10829
10804
|
id: idSchema,
|
|
10830
10805
|
name: z4.string(),
|
|
10831
10806
|
description: z4.string(),
|
|
10832
|
-
// agent id → category id → skill ids.
|
|
10833
|
-
// rather than the whole roster, and the agent roster is as marketplace-owned
|
|
10834
|
-
// as the skills are, so neither level is narrowed.
|
|
10807
|
+
// agent id → category id → skill ids.
|
|
10835
10808
|
skills: z4.record(z4.string(), z4.record(z4.string(), z4.array(idSchema))),
|
|
10836
10809
|
allSkillIds: z4.array(idSchema),
|
|
10837
10810
|
philosophy: z4.string(),
|
|
10838
|
-
// Never populated by the CLI today; a stack rail groups by it when it appears.
|
|
10839
10811
|
group: z4.string().exactOptional()
|
|
10840
10812
|
});
|
|
10841
10813
|
var matrixSchema = z4.object({
|
|
@@ -10848,37 +10820,20 @@ var matrixSchema = z4.object({
|
|
|
10848
10820
|
// ../matrix/src/skill-index.ts
|
|
10849
10821
|
import { z as z5 } from "zod";
|
|
10850
10822
|
var skillIndexEntrySchema = z5.object({
|
|
10851
|
-
//
|
|
10852
|
-
// directory name where there is not. Never empty: a skill with neither is
|
|
10853
|
-
// not addressable and does not make it into the index.
|
|
10823
|
+
// Frontmatter `name`, else the directory name.
|
|
10854
10824
|
name: z5.string().min(1),
|
|
10855
|
-
// Frontmatter `description`,
|
|
10856
|
-
// file offers neither, which is a thin result rather than an invalid one.
|
|
10825
|
+
// Frontmatter `description`, else the first heading; may be empty.
|
|
10857
10826
|
description: z5.string(),
|
|
10858
|
-
//
|
|
10859
|
-
// without a second lookup.
|
|
10827
|
+
// `owner/name`.
|
|
10860
10828
|
repo: z5.string().min(1),
|
|
10861
|
-
// The skill
|
|
10862
|
-
// `skills/docx/SKILL.md`. A skill is a directory in every consumer of this
|
|
10863
|
-
// index, and the file is only how the directory proves itself.
|
|
10829
|
+
// The skill's directory (`skills/docx`), not its SKILL.md.
|
|
10864
10830
|
path: z5.string().min(1),
|
|
10865
|
-
// The
|
|
10866
|
-
// repo rather than the skill, repeated per entry because the dialog ranks
|
|
10867
|
-
// and badges individual results.
|
|
10831
|
+
// The repo's stars, repeated per entry for ranking.
|
|
10868
10832
|
stars: z5.number().int().nonnegative(),
|
|
10869
|
-
//
|
|
10870
|
-
// sizes GitHub reported for them in the tree listing the crawl already made,
|
|
10871
|
-
// never a download. Repeated per entry because the cap it is read against is
|
|
10872
|
-
// per skill: `MAX_EXTERNAL_SKILL_BYTES` decides whether one directory can
|
|
10873
|
-
// ride a shared link, and without this number that decision cannot be made
|
|
10874
|
-
// until the consumer has listed the repository itself. Zero is a real answer,
|
|
10875
|
-
// for a directory GitHub reported no sizes for at all.
|
|
10833
|
+
// Directory size from GitHub's tree listing, checked against `MAX_EXTERNAL_SKILL_BYTES`.
|
|
10876
10834
|
bytes: z5.number().int().nonnegative()
|
|
10877
10835
|
});
|
|
10878
10836
|
var skillIndexSchema = z5.object({
|
|
10879
|
-
// When this index was assembled, as an ISO 8601 instant. The worker's own
|
|
10880
|
-
// freshness check reads it, and it is served so a caller can say how old the
|
|
10881
|
-
// list is rather than having to guess.
|
|
10882
10837
|
builtAt: z5.iso.datetime(),
|
|
10883
10838
|
skills: z5.array(skillIndexEntrySchema)
|
|
10884
10839
|
});
|
|
@@ -10915,17 +10870,6 @@ function orderDomains(domains) {
|
|
|
10915
10870
|
];
|
|
10916
10871
|
}
|
|
10917
10872
|
|
|
10918
|
-
// ../compile/src/string.ts
|
|
10919
|
-
function bytewise(a, b) {
|
|
10920
|
-
return a < b ? -1 : a > b ? 1 : 0;
|
|
10921
|
-
}
|
|
10922
|
-
function inAnEnglishList(items) {
|
|
10923
|
-
const last = items.at(-1);
|
|
10924
|
-
if (last === void 0) return "";
|
|
10925
|
-
if (items.length === 1) return last;
|
|
10926
|
-
return `${items.slice(0, -1).join(", ")} and ${last}`;
|
|
10927
|
-
}
|
|
10928
|
-
|
|
10929
10873
|
// ../compile/src/selection.ts
|
|
10930
10874
|
import { groupBy as groupBy2 } from "remeda";
|
|
10931
10875
|
function skillOrThrow(catalog, id) {
|
|
@@ -10938,75 +10882,87 @@ function validateConflicts(catalog, selections) {
|
|
|
10938
10882
|
return selections.flatMap((skillAId, index) => {
|
|
10939
10883
|
const skillA = catalog.skills[skillAId];
|
|
10940
10884
|
if (!skillA) return [];
|
|
10941
|
-
return selections.slice(index + 1).flatMap((skillBId) =>
|
|
10942
|
-
const conflict = (skillA.conflictsWith ?? []).find(
|
|
10943
|
-
(c) => c.skillId === skillBId
|
|
10944
|
-
);
|
|
10945
|
-
if (!conflict) return [];
|
|
10946
|
-
return [
|
|
10947
|
-
{
|
|
10948
|
-
type: "conflict",
|
|
10949
|
-
message: `${skillA.displayName} conflicts with ${labelOf2(catalog, skillBId)}: ${conflict.reason}`,
|
|
10950
|
-
// Boundary cast: the id came out of the catalogue's own relationship table.
|
|
10951
|
-
skills: [skillA.id, skillBId]
|
|
10952
|
-
}
|
|
10953
|
-
];
|
|
10954
|
-
});
|
|
10885
|
+
return selections.slice(index + 1).flatMap((skillBId) => declaredConflict(catalog, skillA, skillBId));
|
|
10955
10886
|
});
|
|
10956
10887
|
}
|
|
10888
|
+
function declaredConflict(catalog, skillA, skillBId) {
|
|
10889
|
+
const conflict = (skillA.conflictsWith ?? []).find(
|
|
10890
|
+
(c) => c.skillId === skillBId
|
|
10891
|
+
);
|
|
10892
|
+
if (!conflict) return [];
|
|
10893
|
+
return [
|
|
10894
|
+
{
|
|
10895
|
+
type: "conflict",
|
|
10896
|
+
message: `${skillA.displayName} conflicts with ${labelOf2(catalog, skillBId)}: ${conflict.reason}`,
|
|
10897
|
+
// Boundary cast: the id came out of the catalogue's own relationship table.
|
|
10898
|
+
skills: [skillA.id, skillBId]
|
|
10899
|
+
}
|
|
10900
|
+
];
|
|
10901
|
+
}
|
|
10957
10902
|
function validateRequirements(catalog, selections, selectedSet) {
|
|
10958
10903
|
return selections.flatMap((skillId) => {
|
|
10959
10904
|
const skill = catalog.skills[skillId];
|
|
10960
10905
|
if (!skill) return [];
|
|
10961
|
-
return (skill.requires ?? []).flatMap(
|
|
10962
|
-
|
|
10963
|
-
|
|
10964
|
-
if (requiredIds.some((reqId) => selectedSet.has(reqId))) return [];
|
|
10965
|
-
return [
|
|
10966
|
-
{
|
|
10967
|
-
type: "missingRequirement",
|
|
10968
|
-
message: `${skill.displayName} requires one of: ${requiredIds.map((id) => labelOf2(catalog, id)).join(", ")}`,
|
|
10969
|
-
skills: [skillId, ...requiredIds]
|
|
10970
|
-
}
|
|
10971
|
-
];
|
|
10972
|
-
}
|
|
10973
|
-
const missingIds = requiredIds.filter((reqId) => !selectedSet.has(reqId));
|
|
10974
|
-
if (missingIds.length === 0) return [];
|
|
10975
|
-
return [
|
|
10976
|
-
{
|
|
10977
|
-
type: "missingRequirement",
|
|
10978
|
-
message: `${skill.displayName} requires: ${missingIds.map((id) => labelOf2(catalog, id)).join(", ")}`,
|
|
10979
|
-
skills: [skillId, ...missingIds]
|
|
10980
|
-
}
|
|
10981
|
-
];
|
|
10982
|
-
});
|
|
10906
|
+
return (skill.requires ?? []).flatMap(
|
|
10907
|
+
(requirement) => unmetRequirement(catalog, skillId, skill, requirement, selectedSet)
|
|
10908
|
+
);
|
|
10983
10909
|
});
|
|
10984
10910
|
}
|
|
10911
|
+
function unmetRequirement(catalog, skillId, skill, requirement, selectedSet) {
|
|
10912
|
+
const requiredIds = requirement.skillIds;
|
|
10913
|
+
if (requirement.needsAny) {
|
|
10914
|
+
if (requiredIds.some((reqId) => selectedSet.has(reqId))) return [];
|
|
10915
|
+
return [
|
|
10916
|
+
{
|
|
10917
|
+
type: "missingRequirement",
|
|
10918
|
+
message: `${skill.displayName} requires one of: ${labelsOf(catalog, requiredIds)}`,
|
|
10919
|
+
skills: [skillId, ...requiredIds]
|
|
10920
|
+
}
|
|
10921
|
+
];
|
|
10922
|
+
}
|
|
10923
|
+
const missingIds = requiredIds.filter((reqId) => !selectedSet.has(reqId));
|
|
10924
|
+
if (missingIds.length === 0) return [];
|
|
10925
|
+
return [
|
|
10926
|
+
{
|
|
10927
|
+
type: "missingRequirement",
|
|
10928
|
+
message: `${skill.displayName} requires: ${labelsOf(catalog, missingIds)}`,
|
|
10929
|
+
skills: [skillId, ...missingIds]
|
|
10930
|
+
}
|
|
10931
|
+
];
|
|
10932
|
+
}
|
|
10933
|
+
function labelsOf(catalog, ids) {
|
|
10934
|
+
return ids.map((id) => labelOf2(catalog, id)).join(", ");
|
|
10935
|
+
}
|
|
10985
10936
|
function validateExclusivity(catalog, selections) {
|
|
10986
10937
|
const resolved = selections.map((skillId) => ({ skillId, skill: catalog.skills[skillId] })).filter(
|
|
10987
10938
|
(entry) => entry.skill != null
|
|
10988
10939
|
);
|
|
10989
10940
|
return Object.entries(
|
|
10990
10941
|
groupBy2(resolved, (entry) => entry.skill.category)
|
|
10991
|
-
).flatMap(
|
|
10992
|
-
|
|
10993
|
-
|
|
10994
|
-
|
|
10995
|
-
|
|
10996
|
-
|
|
10997
|
-
|
|
10998
|
-
|
|
10999
|
-
|
|
11000
|
-
|
|
11001
|
-
|
|
11002
|
-
|
|
11003
|
-
|
|
11004
|
-
|
|
10942
|
+
).flatMap(
|
|
10943
|
+
([categoryId, entries]) => exclusivityBreach(
|
|
10944
|
+
catalog,
|
|
10945
|
+
categoryId,
|
|
10946
|
+
entries.map((e) => e.skillId)
|
|
10947
|
+
)
|
|
10948
|
+
);
|
|
10949
|
+
}
|
|
10950
|
+
function exclusivityBreach(catalog, categoryId, skillIds) {
|
|
10951
|
+
if (skillIds.length <= 1) return [];
|
|
10952
|
+
if (categoryId === LOCAL_PSEUDO_CATEGORY) return [];
|
|
10953
|
+
const category = catalog.categories[categoryId];
|
|
10954
|
+
if (category?.exclusive !== true) return [];
|
|
10955
|
+
return [
|
|
10956
|
+
{
|
|
10957
|
+
type: "categoryExclusive",
|
|
10958
|
+
message: `Category "${category.displayName}" only allows one selection, but multiple selected: ${labelsOf(catalog, skillIds)}`,
|
|
10959
|
+
skills: skillIds
|
|
10960
|
+
}
|
|
10961
|
+
];
|
|
11005
10962
|
}
|
|
11006
10963
|
function validateSelection(selections, catalog) {
|
|
11007
10964
|
const resolvedSelections = selections.map(
|
|
11008
|
-
// Boundary cast:
|
|
11009
|
-
// skill's `id` is typed `string` on the narrow shape so the wire `Matrix` satisfies it too.
|
|
10965
|
+
// Boundary cast: a catalogue id, typed `string` so the wire `Matrix` fits the shape.
|
|
11010
10966
|
(id) => skillOrThrow(catalog, id).id
|
|
11011
10967
|
);
|
|
11012
10968
|
const selectedSet = new Set(resolvedSelections);
|
|
@@ -11025,11 +10981,13 @@ function sourceDirName(provider) {
|
|
|
11025
10981
|
}
|
|
11026
10982
|
|
|
11027
10983
|
// src/cli/consts.ts
|
|
10984
|
+
import os from "os";
|
|
10985
|
+
import path from "path";
|
|
10986
|
+
import { fileURLToPath } from "url";
|
|
11028
10987
|
var __filename2 = fileURLToPath(import.meta.url);
|
|
11029
10988
|
var __dirname2 = path.dirname(__filename2);
|
|
11030
10989
|
var isInDist = __dirname2.includes("/dist");
|
|
11031
|
-
var
|
|
11032
|
-
var PROJECT_ROOT = CLI_ROOT;
|
|
10990
|
+
var PROJECT_ROOT = isInDist ? path.resolve(__dirname2, "..") : path.resolve(__dirname2, "../..");
|
|
11033
10991
|
var PLUGINS_SUBDIR = "plugins";
|
|
11034
10992
|
var PLUGIN_MANIFEST_DIR = ".claude-plugin";
|
|
11035
10993
|
var MARKETPLACE_JSON = "marketplace.json";
|
|
@@ -11045,7 +11003,8 @@ function globalInstallRoot() {
|
|
|
11045
11003
|
function cacheRoot() {
|
|
11046
11004
|
return path.join(os.homedir(), ".cache", DEFAULT_PLUGIN_NAME);
|
|
11047
11005
|
}
|
|
11048
|
-
var
|
|
11006
|
+
var DEFAULT_EDITOR_URL = "https://agentsinc.sh/editor";
|
|
11007
|
+
var EDITOR_URL = process.env.AGENTS_INC_EDITOR_URL ?? DEFAULT_EDITOR_URL;
|
|
11049
11008
|
function editorConfigUrl(id) {
|
|
11050
11009
|
return `${EDITOR_URL}/?fromId=${encodeURIComponent(id)}`;
|
|
11051
11010
|
}
|
|
@@ -11066,7 +11025,7 @@ var SCHEMA_PATHS = {
|
|
|
11066
11025
|
var YAML_FORMATTING = {
|
|
11067
11026
|
INDENT: 2,
|
|
11068
11027
|
LINE_WIDTH: 120,
|
|
11069
|
-
/**
|
|
11028
|
+
/** 0 disables wrapping. */
|
|
11070
11029
|
LINE_WIDTH_NONE: 0
|
|
11071
11030
|
};
|
|
11072
11031
|
var CHECK_GLYPH = "\u2713";
|
|
@@ -11087,9 +11046,7 @@ var UI_SYMBOLS = {
|
|
|
11087
11046
|
SCROLL_DOWN: "\u25BC",
|
|
11088
11047
|
CHECK: CHECK_GLYPH,
|
|
11089
11048
|
CROSS: "\u2717",
|
|
11090
|
-
/** Removed/pending-removal diff marker (ASCII hyphen). */
|
|
11091
11049
|
REMOVED: "-",
|
|
11092
|
-
/** Added/newly-selected diff marker (ASCII plus). */
|
|
11093
11050
|
ADDED: "+"
|
|
11094
11051
|
};
|
|
11095
11052
|
var GITHUB_SOURCE = {
|
|
@@ -11109,7 +11066,6 @@ var MAX_CONFIG_FILE_SIZE = ONE_MB;
|
|
|
11109
11066
|
var MAX_JSON_NESTING_DEPTH = 10;
|
|
11110
11067
|
var MAX_MARKETPLACE_PLUGINS = 1e4;
|
|
11111
11068
|
var SCROLL_VIEWPORT = {
|
|
11112
|
-
/** Height of the "N more above" scroll indicator */
|
|
11113
11069
|
SCROLL_INDICATOR_HEIGHT: 1
|
|
11114
11070
|
};
|
|
11115
11071
|
var MIN_TERMINAL_SIZE = {
|
|
@@ -11167,6 +11123,7 @@ export {
|
|
|
11167
11123
|
seedPayloadSchema,
|
|
11168
11124
|
isSeedScopePairWritable,
|
|
11169
11125
|
seedAgentScope,
|
|
11126
|
+
externalIdsNamingNoDirectory,
|
|
11170
11127
|
installableSeedPayloadSchema,
|
|
11171
11128
|
seatCatalog,
|
|
11172
11129
|
seatedCatalog,
|
|
@@ -11182,6 +11139,7 @@ export {
|
|
|
11182
11139
|
LOCAL_SKILLS_PATH,
|
|
11183
11140
|
DEFAULT_PLUGIN_NAME,
|
|
11184
11141
|
DEFAULT_PUBLIC_SOURCE_NAME,
|
|
11142
|
+
GITHUB_PREFIX,
|
|
11185
11143
|
DEFAULT_SOURCE,
|
|
11186
11144
|
CLI_INVOKE_COMMAND,
|
|
11187
11145
|
EJECT_SOURCE,
|
|
@@ -11241,4 +11199,4 @@ export {
|
|
|
11241
11199
|
CLI_COLORS,
|
|
11242
11200
|
ASCII_LOGO
|
|
11243
11201
|
};
|
|
11244
|
-
//# sourceMappingURL=chunk-
|
|
11202
|
+
//# sourceMappingURL=chunk-7C3PFRBU.js.map
|