@claude-collective/cli 0.6.0 → 0.8.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 +65 -0
- package/dist/{chunk-D4IQAT27.js → chunk-3HBTELJN.js} +2 -2
- package/dist/{chunk-6ESUJMM7.js → chunk-3ZCB5K33.js} +3 -3
- package/dist/chunk-66UDJBF6.js +96 -0
- package/dist/chunk-66UDJBF6.js.map +1 -0
- package/dist/chunk-6LS7XO3H.js +31 -0
- package/dist/chunk-6LS7XO3H.js.map +1 -0
- package/dist/{chunk-SJYG4EJZ.js → chunk-A3J6IAXK.js} +7 -7
- package/dist/{chunk-SJYG4EJZ.js.map → chunk-A3J6IAXK.js.map} +1 -1
- package/dist/chunk-A65SBAAJ.js +69 -0
- package/dist/chunk-A65SBAAJ.js.map +1 -0
- package/dist/chunk-ALEPJ6YN.js +80 -0
- package/dist/chunk-ALEPJ6YN.js.map +1 -0
- package/dist/{chunk-367K3JB3.js → chunk-C4ZTIYFR.js} +3 -3
- package/dist/{chunk-FKU7VSUD.js → chunk-CIY5UBRB.js} +2 -2
- package/dist/{chunk-6WEQADPL.js → chunk-DKGL77IY.js} +4 -4
- package/dist/chunk-ED73HCW2.js +315 -0
- package/dist/chunk-ED73HCW2.js.map +1 -0
- package/dist/{chunk-URDV4OCP.js → chunk-FNOYEXUE.js} +5 -5
- package/dist/{chunk-OSQDDJXX.js → chunk-G2FBJOZG.js} +2 -7
- package/dist/chunk-G2FBJOZG.js.map +1 -0
- package/dist/chunk-HNDT5QRB.js +120 -0
- package/dist/chunk-HNDT5QRB.js.map +1 -0
- package/dist/chunk-K7PTOVX4.js +158 -0
- package/dist/chunk-K7PTOVX4.js.map +1 -0
- package/dist/{chunk-AU7XVCLO.js → chunk-LQTST4WY.js} +2 -2
- package/dist/chunk-LVKRVFYR.js +54 -0
- package/dist/chunk-LVKRVFYR.js.map +1 -0
- package/dist/{chunk-ZSKHDU5P.js → chunk-NGBFJJ7Q.js} +2 -2
- package/dist/{chunk-UNHCZRO4.js → chunk-OLBOTK3O.js} +2 -2
- package/dist/chunk-PPNTD5LO.js +330 -0
- package/dist/chunk-PPNTD5LO.js.map +1 -0
- package/dist/{chunk-UFWNMW3G.js → chunk-Q2LH2DAB.js} +5 -5
- package/dist/{chunk-AZP2AA5M.js → chunk-Q6DR5QUH.js} +206 -84
- package/dist/chunk-Q6DR5QUH.js.map +1 -0
- package/dist/{chunk-JMQGWQZU.js → chunk-QGGSLMO3.js} +3 -3
- package/dist/chunk-QGGSLMO3.js.map +1 -0
- package/dist/{chunk-J2Y4A3LP.js → chunk-SEBPPFUW.js} +2 -2
- package/dist/chunk-SEBPPFUW.js.map +1 -0
- package/dist/chunk-UOWHJ6BE.js +83 -0
- package/dist/chunk-UOWHJ6BE.js.map +1 -0
- package/dist/{chunk-ZDQIUHAM.js → chunk-XKEG3SCV.js} +13 -16
- package/dist/chunk-XKEG3SCV.js.map +1 -0
- package/dist/chunk-XY3XDVMI.js +15599 -0
- package/dist/chunk-XY3XDVMI.js.map +1 -0
- package/dist/chunk-Y3V43XCU.js +76 -0
- package/dist/chunk-Y3V43XCU.js.map +1 -0
- package/dist/{chunk-TFV6Z7F7.js → chunk-YKXBGCFD.js} +4 -4
- package/dist/commands/build/marketplace.js +11 -52
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +11 -49
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +7 -7
- package/dist/commands/compile.js +10 -10
- package/dist/commands/diff.js +4 -4
- package/dist/commands/doctor.js +4 -4
- package/dist/commands/edit.js +24 -23
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +2 -2
- package/dist/commands/info.js +4 -4
- package/dist/commands/init.js +20 -19
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +2 -2
- package/dist/commands/new/skill.js +1 -1
- package/dist/commands/outdated.js +4 -4
- package/dist/commands/search.js +4 -4
- package/dist/commands/test-imports.js +9 -9
- package/dist/commands/uninstall.js +15 -8
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +12 -12
- package/dist/commands/validate.js +2 -2
- package/dist/commands/version/bump.js +2 -2
- package/dist/commands/version/index.js +2 -2
- package/dist/commands/version/set.js +1 -1
- package/dist/commands/version/show.js +2 -2
- package/dist/components/wizard/category-grid.js +9 -0
- package/dist/components/wizard/category-grid.test.js +728 -0
- package/dist/components/wizard/category-grid.test.js.map +1 -0
- package/dist/components/wizard/section-progress.js +9 -0
- package/dist/components/wizard/section-progress.test.js +281 -0
- package/dist/components/wizard/section-progress.test.js.map +1 -0
- package/dist/components/wizard/step-approach.js +3 -3
- package/dist/components/wizard/step-build.js +15 -0
- package/dist/components/wizard/step-build.test.js +729 -0
- package/dist/components/wizard/step-build.test.js.map +1 -0
- package/dist/components/wizard/step-confirm.js +1 -4
- package/dist/components/wizard/step-refine.js +9 -0
- package/dist/components/wizard/step-refine.js.map +1 -0
- package/dist/components/wizard/step-refine.test.js +235 -0
- package/dist/components/wizard/step-refine.test.js.map +1 -0
- package/dist/components/wizard/step-stack-options.js +11 -0
- package/dist/components/wizard/step-stack-options.js.map +1 -0
- package/dist/components/wizard/step-stack.js +3 -3
- package/dist/components/wizard/wizard-tabs.js +11 -0
- package/dist/components/wizard/wizard-tabs.js.map +1 -0
- package/dist/components/wizard/wizard.js +12 -11
- package/dist/stores/wizard-store.js +2 -2
- package/dist/stores/wizard-store.test.js +249 -15835
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-6OY6ZYQF.js +0 -93
- package/dist/chunk-6OY6ZYQF.js.map +0 -1
- package/dist/chunk-AZP2AA5M.js.map +0 -1
- package/dist/chunk-J2Y4A3LP.js.map +0 -1
- package/dist/chunk-JMQGWQZU.js.map +0 -1
- package/dist/chunk-JY4RO76L.js +0 -73
- package/dist/chunk-JY4RO76L.js.map +0 -1
- package/dist/chunk-OSQDDJXX.js.map +0 -1
- package/dist/chunk-TD643KB3.js +0 -245
- package/dist/chunk-TD643KB3.js.map +0 -1
- package/dist/chunk-TGOHJCQ4.js +0 -83
- package/dist/chunk-TGOHJCQ4.js.map +0 -1
- package/dist/chunk-YI6JVSFO.js +0 -43
- package/dist/chunk-YI6JVSFO.js.map +0 -1
- package/dist/chunk-YNSNRR5D.js +0 -184
- package/dist/chunk-YNSNRR5D.js.map +0 -1
- package/dist/chunk-Z6DLWTBY.js +0 -46
- package/dist/chunk-Z6DLWTBY.js.map +0 -1
- package/dist/chunk-ZDQIUHAM.js.map +0 -1
- package/dist/components/wizard/selection-header.js +0 -11
- package/dist/components/wizard/step-category.js +0 -12
- package/dist/components/wizard/step-subcategory.js +0 -13
- /package/dist/{chunk-D4IQAT27.js.map → chunk-3HBTELJN.js.map} +0 -0
- /package/dist/{chunk-6ESUJMM7.js.map → chunk-3ZCB5K33.js.map} +0 -0
- /package/dist/{chunk-367K3JB3.js.map → chunk-C4ZTIYFR.js.map} +0 -0
- /package/dist/{chunk-FKU7VSUD.js.map → chunk-CIY5UBRB.js.map} +0 -0
- /package/dist/{chunk-6WEQADPL.js.map → chunk-DKGL77IY.js.map} +0 -0
- /package/dist/{chunk-URDV4OCP.js.map → chunk-FNOYEXUE.js.map} +0 -0
- /package/dist/{chunk-AU7XVCLO.js.map → chunk-LQTST4WY.js.map} +0 -0
- /package/dist/{chunk-ZSKHDU5P.js.map → chunk-NGBFJJ7Q.js.map} +0 -0
- /package/dist/{chunk-UNHCZRO4.js.map → chunk-OLBOTK3O.js.map} +0 -0
- /package/dist/{chunk-UFWNMW3G.js.map → chunk-Q2LH2DAB.js.map} +0 -0
- /package/dist/{chunk-TFV6Z7F7.js.map → chunk-YKXBGCFD.js.map} +0 -0
- /package/dist/components/wizard/{selection-header.js.map → category-grid.js.map} +0 -0
- /package/dist/components/wizard/{step-category.js.map → section-progress.js.map} +0 -0
- /package/dist/components/wizard/{step-subcategory.js.map → step-build.js.map} +0 -0
package/package.json
CHANGED
package/dist/chunk-6OY6ZYQF.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
DEFAULT_PRESELECTED_SKILLS
|
|
4
|
-
} from "./chunk-SJYG4EJZ.js";
|
|
5
|
-
import {
|
|
6
|
-
init_esm_shims
|
|
7
|
-
} from "./chunk-DHET7RCE.js";
|
|
8
|
-
|
|
9
|
-
// src/cli-v2/stores/wizard-store.ts
|
|
10
|
-
init_esm_shims();
|
|
11
|
-
import { create } from "zustand";
|
|
12
|
-
var createInitialState = (options) => {
|
|
13
|
-
const hasInitialSkills = options?.initialSkills && options.initialSkills.length > 0;
|
|
14
|
-
const baseSkills = [...DEFAULT_PRESELECTED_SKILLS];
|
|
15
|
-
const initialSkills = options?.initialSkills ?? [];
|
|
16
|
-
const combinedSkills = [.../* @__PURE__ */ new Set([...baseSkills, ...initialSkills])];
|
|
17
|
-
return {
|
|
18
|
-
step: hasInitialSkills ? "category" : "approach",
|
|
19
|
-
selectedSkills: combinedSkills,
|
|
20
|
-
selectedStack: null,
|
|
21
|
-
expertMode: options?.hasLocalSkills ?? false,
|
|
22
|
-
installMode: "local",
|
|
23
|
-
history: [],
|
|
24
|
-
currentTopCategory: null,
|
|
25
|
-
currentSubcategory: null,
|
|
26
|
-
visitedCategories: /* @__PURE__ */ new Set(),
|
|
27
|
-
lastSelectedCategory: null,
|
|
28
|
-
lastSelectedSubcategory: null,
|
|
29
|
-
lastSelectedSkill: null,
|
|
30
|
-
lastSelectedApproach: null
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
var useWizardStore = create((set, get) => ({
|
|
34
|
-
...createInitialState(),
|
|
35
|
-
setStep: (step) => set((state) => ({
|
|
36
|
-
step,
|
|
37
|
-
history: [...state.history, state.step]
|
|
38
|
-
})),
|
|
39
|
-
toggleSkill: (skillId) => set((state) => {
|
|
40
|
-
const isSelected = state.selectedSkills.includes(skillId);
|
|
41
|
-
return {
|
|
42
|
-
selectedSkills: isSelected ? state.selectedSkills.filter((id) => id !== skillId) : [...state.selectedSkills, skillId]
|
|
43
|
-
};
|
|
44
|
-
}),
|
|
45
|
-
selectStack: (stack) => set({
|
|
46
|
-
selectedStack: stack,
|
|
47
|
-
// Include preselected skills (methodology) plus stack skills
|
|
48
|
-
selectedSkills: stack ? [.../* @__PURE__ */ new Set([...DEFAULT_PRESELECTED_SKILLS, ...stack.allSkillIds])] : [...DEFAULT_PRESELECTED_SKILLS]
|
|
49
|
-
}),
|
|
50
|
-
toggleExpertMode: () => set((state) => ({
|
|
51
|
-
expertMode: !state.expertMode
|
|
52
|
-
})),
|
|
53
|
-
toggleInstallMode: () => set((state) => ({
|
|
54
|
-
installMode: state.installMode === "plugin" ? "local" : "plugin"
|
|
55
|
-
})),
|
|
56
|
-
setCategory: (category) => set({
|
|
57
|
-
currentTopCategory: category
|
|
58
|
-
}),
|
|
59
|
-
setSubcategory: (subcategory) => set({
|
|
60
|
-
currentSubcategory: subcategory
|
|
61
|
-
}),
|
|
62
|
-
setLastSelectedCategory: (category) => set({
|
|
63
|
-
lastSelectedCategory: category
|
|
64
|
-
}),
|
|
65
|
-
setLastSelectedSubcategory: (subcategory) => set({
|
|
66
|
-
lastSelectedSubcategory: subcategory
|
|
67
|
-
}),
|
|
68
|
-
setLastSelectedSkill: (skillId) => set({
|
|
69
|
-
lastSelectedSkill: skillId
|
|
70
|
-
}),
|
|
71
|
-
setLastSelectedApproach: (approach) => set({
|
|
72
|
-
lastSelectedApproach: approach
|
|
73
|
-
}),
|
|
74
|
-
markCategoryVisited: (category) => set((state) => {
|
|
75
|
-
const visited = new Set(state.visitedCategories);
|
|
76
|
-
visited.add(category);
|
|
77
|
-
return { visitedCategories: visited };
|
|
78
|
-
}),
|
|
79
|
-
goBack: () => set((state) => {
|
|
80
|
-
const history = [...state.history];
|
|
81
|
-
const previousStep = history.pop();
|
|
82
|
-
return {
|
|
83
|
-
step: previousStep || "approach",
|
|
84
|
-
history
|
|
85
|
-
};
|
|
86
|
-
}),
|
|
87
|
-
reset: (options) => set(createInitialState(options))
|
|
88
|
-
}));
|
|
89
|
-
|
|
90
|
-
export {
|
|
91
|
-
useWizardStore
|
|
92
|
-
};
|
|
93
|
-
//# sourceMappingURL=chunk-6OY6ZYQF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-v2/stores/wizard-store.ts"],"sourcesContent":["import { create } from \"zustand\";\n// Note: ResolvedStack is from skills-matrix.yaml's suggested_stacks (for wizard skill selection)\n// This is different from Stack in types-stacks.ts (for agent groupings in config/stacks.yaml)\nimport type { ResolvedStack } from \"../types-matrix\";\nimport { DEFAULT_PRESELECTED_SKILLS } from \"../consts\";\n\nexport type WizardStep =\n | \"approach\"\n | \"stack\"\n | \"category\"\n | \"subcategory\"\n | \"confirm\";\n\nexport interface WizardState {\n // Current step\n step: WizardStep;\n\n // Selections\n selectedSkills: string[];\n selectedStack: ResolvedStack | null;\n\n // Modes\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n\n // Navigation\n history: WizardStep[];\n currentTopCategory: string | null;\n currentSubcategory: string | null;\n visitedCategories: Set<string>;\n\n // Last selected values (for initialValue in prompts)\n lastSelectedCategory: string | null;\n lastSelectedSubcategory: string | null;\n lastSelectedSkill: string | null;\n lastSelectedApproach: string | null;\n\n // Actions\n setStep: (step: WizardStep) => void;\n toggleSkill: (skillId: string) => void;\n selectStack: (stack: ResolvedStack | null) => void;\n toggleExpertMode: () => void;\n toggleInstallMode: () => void;\n setCategory: (category: string | null) => void;\n setSubcategory: (subcategory: string | null) => void;\n setLastSelectedCategory: (category: string | null) => void;\n setLastSelectedSubcategory: (subcategory: string | null) => void;\n setLastSelectedSkill: (skillId: string | null) => void;\n setLastSelectedApproach: (approach: string | null) => void;\n markCategoryVisited: (category: string) => void;\n goBack: () => void;\n reset: (options?: {\n initialSkills?: string[];\n hasLocalSkills?: boolean;\n }) => void;\n}\n\nconst createInitialState = (options?: {\n initialSkills?: string[];\n hasLocalSkills?: boolean;\n}) => {\n const hasInitialSkills =\n options?.initialSkills && options.initialSkills.length > 0;\n\n // Start with default preselected skills (methodology), then add any initial skills\n const baseSkills = [...DEFAULT_PRESELECTED_SKILLS];\n const initialSkills = options?.initialSkills ?? [];\n const combinedSkills = [...new Set([...baseSkills, ...initialSkills])];\n\n return {\n step: (hasInitialSkills ? \"category\" : \"approach\") as WizardStep,\n selectedSkills: combinedSkills,\n selectedStack: null,\n expertMode: options?.hasLocalSkills ?? false,\n installMode: \"local\" as \"plugin\" | \"local\",\n history: [] as WizardStep[],\n currentTopCategory: null,\n currentSubcategory: null,\n visitedCategories: new Set<string>(),\n lastSelectedCategory: null,\n lastSelectedSubcategory: null,\n lastSelectedSkill: null,\n lastSelectedApproach: null,\n };\n};\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n })),\n\n toggleSkill: (skillId) =>\n set((state) => {\n const isSelected = state.selectedSkills.includes(skillId);\n return {\n selectedSkills: isSelected\n ? state.selectedSkills.filter((id) => id !== skillId)\n : [...state.selectedSkills, skillId],\n };\n }),\n\n selectStack: (stack) =>\n set({\n selectedStack: stack,\n // Include preselected skills (methodology) plus stack skills\n selectedSkills: stack\n ? [...new Set([...DEFAULT_PRESELECTED_SKILLS, ...stack.allSkillIds])]\n : [...DEFAULT_PRESELECTED_SKILLS],\n }),\n\n toggleExpertMode: () =>\n set((state) => ({\n expertMode: !state.expertMode,\n })),\n\n toggleInstallMode: () =>\n set((state) => ({\n installMode: state.installMode === \"plugin\" ? \"local\" : \"plugin\",\n })),\n\n setCategory: (category) =>\n set({\n currentTopCategory: category,\n }),\n\n setSubcategory: (subcategory) =>\n set({\n currentSubcategory: subcategory,\n }),\n\n setLastSelectedCategory: (category) =>\n set({\n lastSelectedCategory: category,\n }),\n\n setLastSelectedSubcategory: (subcategory) =>\n set({\n lastSelectedSubcategory: subcategory,\n }),\n\n setLastSelectedSkill: (skillId) =>\n set({\n lastSelectedSkill: skillId,\n }),\n\n setLastSelectedApproach: (approach) =>\n set({\n lastSelectedApproach: approach,\n }),\n\n markCategoryVisited: (category) =>\n set((state) => {\n const visited = new Set(state.visitedCategories);\n visited.add(category);\n return { visitedCategories: visited };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"approach\",\n history,\n };\n }),\n\n reset: (options) => set(createInitialState(options)),\n}));\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-v2/lib/matrix-resolver.ts"],"sourcesContent":["import type {\n MergedSkillsMatrix,\n ResolvedSkill,\n SkillOption,\n SelectionValidation,\n ValidationError,\n ValidationWarning,\n} from \"../types-matrix\";\n\nexport function resolveAlias(\n aliasOrId: string,\n matrix: MergedSkillsMatrix,\n): string {\n return matrix.aliases[aliasOrId] || aliasOrId;\n}\n\nexport function getDependentSkills(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string[] {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) return [];\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n const dependents: string[] = [];\n\n for (const selectedId of resolvedSelections) {\n if (selectedId === fullId) continue;\n\n const selectedSkill = matrix.skills[selectedId];\n if (!selectedSkill) continue;\n\n for (const requirement of selectedSkill.requires) {\n if (requirement.needsAny) {\n const satisfiedReqs = requirement.skillIds.filter((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (satisfiedReqs.length === 1 && satisfiedReqs[0] === fullId) {\n dependents.push(selectedId);\n }\n } else {\n if (requirement.skillIds.includes(fullId)) {\n dependents.push(selectedId);\n }\n }\n }\n }\n\n return dependents;\n}\n\nexport interface SkillCheckOptions {\n expertMode?: boolean;\n}\n\nexport function isDisabled(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): boolean {\n if (options?.expertMode) {\n return false;\n }\n\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return false;\n }\n\n for (const selectedId of currentSelections) {\n const selectedFullId = resolveAlias(selectedId, matrix);\n\n if (skill.conflictsWith.some((c) => c.skillId === selectedFullId)) {\n return true;\n }\n\n const selectedSkill = matrix.skills[selectedFullId];\n if (\n selectedSkill &&\n selectedSkill.conflictsWith.some((c) => c.skillId === fullId)\n ) {\n return true;\n }\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAny) {\n return true;\n }\n } else {\n const hasAll = requirement.skillIds.every((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAll) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function getDisableReason(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string | undefined {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return undefined;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const conflict = skill.conflictsWith.find((c) => c.skillId === selectedId);\n if (conflict) {\n const selectedSkill = matrix.skills[selectedId];\n const selectedName = selectedSkill?.name || selectedId;\n return `${conflict.reason} (conflicts with ${selectedName})`;\n }\n\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const reverseConflict = selectedSkill.conflictsWith.find(\n (c) => c.skillId === fullId,\n );\n if (reverseConflict) {\n const selectedName = selectedSkill.name;\n return `${reverseConflict.reason} (conflicts with ${selectedName})`;\n }\n }\n }\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAny) {\n const requiredNames = requirement.skillIds\n .map((id) => matrix.skills[id]?.name || id)\n .join(\" or \");\n return `${requirement.reason} (requires ${requiredNames})`;\n }\n } else {\n const missingIds = requirement.skillIds.filter(\n (reqId) => !resolvedSelections.includes(reqId),\n );\n if (missingIds.length > 0) {\n const missingNames = missingIds\n .map((id) => matrix.skills[id]?.name || id)\n .join(\", \");\n return `${requirement.reason} (requires ${missingNames})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function isDiscouraged(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): boolean {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return false;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (\n selectedSkill &&\n selectedSkill.discourages.some((d) => d.skillId === fullId)\n ) {\n return true;\n }\n\n if (skill.discourages.some((d) => d.skillId === selectedId)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getDiscourageReason(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string | undefined {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return undefined;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const discourage = selectedSkill.discourages.find(\n (d) => d.skillId === fullId,\n );\n if (discourage) {\n return discourage.reason;\n }\n }\n\n const reverseDiscourage = skill.discourages.find(\n (d) => d.skillId === selectedId,\n );\n if (reverseDiscourage) {\n return reverseDiscourage.reason;\n }\n }\n\n return undefined;\n}\n\nexport function isRecommended(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): boolean {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return false;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (\n selectedSkill &&\n selectedSkill.recommends.some((r) => r.skillId === fullId)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getRecommendReason(\n skillId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n): string | undefined {\n const fullId = resolveAlias(skillId, matrix);\n const skill = matrix.skills[fullId];\n\n if (!skill) {\n return undefined;\n }\n\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const selectedId of resolvedSelections) {\n const selectedSkill = matrix.skills[selectedId];\n if (selectedSkill) {\n const recommendation = selectedSkill.recommends.find(\n (r) => r.skillId === fullId,\n );\n if (recommendation) {\n return `${recommendation.reason} (recommended by ${selectedSkill.name})`;\n }\n }\n }\n\n return undefined;\n}\n\nexport function validateSelection(\n selections: string[],\n matrix: MergedSkillsMatrix,\n): SelectionValidation {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const resolvedSelections = selections.map((s) => resolveAlias(s, matrix));\n\n for (let i = 0; i < resolvedSelections.length; i++) {\n const skillA = matrix.skills[resolvedSelections[i]];\n if (!skillA) continue;\n\n for (let j = i + 1; j < resolvedSelections.length; j++) {\n const skillBId = resolvedSelections[j];\n const conflict = skillA.conflictsWith.find((c) => c.skillId === skillBId);\n if (conflict) {\n errors.push({\n type: \"conflict\",\n message: `${skillA.name} conflicts with ${matrix.skills[skillBId]?.name || skillBId}: ${conflict.reason}`,\n skills: [skillA.id, skillBId],\n });\n }\n }\n }\n\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n for (const requirement of skill.requires) {\n if (requirement.needsAny) {\n const hasAny = requirement.skillIds.some((reqId) =>\n resolvedSelections.includes(reqId),\n );\n if (!hasAny) {\n errors.push({\n type: \"missing_requirement\",\n message: `${skill.name} requires one of: ${requirement.skillIds.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: [skillId, ...requirement.skillIds],\n });\n }\n } else {\n const missingIds = requirement.skillIds.filter(\n (reqId) => !resolvedSelections.includes(reqId),\n );\n if (missingIds.length > 0) {\n errors.push({\n type: \"missing_requirement\",\n message: `${skill.name} requires: ${missingIds.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: [skillId, ...missingIds],\n });\n }\n }\n }\n }\n\n const categorySelections = new Map<string, string[]>();\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n const existing = categorySelections.get(skill.category) || [];\n existing.push(skillId);\n categorySelections.set(skill.category, existing);\n }\n\n for (const [categoryId, skillIds] of categorySelections.entries()) {\n if (skillIds.length > 1) {\n const category = matrix.categories[categoryId];\n if (category?.exclusive) {\n errors.push({\n type: \"category_exclusive\",\n message: `Category \"${category.name}\" only allows one selection, but multiple selected: ${skillIds.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: skillIds,\n });\n }\n }\n }\n\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n for (const recommendation of skill.recommends) {\n if (!resolvedSelections.includes(recommendation.skillId)) {\n const recommendedSkill = matrix.skills[recommendation.skillId];\n if (recommendedSkill) {\n const hasConflict = recommendedSkill.conflictsWith.some((c) =>\n resolvedSelections.includes(c.skillId),\n );\n if (!hasConflict) {\n warnings.push({\n type: \"missing_recommendation\",\n message: `${skill.name} recommends ${recommendedSkill.name}: ${recommendation.reason}`,\n skills: [skillId, recommendation.skillId],\n });\n }\n }\n }\n }\n }\n\n for (const skillId of resolvedSelections) {\n const skill = matrix.skills[skillId];\n if (!skill || skill.providesSetupFor.length === 0) continue;\n\n const hasUsageSkill = skill.providesSetupFor.some((usageId) =>\n resolvedSelections.includes(usageId),\n );\n if (!hasUsageSkill) {\n warnings.push({\n type: \"unused_setup\",\n message: `Setup skill \"${skill.name}\" selected but no corresponding usage skills: ${skill.providesSetupFor.map((id) => matrix.skills[id]?.name || id).join(\", \")}`,\n skills: [skillId, ...skill.providesSetupFor],\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport function getAvailableSkills(\n categoryId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): SkillOption[] {\n const skillOptions: SkillOption[] = [];\n const resolvedSelections = currentSelections.map((s) =>\n resolveAlias(s, matrix),\n );\n\n for (const skill of Object.values(matrix.skills)) {\n if (skill.category !== categoryId) {\n continue;\n }\n\n const disabled = isDisabled(skill.id, currentSelections, matrix, options);\n const discouraged =\n !disabled && isDiscouraged(skill.id, currentSelections, matrix);\n const recommended =\n !disabled &&\n !discouraged &&\n isRecommended(skill.id, currentSelections, matrix);\n\n skillOptions.push({\n id: skill.id,\n alias: skill.alias,\n name: skill.name,\n description: skill.description,\n disabled,\n disabledReason: disabled\n ? getDisableReason(skill.id, currentSelections, matrix)\n : undefined,\n discouraged,\n discouragedReason: discouraged\n ? getDiscourageReason(skill.id, currentSelections, matrix)\n : undefined,\n recommended,\n recommendedReason: recommended\n ? getRecommendReason(skill.id, currentSelections, matrix)\n : undefined,\n selected: resolvedSelections.includes(skill.id),\n alternatives: skill.alternatives.map((a) => a.skillId),\n });\n }\n\n return skillOptions;\n}\n\nexport function getSkillsByCategory(\n categoryId: string,\n matrix: MergedSkillsMatrix,\n): ResolvedSkill[] {\n const skills: ResolvedSkill[] = [];\n\n for (const skill of Object.values(matrix.skills)) {\n if (skill.category === categoryId) {\n skills.push(skill);\n }\n }\n\n return skills;\n}\n\nexport function isCategoryAllDisabled(\n categoryId: string,\n currentSelections: string[],\n matrix: MergedSkillsMatrix,\n options?: SkillCheckOptions,\n): { disabled: boolean; reason?: string } {\n if (options?.expertMode) {\n return { disabled: false };\n }\n\n const skills = getSkillsByCategory(categoryId, matrix);\n\n if (skills.length === 0) {\n return { disabled: false };\n }\n\n const disabledSkills: Array<{ skillId: string; reason: string | undefined }> =\n [];\n\n for (const skill of skills) {\n if (isDisabled(skill.id, currentSelections, matrix, options)) {\n disabledSkills.push({\n skillId: skill.id,\n reason: getDisableReason(skill.id, currentSelections, matrix),\n });\n }\n }\n\n if (disabledSkills.length === skills.length) {\n const firstReason = disabledSkills[0]?.reason;\n const shortReason = firstReason?.split(\" (\")[0] || \"requirements not met\";\n return { disabled: true, reason: shortReason };\n }\n\n return { disabled: false };\n}\n\nexport function getSubcategories(\n parentCategoryId: string,\n matrix: MergedSkillsMatrix,\n): string[] {\n const subcategories: string[] = [];\n\n for (const category of Object.values(matrix.categories)) {\n if (category.parent === parentCategoryId) {\n subcategories.push(category.id);\n }\n }\n\n subcategories.sort((a, b) => {\n const catA = matrix.categories[a];\n const catB = matrix.categories[b];\n return (catA?.order ?? 0) - (catB?.order ?? 0);\n });\n\n return subcategories;\n}\n\nexport function getTopLevelCategories(matrix: MergedSkillsMatrix): string[] {\n const topLevel: string[] = [];\n\n for (const category of Object.values(matrix.categories)) {\n if (!category.parent) {\n topLevel.push(category.id);\n }\n }\n\n topLevel.sort((a, b) => {\n const catA = matrix.categories[a];\n const catB = matrix.categories[b];\n return (catA?.order ?? 0) - (catB?.order ?? 0);\n });\n\n return topLevel;\n}\n"],"mappings":"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","names":["selectedSkill"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-v2/lib/resolver.ts","../src/cli-v2/lib/compiler.ts","../src/cli-v2/lib/output-validator.ts"],"sourcesContent":["import path from \"path\";\nimport { fileExists } from \"../utils/fs\";\nimport { getDirs, type CompileMode } from \"./loader\";\nimport { verbose } from \"../utils/logger\";\nimport type {\n AgentConfig,\n AgentDefinition,\n CompileAgentConfig,\n CompileConfig,\n Skill,\n SkillAssignment,\n SkillDefinition,\n SkillReference,\n StackConfig,\n} from \"../types\";\nimport type { Stack, StackAgentConfig } from \"../types-stacks\";\n\nexport async function resolveTemplate(\n projectRoot: string,\n stackId: string,\n mode: CompileMode = \"dev\",\n): Promise<string> {\n const dirs = getDirs(mode);\n const stackTemplate = path.join(\n projectRoot,\n dirs.stacks,\n stackId,\n \"agent.liquid\",\n );\n if (await fileExists(stackTemplate)) return stackTemplate;\n\n return path.join(projectRoot, dirs.templates, \"agent.liquid\");\n}\n\nexport async function resolveClaudeMd(\n projectRoot: string,\n stackId: string,\n mode: CompileMode = \"dev\",\n): Promise<string> {\n const dirs = getDirs(mode);\n const stackClaude = path.join(projectRoot, dirs.stacks, stackId, \"CLAUDE.md\");\n if (await fileExists(stackClaude)) return stackClaude;\n\n throw new Error(\n `Stack '${stackId}' is missing required CLAUDE.md file. Expected at: ${stackClaude}`,\n );\n}\n\nexport function resolveSkillReference(\n ref: SkillReference,\n skills: Record<string, SkillDefinition>,\n): Skill {\n const definition = skills[ref.id];\n if (!definition) {\n const availableSkills = Object.keys(skills);\n const skillList =\n availableSkills.length > 0\n ? `Available skills: ${availableSkills.slice(0, 5).join(\", \")}${availableSkills.length > 5 ? ` (and ${availableSkills.length - 5} more)` : \"\"}`\n : \"No skills found in scanned directories\";\n throw new Error(\n `Skill '${ref.id}' not found in scanned skills. ${skillList}`,\n );\n }\n return {\n id: ref.id,\n path: definition.path,\n name: definition.name,\n description: definition.description,\n usage: ref.usage,\n preloaded: ref.preloaded ?? false,\n };\n}\n\nexport function resolveSkillReferences(\n skillRefs: SkillReference[],\n skills: Record<string, SkillDefinition>,\n): Skill[] {\n return skillRefs.map((ref) => resolveSkillReference(ref, skills));\n}\n\nfunction getStackSkillIds(stackSkills: SkillAssignment[]): string[] {\n return stackSkills.map((s) => s.id);\n}\n\nfunction flattenAgentSkills(\n categorizedSkills: Record<string, SkillAssignment[]>,\n): SkillAssignment[] {\n const assignments: SkillAssignment[] = [];\n for (const category of Object.keys(categorizedSkills)) {\n assignments.push(...categorizedSkills[category]);\n }\n return assignments;\n}\n\nfunction expandSkillIdIfDirectory(\n skillId: string,\n skills: Record<string, SkillDefinition>,\n): string[] {\n if (skills[skillId]) {\n return [skillId];\n }\n\n // Use path as unique key to deduplicate (both frontmatter name and directory path map to same skill)\n const allSkillIds = Object.keys(skills);\n const seenPaths = new Set<string>();\n const matchingSkills: string[] = [];\n\n for (const id of allSkillIds) {\n const skillDef = skills[id];\n if (skillDef.path.startsWith(`src/skills/${skillId}/`)) {\n if (!seenPaths.has(skillDef.path)) {\n seenPaths.add(skillDef.path);\n matchingSkills.push(id);\n }\n }\n }\n\n if (matchingSkills.length > 0) {\n return matchingSkills;\n }\n\n return [skillId];\n}\n\n/**\n * Resolve skills from agent's skills field (Phase 6: agent-centric configuration)\n * Converts agent's skills Record to SkillReference array\n *\n * @deprecated Use resolveAgentSkillsFromStack for Phase 7 agent-centric configuration\n */\nexport function resolveAgentSkills(\n agentDef: AgentDefinition,\n): SkillReference[] {\n if (!agentDef.skills) return [];\n\n return Object.entries(agentDef.skills).map(([category, entry]) => ({\n id: entry.id,\n usage: `when working with ${category}`,\n preloaded: entry.preloaded,\n }));\n}\n\n/**\n * Subcategories considered \"key\" skills that should be preloaded.\n * These are primary technology choices that define the stack's core.\n */\nconst KEY_SUBCATEGORIES = new Set([\n \"framework\",\n \"api\",\n \"database\",\n \"meta-framework\",\n \"base-framework\",\n \"platform\",\n]);\n\n/**\n * Resolve skills for an agent from a Stack definition (Phase 7 format).\n * Takes a stack and skill aliases, returns skill references for the specified agent.\n *\n * @param agentName - The agent ID to resolve skills for\n * @param stack - The stack definition with agent technology selections\n * @param skillAliases - Mapping from technology aliases to full skill IDs\n * @returns Array of SkillReference objects for the agent\n *\n * @example\n * ```typescript\n * const stack = {\n * id: 'nextjs-fullstack',\n * agents: {\n * 'web-developer': { framework: 'react', styling: 'scss-modules' }\n * }\n * };\n *\n * const aliases = { react: 'web/framework/react (@vince)', ... };\n *\n * const skills = resolveAgentSkillsFromStack('web-developer', stack, aliases);\n * // Returns: [{ id: 'web/framework/react (@vince)', usage: '...', preloaded: true }, ...]\n * ```\n */\nexport function resolveAgentSkillsFromStack(\n agentName: string,\n stack: Stack,\n skillAliases: Record<string, string>,\n): SkillReference[] {\n const agentConfig = stack.agents[agentName];\n\n // Agent not in this stack\n if (!agentConfig) {\n verbose(`Agent '${agentName}' not found in stack '${stack.id}'`);\n return [];\n }\n\n // Empty config {} means agent has no technology-specific skills\n if (Object.keys(agentConfig).length === 0) {\n verbose(\n `Agent '${agentName}' has no technology config in stack '${stack.id}'`,\n );\n return [];\n }\n\n const skillRefs: SkillReference[] = [];\n\n for (const [subcategory, technologyAlias] of Object.entries(agentConfig)) {\n const fullSkillId = skillAliases[technologyAlias];\n\n if (!fullSkillId) {\n verbose(\n `Warning: No skill alias found for '${technologyAlias}' (agent: ${agentName}, subcategory: ${subcategory}). Skipping.`,\n );\n continue;\n }\n\n const isKeySkill = KEY_SUBCATEGORIES.has(subcategory);\n\n skillRefs.push({\n id: fullSkillId,\n usage: `when working with ${subcategory}`,\n preloaded: isKeySkill,\n });\n }\n\n verbose(\n `Resolved ${skillRefs.length} skills for agent '${agentName}' from stack '${stack.id}'`,\n );\n\n return skillRefs;\n}\n\nexport function resolveStackSkills(\n stack: StackConfig,\n agentName: string,\n skills: Record<string, SkillDefinition>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n\n const agentSkillCategories = stack.agent_skills?.[agentName];\n const assignments: SkillAssignment[] = agentSkillCategories\n ? flattenAgentSkills(agentSkillCategories)\n : stack.skills;\n\n const validSkillIds = new Set<string>();\n for (const s of stack.skills) {\n const expandedIds = expandSkillIdIfDirectory(s.id, skills);\n for (const id of expandedIds) {\n validSkillIds.add(id);\n }\n }\n\n const addedSkills = new Set<string>();\n\n for (const assignment of assignments) {\n const skillId = assignment.id;\n const expandedSkillIds = expandSkillIdIfDirectory(skillId, skills);\n\n for (const expandedId of expandedSkillIds) {\n if (addedSkills.has(expandedId)) {\n continue;\n }\n\n if (!skills[expandedId]) {\n throw new Error(\n `Stack \"${stack.name}\" references skill \"${expandedId}\" for agent \"${agentName}\" not found in scanned skills`,\n );\n }\n\n if (agentSkillCategories && !validSkillIds.has(expandedId)) {\n throw new Error(\n `Stack \"${stack.name}\" agent_skills for \"${agentName}\" includes skill \"${expandedId}\" not in stack's skills array`,\n );\n }\n\n const skillDef = skills[expandedId];\n skillRefs.push({\n id: expandedId,\n usage: `when working with ${skillDef.name.toLowerCase()}`,\n preloaded: assignment.preloaded ?? false,\n });\n\n addedSkills.add(expandedId);\n }\n }\n\n return skillRefs;\n}\n\n/**\n * Options for getAgentSkills function.\n * Supports both Phase 6 (agent-centric) and Phase 7 (stack-based) configurations.\n */\nexport interface GetAgentSkillsOptions {\n /** The agent name/ID */\n agentName: string;\n /** Per-agent compile config (may have explicit skills) */\n agentConfig: CompileAgentConfig;\n /** Overall compile config */\n compileConfig: CompileConfig;\n /** All available skill definitions */\n skills: Record<string, SkillDefinition>;\n /** Project root path */\n projectRoot: string;\n /** Agent definition (Phase 6) */\n agentDef?: AgentDefinition;\n /** Stack definition (Phase 7) */\n stack?: Stack;\n /** Skill aliases mapping (Phase 7) */\n skillAliases?: Record<string, string>;\n}\n\n/**\n * Get skill references for an agent.\n * Supports multiple resolution strategies with the following priority:\n *\n * 1. Explicit skills in compile config (agentConfig.skills)\n * 2. Stack-based skills (Phase 7) if stack and skillAliases provided\n * 3. Agent definition skills (Phase 6) if agentDef.skills provided\n *\n * @param options - Configuration options for skill resolution\n * @returns Array of SkillReference objects\n */\nexport async function getAgentSkills(\n agentName: string,\n agentConfig: CompileAgentConfig,\n _compileConfig: CompileConfig,\n _skills: Record<string, SkillDefinition>,\n _projectRoot: string,\n agentDef?: AgentDefinition,\n stack?: Stack,\n skillAliases?: Record<string, string>,\n): Promise<SkillReference[]> {\n // Priority 1: Explicit skills in compile config\n if (agentConfig.skills && agentConfig.skills.length > 0) {\n return agentConfig.skills;\n }\n\n // Priority 2: Stack-based skills (Phase 7)\n if (stack && skillAliases) {\n const stackSkills = resolveAgentSkillsFromStack(\n agentName,\n stack,\n skillAliases,\n );\n if (stackSkills.length > 0) {\n verbose(\n `Resolved ${stackSkills.length} skills from stack for ${agentName}`,\n );\n return stackSkills;\n }\n }\n\n // Priority 3: Agent's own skills field (Phase 6: agent-centric configuration)\n if (agentDef?.skills && Object.keys(agentDef.skills).length > 0) {\n verbose(`Resolving skills from agent definition for ${agentName}`);\n return resolveAgentSkills(agentDef);\n }\n\n // No skills defined for this agent\n return [];\n}\n\n/**\n * Options for resolveAgents function.\n */\nexport interface ResolveAgentsOptions {\n /** All loaded agent definitions */\n agents: Record<string, AgentDefinition>;\n /** All loaded skill definitions */\n skills: Record<string, SkillDefinition>;\n /** Compile configuration */\n compileConfig: CompileConfig;\n /** Project root path */\n projectRoot: string;\n /** Stack definition (Phase 7) - optional */\n stack?: Stack;\n /** Skill aliases mapping (Phase 7) - optional */\n skillAliases?: Record<string, string>;\n}\n\nexport async function resolveAgents(\n agents: Record<string, AgentDefinition>,\n skills: Record<string, SkillDefinition>,\n compileConfig: CompileConfig,\n projectRoot: string,\n stack?: Stack,\n skillAliases?: Record<string, string>,\n): Promise<Record<string, AgentConfig>> {\n const resolved: Record<string, AgentConfig> = {};\n const agentNames = Object.keys(compileConfig.agents);\n\n for (const agentName of agentNames) {\n const definition = agents[agentName];\n if (!definition) {\n const availableAgents = Object.keys(agents);\n const agentList =\n availableAgents.length > 0\n ? `Available agents: ${availableAgents.slice(0, 5).join(\", \")}${availableAgents.length > 5 ? ` (and ${availableAgents.length - 5} more)` : \"\"}`\n : \"No agents found in scanned directories\";\n throw new Error(\n `Agent '${agentName}' referenced in compile config but not found in scanned agents. ${agentList}. Check that src/agents/${agentName}/agent.yaml exists.`,\n );\n }\n\n const agentConfig = compileConfig.agents[agentName];\n\n const skillRefs = await getAgentSkills(\n agentName,\n agentConfig,\n compileConfig,\n skills,\n projectRoot,\n definition,\n stack,\n skillAliases,\n );\n\n const resolvedSkills = resolveSkillReferences(skillRefs, skills);\n\n resolved[agentName] = {\n name: agentName,\n title: definition.title,\n description: definition.description,\n model: definition.model,\n tools: definition.tools,\n skills: resolvedSkills,\n path: definition.path,\n sourceRoot: definition.sourceRoot,\n };\n }\n\n return resolved;\n}\n\nexport function stackToCompileConfig(\n stackId: string,\n stack: StackConfig,\n): CompileConfig {\n const agents: Record<string, CompileAgentConfig> = {};\n\n for (const agentId of stack.agents) {\n agents[agentId] = {};\n }\n\n return {\n name: stack.name,\n description: stack.description || \"\",\n claude_md: \"\",\n stack: stackId,\n agents,\n };\n}\n","import { Liquid } from \"liquidjs\";\nimport path from \"path\";\nimport {\n readFile,\n readFileOptional,\n writeFile,\n ensureDir,\n remove,\n copy,\n glob,\n fileExists,\n directoryExists,\n} from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS, OUTPUT_DIR, PROJECT_ROOT } from \"../consts\";\nimport { resolveClaudeMd } from \"./resolver\";\nimport {\n validateCompiledAgent,\n printOutputValidationResult,\n} from \"./output-validator\";\nimport type {\n Skill,\n AgentConfig,\n CompiledAgentData,\n CompileConfig,\n CompileContext,\n} from \"../types\";\n\nasync function compileAgent(\n name: string,\n agent: AgentConfig,\n projectRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Reading agent files for ${name}...`);\n\n const agentDir = path.join(projectRoot, DIRS.agents, agent.path || name);\n\n const intro = await readFile(path.join(agentDir, \"intro.md\"));\n const workflow = await readFile(path.join(agentDir, \"workflow.md\"));\n const examples = await readFileOptional(\n path.join(agentDir, \"examples.md\"),\n \"## Examples\\n\\n_No examples defined._\",\n );\n const criticalRequirementsTop = await readFileOptional(\n path.join(agentDir, \"critical-requirements.md\"),\n \"\",\n );\n const criticalReminders = await readFileOptional(\n path.join(agentDir, \"critical-reminders.md\"),\n \"\",\n );\n\n const agentPath = agent.path || name;\n const category = agentPath.split(\"/\")[0];\n const categoryDir = path.join(projectRoot, DIRS.agents, category);\n\n let outputFormat = await readFileOptional(\n path.join(agentDir, \"output-format.md\"),\n \"\",\n );\n if (!outputFormat) {\n outputFormat = await readFileOptional(\n path.join(categoryDir, \"output-format.md\"),\n \"\",\n );\n }\n\n const preloadedSkills = agent.skills.filter((s) => s.preloaded);\n const dynamicSkills = agent.skills.filter((s) => !s.preloaded);\n const preloadedSkillIds = preloadedSkills.map((s) => s.id);\n\n verbose(\n `Skills for ${name}: ${preloadedSkills.length} preloaded, ${dynamicSkills.length} dynamic`,\n );\n\n const data: CompiledAgentData = {\n agent,\n intro,\n workflow,\n examples,\n criticalRequirementsTop,\n criticalReminders,\n outputFormat,\n skills: agent.skills,\n preloadedSkills,\n dynamicSkills,\n preloadedSkillIds,\n };\n\n verbose(`Rendering template for ${name}...`);\n return engine.renderFile(\"agent\", data);\n}\n\nexport async function compileAllAgents(\n resolvedAgents: Record<string, AgentConfig>,\n config: CompileConfig,\n ctx: CompileContext,\n engine: Liquid,\n): Promise<void> {\n const outDir = path.join(ctx.outputDir, \"agents\");\n await ensureDir(outDir);\n\n let hasValidationIssues = false;\n\n for (const [name, agent] of Object.entries(resolvedAgents)) {\n try {\n const output = await compileAgent(name, agent, ctx.projectRoot, engine);\n await writeFile(path.join(outDir, `${name}.md`), output);\n console.log(` ✓ ${name}.md`);\n\n const validationResult = validateCompiledAgent(output);\n if (!validationResult.valid || validationResult.warnings.length > 0) {\n hasValidationIssues = true;\n printOutputValidationResult(name, validationResult);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(` ✗ ${name}.md - ${errorMessage}`);\n throw new Error(\n `Failed to compile agent '${name}': ${errorMessage}. Check that all required files exist in src/agents/${agent.path || name}/`,\n );\n }\n }\n\n if (hasValidationIssues) {\n console.log(\"\");\n }\n}\n\nexport async function compileAllSkills(\n resolvedAgents: Record<string, AgentConfig>,\n ctx: CompileContext,\n): Promise<void> {\n const allSkills = Object.values(resolvedAgents)\n .flatMap((a) => a.skills)\n .filter((s) => s.path);\n\n const uniqueSkills = [...new Map(allSkills.map((s) => [s.id, s])).values()];\n\n for (const skill of uniqueSkills) {\n const id = skill.id.replace(\"/\", \"-\");\n const outDir = path.join(ctx.outputDir, \"skills\", id);\n await ensureDir(outDir);\n\n const sourcePath = path.join(ctx.projectRoot, skill.path);\n const isFolder = skill.path.endsWith(\"/\");\n\n try {\n if (isFolder) {\n const mainContent = await readFile(path.join(sourcePath, \"SKILL.md\"));\n await writeFile(path.join(outDir, \"SKILL.md\"), mainContent);\n console.log(` ✓ skills/${id}/SKILL.md`);\n\n const referenceContent = await readFileOptional(\n path.join(sourcePath, \"reference.md\"),\n );\n if (referenceContent) {\n await writeFile(path.join(outDir, \"reference.md\"), referenceContent);\n console.log(` ✓ skills/${id}/reference.md`);\n }\n\n const examplesDir = path.join(sourcePath, \"examples\");\n if (await fileExists(examplesDir)) {\n await copy(examplesDir, path.join(outDir, \"examples\"));\n console.log(` ✓ skills/${id}/examples/`);\n }\n\n const scriptsDir = path.join(sourcePath, \"scripts\");\n if (await fileExists(scriptsDir)) {\n await copy(scriptsDir, path.join(outDir, \"scripts\"));\n console.log(` ✓ skills/${id}/scripts/`);\n }\n } else {\n const content = await readFile(sourcePath);\n await writeFile(path.join(outDir, \"SKILL.md\"), content);\n console.log(` ✓ skills/${id}/SKILL.md`);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(` ✗ skills/${id}/SKILL.md - ${errorMessage}`);\n throw new Error(\n `Failed to compile skill '${skill.id}': ${errorMessage}. Expected skill at: ${sourcePath}`,\n );\n }\n }\n}\n\nexport async function copyClaude(ctx: CompileContext): Promise<void> {\n const claudePath = await resolveClaudeMd(\n ctx.projectRoot,\n ctx.stackId,\n ctx.mode,\n );\n\n const content = await readFile(claudePath);\n const outputPath = path.join(ctx.outputDir, \"..\", \"CLAUDE.md\");\n await writeFile(outputPath, content);\n console.log(` ✓ CLAUDE.md (from stack)`);\n}\n\nexport async function compileAllCommands(ctx: CompileContext): Promise<void> {\n const commandsDir = path.join(ctx.projectRoot, DIRS.commands);\n const outDir = path.join(ctx.outputDir, \"commands\");\n\n if (!(await fileExists(commandsDir))) {\n console.log(\" - No commands directory found, skipping...\");\n return;\n }\n\n const files = await glob(\"*.md\", commandsDir);\n\n if (files.length === 0) {\n console.log(\" - No commands found, skipping...\");\n return;\n }\n\n await ensureDir(outDir);\n\n for (const file of files) {\n try {\n const content = await readFile(path.join(commandsDir, file));\n await writeFile(path.join(outDir, file), content);\n console.log(` ✓ ${file}`);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(` ✗ ${file} - ${errorMessage}`);\n throw new Error(\n `Failed to compile command '${file}': ${errorMessage}. Expected at: ${path.join(commandsDir, file)}`,\n );\n }\n }\n}\n\nexport async function createLiquidEngine(projectDir?: string): Promise<Liquid> {\n const roots: string[] = [];\n\n if (projectDir) {\n const localTemplatesDir = path.join(projectDir, \".claude\", \"templates\");\n if (await directoryExists(localTemplatesDir)) {\n roots.push(localTemplatesDir);\n verbose(`Using local templates from: ${localTemplatesDir}`);\n }\n }\n\n roots.push(path.join(PROJECT_ROOT, DIRS.templates));\n\n return new Liquid({\n root: roots,\n extname: \".liquid\",\n strictVariables: false,\n strictFilters: true,\n });\n}\n\nexport async function cleanOutputDir(outputDir: string): Promise<void> {\n await remove(path.join(outputDir, \"agents\"));\n await remove(path.join(outputDir, \"skills\"));\n await remove(path.join(outputDir, \"commands\"));\n}\n","import { parse as parseYaml } from \"yaml\";\n\nexport interface OutputValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\nfunction extractFrontmatter(content: string): unknown | null {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match || !match[1]) {\n return null;\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return null;\n }\n}\n\nfunction checkXmlTagBalance(content: string): string[] {\n const errors: string[] = [];\n const tagRegex = /<\\/?([a-z_][a-z0-9_-]*)\\s*>/gi;\n const tagCounts = new Map<string, number>();\n\n let match;\n while ((match = tagRegex.exec(content)) !== null) {\n const fullTag = match[0];\n const tagName = match[1].toLowerCase();\n\n const before = content.slice(Math.max(0, match.index - 10), match.index);\n const after = content.slice(\n match.index + fullTag.length,\n match.index + fullTag.length + 10,\n );\n if (before.includes(\"`\") || after.includes(\"`\")) {\n continue;\n }\n\n const isClosing = fullTag.startsWith(\"</\");\n const current = tagCounts.get(tagName) || 0;\n tagCounts.set(tagName, isClosing ? current - 1 : current + 1);\n }\n\n for (const [tag, count] of tagCounts) {\n if (count > 0) {\n errors.push(`Unclosed XML tag: <${tag}> (${count} unclosed)`);\n } else if (count < 0) {\n errors.push(`Extra closing tag: </${tag}> (${Math.abs(count)} extra)`);\n }\n }\n\n return errors;\n}\n\nfunction checkTemplateArtifacts(content: string): string[] {\n const warnings: string[] = [];\n\n const variableMatches = content.match(/\\{\\{[^}]*\\}\\}/g);\n if (variableMatches) {\n warnings.push(\n `Template artifacts found: ${variableMatches.length} unprocessed {{ }} tags`,\n );\n }\n\n const controlMatches = content.match(/\\{%[^%]*%\\}/g);\n if (controlMatches) {\n warnings.push(\n `Template artifacts found: ${controlMatches.length} unprocessed {% %} tags`,\n );\n }\n\n return warnings;\n}\n\nfunction checkRequiredPatterns(content: string): string[] {\n const warnings: string[] = [];\n\n if (!content.startsWith(\"---\")) {\n warnings.push(\"Missing YAML frontmatter at start of file\");\n }\n\n if (!content.includes(\"<role>\")) {\n warnings.push(\"Missing <role> section\");\n }\n\n if (\n !content.includes(\"Core Principles\") &&\n !content.includes(\"core_principles\")\n ) {\n warnings.push(\"Missing Core Principles section\");\n }\n\n const lines = content.trim().split(\"\\n\");\n if (lines.length < 50) {\n warnings.push(`Suspiciously short output: only ${lines.length} lines`);\n }\n\n return warnings;\n}\n\nfunction validateFrontmatter(content: string): {\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const frontmatter = extractFrontmatter(content);\n\n if (frontmatter === null) {\n errors.push(\"Failed to parse YAML frontmatter\");\n return { errors, warnings };\n }\n\n const fm = frontmatter as Record<string, unknown>;\n\n if (!fm.name || typeof fm.name !== \"string\") {\n errors.push(\"Frontmatter missing required field: name\");\n }\n\n if (!fm.description || typeof fm.description !== \"string\") {\n warnings.push(\"Frontmatter missing field: description\");\n }\n\n if (!fm.tools || typeof fm.tools !== \"string\") {\n warnings.push(\"Frontmatter missing field: tools\");\n }\n\n return { errors, warnings };\n}\n\nexport function validateCompiledAgent(content: string): OutputValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!content || content.trim().length === 0) {\n return {\n valid: false,\n errors: [\"Compiled output is empty\"],\n warnings: [],\n };\n }\n\n const fmResult = validateFrontmatter(content);\n errors.push(...fmResult.errors);\n warnings.push(...fmResult.warnings);\n\n const xmlErrors = checkXmlTagBalance(content);\n errors.push(...xmlErrors);\n\n const artifactWarnings = checkTemplateArtifacts(content);\n warnings.push(...artifactWarnings);\n\n const patternWarnings = checkRequiredPatterns(content);\n warnings.push(...patternWarnings);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport function printOutputValidationResult(\n agentName: string,\n result: OutputValidationResult,\n): void {\n if (result.errors.length > 0) {\n console.log(` Validation errors for ${agentName}:`);\n result.errors.forEach((e) => console.log(` - ${e}`));\n }\n\n if (result.warnings.length > 0) {\n console.log(` Validation warnings for ${agentName}:`);\n result.warnings.forEach((w) => console.log(` - ${w}`));\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-v2/lib/loader.ts","../src/cli-v2/lib/stacks-loader.ts","../src/cli-v2/lib/matrix-loader.ts"],"sourcesContent":["import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { glob, readFile, directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS } from \"../consts\";\nimport type {\n AgentDefinition,\n AgentYamlConfig,\n SkillDefinition,\n SkillFrontmatter,\n StackConfig,\n} from \"../types\";\n\nexport type CompileMode = \"dev\";\n\nexport function getDirs(_mode: CompileMode) {\n return DIRS;\n}\n\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---/;\n\nexport function parseFrontmatter(content: string): SkillFrontmatter | null {\n const match = content.match(FRONTMATTER_REGEX);\n if (!match) return null;\n\n const yamlContent = match[1];\n const frontmatter = parseYaml(yamlContent) as SkillFrontmatter;\n\n if (!frontmatter.name || !frontmatter.description) return null;\n return frontmatter;\n}\n\nfunction extractDisplayName(skillId: string): string {\n const withoutCategory = skillId.split(\"/\").pop() || skillId;\n const withoutAuthor = withoutCategory.replace(/\\s*\\(@\\w+\\)$/, \"\").trim();\n return withoutAuthor\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport async function loadAllAgents(\n projectRoot: string,\n): Promise<Record<string, AgentDefinition>> {\n const agents: Record<string, AgentDefinition> = {};\n const agentSourcesDir = path.join(projectRoot, DIRS.agents);\n\n const files = await glob(\"**/agent.yaml\", agentSourcesDir);\n\n for (const file of files) {\n const fullPath = path.join(agentSourcesDir, file);\n const content = await readFile(fullPath);\n const config = parseYaml(content) as AgentYamlConfig;\n const agentPath = path.dirname(file);\n\n agents[config.id] = {\n title: config.title,\n description: config.description,\n model: config.model,\n tools: config.tools,\n path: agentPath,\n sourceRoot: projectRoot,\n skills: config.skills,\n };\n\n verbose(`Loaded agent: ${config.id} from ${file}`);\n }\n\n return agents;\n}\n\n/** @deprecated Use loadSkillsByIds instead - stacks no longer embed skills */\nexport async function loadStackSkills(\n stackId: string,\n projectRoot: string,\n _mode: CompileMode = \"dev\",\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n const stackSkillsDir = path.join(projectRoot, DIRS.stacks, stackId, \"skills\");\n\n if (!(await directoryExists(stackSkillsDir))) {\n verbose(`No embedded skills directory for stack ${stackId}`);\n return skills;\n }\n\n const files = await glob(\"**/SKILL.md\", stackSkillsDir);\n\n for (const file of files) {\n const fullPath = path.join(stackSkillsDir, file);\n const content = await readFile(fullPath);\n\n const frontmatter = parseFrontmatter(content);\n if (!frontmatter) {\n console.warn(\n ` Warning: Skipping ${file}: Missing or invalid frontmatter`,\n );\n continue;\n }\n\n const folderPath = file.replace(\"/SKILL.md\", \"\");\n const skillPath = `src/stacks/${stackId}/skills/${folderPath}/`;\n const skillId = frontmatter.name;\n\n skills[skillId] = {\n path: skillPath,\n name: extractDisplayName(frontmatter.name),\n description: frontmatter.description,\n canonicalId: skillId,\n };\n\n verbose(`Loaded stack skill: ${skillId} from ${file}`);\n }\n\n return skills;\n}\n\nasync function buildIdToDirectoryPathMap(\n skillsDir: string,\n): Promise<Record<string, string>> {\n const map: Record<string, string> = {};\n const files = await glob(\"**/SKILL.md\", skillsDir);\n\n for (const file of files) {\n const fullPath = path.join(skillsDir, file);\n const content = await readFile(fullPath);\n const frontmatter = parseFrontmatter(content);\n\n if (frontmatter?.name) {\n const directoryPath = file.replace(\"/SKILL.md\", \"\");\n map[frontmatter.name] = directoryPath;\n map[directoryPath] = directoryPath;\n }\n }\n\n return map;\n}\n\nexport async function loadSkillsByIds(\n skillIds: Array<{ id: string }>,\n projectRoot: string,\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n const skillsDir = path.join(projectRoot, DIRS.skills);\n\n const idToDirectoryPath = await buildIdToDirectoryPathMap(skillsDir);\n const allSkillIds = Object.keys(idToDirectoryPath);\n const expandedSkillIds: string[] = [];\n\n for (const { id: skillId } of skillIds) {\n if (idToDirectoryPath[skillId]) {\n expandedSkillIds.push(skillId);\n } else {\n const childSkills = allSkillIds.filter((id) => {\n const dirPath = idToDirectoryPath[id];\n return dirPath.startsWith(skillId + \"/\");\n });\n\n if (childSkills.length > 0) {\n expandedSkillIds.push(...childSkills);\n verbose(\n `Expanded directory '${skillId}' to ${childSkills.length} skills`,\n );\n } else {\n console.warn(` Warning: Unknown skill reference '${skillId}'`);\n }\n }\n }\n\n const uniqueSkillIds = [...new Set(expandedSkillIds)];\n\n for (const skillId of uniqueSkillIds) {\n const directoryPath = idToDirectoryPath[skillId];\n if (!directoryPath) {\n console.warn(\n ` Warning: Could not find skill ${skillId}: No matching skill found`,\n );\n continue;\n }\n\n const skillPath = path.join(skillsDir, directoryPath);\n const skillMdPath = path.join(skillPath, \"SKILL.md\");\n\n try {\n const content = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(content);\n\n if (!frontmatter) {\n console.warn(\n ` Warning: Skipping ${skillId}: Missing or invalid frontmatter`,\n );\n continue;\n }\n\n const canonicalId = frontmatter.name;\n const skillDef: SkillDefinition = {\n path: `${DIRS.skills}/${directoryPath}/`,\n name: extractDisplayName(frontmatter.name),\n description: frontmatter.description,\n canonicalId,\n };\n\n skills[canonicalId] = skillDef;\n\n if (directoryPath !== canonicalId) {\n skills[directoryPath] = skillDef;\n }\n\n verbose(`Loaded skill: ${canonicalId} (from ${directoryPath})`);\n } catch (error) {\n console.warn(` Warning: Could not load skill ${skillId}: ${error}`);\n }\n }\n\n return skills;\n}\n\nexport async function loadPluginSkills(\n pluginDir: string,\n): Promise<Record<string, SkillDefinition>> {\n const skills: Record<string, SkillDefinition> = {};\n const pluginSkillsDir = path.join(pluginDir, \"skills\");\n\n if (!(await directoryExists(pluginSkillsDir))) {\n return skills;\n }\n\n const files = await glob(\"**/SKILL.md\", pluginSkillsDir);\n\n for (const file of files) {\n const fullPath = path.join(pluginSkillsDir, file);\n const content = await readFile(fullPath);\n\n const frontmatter = parseFrontmatter(content);\n if (!frontmatter) {\n console.warn(\n ` Warning: Skipping ${file}: Missing or invalid frontmatter`,\n );\n continue;\n }\n\n const folderPath = file.replace(\"/SKILL.md\", \"\");\n const skillPath = `skills/${folderPath}/`;\n const skillId = frontmatter.name;\n\n skills[skillId] = {\n path: skillPath,\n name: extractDisplayName(frontmatter.name),\n description: frontmatter.description,\n canonicalId: skillId,\n };\n\n verbose(`Loaded plugin skill: ${skillId} from ${file}`);\n }\n\n return skills;\n}\n\nconst stackCache = new Map<string, StackConfig>();\n\n/**\n * @deprecated Use loadStackById from stacks-loader.ts instead.\n * This function loads legacy stack configs from src/stacks/{stackId}/config.yaml.\n * The new system uses config/stacks.yaml with agent-centric configuration\n * where skills are defined in each agent's agent.yaml file.\n *\n * Migration path:\n * 1. Use loadStackById() to get stack metadata (agents list)\n * 2. Skills come from agent.yaml files, not stack config\n *\n * @see src/cli-v2/lib/stacks-loader.ts\n */\nexport async function loadStack(\n stackId: string,\n projectRoot: string,\n mode: CompileMode = \"dev\",\n): Promise<StackConfig> {\n const cacheKey = `${mode}:${stackId}`;\n const cached = stackCache.get(cacheKey);\n if (cached) return cached;\n\n const dirs = getDirs(mode);\n const stackPath = path.join(projectRoot, dirs.stacks, stackId, \"config.yaml\");\n\n try {\n const content = await readFile(stackPath);\n const stack = parseYaml(content) as StackConfig;\n stackCache.set(cacheKey, stack);\n verbose(`Loaded stack: ${stack.name} (${stackId})`);\n return stack;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load stack '${stackId}': ${errorMessage}. Expected config at: ${stackPath}`,\n );\n }\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport type { Stack, StacksConfig, StackAgentConfig } from \"../types-stacks\";\nimport type { SkillReference } from \"../types\";\n\nconst STACKS_FILE = \"config/stacks.yaml\";\n\nconst stacksCache = new Map<string, Stack[]>();\n\n/**\n * Load all stacks from config/stacks.yaml\n * Stacks are simple agent groupings without skill mappings\n */\nexport async function loadStacks(configDir: string): Promise<Stack[]> {\n const cacheKey = configDir;\n const cached = stacksCache.get(cacheKey);\n if (cached) return cached;\n\n const stacksPath = path.join(configDir, STACKS_FILE);\n\n if (!(await fileExists(stacksPath))) {\n verbose(`No stacks file found at ${stacksPath}`);\n return [];\n }\n\n try {\n const content = await readFile(stacksPath);\n const config = parseYaml(content) as StacksConfig;\n\n if (!config.stacks || !Array.isArray(config.stacks)) {\n verbose(`Invalid stacks.yaml format: missing stacks array`);\n return [];\n }\n\n stacksCache.set(cacheKey, config.stacks);\n verbose(`Loaded ${config.stacks.length} stacks from ${stacksPath}`);\n\n return config.stacks;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load stacks from '${stacksPath}': ${errorMessage}`,\n );\n }\n}\n\n/**\n * Load a specific stack by ID\n * Returns null if stack not found\n */\nexport async function loadStackById(\n stackId: string,\n configDir: string,\n): Promise<Stack | null> {\n const stacks = await loadStacks(configDir);\n const stack = stacks.find((s) => s.id === stackId);\n\n if (!stack) {\n verbose(`Stack '${stackId}' not found`);\n return null;\n }\n\n verbose(`Found stack: ${stack.name} (${stackId})`);\n return stack;\n}\n\n/**\n * Subcategories considered \"key\" skills that should be preloaded.\n * These are primary technology choices that define the stack's core.\n */\nconst KEY_SUBCATEGORIES = new Set([\n \"framework\",\n \"api\",\n \"database\",\n \"meta-framework\",\n \"base-framework\",\n \"platform\",\n]);\n\n/**\n * Resolve a single agent's technology config to skill references.\n * Looks up each technology alias in skill_aliases to get full skill ID.\n *\n * @param agentConfig - The agent's technology selections (subcategory -> alias)\n * @param skillAliases - Mapping from technology aliases to full skill IDs\n * @returns Array of SkillReference objects\n */\nexport function resolveAgentConfigToSkills(\n agentConfig: StackAgentConfig,\n skillAliases: Record<string, string>,\n): SkillReference[] {\n const skillRefs: SkillReference[] = [];\n\n for (const [subcategory, technologyAlias] of Object.entries(agentConfig)) {\n const fullSkillId = skillAliases[technologyAlias];\n\n if (!fullSkillId) {\n verbose(\n `Warning: No skill alias found for '${technologyAlias}' (subcategory: ${subcategory}). Skipping.`,\n );\n continue;\n }\n\n const isKeySkill = KEY_SUBCATEGORIES.has(subcategory);\n\n skillRefs.push({\n id: fullSkillId,\n usage: `when working with ${subcategory}`,\n preloaded: isKeySkill,\n });\n }\n\n return skillRefs;\n}\n\n/**\n * Resolve all agents in a stack to their skill references.\n * Takes a Stack and skill_aliases, returns a mapping of agent IDs to their resolved skills.\n *\n * @param stack - The stack definition with agent technology selections\n * @param skillAliases - Mapping from technology aliases to full skill IDs\n * @returns Record mapping agent IDs to their SkillReference arrays\n *\n * @example\n * ```typescript\n * const stack = {\n * id: 'nextjs-fullstack',\n * name: 'Next.js Fullstack',\n * agents: {\n * 'web-developer': { framework: 'react', styling: 'scss-modules' },\n * 'api-developer': { api: 'hono', database: 'drizzle' }\n * }\n * };\n *\n * const aliases = {\n * react: 'web/framework/react (@vince)',\n * hono: 'api/framework/hono (@vince)',\n * // ...\n * };\n *\n * const result = resolveStackSkillsFromAliases(stack, aliases);\n * // Returns:\n * // {\n * // 'web-developer': [{ id: 'web/framework/react (@vince)', usage: '...', preloaded: true }, ...],\n * // 'api-developer': [{ id: 'api/framework/hono (@vince)', usage: '...', preloaded: true }, ...]\n * // }\n * ```\n */\nexport function resolveStackSkillsFromAliases(\n stack: Stack,\n skillAliases: Record<string, string>,\n): Record<string, SkillReference[]> {\n const result: Record<string, SkillReference[]> = {};\n\n for (const [agentId, agentConfig] of Object.entries(stack.agents)) {\n // Empty config {} means agent has no technology-specific skills\n if (Object.keys(agentConfig).length === 0) {\n result[agentId] = [];\n continue;\n }\n\n result[agentId] = resolveAgentConfigToSkills(agentConfig, skillAliases);\n }\n\n verbose(\n `Resolved skills for ${Object.keys(result).length} agents in stack '${stack.id}'`,\n );\n\n return result;\n}\n","import { parse as parseYaml } from \"yaml\";\nimport path from \"path\";\nimport { glob, readFile, fileExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport { DIRS } from \"../consts\";\nimport { parseFrontmatter } from \"./loader\";\nimport type {\n SkillsMatrixConfig,\n ExtractedSkillMetadata,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n SkillRelation,\n SkillRequirement,\n SkillAlternative,\n} from \"../types-matrix\";\n\ninterface RawMetadata {\n category: string;\n category_exclusive?: boolean;\n author: string;\n version: string;\n cli_name?: string;\n cli_description?: string;\n usage_guidance?: string;\n tags?: string[];\n compatible_with?: string[];\n conflicts_with?: string[];\n requires?: string[];\n requires_setup?: string[];\n provides_setup_for?: string[];\n}\n\nexport async function loadSkillsMatrix(\n configPath: string,\n): Promise<SkillsMatrixConfig> {\n const content = await readFile(configPath);\n const config = parseYaml(content) as SkillsMatrixConfig;\n\n validateMatrixStructure(config, configPath);\n\n verbose(`Loaded skills matrix: ${configPath}`);\n return config;\n}\n\nfunction validateMatrixStructure(\n config: SkillsMatrixConfig,\n configPath: string,\n): void {\n // Note: suggested_stacks removed from required - stacks now defined in config/stacks.yaml (Phase 6)\n const requiredFields = [\n \"version\",\n \"categories\",\n \"relationships\",\n \"skill_aliases\",\n ];\n const missing = requiredFields.filter((field) => !(field in config));\n\n if (missing.length > 0) {\n throw new Error(\n `Skills matrix at ${configPath} is missing required fields: ${missing.join(\", \")}`,\n );\n }\n\n const relationshipFields = [\n \"conflicts\",\n \"recommends\",\n \"requires\",\n \"alternatives\",\n ];\n const missingRelationships = relationshipFields.filter(\n (field) => !config.relationships || !(field in config.relationships),\n );\n\n if (missingRelationships.length > 0) {\n throw new Error(\n `Skills matrix relationships missing required fields: ${missingRelationships.join(\", \")}`,\n );\n }\n\n for (const [categoryId, category] of Object.entries(config.categories)) {\n const requiredCategoryFields = [\n \"id\",\n \"name\",\n \"description\",\n \"exclusive\",\n \"required\",\n \"order\",\n ];\n const missingCategoryFields = requiredCategoryFields.filter(\n (field) => !(field in category),\n );\n\n if (missingCategoryFields.length > 0) {\n throw new Error(\n `Category \"${categoryId}\" missing required fields: ${missingCategoryFields.join(\", \")}`,\n );\n }\n }\n}\n\nexport async function extractAllSkills(\n skillsDir: string,\n): Promise<ExtractedSkillMetadata[]> {\n const skills: ExtractedSkillMetadata[] = [];\n const metadataFiles = await glob(\"**/metadata.yaml\", skillsDir);\n\n for (const metadataFile of metadataFiles) {\n const skillDir = path.dirname(metadataFile);\n const skillMdPath = path.join(skillsDir, skillDir, \"SKILL.md\");\n const metadataPath = path.join(skillsDir, metadataFile);\n\n if (!(await fileExists(skillMdPath))) {\n verbose(`Skipping ${metadataFile}: No SKILL.md found`);\n continue;\n }\n\n const metadataContent = await readFile(metadataPath);\n const metadata = parseYaml(metadataContent) as RawMetadata;\n const skillMdContent = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(skillMdContent);\n\n if (!frontmatter) {\n verbose(`Skipping ${metadataFile}: Invalid SKILL.md frontmatter`);\n continue;\n }\n\n if (!metadata.cli_name) {\n throw new Error(\n `Skill at ${metadataFile} is missing required 'cli_name' field in metadata.yaml`,\n );\n }\n\n const skillId = frontmatter.name;\n\n const extracted: ExtractedSkillMetadata = {\n id: skillId,\n directoryPath: skillDir,\n name: `${metadata.cli_name} ${metadata.author}`,\n description: metadata.cli_description || frontmatter.description,\n usageGuidance: metadata.usage_guidance,\n category: metadata.category,\n categoryExclusive: metadata.category_exclusive ?? true,\n author: metadata.author,\n tags: metadata.tags ?? [],\n compatibleWith: metadata.compatible_with ?? [],\n conflictsWith: metadata.conflicts_with ?? [],\n requires: metadata.requires ?? [],\n requiresSetup: metadata.requires_setup ?? [],\n providesSetupFor: metadata.provides_setup_for ?? [],\n path: `skills/${skillDir}/`,\n };\n\n skills.push(extracted);\n verbose(`Extracted skill: ${skillId}`);\n }\n\n return skills;\n}\n\nfunction buildReverseAliases(\n aliases: Record<string, string>,\n): Record<string, string> {\n const reverse: Record<string, string> = {};\n for (const [alias, fullId] of Object.entries(aliases)) {\n reverse[fullId] = alias;\n }\n return reverse;\n}\n\n/**\n * Build a map from short names to actual skill IDs.\n *\n * This handles multiple formats used in skill metadata:\n * - \"react (@vince)\" -> \"web/framework/react (@vince)\"\n * - \"react\" -> \"web/framework/react (@vince)\"\n * - Old alias targets that may still exist in metadata files\n */\nfunction buildAliasTargetToSkillIdMap(\n aliases: Record<string, string>,\n skills: ExtractedSkillMetadata[],\n): Record<string, string> {\n const map: Record<string, string> = {};\n\n for (const skill of skills) {\n // Extract the \"short author\" form: last path segment with author\n // e.g., \"web/framework/react (@vince)\" -> \"react (@vince)\"\n const parts = skill.id.split(\"/\");\n const shortForm = parts[parts.length - 1];\n\n if (shortForm && shortForm !== skill.id) {\n map[shortForm] = skill.id;\n }\n\n // Also map directory name without author if different\n // e.g., \"web/framework/react\" -> \"web/framework/react (@vince)\"\n if (skill.directoryPath && skill.directoryPath !== skill.id) {\n map[skill.directoryPath] = skill.id;\n }\n }\n\n // Also include any old-style alias targets that might still be referenced\n const aliasTargets = new Set(Object.values(aliases));\n for (const skill of skills) {\n for (const aliasTarget of aliasTargets) {\n if (\n aliasTarget !== skill.id &&\n (skill.id.endsWith(`/${aliasTarget}`) || skill.id === aliasTarget)\n ) {\n map[aliasTarget] = skill.id;\n }\n }\n }\n\n return map;\n}\n\nfunction buildDirectoryPathToIdMap(\n skills: ExtractedSkillMetadata[],\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const skill of skills) {\n if (skill.directoryPath && skill.directoryPath !== skill.id) {\n map[skill.directoryPath] = skill.id;\n }\n }\n return map;\n}\n\nfunction resolveToCanonicalId(\n aliasOrId: string,\n aliases: Record<string, string>,\n directoryPathToId: Record<string, string> = {},\n aliasTargetToSkillId: Record<string, string> = {},\n): string {\n if (aliases[aliasOrId]) {\n return aliases[aliasOrId];\n }\n if (directoryPathToId[aliasOrId]) {\n return directoryPathToId[aliasOrId];\n }\n // Handle \"short author\" format like \"react (@vince)\" that maps to full ID\n if (aliasTargetToSkillId[aliasOrId]) {\n return aliasTargetToSkillId[aliasOrId];\n }\n return aliasOrId;\n}\n\nexport async function mergeMatrixWithSkills(\n matrix: SkillsMatrixConfig,\n skills: ExtractedSkillMetadata[],\n): Promise<MergedSkillsMatrix> {\n const aliases = matrix.skill_aliases;\n const aliasesReverse = buildReverseAliases(aliases);\n const directoryPathToId = buildDirectoryPathToIdMap(skills);\n const aliasTargetToSkillId = buildAliasTargetToSkillIdMap(aliases, skills);\n const resolvedSkills: Record<string, ResolvedSkill> = {};\n\n for (const skill of skills) {\n const resolved = buildResolvedSkill(\n skill,\n matrix,\n aliases,\n aliasesReverse,\n directoryPathToId,\n aliasTargetToSkillId,\n );\n resolvedSkills[skill.id] = resolved;\n }\n\n computeInverseRelationships(resolvedSkills);\n const suggestedStacks = resolveSuggestedStacks(\n matrix,\n aliases,\n aliasTargetToSkillId,\n );\n\n const merged: MergedSkillsMatrix = {\n version: matrix.version,\n categories: matrix.categories,\n skills: resolvedSkills,\n suggestedStacks,\n aliases,\n aliasesReverse,\n generatedAt: new Date().toISOString(),\n };\n\n return merged;\n}\n\nfunction buildResolvedSkill(\n skill: ExtractedSkillMetadata,\n matrix: SkillsMatrixConfig,\n aliases: Record<string, string>,\n aliasesReverse: Record<string, string>,\n directoryPathToId: Record<string, string>,\n aliasTargetToSkillId: Record<string, string>,\n): ResolvedSkill {\n const conflictsWith: SkillRelation[] = [];\n const recommends: SkillRelation[] = [];\n const requires: SkillRequirement[] = [];\n const alternatives: SkillAlternative[] = [];\n const discourages: SkillRelation[] = [];\n\n // Helper to resolve with all maps\n const resolve = (id: string) =>\n resolveToCanonicalId(id, aliases, directoryPathToId, aliasTargetToSkillId);\n\n for (const conflictRef of skill.conflictsWith) {\n const canonicalId = resolve(conflictRef);\n conflictsWith.push({\n skillId: canonicalId,\n reason: \"Defined in skill metadata\",\n });\n }\n\n for (const conflictRule of matrix.relationships.conflicts) {\n const resolvedSkills = conflictRule.skills.map(resolve);\n if (resolvedSkills.includes(skill.id)) {\n for (const otherSkill of resolvedSkills) {\n if (otherSkill !== skill.id) {\n if (!conflictsWith.some((c) => c.skillId === otherSkill)) {\n conflictsWith.push({\n skillId: otherSkill,\n reason: conflictRule.reason,\n });\n }\n }\n }\n }\n }\n\n for (const compatRef of skill.compatibleWith) {\n const canonicalId = resolve(compatRef);\n recommends.push({\n skillId: canonicalId,\n reason: \"Compatible with this skill\",\n });\n }\n\n for (const recommendRule of matrix.relationships.recommends) {\n const whenCanonicalId = resolve(recommendRule.when);\n if (whenCanonicalId === skill.id) {\n for (const suggested of recommendRule.suggest) {\n const canonicalId = resolve(suggested);\n if (!recommends.some((r) => r.skillId === canonicalId)) {\n recommends.push({\n skillId: canonicalId,\n reason: recommendRule.reason,\n });\n }\n }\n }\n }\n\n if (skill.requires.length > 0) {\n requires.push({\n skillIds: skill.requires.map(resolve),\n needsAny: false,\n reason: \"Defined in skill metadata\",\n });\n }\n\n for (const requireRule of matrix.relationships.requires) {\n const skillCanonicalId = resolve(requireRule.skill);\n if (skillCanonicalId === skill.id) {\n requires.push({\n skillIds: requireRule.needs.map(resolve),\n needsAny: requireRule.needs_any ?? false,\n reason: requireRule.reason,\n });\n }\n }\n\n for (const altGroup of matrix.relationships.alternatives) {\n const resolvedAlts = altGroup.skills.map(resolve);\n if (resolvedAlts.includes(skill.id)) {\n for (const altSkill of resolvedAlts) {\n if (altSkill !== skill.id) {\n alternatives.push({\n skillId: altSkill,\n purpose: altGroup.purpose,\n });\n }\n }\n }\n }\n\n if (matrix.relationships.discourages) {\n for (const discourageRule of matrix.relationships.discourages) {\n const resolvedSkills = discourageRule.skills.map(resolve);\n if (resolvedSkills.includes(skill.id)) {\n for (const otherSkill of resolvedSkills) {\n if (otherSkill !== skill.id) {\n if (!discourages.some((d) => d.skillId === otherSkill)) {\n discourages.push({\n skillId: otherSkill,\n reason: discourageRule.reason,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n id: skill.id,\n alias: aliasesReverse[skill.id],\n name: skill.name,\n description: skill.description,\n usageGuidance: skill.usageGuidance,\n category: skill.category,\n categoryExclusive: skill.categoryExclusive,\n tags: skill.tags,\n author: skill.author,\n conflictsWith,\n recommends,\n recommendedBy: [],\n requires,\n requiredBy: [],\n alternatives,\n discourages,\n requiresSetup: skill.requiresSetup.map(resolve),\n providesSetupFor: skill.providesSetupFor.map(resolve),\n path: skill.path,\n };\n}\n\nfunction computeInverseRelationships(\n skills: Record<string, ResolvedSkill>,\n): void {\n for (const skill of Object.values(skills)) {\n for (const recommend of skill.recommends) {\n const targetSkill = skills[recommend.skillId];\n if (targetSkill) {\n targetSkill.recommendedBy.push({\n skillId: skill.id,\n reason: recommend.reason,\n });\n }\n }\n\n for (const requirement of skill.requires) {\n for (const requiredId of requirement.skillIds) {\n const targetSkill = skills[requiredId];\n if (targetSkill) {\n targetSkill.requiredBy.push({\n skillId: skill.id,\n reason: requirement.reason,\n });\n }\n }\n }\n }\n}\n\nfunction resolveSuggestedStacks(\n matrix: SkillsMatrixConfig,\n aliases: Record<string, string>,\n aliasTargetToSkillId: Record<string, string>,\n): ResolvedStack[] {\n // Phase 6: suggested_stacks is now optional (stacks moved to config/stacks.yaml)\n if (!matrix.suggested_stacks) {\n return [];\n }\n return matrix.suggested_stacks.map((stack) => {\n const resolvedSkillsMap: Record<string, Record<string, string>> = {};\n const allSkillIds: string[] = [];\n\n for (const [category, subcategories] of Object.entries(stack.skills)) {\n resolvedSkillsMap[category] = {};\n for (const [subcategory, alias] of Object.entries(subcategories)) {\n // First resolve the alias to its target (e.g., \"react\" -> \"react (@vince)\")\n const aliasTarget = resolveToCanonicalId(alias, aliases);\n // Then check if the alias target needs to be mapped to a full skill ID\n // (e.g., \"react (@vince)\" -> \"web/framework/react (@vince)\")\n const canonicalId = aliasTargetToSkillId[aliasTarget] || aliasTarget;\n resolvedSkillsMap[category][subcategory] = canonicalId;\n allSkillIds.push(canonicalId);\n }\n }\n\n return {\n id: stack.id,\n name: stack.name,\n description: stack.description,\n audience: stack.audience,\n skills: resolvedSkillsMap,\n allSkillIds,\n philosophy: stack.philosophy,\n };\n });\n}\n\nexport async function loadAndMergeSkillsMatrix(\n matrixPath: string,\n projectRoot: string,\n): Promise<MergedSkillsMatrix> {\n const matrix = await loadSkillsMatrix(matrixPath);\n const skillsDir = path.join(projectRoot, DIRS.skills);\n const skills = await extractAllSkills(skillsDir);\n return mergeMatrixWithSkills(matrix, skills);\n}\n"],"mappings":"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","names":["parseYaml","path","path","parseYaml","parseYaml","path","parseYaml","path"]}
|
package/dist/chunk-JY4RO76L.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
getTopLevelCategories
|
|
4
|
-
} from "./chunk-AZP2AA5M.js";
|
|
5
|
-
import {
|
|
6
|
-
useWizardStore
|
|
7
|
-
} from "./chunk-6OY6ZYQF.js";
|
|
8
|
-
import {
|
|
9
|
-
init_esm_shims
|
|
10
|
-
} from "./chunk-DHET7RCE.js";
|
|
11
|
-
|
|
12
|
-
// src/cli-v2/components/wizard/step-category.tsx
|
|
13
|
-
init_esm_shims();
|
|
14
|
-
import { Box, Text } from "ink";
|
|
15
|
-
import { Select } from "@inkjs/ui";
|
|
16
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
-
var BACK_VALUE = "__back__";
|
|
18
|
-
var CONTINUE_VALUE = "__continue__";
|
|
19
|
-
var StepCategory = ({ matrix }) => {
|
|
20
|
-
const {
|
|
21
|
-
selectedSkills,
|
|
22
|
-
visitedCategories,
|
|
23
|
-
setCategory,
|
|
24
|
-
setStep,
|
|
25
|
-
goBack,
|
|
26
|
-
markCategoryVisited
|
|
27
|
-
} = useWizardStore();
|
|
28
|
-
const topCategoryIds = getTopLevelCategories(matrix);
|
|
29
|
-
const unvisitedCategories = topCategoryIds.filter(
|
|
30
|
-
(catId) => !visitedCategories.has(catId)
|
|
31
|
-
);
|
|
32
|
-
const options = [
|
|
33
|
-
{ value: BACK_VALUE, label: "\u2190 Back" }
|
|
34
|
-
];
|
|
35
|
-
if (selectedSkills.length > 0) {
|
|
36
|
-
options.push({
|
|
37
|
-
value: CONTINUE_VALUE,
|
|
38
|
-
label: `\u2192 Continue with ${selectedSkills.length} skill(s)`
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
for (const catId of topCategoryIds) {
|
|
42
|
-
const cat = matrix.categories[catId];
|
|
43
|
-
const isVisited = visitedCategories.has(catId);
|
|
44
|
-
const label = isVisited ? cat.name : `${cat.name} (new)`;
|
|
45
|
-
options.push({ value: catId, label });
|
|
46
|
-
}
|
|
47
|
-
const handleSelect = (value) => {
|
|
48
|
-
if (value === BACK_VALUE) {
|
|
49
|
-
goBack();
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
if (value === CONTINUE_VALUE) {
|
|
53
|
-
setStep("confirm");
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
setCategory(value);
|
|
57
|
-
markCategoryVisited(value);
|
|
58
|
-
setStep("subcategory");
|
|
59
|
-
};
|
|
60
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
61
|
-
/* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
62
|
-
"Select a category to configure (",
|
|
63
|
-
unvisitedCategories.length,
|
|
64
|
-
" remaining):"
|
|
65
|
-
] }),
|
|
66
|
-
/* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Select, { options, onChange: handleSelect }) })
|
|
67
|
-
] });
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export {
|
|
71
|
-
StepCategory
|
|
72
|
-
};
|
|
73
|
-
//# sourceMappingURL=chunk-JY4RO76L.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-v2/components/wizard/step-category.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { Select } from \"@inkjs/ui\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { getTopLevelCategories } from \"../../lib/matrix-resolver.js\";\nimport type { MergedSkillsMatrix } from \"../../types-matrix.js\";\n\nconst BACK_VALUE = \"__back__\";\nconst CONTINUE_VALUE = \"__continue__\";\n\ninterface StepCategoryProps {\n matrix: MergedSkillsMatrix;\n}\n\nexport const StepCategory: React.FC<StepCategoryProps> = ({ matrix }) => {\n const {\n selectedSkills,\n visitedCategories,\n setCategory,\n setStep,\n goBack,\n markCategoryVisited,\n } = useWizardStore();\n\n const topCategoryIds = getTopLevelCategories(matrix);\n const unvisitedCategories = topCategoryIds.filter(\n (catId) => !visitedCategories.has(catId),\n );\n\n // Build options\n const options: Array<{ value: string; label: string }> = [\n { value: BACK_VALUE, label: \"← Back\" },\n ];\n\n // Add continue option if skills selected\n if (selectedSkills.length > 0) {\n options.push({\n value: CONTINUE_VALUE,\n label: `→ Continue with ${selectedSkills.length} skill(s)`,\n });\n }\n\n // Add category options with unvisited indicators\n for (const catId of topCategoryIds) {\n const cat = matrix.categories[catId];\n const isVisited = visitedCategories.has(catId);\n const label = isVisited ? cat.name : `${cat.name} (new)`;\n options.push({ value: catId, label });\n }\n\n const handleSelect = (value: string) => {\n if (value === BACK_VALUE) {\n goBack();\n return;\n }\n if (value === CONTINUE_VALUE) {\n setStep(\"confirm\");\n return;\n }\n\n setCategory(value);\n markCategoryVisited(value);\n setStep(\"subcategory\");\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>\n Select a category to configure ({unvisitedCategories.length} remaining):\n </Text>\n <Box marginTop={1}>\n <Select options={options} onChange={handleSelect} />\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAAA;AACA,SAAS,KAAK,YAAY;AAC1B,SAAS,cAAc;AAiEjB,SAIE,KAJF;AA5DN,IAAM,aAAa;AACnB,IAAM,iBAAiB;AAMhB,IAAM,eAA4C,CAAC,EAAE,OAAO,MAAM;AACvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAEnB,QAAM,iBAAiB,sBAAsB,MAAM;AACnD,QAAM,sBAAsB,eAAe;AAAA,IACzC,CAAC,UAAU,CAAC,kBAAkB,IAAI,KAAK;AAAA,EACzC;AAGA,QAAM,UAAmD;AAAA,IACvD,EAAE,OAAO,YAAY,OAAO,cAAS;AAAA,EACvC;AAGA,MAAI,eAAe,SAAS,GAAG;AAC7B,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,OAAO,wBAAmB,eAAe,MAAM;AAAA,IACjD,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,gBAAgB;AAClC,UAAM,MAAM,OAAO,WAAW,KAAK;AACnC,UAAM,YAAY,kBAAkB,IAAI,KAAK;AAC7C,UAAM,QAAQ,YAAY,IAAI,OAAO,GAAG,IAAI,IAAI;AAChD,YAAQ,KAAK,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,EACtC;AAEA,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,UAAU,YAAY;AACxB,aAAO;AACP;AAAA,IACF;AACA,QAAI,UAAU,gBAAgB;AAC5B,cAAQ,SAAS;AACjB;AAAA,IACF;AAEA,gBAAY,KAAK;AACjB,wBAAoB,KAAK;AACzB,YAAQ,aAAa;AAAA,EACvB;AAEA,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,yBAAC,QAAK,MAAI,MAAC;AAAA;AAAA,MACwB,oBAAoB;AAAA,MAAO;AAAA,OAC9D;AAAA,IACA,oBAAC,OAAI,WAAW,GACd,8BAAC,UAAO,SAAkB,UAAU,cAAc,GACpD;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli-v2/lib/skill-copier.ts"],"sourcesContent":["import path from \"path\";\nimport { stringify as stringifyYaml, parse as parseYaml } from \"yaml\";\nimport { copy, ensureDir, readFile, writeFile } from \"../utils/fs\";\nimport { hashFile } from \"./versioning\";\nimport type { MergedSkillsMatrix, ResolvedSkill } from \"../types-matrix\";\nimport type { SourceLoadResult } from \"./source-loader\";\n\ninterface ForkedFromMetadata {\n skill_id: string;\n content_hash: string;\n date: string;\n}\n\ninterface SkillMetadata {\n content_hash?: string;\n forked_from?: ForkedFromMetadata;\n [key: string]: unknown;\n}\n\nconst METADATA_FILE_NAME = \"metadata.yaml\";\n\nexport interface CopiedSkill {\n skillId: string;\n contentHash: string;\n sourcePath: string;\n destPath: string;\n local?: boolean;\n}\n\nfunction getSkillSourcePath(\n skill: ResolvedSkill,\n registryRoot: string,\n): string {\n return path.join(registryRoot, \"src\", skill.path);\n}\n\nfunction getSkillDestPath(skill: ResolvedSkill, stackDir: string): string {\n const skillRelativePath = skill.path.replace(/^skills\\//, \"\");\n return path.join(stackDir, \"skills\", skillRelativePath);\n}\n\nasync function generateSkillHash(skillSourcePath: string): Promise<string> {\n const skillMdPath = path.join(skillSourcePath, \"SKILL.md\");\n return hashFile(skillMdPath);\n}\n\nfunction getCurrentDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\nasync function injectForkedFromMetadata(\n destPath: string,\n skillId: string,\n contentHash: string,\n): Promise<void> {\n const metadataPath = path.join(destPath, METADATA_FILE_NAME);\n const rawContent = await readFile(metadataPath);\n\n const lines = rawContent.split(\"\\n\");\n let yamlContent = rawContent;\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n yamlContent = lines.slice(1).join(\"\\n\");\n }\n\n const metadata = parseYaml(yamlContent) as SkillMetadata;\n\n metadata.forked_from = {\n skill_id: skillId,\n content_hash: contentHash,\n date: getCurrentDate(),\n };\n\n const newYamlContent = stringifyYaml(metadata, { lineWidth: 0 });\n await writeFile(metadataPath, newYamlContent);\n}\n\nexport async function copySkill(\n skill: ResolvedSkill,\n stackDir: string,\n registryRoot: string,\n): Promise<CopiedSkill> {\n const sourcePath = getSkillSourcePath(skill, registryRoot);\n const destPath = getSkillDestPath(skill, stackDir);\n\n const contentHash = await generateSkillHash(sourcePath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectForkedFromMetadata(destPath, skill.id, contentHash);\n\n return {\n skillId: skill.id,\n contentHash,\n sourcePath,\n destPath,\n };\n}\n\nfunction getSkillSourcePathFromSource(\n skill: ResolvedSkill,\n sourceResult: SourceLoadResult,\n): string {\n return path.join(sourceResult.sourcePath, \"src\", skill.path);\n}\n\nexport async function copySkillFromSource(\n skill: ResolvedSkill,\n stackDir: string,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill> {\n const sourcePath = getSkillSourcePathFromSource(skill, sourceResult);\n const destPath = getSkillDestPath(skill, stackDir);\n\n const contentHash = await generateSkillHash(sourcePath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectForkedFromMetadata(destPath, skill.id, contentHash);\n\n return {\n skillId: skill.id,\n contentHash,\n sourcePath,\n destPath,\n };\n}\n\nexport async function copySkillsToPluginFromSource(\n selectedSkillIds: string[],\n pluginDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill[]> {\n const copiedSkills: CopiedSkill[] = [];\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n console.warn(`Warning: Skill not found in matrix: ${skillId}`);\n continue;\n }\n\n if (skill.local && skill.localPath) {\n const localSkillPath = path.join(process.cwd(), skill.localPath);\n const contentHash = await generateSkillHash(localSkillPath);\n\n copiedSkills.push({\n skillId: skill.id,\n sourcePath: skill.localPath,\n destPath: skill.localPath,\n contentHash,\n local: true,\n });\n continue;\n }\n\n const copied = await copySkillFromSource(skill, pluginDir, sourceResult);\n copiedSkills.push(copied);\n }\n\n return copiedSkills;\n}\n\nfunction getFlattenedSkillDestPath(\n skill: ResolvedSkill,\n localSkillsDir: string,\n): string {\n const skillFolderName = skill.alias || extractSkillNameFromId(skill.id);\n return path.join(localSkillsDir, skillFolderName);\n}\n\nfunction extractSkillNameFromId(skillId: string): string {\n const withoutAuthor = skillId.replace(/\\s*\\(@\\w+\\)$/, \"\").trim();\n return withoutAuthor;\n}\n\nasync function copySkillToLocalFlattened(\n skill: ResolvedSkill,\n localSkillsDir: string,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill> {\n const sourcePath = getSkillSourcePathFromSource(skill, sourceResult);\n const destPath = getFlattenedSkillDestPath(skill, localSkillsDir);\n\n const contentHash = await generateSkillHash(sourcePath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectForkedFromMetadata(destPath, skill.id, contentHash);\n\n return {\n skillId: skill.id,\n contentHash,\n sourcePath,\n destPath,\n };\n}\n\nexport async function copySkillsToLocalFlattened(\n selectedSkillIds: string[],\n localSkillsDir: string,\n matrix: MergedSkillsMatrix,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill[]> {\n const copiedSkills: CopiedSkill[] = [];\n\n for (const skillId of selectedSkillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) {\n console.warn(`Warning: Skill not found in matrix: ${skillId}`);\n continue;\n }\n\n if (skill.local && skill.localPath) {\n const localSkillPath = path.join(process.cwd(), skill.localPath);\n const contentHash = await generateSkillHash(localSkillPath);\n\n copiedSkills.push({\n skillId: skill.id,\n sourcePath: skill.localPath,\n destPath: skill.localPath,\n contentHash,\n local: true,\n });\n continue;\n }\n\n const copied = await copySkillToLocalFlattened(\n skill,\n localSkillsDir,\n sourceResult,\n );\n copiedSkills.push(copied);\n }\n\n return copiedSkills;\n}\n"],"mappings":"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","names":[]}
|