skill-flow 1.0.1 → 1.0.3
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/README.md +61 -22
- package/README.zh.md +62 -24
- package/dist/cli.js +35 -5
- package/dist/cli.js.map +1 -1
- package/dist/domain/types.d.ts +25 -0
- package/dist/services/deployment-applier.js +6 -0
- package/dist/services/deployment-applier.js.map +1 -1
- package/dist/services/deployment-planner.d.ts +5 -0
- package/dist/services/deployment-planner.js +198 -16
- package/dist/services/deployment-planner.js.map +1 -1
- package/dist/services/doctor-service.js +1 -1
- package/dist/services/doctor-service.js.map +1 -1
- package/dist/services/skill-flow.d.ts +28 -2
- package/dist/services/skill-flow.js +354 -3
- package/dist/services/skill-flow.js.map +1 -1
- package/dist/services/source-service.d.ts +1 -1
- package/dist/services/source-service.js +15 -18
- package/dist/services/source-service.js.map +1 -1
- package/dist/state/store.d.ts +3 -0
- package/dist/state/store.js +10 -0
- package/dist/state/store.js.map +1 -1
- package/dist/tests/skill-flow.test.js +1427 -0
- package/dist/tests/skill-flow.test.js.map +1 -1
- package/dist/tui/config-app.js +53 -4
- package/dist/tui/config-app.js.map +1 -1
- package/dist/tui/find-app.d.ts +9 -0
- package/dist/tui/find-app.js +117 -0
- package/dist/tui/find-app.js.map +1 -0
- package/dist/utils/builtin-git-sources.d.ts +5 -0
- package/dist/utils/builtin-git-sources.js +23 -0
- package/dist/utils/builtin-git-sources.js.map +1 -0
- package/dist/utils/find-command.d.ts +2 -0
- package/dist/utils/find-command.js +21 -0
- package/dist/utils/find-command.js.map +1 -0
- package/dist/utils/format.d.ts +2 -1
- package/dist/utils/format.js +19 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/github-catalog.d.ts +1 -0
- package/dist/utils/github-catalog.js +25 -0
- package/dist/utils/github-catalog.js.map +1 -0
- package/dist/utils/naming.d.ts +9 -1
- package/dist/utils/naming.js +33 -6
- package/dist/utils/naming.js.map +1 -1
- package/package.json +10 -1
- package/.gstack/browse-network.log +0 -1
- package/.gstack/browse.json +0 -7
- package/.gstack/qa-reports/qa-report-skill-manager-2026-03-22.md +0 -60
- package/docs/DESIGN.md +0 -407
- package/docs/PRD/PRD-1.0.0.md +0 -1862
- package/docs/PRD/renew/PRD-0.0.0.md +0 -26
- package/docs/PRD/renew/PRD-0.0.1.md +0 -408
- package/docs/PRD/renew/PRD-0.0.2.md +0 -705
- package/docs/PRD/renew/PRD-0.0.3.md +0 -740
- package/docs/PRD/renew/PRD-0.0.4.md +0 -1494
- package/docs/README.md +0 -242
- package/docs/plan/PLAN_v1.0.0.md +0 -663
- package/docs/plan/PLAN_v1.0.1.md +0 -814
- package/docs/refrences/README.md +0 -7
- package/docs/refrences/agent-skill-paths.md +0 -252
- package/docs/refrences/naming-dedupe-warning-rules.md +0 -482
- package/img/img-1.jpg +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from "react";
|
|
3
|
+
import { Box, Text, useApp, useInput, useStdout } from "ink";
|
|
4
|
+
import { buildFindCommand } from "../utils/find-command.js";
|
|
5
|
+
export function FindApp({ app, query, candidates }) {
|
|
6
|
+
const { exit } = useApp();
|
|
7
|
+
const { stdout } = useStdout();
|
|
8
|
+
const [cursor, setCursor] = useState(0);
|
|
9
|
+
const [state, setState] = useState({ phase: "list" });
|
|
10
|
+
const visibleCandidates = useMemo(() => candidates.slice(0, 30), [candidates]);
|
|
11
|
+
const selected = visibleCandidates[cursor];
|
|
12
|
+
const columns = getColumns(stdout?.columns ?? 100);
|
|
13
|
+
useInput((input, key) => {
|
|
14
|
+
if (key.escape || input === "q") {
|
|
15
|
+
if (state.phase === "confirm" || state.phase === "error") {
|
|
16
|
+
setState({ phase: "list" });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
exit();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (state.phase === "installing") {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (state.phase === "done") {
|
|
26
|
+
exit();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (key.upArrow) {
|
|
30
|
+
setCursor((current) => Math.max(0, current - 1));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (key.downArrow) {
|
|
34
|
+
setCursor((current) => Math.min(visibleCandidates.length - 1, current + 1));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!key.return) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!selected) {
|
|
41
|
+
exit();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (state.phase === "list") {
|
|
45
|
+
setState({ phase: "confirm" });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (state.phase === "confirm") {
|
|
49
|
+
if (selected.action.type === "none") {
|
|
50
|
+
setState({ phase: "error", message: "This skill is already installed." });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
setState({ phase: "installing" });
|
|
54
|
+
void installSelected(app, selected).then((result) => {
|
|
55
|
+
if (result.ok) {
|
|
56
|
+
setState({
|
|
57
|
+
phase: "done",
|
|
58
|
+
message: result.message,
|
|
59
|
+
warnings: result.warnings,
|
|
60
|
+
});
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
setState({ phase: "error", message: result.message });
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (visibleCandidates.length === 0) {
|
|
68
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { children: ["No matching skills found for \"", query, "\"."] }), _jsx(Text, { color: "gray", children: "Press q or Esc to exit." })] }));
|
|
69
|
+
}
|
|
70
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Find Skills" }), _jsxs(Text, { color: "gray", children: ["query: ", query, " \u00B7 results: ", visibleCandidates.length, candidates.length > visibleCandidates.length ? ` / ${candidates.length}` : ""] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { bold: true, children: pad("No.", columns.index) }), _jsx(Text, { bold: true, children: pad("Skill", columns.name) }), _jsx(Text, { bold: true, children: "Repository" })] }), visibleCandidates.map((candidate, index) => {
|
|
71
|
+
const active = index === cursor;
|
|
72
|
+
return (_jsx(Box, { children: _jsxs(Text, { ...(active ? { color: "cyan" } : {}), children: [pad(`${index + 1}.`, columns.index), pad(candidate.installed ? `${candidate.title} *` : candidate.title, columns.name), candidate.sourceLabel] }) }, candidate.id));
|
|
73
|
+
}), selected ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { children: ["selected: ", _jsx(Text, { color: "cyan", children: selected.title }), " \u00B7 ", selected.sourceLabel] }), state.phase === "list" ? (_jsx(Text, { color: "gray", children: "Enter preview add command \u00B7 Up/Down move \u00B7 Esc/q exit" })) : null, state.phase === "confirm" ? (_jsxs(_Fragment, { children: [_jsxs(Text, { children: ["next: ", buildFindCommand(selected) ?? "already installed"] }), _jsx(Text, { color: "gray", children: "Enter install \u00B7 Esc back" })] })) : null, state.phase === "installing" ? _jsx(Text, { color: "yellow", children: "Installing..." }) : null, state.phase === "done" ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", children: state.message }), state.warnings.map((warning) => (_jsxs(Text, { color: "yellow", children: ["warning: ", warning] }, warning))), _jsx(Text, { color: "gray", children: "Press Enter, q, or Esc to exit." })] })) : null, state.phase === "error" ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: "red", children: state.message }), _jsx(Text, { color: "gray", children: "Esc back" })] })) : null] })) : null] }));
|
|
74
|
+
}
|
|
75
|
+
async function installSelected(app, candidate) {
|
|
76
|
+
if (candidate.action.type === "add-clawhub") {
|
|
77
|
+
const locator = candidate.action.version
|
|
78
|
+
? `clawhub:${candidate.action.slug}@${candidate.action.version}`
|
|
79
|
+
: `clawhub:${candidate.action.slug}`;
|
|
80
|
+
const result = await app.addSource(locator);
|
|
81
|
+
if (!result.ok) {
|
|
82
|
+
return { ok: false, message: result.errors[0]?.message ?? "Install failed." };
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
message: `Added ${result.data.manifest.displayName} with ${result.data.leafCount} skills.`,
|
|
87
|
+
warnings: result.warnings.map((warning) => warning.message),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (candidate.action.type === "add-git") {
|
|
91
|
+
const result = await app.addSource(candidate.action.locator, candidate.action.requestedPath
|
|
92
|
+
? { path: candidate.action.requestedPath }
|
|
93
|
+
: undefined);
|
|
94
|
+
if (!result.ok) {
|
|
95
|
+
return { ok: false, message: result.errors[0]?.message ?? "Install failed." };
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
ok: true,
|
|
99
|
+
message: `Added ${result.data.manifest.displayName} with ${result.data.leafCount} skills.`,
|
|
100
|
+
warnings: result.warnings.map((warning) => warning.message),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return { ok: false, message: "This skill is already installed." };
|
|
104
|
+
}
|
|
105
|
+
function getColumns(total) {
|
|
106
|
+
const usable = Math.max(72, total);
|
|
107
|
+
return {
|
|
108
|
+
index: 5,
|
|
109
|
+
name: Math.max(18, Math.floor(usable * 0.26)),
|
|
110
|
+
source: Math.max(12, Math.floor(usable * 0.14)),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function pad(value, width) {
|
|
114
|
+
const trimmed = value.length > width - 1 ? `${value.slice(0, width - 2)}…` : value;
|
|
115
|
+
return trimmed.padEnd(width, " ");
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=find-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-app.js","sourceRoot":"","sources":["../../src/tui/find-app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function getBuiltinGitSources() {
|
|
2
|
+
return [
|
|
3
|
+
{ locator: "https://github.com/anthropics/skills.git", branch: "main" },
|
|
4
|
+
{ locator: "https://github.com/obra/superpowers.git", branch: "main" },
|
|
5
|
+
{ locator: "https://github.com/affaan-m/everything-claude-code.git", branch: "main" },
|
|
6
|
+
{ locator: "https://github.com/msitarzewski/agency-agents.git", branch: "main" },
|
|
7
|
+
{ locator: "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", branch: "main" },
|
|
8
|
+
{ locator: "https://github.com/sickn33/antigravity-awesome-skills.git", branch: "main" },
|
|
9
|
+
{ locator: "https://github.com/coreyhaines31/marketingskills.git", branch: "main" },
|
|
10
|
+
{ locator: "https://github.com/agentskills/agentskills.git", branch: "main" },
|
|
11
|
+
{ locator: "https://github.com/Leonxlnx/taste-skill.git", branch: "main" },
|
|
12
|
+
{ locator: "https://github.com/Affitor/affiliate-skills.git", branch: "main" },
|
|
13
|
+
{ locator: "https://github.com/luongnv89/skills.git", branch: "main" },
|
|
14
|
+
{ locator: "https://github.com/ComposioHQ/awesome-claude-skills.git", branch: "master" },
|
|
15
|
+
{ locator: "https://github.com/cexll/myclaude.git", branch: "master" },
|
|
16
|
+
{ locator: "https://github.com/JimLiu/baoyu-skills.git", branch: "main" },
|
|
17
|
+
{ locator: "https://github.com/dontbesilent2025/dbskill.git", branch: "main" },
|
|
18
|
+
{ locator: "https://github.com/garrytan/gstack.git", branch: "main" },
|
|
19
|
+
{ locator: "https://github.com/pbakaus/impeccable.git", branch: "main" },
|
|
20
|
+
{ locator: "https://github.com/zarazhangrui/frontend-slides.git", branch: "main" },
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=builtin-git-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-git-sources.js","sourceRoot":"","sources":["../../src/utils/builtin-git-sources.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,EAAE,OAAO,EAAE,0CAA0C,EAAE,MAAM,EAAE,MAAM,EAAE;QACvE,EAAE,OAAO,EAAE,yCAAyC,EAAE,MAAM,EAAE,MAAM,EAAE;QACtE,EAAE,OAAO,EAAE,wDAAwD,EAAE,MAAM,EAAE,MAAM,EAAE;QACrF,EAAE,OAAO,EAAE,mDAAmD,EAAE,MAAM,EAAE,MAAM,EAAE;QAChF,EAAE,OAAO,EAAE,6DAA6D,EAAE,MAAM,EAAE,MAAM,EAAE;QAC1F,EAAE,OAAO,EAAE,2DAA2D,EAAE,MAAM,EAAE,MAAM,EAAE;QACxF,EAAE,OAAO,EAAE,sDAAsD,EAAE,MAAM,EAAE,MAAM,EAAE;QACnF,EAAE,OAAO,EAAE,gDAAgD,EAAE,MAAM,EAAE,MAAM,EAAE;QAC7E,EAAE,OAAO,EAAE,6CAA6C,EAAE,MAAM,EAAE,MAAM,EAAE;QAC1E,EAAE,OAAO,EAAE,iDAAiD,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9E,EAAE,OAAO,EAAE,yCAAyC,EAAE,MAAM,EAAE,MAAM,EAAE;QACtE,EAAE,OAAO,EAAE,yDAAyD,EAAE,MAAM,EAAE,QAAQ,EAAE;QACxF,EAAE,OAAO,EAAE,uCAAuC,EAAE,MAAM,EAAE,QAAQ,EAAE;QACtE,EAAE,OAAO,EAAE,4CAA4C,EAAE,MAAM,EAAE,MAAM,EAAE;QACzE,EAAE,OAAO,EAAE,iDAAiD,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9E,EAAE,OAAO,EAAE,wCAAwC,EAAE,MAAM,EAAE,MAAM,EAAE;QACrE,EAAE,OAAO,EAAE,2CAA2C,EAAE,MAAM,EAAE,MAAM,EAAE;QACxE,EAAE,OAAO,EAAE,qDAAqD,EAAE,MAAM,EAAE,MAAM,EAAE;KACnF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function buildFindCommand(candidate) {
|
|
2
|
+
if (candidate.action.type === "none") {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
if (candidate.action.type === "add-clawhub") {
|
|
6
|
+
const suffix = candidate.action.version ? `@${candidate.action.version}` : "";
|
|
7
|
+
return `skill-flow add clawhub:${candidate.action.slug}${suffix}`;
|
|
8
|
+
}
|
|
9
|
+
const parts = ["skill-flow", "add", shellQuote(candidate.action.locator)];
|
|
10
|
+
if (candidate.action.requestedPath) {
|
|
11
|
+
parts.push("--path", shellQuote(candidate.action.requestedPath));
|
|
12
|
+
}
|
|
13
|
+
return parts.join(" ");
|
|
14
|
+
}
|
|
15
|
+
function shellQuote(value) {
|
|
16
|
+
if (/^[A-Za-z0-9_./:@-]+$/.test(value)) {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
return `'${value.replace(/'/g, `'\"'\"'`)}'`;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=find-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-command.js","sourceRoot":"","sources":["../../src/utils/find-command.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,SAAyB;IACxD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO,0BAA0B,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,IAAI,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;AAC/C,CAAC"}
|
package/dist/utils/format.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { DeploymentAction, DeploymentTargetName, DoctorIssue, WorkflowSummary } from "../domain/types.js";
|
|
1
|
+
import type { DeploymentAction, DeploymentTargetName, DoctorIssue, SkillCandidate, WorkflowSummary } from "../domain/types.js";
|
|
2
2
|
export declare function formatWorkflowList(summaries: WorkflowSummary[]): string;
|
|
3
3
|
export declare function countActions(actions: DeploymentAction[]): Record<string, number>;
|
|
4
4
|
export declare function formatActionSummary(actions: DeploymentAction[]): string;
|
|
5
5
|
export declare function formatTargetName(target: DeploymentTargetName): string;
|
|
6
6
|
export declare function formatDoctorIssue(issue: DoctorIssue): string;
|
|
7
|
+
export declare function formatSkillCandidates(candidates: SkillCandidate[]): string;
|
package/dist/utils/format.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { TARGET_LABELS } from "./constants.js";
|
|
2
|
+
import { buildFindCommand } from "./find-command.js";
|
|
2
3
|
import { formatGroupLabel } from "./naming.js";
|
|
3
4
|
export function formatWorkflowList(summaries) {
|
|
4
5
|
if (summaries.length === 0) {
|
|
5
6
|
return [
|
|
6
|
-
"No
|
|
7
|
+
"No skills groups yet",
|
|
7
8
|
"Add a source to discover a grouped set of related skills.",
|
|
8
9
|
].join("\n");
|
|
9
10
|
}
|
|
@@ -47,4 +48,21 @@ export function formatDoctorIssue(issue) {
|
|
|
47
48
|
: "";
|
|
48
49
|
return `[${issue.severity.toUpperCase()}] ${issue.sourceLabel ?? issue.sourceId}${target}${leaf} ${issue.message}`;
|
|
49
50
|
}
|
|
51
|
+
export function formatSkillCandidates(candidates) {
|
|
52
|
+
if (candidates.length === 0) {
|
|
53
|
+
return "No matching skills found.";
|
|
54
|
+
}
|
|
55
|
+
return candidates
|
|
56
|
+
.map((candidate, index) => {
|
|
57
|
+
const location = candidate.relativePath ? ` · ${candidate.relativePath}` : "";
|
|
58
|
+
const next = buildFindCommand(candidate);
|
|
59
|
+
return [
|
|
60
|
+
`${index + 1}. ${candidate.title} ${candidate.source}${candidate.installed ? " installed" : ""}`,
|
|
61
|
+
candidate.description,
|
|
62
|
+
`${candidate.sourceLabel}${location}`,
|
|
63
|
+
next ? `next: ${next}` : "next: already installed",
|
|
64
|
+
].join("\n");
|
|
65
|
+
})
|
|
66
|
+
.join("\n\n");
|
|
67
|
+
}
|
|
50
68
|
//# sourceMappingURL=format.js.map
|
package/dist/utils/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function fetchGitHubSkillPaths(locator: string, branch: string): Promise<string[]>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { parseGitHubRepo } from "./naming.js";
|
|
2
|
+
export async function fetchGitHubSkillPaths(locator, branch) {
|
|
3
|
+
const repo = parseGitHubRepo(locator);
|
|
4
|
+
if (!repo) {
|
|
5
|
+
throw new Error(`Unsupported GitHub locator '${locator}'.`);
|
|
6
|
+
}
|
|
7
|
+
const response = await fetch(`https://api.github.com/repos/${repo.owner}/${repo.repo}/git/trees/${branch}?recursive=1`, { headers: buildGitHubHeaders() });
|
|
8
|
+
if (!response.ok) {
|
|
9
|
+
throw new Error(`GitHub tree request failed with ${response.status}.`);
|
|
10
|
+
}
|
|
11
|
+
const payload = await response.json();
|
|
12
|
+
return (payload.tree ?? [])
|
|
13
|
+
.filter((entry) => entry.type === "blob" && entry.path?.endsWith("SKILL.md"))
|
|
14
|
+
.map((entry) => entry.path)
|
|
15
|
+
.sort((left, right) => left.localeCompare(right));
|
|
16
|
+
}
|
|
17
|
+
function buildGitHubHeaders() {
|
|
18
|
+
return {
|
|
19
|
+
Accept: "application/vnd.github+json",
|
|
20
|
+
...(process.env.GITHUB_TOKEN
|
|
21
|
+
? { Authorization: `Bearer ${process.env.GITHUB_TOKEN}` }
|
|
22
|
+
: {}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=github-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-catalog.js","sourceRoot":"","sources":["../../src/utils/github-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS9C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAe,EACf,MAAc;IAEd,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,gCAAgC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,cAAc,MAAM,cAAc,EACzF,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAClC,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwB,CAAC;IAC5D,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAK,CAAC;SAC3B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;QACL,MAAM,EAAE,6BAA6B;QACrC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;YAC1B,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
|
package/dist/utils/naming.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ type ProjectedSkillInput = {
|
|
|
7
7
|
leafId: string;
|
|
8
8
|
groupId: string;
|
|
9
9
|
groupName: string;
|
|
10
|
+
groupAuthor?: string | undefined;
|
|
10
11
|
skillName: string;
|
|
11
12
|
};
|
|
12
13
|
export declare function parseGitHubRepo(locator: string): {
|
|
@@ -15,6 +16,13 @@ export declare function parseGitHubRepo(locator: string): {
|
|
|
15
16
|
} | null;
|
|
16
17
|
export declare function formatGroupLabel(source: SourceLike): string;
|
|
17
18
|
export declare function formatGroupRef(source: SourceLike): string;
|
|
18
|
-
export declare function buildProjectedSkillName(groupName: string, skillName: string): string;
|
|
19
|
+
export declare function buildProjectedSkillName(groupName: string, skillName: string, groupAuthor?: string): string;
|
|
20
|
+
export declare function buildProjectedSkillNameCandidates({ preferredName, groupId, groupName, groupAuthor, skillName, }: {
|
|
21
|
+
preferredName: string;
|
|
22
|
+
groupId: string;
|
|
23
|
+
groupName: string;
|
|
24
|
+
groupAuthor?: string | undefined;
|
|
25
|
+
skillName: string;
|
|
26
|
+
}): string[];
|
|
19
27
|
export declare function resolveProjectedSkillNames(items: ProjectedSkillInput[]): Map<string, string>;
|
|
20
28
|
export {};
|
package/dist/utils/naming.js
CHANGED
|
@@ -42,8 +42,17 @@ export function formatGroupLabel(source) {
|
|
|
42
42
|
export function formatGroupRef(source) {
|
|
43
43
|
return `${formatGroupLabel(source)} [${source.id}]`;
|
|
44
44
|
}
|
|
45
|
-
export function buildProjectedSkillName(groupName, skillName) {
|
|
46
|
-
return `${groupName}-${skillName}`;
|
|
45
|
+
export function buildProjectedSkillName(groupName, skillName, groupAuthor) {
|
|
46
|
+
return `${getPreferredProjectedPrefix(groupName, skillName, groupAuthor)}-${skillName}`;
|
|
47
|
+
}
|
|
48
|
+
export function buildProjectedSkillNameCandidates({ preferredName, groupId, groupName, groupAuthor, skillName, }) {
|
|
49
|
+
const candidates = [
|
|
50
|
+
preferredName,
|
|
51
|
+
buildProjectedSkillName(groupName, skillName, groupAuthor),
|
|
52
|
+
buildRepoAuthorProjectedSkillName(groupName, skillName, groupAuthor),
|
|
53
|
+
`${groupId}-${skillName}`,
|
|
54
|
+
];
|
|
55
|
+
return [...new Set(candidates.filter((value) => Boolean(value)))];
|
|
47
56
|
}
|
|
48
57
|
export function resolveProjectedSkillNames(items) {
|
|
49
58
|
const result = new Map();
|
|
@@ -63,20 +72,38 @@ export function resolveProjectedSkillNames(items) {
|
|
|
63
72
|
}
|
|
64
73
|
const preferredNames = group.map((item) => ({
|
|
65
74
|
item,
|
|
66
|
-
projectedName: buildProjectedSkillName(item.groupName, item.skillName),
|
|
75
|
+
projectedName: buildProjectedSkillName(item.groupName, item.skillName, item.groupAuthor),
|
|
67
76
|
}));
|
|
68
|
-
const
|
|
77
|
+
const projectedNameCounts = new Map();
|
|
69
78
|
for (const preferred of preferredNames) {
|
|
70
|
-
|
|
79
|
+
projectedNameCounts.set(preferred.projectedName, (projectedNameCounts.get(preferred.projectedName) ?? 0) + 1);
|
|
71
80
|
}
|
|
72
81
|
for (const preferred of preferredNames) {
|
|
73
|
-
if ((
|
|
82
|
+
if ((projectedNameCounts.get(preferred.projectedName) ?? 0) === 1) {
|
|
74
83
|
result.set(preferred.item.leafId, preferred.projectedName);
|
|
75
84
|
continue;
|
|
76
85
|
}
|
|
86
|
+
const repoAuthorProjectedName = buildRepoAuthorProjectedSkillName(preferred.item.groupName, preferred.item.skillName, preferred.item.groupAuthor);
|
|
87
|
+
if (repoAuthorProjectedName &&
|
|
88
|
+
(projectedNameCounts.get(repoAuthorProjectedName) ?? 0) === 0) {
|
|
89
|
+
result.set(preferred.item.leafId, repoAuthorProjectedName);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
77
92
|
result.set(preferred.item.leafId, `${preferred.item.groupId}-${preferred.item.skillName}`);
|
|
78
93
|
}
|
|
79
94
|
}
|
|
80
95
|
return result;
|
|
81
96
|
}
|
|
97
|
+
function getPreferredProjectedPrefix(groupName, skillName, groupAuthor) {
|
|
98
|
+
if (skillName.startsWith(`${groupName}-`) && groupAuthor) {
|
|
99
|
+
return groupAuthor;
|
|
100
|
+
}
|
|
101
|
+
return groupName;
|
|
102
|
+
}
|
|
103
|
+
function buildRepoAuthorProjectedSkillName(groupName, skillName, groupAuthor) {
|
|
104
|
+
if (!groupAuthor) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
return `${groupName}(${groupAuthor})-${skillName}`;
|
|
108
|
+
}
|
|
82
109
|
//# sourceMappingURL=naming.js.map
|
package/dist/utils/naming.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skill-flow",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Workflow-first management for AI agent skills. Group, project, and sync skills across multiple agents with explicit state tracking.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"skill-flow": "dist/cli.js"
|
|
9
9
|
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"README.zh.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
10
16
|
"scripts": {
|
|
11
17
|
"build": "tsc -p tsconfig.json",
|
|
12
18
|
"dev": "tsx src/cli.tsx",
|
|
@@ -35,6 +41,9 @@
|
|
|
35
41
|
"url": "https://github.com/VintLin/skill-flow/issues"
|
|
36
42
|
},
|
|
37
43
|
"homepage": "https://github.com/VintLin/skill-flow#readme",
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20"
|
|
46
|
+
},
|
|
38
47
|
"dependencies": {
|
|
39
48
|
"commander": "^14.0.3",
|
|
40
49
|
"ink": "^6.8.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[2026-03-21T10:24:32.733Z] GET file:///tmp/gstack-sketch-skill-flow.html → 200 (5ms, 7267B)
|
package/.gstack/browse.json
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# QA Report: skill-flow
|
|
2
|
-
|
|
3
|
-
Date: 2026-03-22
|
|
4
|
-
Mode: full CLI QA
|
|
5
|
-
Scope: build, unit tests, empty-state CLI flows, add/apply/update/uninstall end-to-end flow, interactive config smoke check
|
|
6
|
-
|
|
7
|
-
## Coverage
|
|
8
|
-
|
|
9
|
-
- `npm test`
|
|
10
|
-
- `npm run build`
|
|
11
|
-
- `node dist/cli.js --help`
|
|
12
|
-
- Empty state:
|
|
13
|
-
- `list`
|
|
14
|
-
- `doctor`
|
|
15
|
-
- `config`
|
|
16
|
-
- `uninstall missing`
|
|
17
|
-
- End-to-end fixture workflow:
|
|
18
|
-
- `add <git-source>`
|
|
19
|
-
- `list`
|
|
20
|
-
- `doctor`
|
|
21
|
-
- `applyDraft(...)` through app service with real state root + target roots
|
|
22
|
-
- `update --all` after upstream repo change
|
|
23
|
-
- `uninstall <sourceId>`
|
|
24
|
-
|
|
25
|
-
## Findings
|
|
26
|
-
|
|
27
|
-
### ISSUE-001
|
|
28
|
-
|
|
29
|
-
- Severity: medium
|
|
30
|
-
- Title: `uninstall` reported success for unknown workflow groups
|
|
31
|
-
- Repro:
|
|
32
|
-
1. Start with a fresh state root.
|
|
33
|
-
2. Run `node dist/cli.js uninstall missing`.
|
|
34
|
-
- Expected:
|
|
35
|
-
- Command should fail and say the workflow group is not registered.
|
|
36
|
-
- Actual:
|
|
37
|
-
- Command printed `Removed: missing` and exited `0`.
|
|
38
|
-
- Fix status: verified
|
|
39
|
-
|
|
40
|
-
## Fix
|
|
41
|
-
|
|
42
|
-
- Updated source removal to reject unknown workflow groups with `SOURCE_NOT_FOUND`.
|
|
43
|
-
- Added regression test coverage for uninstalling an unknown workflow group.
|
|
44
|
-
|
|
45
|
-
## Verification
|
|
46
|
-
|
|
47
|
-
- `npm test` -> 33 passed
|
|
48
|
-
- `npm run build` -> passed
|
|
49
|
-
- `node dist/cli.js uninstall missing` -> prints `Workflow group 'missing' is not registered.` and exits `1`
|
|
50
|
-
- End-to-end fixture flow still passes:
|
|
51
|
-
- add source
|
|
52
|
-
- apply targets
|
|
53
|
-
- doctor healthy
|
|
54
|
-
- update after source change
|
|
55
|
-
- uninstall existing source
|
|
56
|
-
- list returns empty state
|
|
57
|
-
|
|
58
|
-
## Summary
|
|
59
|
-
|
|
60
|
-
QA found 1 issue, fixed 1, deferred 0.
|