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.
Files changed (61) hide show
  1. package/README.md +61 -22
  2. package/README.zh.md +62 -24
  3. package/dist/cli.js +35 -5
  4. package/dist/cli.js.map +1 -1
  5. package/dist/domain/types.d.ts +25 -0
  6. package/dist/services/deployment-applier.js +6 -0
  7. package/dist/services/deployment-applier.js.map +1 -1
  8. package/dist/services/deployment-planner.d.ts +5 -0
  9. package/dist/services/deployment-planner.js +198 -16
  10. package/dist/services/deployment-planner.js.map +1 -1
  11. package/dist/services/doctor-service.js +1 -1
  12. package/dist/services/doctor-service.js.map +1 -1
  13. package/dist/services/skill-flow.d.ts +28 -2
  14. package/dist/services/skill-flow.js +354 -3
  15. package/dist/services/skill-flow.js.map +1 -1
  16. package/dist/services/source-service.d.ts +1 -1
  17. package/dist/services/source-service.js +15 -18
  18. package/dist/services/source-service.js.map +1 -1
  19. package/dist/state/store.d.ts +3 -0
  20. package/dist/state/store.js +10 -0
  21. package/dist/state/store.js.map +1 -1
  22. package/dist/tests/skill-flow.test.js +1427 -0
  23. package/dist/tests/skill-flow.test.js.map +1 -1
  24. package/dist/tui/config-app.js +53 -4
  25. package/dist/tui/config-app.js.map +1 -1
  26. package/dist/tui/find-app.d.ts +9 -0
  27. package/dist/tui/find-app.js +117 -0
  28. package/dist/tui/find-app.js.map +1 -0
  29. package/dist/utils/builtin-git-sources.d.ts +5 -0
  30. package/dist/utils/builtin-git-sources.js +23 -0
  31. package/dist/utils/builtin-git-sources.js.map +1 -0
  32. package/dist/utils/find-command.d.ts +2 -0
  33. package/dist/utils/find-command.js +21 -0
  34. package/dist/utils/find-command.js.map +1 -0
  35. package/dist/utils/format.d.ts +2 -1
  36. package/dist/utils/format.js +19 -1
  37. package/dist/utils/format.js.map +1 -1
  38. package/dist/utils/github-catalog.d.ts +1 -0
  39. package/dist/utils/github-catalog.js +25 -0
  40. package/dist/utils/github-catalog.js.map +1 -0
  41. package/dist/utils/naming.d.ts +9 -1
  42. package/dist/utils/naming.js +33 -6
  43. package/dist/utils/naming.js.map +1 -1
  44. package/package.json +10 -1
  45. package/.gstack/browse-network.log +0 -1
  46. package/.gstack/browse.json +0 -7
  47. package/.gstack/qa-reports/qa-report-skill-manager-2026-03-22.md +0 -60
  48. package/docs/DESIGN.md +0 -407
  49. package/docs/PRD/PRD-1.0.0.md +0 -1862
  50. package/docs/PRD/renew/PRD-0.0.0.md +0 -26
  51. package/docs/PRD/renew/PRD-0.0.1.md +0 -408
  52. package/docs/PRD/renew/PRD-0.0.2.md +0 -705
  53. package/docs/PRD/renew/PRD-0.0.3.md +0 -740
  54. package/docs/PRD/renew/PRD-0.0.4.md +0 -1494
  55. package/docs/README.md +0 -242
  56. package/docs/plan/PLAN_v1.0.0.md +0 -663
  57. package/docs/plan/PLAN_v1.0.1.md +0 -814
  58. package/docs/refrences/README.md +0 -7
  59. package/docs/refrences/agent-skill-paths.md +0 -252
  60. package/docs/refrences/naming-dedupe-warning-rules.md +0 -482
  61. 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,5 @@
1
+ export type BuiltinGitSource = {
2
+ locator: string;
3
+ branch: string;
4
+ };
5
+ export declare function getBuiltinGitSources(): BuiltinGitSource[];
@@ -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,2 @@
1
+ import type { SkillCandidate } from "../domain/types.js";
2
+ export declare function buildFindCommand(candidate: SkillCandidate): string | null;
@@ -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"}
@@ -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;
@@ -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 workflow groups yet",
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
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
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"}
@@ -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 {};
@@ -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 preferredCounts = new Map();
77
+ const projectedNameCounts = new Map();
69
78
  for (const preferred of preferredNames) {
70
- preferredCounts.set(preferred.projectedName, (preferredCounts.get(preferred.projectedName) ?? 0) + 1);
79
+ projectedNameCounts.set(preferred.projectedName, (projectedNameCounts.get(preferred.projectedName) ?? 0) + 1);
71
80
  }
72
81
  for (const preferred of preferredNames) {
73
- if ((preferredCounts.get(preferred.projectedName) ?? 0) === 1) {
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
@@ -1 +1 @@
1
- {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"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"}
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.1",
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)
@@ -1,7 +0,0 @@
1
- {
2
- "pid": 51199,
3
- "port": 30333,
4
- "token": "8770c4f1-ad31-4eaa-94c9-561a491cdbb2",
5
- "startedAt": "2026-03-21T10:24:32.663Z",
6
- "serverPath": "/Users/Vint/.cc-switch/skills/browse/src/server.ts"
7
- }
@@ -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.