genskills 1.0.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.
Files changed (97) hide show
  1. package/README.md +259 -0
  2. package/dist/cli/commands/clean.d.ts +3 -0
  3. package/dist/cli/commands/clean.d.ts.map +1 -0
  4. package/dist/cli/commands/clean.js +100 -0
  5. package/dist/cli/commands/clean.js.map +1 -0
  6. package/dist/cli/commands/disable.d.ts +3 -0
  7. package/dist/cli/commands/disable.d.ts.map +1 -0
  8. package/dist/cli/commands/disable.js +44 -0
  9. package/dist/cli/commands/disable.js.map +1 -0
  10. package/dist/cli/commands/doctor.d.ts +3 -0
  11. package/dist/cli/commands/doctor.d.ts.map +1 -0
  12. package/dist/cli/commands/doctor.js +151 -0
  13. package/dist/cli/commands/doctor.js.map +1 -0
  14. package/dist/cli/commands/enable.d.ts +3 -0
  15. package/dist/cli/commands/enable.d.ts.map +1 -0
  16. package/dist/cli/commands/enable.js +48 -0
  17. package/dist/cli/commands/enable.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +3 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +94 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/install.d.ts +3 -0
  23. package/dist/cli/commands/install.d.ts.map +1 -0
  24. package/dist/cli/commands/install.js +40 -0
  25. package/dist/cli/commands/install.js.map +1 -0
  26. package/dist/cli/commands/list.d.ts +3 -0
  27. package/dist/cli/commands/list.d.ts.map +1 -0
  28. package/dist/cli/commands/list.js +60 -0
  29. package/dist/cli/commands/list.js.map +1 -0
  30. package/dist/cli/commands/update.d.ts +3 -0
  31. package/dist/cli/commands/update.d.ts.map +1 -0
  32. package/dist/cli/commands/update.js +58 -0
  33. package/dist/cli/commands/update.js.map +1 -0
  34. package/dist/cli/index.d.ts +8 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +33 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/utils/config-loader.d.ts +37 -0
  39. package/dist/cli/utils/config-loader.d.ts.map +1 -0
  40. package/dist/cli/utils/config-loader.js +129 -0
  41. package/dist/cli/utils/config-loader.js.map +1 -0
  42. package/dist/cli/utils/copy.d.ts +26 -0
  43. package/dist/cli/utils/copy.d.ts.map +1 -0
  44. package/dist/cli/utils/copy.js +182 -0
  45. package/dist/cli/utils/copy.js.map +1 -0
  46. package/dist/cli/utils/dependency-resolver.d.ts +26 -0
  47. package/dist/cli/utils/dependency-resolver.d.ts.map +1 -0
  48. package/dist/cli/utils/dependency-resolver.js +181 -0
  49. package/dist/cli/utils/dependency-resolver.js.map +1 -0
  50. package/dist/cli/utils/hooks.d.ts +22 -0
  51. package/dist/cli/utils/hooks.d.ts.map +1 -0
  52. package/dist/cli/utils/hooks.js +124 -0
  53. package/dist/cli/utils/hooks.js.map +1 -0
  54. package/dist/cli/utils/logger.d.ts +13 -0
  55. package/dist/cli/utils/logger.d.ts.map +1 -0
  56. package/dist/cli/utils/logger.js +57 -0
  57. package/dist/cli/utils/logger.js.map +1 -0
  58. package/dist/cli/utils/manifest.d.ts +29 -0
  59. package/dist/cli/utils/manifest.d.ts.map +1 -0
  60. package/dist/cli/utils/manifest.js +110 -0
  61. package/dist/cli/utils/manifest.js.map +1 -0
  62. package/dist/cli/utils/paths.d.ts +46 -0
  63. package/dist/cli/utils/paths.d.ts.map +1 -0
  64. package/dist/cli/utils/paths.js +150 -0
  65. package/dist/cli/utils/paths.js.map +1 -0
  66. package/dist/index.d.ts +12 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +30 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/postinstall.d.ts +9 -0
  71. package/dist/postinstall.d.ts.map +1 -0
  72. package/dist/postinstall.js +58 -0
  73. package/dist/postinstall.js.map +1 -0
  74. package/package.json +52 -0
  75. package/plugin.json +60 -0
  76. package/schemas/genskills-config.schema.json +91 -0
  77. package/skills/code-quality/code-review/SKILL.md +65 -0
  78. package/skills/code-quality/lint-fix/SKILL.md +44 -0
  79. package/skills/code-quality/refactor/SKILL.md +43 -0
  80. package/skills/code-quality/security-audit/SKILL.md +71 -0
  81. package/skills/code-quality/test-generator/SKILL.md +51 -0
  82. package/skills/code-quality/type-check/SKILL.md +41 -0
  83. package/skills/development/debug/SKILL.md +53 -0
  84. package/skills/development/migrate/SKILL.md +50 -0
  85. package/skills/development/perf-optimize/SKILL.md +64 -0
  86. package/skills/development/scaffold/SKILL.md +52 -0
  87. package/skills/documentation/api-docs/SKILL.md +51 -0
  88. package/skills/documentation/doc-gen/SKILL.md +49 -0
  89. package/skills/documentation/readme-gen/SKILL.md +68 -0
  90. package/skills/project-management/changelog-gen/SKILL.md +61 -0
  91. package/skills/project-management/release-notes/SKILL.md +62 -0
  92. package/skills/project-management/task-tracker/SKILL.md +42 -0
  93. package/skills/workflow/branch-manager/SKILL.md +50 -0
  94. package/skills/workflow/ci-fix/SKILL.md +44 -0
  95. package/skills/workflow/deploy/SKILL.md +53 -0
  96. package/skills/workflow/git-commit/SKILL.md +58 -0
  97. package/skills/workflow/pr-create/SKILL.md +53 -0
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.installSkills = installSkills;
37
+ exports.removeSkill = removeSkill;
38
+ exports.copyDirRecursive = copyDirRecursive;
39
+ exports.getInstalledSkills = getInstalledSkills;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const paths_1 = require("./paths");
43
+ const config_loader_1 = require("./config-loader");
44
+ const manifest_1 = require("./manifest");
45
+ /**
46
+ * Install all enabled skills into the project.
47
+ */
48
+ function installSkills(projectRoot, options = {}) {
49
+ const config = (0, config_loader_1.loadConfig)(projectRoot);
50
+ const skillsDir = (0, paths_1.getSkillsDir)(projectRoot);
51
+ const manifest = (0, manifest_1.readManifest)(projectRoot);
52
+ const result = {
53
+ installed: [],
54
+ updated: [],
55
+ skipped: [],
56
+ errors: [],
57
+ };
58
+ // Ensure skills directory exists
59
+ fs.mkdirSync(skillsDir, { recursive: true });
60
+ const categories = (0, paths_1.getCategories)();
61
+ for (const category of categories) {
62
+ const skills = (0, paths_1.getSkillsInCategory)(category);
63
+ for (const skillName of skills) {
64
+ // If a specific skill was requested, skip others
65
+ if (options.specific && options.specific !== skillName)
66
+ continue;
67
+ // Check if skill is enabled
68
+ if (!options.force && !(0, config_loader_1.isSkillEnabled)(config, category, skillName)) {
69
+ result.skipped.push(skillName);
70
+ continue;
71
+ }
72
+ try {
73
+ const status = installSingleSkill(projectRoot, category, skillName, config, manifest, options.force);
74
+ if (status === "installed")
75
+ result.installed.push(skillName);
76
+ else if (status === "updated")
77
+ result.updated.push(skillName);
78
+ else
79
+ result.skipped.push(skillName);
80
+ }
81
+ catch (err) {
82
+ const msg = err instanceof Error ? err.message : String(err);
83
+ result.errors.push(`${skillName}: ${msg}`);
84
+ }
85
+ }
86
+ }
87
+ // Update manifest
88
+ manifest.packageVersion = (0, manifest_1.getPackageVersion)();
89
+ manifest.installedAt = new Date().toISOString();
90
+ (0, manifest_1.writeManifest)(projectRoot, manifest);
91
+ return result;
92
+ }
93
+ /**
94
+ * Install a single skill.
95
+ */
96
+ function installSingleSkill(projectRoot, category, skillName, config, manifest, force) {
97
+ const sourcePath = (0, paths_1.getSkillSourcePath)(category, skillName);
98
+ const targetDir = path.join((0, paths_1.getSkillsDir)(projectRoot), (0, paths_1.namespacedSkillDir)(skillName));
99
+ const manifestKey = (0, paths_1.namespacedSkillDir)(skillName);
100
+ // Compute source checksum
101
+ const sourceChecksum = (0, manifest_1.computeChecksum)(sourcePath);
102
+ // Check if already installed with same checksum
103
+ const existing = manifest.skills[manifestKey];
104
+ if (existing && existing.checksum === sourceChecksum && !force) {
105
+ return "skipped";
106
+ }
107
+ const isUpdate = existing !== undefined;
108
+ // Backup existing if updating
109
+ if (isUpdate && fs.existsSync(targetDir)) {
110
+ backupSkill(projectRoot, skillName, targetDir);
111
+ }
112
+ // Copy skill directory
113
+ copyDirRecursive(sourcePath, targetDir);
114
+ // Write per-skill config
115
+ const settings = (0, config_loader_1.getSkillSettings)(config, skillName);
116
+ if (Object.keys(settings).length > 0) {
117
+ fs.writeFileSync(path.join(targetDir, "_config.json"), JSON.stringify(settings, null, 2), "utf-8");
118
+ }
119
+ // Update manifest entry
120
+ manifest.skills[manifestKey] = {
121
+ version: (0, manifest_1.getPackageVersion)(),
122
+ category,
123
+ checksum: sourceChecksum,
124
+ installedAt: new Date().toISOString(),
125
+ source: "genskills",
126
+ };
127
+ return isUpdate ? "updated" : "installed";
128
+ }
129
+ /**
130
+ * Remove a skill from the project.
131
+ */
132
+ function removeSkill(projectRoot, skillName) {
133
+ const targetDir = path.join((0, paths_1.getSkillsDir)(projectRoot), (0, paths_1.namespacedSkillDir)(skillName));
134
+ const manifest = (0, manifest_1.readManifest)(projectRoot);
135
+ const manifestKey = (0, paths_1.namespacedSkillDir)(skillName);
136
+ if (!fs.existsSync(targetDir))
137
+ return false;
138
+ fs.rmSync(targetDir, { recursive: true, force: true });
139
+ delete manifest.skills[manifestKey];
140
+ (0, manifest_1.writeManifest)(projectRoot, manifest);
141
+ return true;
142
+ }
143
+ /**
144
+ * Backup a skill directory before overwriting.
145
+ */
146
+ function backupSkill(projectRoot, skillName, sourceDir) {
147
+ const backupDir = (0, paths_1.getBackupDir)(projectRoot);
148
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
149
+ const backupPath = path.join(backupDir, `${skillName}-${timestamp}`);
150
+ fs.mkdirSync(backupPath, { recursive: true });
151
+ copyDirRecursive(sourceDir, backupPath);
152
+ }
153
+ /**
154
+ * Recursively copy a directory.
155
+ */
156
+ function copyDirRecursive(src, dest) {
157
+ fs.mkdirSync(dest, { recursive: true });
158
+ const entries = fs.readdirSync(src, { withFileTypes: true });
159
+ for (const entry of entries) {
160
+ const srcPath = path.join(src, entry.name);
161
+ const destPath = path.join(dest, entry.name);
162
+ if (entry.isDirectory()) {
163
+ copyDirRecursive(srcPath, destPath);
164
+ }
165
+ else if (entry.isFile()) {
166
+ fs.copyFileSync(srcPath, destPath);
167
+ }
168
+ }
169
+ }
170
+ /**
171
+ * Get all installed genskills skill names.
172
+ */
173
+ function getInstalledSkills(projectRoot) {
174
+ const skillsDir = (0, paths_1.getSkillsDir)(projectRoot);
175
+ if (!fs.existsSync(skillsDir))
176
+ return [];
177
+ return fs
178
+ .readdirSync(skillsDir, { withFileTypes: true })
179
+ .filter((d) => d.isDirectory() && d.name.startsWith("genskills--"))
180
+ .map((d) => d.name.replace("genskills--", ""));
181
+ }
182
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/cli/utils/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface MissingDep {
2
+ skill: string;
3
+ dependency: string;
4
+ }
5
+ export interface DependencyResult {
6
+ resolved: string[];
7
+ missing: MissingDep[];
8
+ autoEnabled: string[];
9
+ }
10
+ /**
11
+ * Parse genskills-depends from a SKILL.md frontmatter.
12
+ */
13
+ export declare function parseSkillDependencies(skillMdPath: string): string[];
14
+ /**
15
+ * Build the full dependency graph for all skills.
16
+ */
17
+ export declare function buildDependencyGraph(): Map<string, string[]>;
18
+ /**
19
+ * Resolve dependencies: auto-enable missing deps, detect cycles, find missing.
20
+ */
21
+ export declare function resolveDependencies(projectRoot: string): DependencyResult;
22
+ /**
23
+ * Detect circular dependencies in the graph.
24
+ */
25
+ export declare function detectCycles(graph: Map<string, string[]>): string[][];
26
+ //# sourceMappingURL=dependency-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/dependency-resolver.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCpE;AASD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAc5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAwCzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAgCrE"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseSkillDependencies = parseSkillDependencies;
37
+ exports.buildDependencyGraph = buildDependencyGraph;
38
+ exports.resolveDependencies = resolveDependencies;
39
+ exports.detectCycles = detectCycles;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const paths_1 = require("./paths");
43
+ const config_loader_1 = require("./config-loader");
44
+ /**
45
+ * Parse genskills-depends from a SKILL.md frontmatter.
46
+ */
47
+ function parseSkillDependencies(skillMdPath) {
48
+ if (!fs.existsSync(skillMdPath))
49
+ return [];
50
+ const content = fs.readFileSync(skillMdPath, "utf-8");
51
+ const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
52
+ if (!frontmatterMatch)
53
+ return [];
54
+ const frontmatter = frontmatterMatch[1];
55
+ const deps = [];
56
+ // Parse genskills-depends: [skill1, skill2] or multiline
57
+ const inlineMatch = frontmatter.match(/genskills-depends:\s*\[([^\]]*)\]/);
58
+ if (inlineMatch) {
59
+ const items = inlineMatch[1].split(",").map((s) => s.trim().replace(/['"]/g, ""));
60
+ for (const item of items) {
61
+ if (item)
62
+ deps.push(normalizeDepName(item));
63
+ }
64
+ return deps;
65
+ }
66
+ // Multiline YAML list
67
+ const multiMatch = frontmatter.match(/genskills-depends:\s*\n((?:\s+-\s+.+\n?)*)/);
68
+ if (multiMatch) {
69
+ const lines = multiMatch[1].split("\n");
70
+ for (const line of lines) {
71
+ const m = line.match(/^\s+-\s+(.+)/);
72
+ if (m)
73
+ deps.push(normalizeDepName(m[1].trim().replace(/['"]/g, "")));
74
+ }
75
+ }
76
+ return deps;
77
+ }
78
+ /**
79
+ * Strip genskills: prefix from dependency name.
80
+ */
81
+ function normalizeDepName(name) {
82
+ return name.replace(/^genskills:/, "");
83
+ }
84
+ /**
85
+ * Build the full dependency graph for all skills.
86
+ */
87
+ function buildDependencyGraph() {
88
+ const graph = new Map();
89
+ const categories = (0, paths_1.getCategories)();
90
+ for (const category of categories) {
91
+ const skills = (0, paths_1.getSkillsInCategory)(category);
92
+ for (const skill of skills) {
93
+ const skillMd = path.join((0, paths_1.getSkillSourcePath)(category, skill), "SKILL.md");
94
+ const deps = parseSkillDependencies(skillMd);
95
+ graph.set(skill, deps);
96
+ }
97
+ }
98
+ return graph;
99
+ }
100
+ /**
101
+ * Resolve dependencies: auto-enable missing deps, detect cycles, find missing.
102
+ */
103
+ function resolveDependencies(projectRoot) {
104
+ const config = (0, config_loader_1.loadConfig)(projectRoot);
105
+ const graph = buildDependencyGraph();
106
+ const allSkills = new Set(graph.keys());
107
+ const resolved = [];
108
+ const missing = [];
109
+ const autoEnabled = [];
110
+ // For each enabled skill, check its deps
111
+ for (const [skill, deps] of graph) {
112
+ // Find the category for this skill
113
+ const category = findCategoryForSkill(skill);
114
+ if (!category)
115
+ continue;
116
+ const enabled = (0, config_loader_1.isSkillEnabled)(config, category, skill);
117
+ if (!enabled)
118
+ continue;
119
+ resolved.push(skill);
120
+ for (const dep of deps) {
121
+ if (!allSkills.has(dep)) {
122
+ missing.push({ skill, dependency: dep });
123
+ continue;
124
+ }
125
+ const depCategory = findCategoryForSkill(dep);
126
+ if (!depCategory) {
127
+ missing.push({ skill, dependency: dep });
128
+ continue;
129
+ }
130
+ const depEnabled = (0, config_loader_1.isSkillEnabled)(config, depCategory, dep);
131
+ if (!depEnabled) {
132
+ autoEnabled.push(dep);
133
+ }
134
+ }
135
+ }
136
+ return { resolved, missing, autoEnabled };
137
+ }
138
+ /**
139
+ * Detect circular dependencies in the graph.
140
+ */
141
+ function detectCycles(graph) {
142
+ const cycles = [];
143
+ const visited = new Set();
144
+ const inStack = new Set();
145
+ function dfs(node, path) {
146
+ if (inStack.has(node)) {
147
+ const cycleStart = path.indexOf(node);
148
+ cycles.push(path.slice(cycleStart).concat(node));
149
+ return;
150
+ }
151
+ if (visited.has(node))
152
+ return;
153
+ visited.add(node);
154
+ inStack.add(node);
155
+ path.push(node);
156
+ const deps = graph.get(node) || [];
157
+ for (const dep of deps) {
158
+ dfs(dep, [...path]);
159
+ }
160
+ inStack.delete(node);
161
+ }
162
+ for (const node of graph.keys()) {
163
+ if (!visited.has(node)) {
164
+ dfs(node, []);
165
+ }
166
+ }
167
+ return cycles;
168
+ }
169
+ /**
170
+ * Find which category a skill belongs to.
171
+ */
172
+ function findCategoryForSkill(skillName) {
173
+ const categories = (0, paths_1.getCategories)();
174
+ for (const category of categories) {
175
+ const skills = (0, paths_1.getSkillsInCategory)(category);
176
+ if (skills.includes(skillName))
177
+ return category;
178
+ }
179
+ return null;
180
+ }
181
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../../src/cli/utils/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ interface HookDefinition {
2
+ event: string;
3
+ matcher?: string;
4
+ command: string;
5
+ skillName: string;
6
+ }
7
+ /**
8
+ * Parse hooks from a SKILL.md frontmatter.
9
+ */
10
+ export declare function parseSkillHooks(skillMdPath: string, skillName: string): HookDefinition[];
11
+ /**
12
+ * Collect all hooks from all enabled skills.
13
+ */
14
+ export declare function collectAllHooks(projectRoot: string): HookDefinition[];
15
+ /**
16
+ * Register hooks into .claude/settings.local.json.
17
+ * Note: Claude Code handles hooks in SKILL.md frontmatter natively,
18
+ * so this is mainly for custom hooks that need project-level registration.
19
+ */
20
+ export declare function registerHooks(projectRoot: string): number;
21
+ export {};
22
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/hooks.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,cAAc,EAAE,CAuClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAiBrE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAyBzD"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseSkillHooks = parseSkillHooks;
37
+ exports.collectAllHooks = collectAllHooks;
38
+ exports.registerHooks = registerHooks;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const paths_1 = require("./paths");
42
+ const config_loader_1 = require("./config-loader");
43
+ const logger_1 = require("./logger");
44
+ /**
45
+ * Parse hooks from a SKILL.md frontmatter.
46
+ */
47
+ function parseSkillHooks(skillMdPath, skillName) {
48
+ if (!fs.existsSync(skillMdPath))
49
+ return [];
50
+ const content = fs.readFileSync(skillMdPath, "utf-8");
51
+ const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
52
+ if (!frontmatterMatch)
53
+ return [];
54
+ const frontmatter = frontmatterMatch[1];
55
+ const hooks = [];
56
+ // Simple YAML parsing for hooks section
57
+ // Looking for patterns like:
58
+ // hooks:
59
+ // PreToolUse:
60
+ // - matcher: "Bash"
61
+ // hooks:
62
+ // - type: command
63
+ // command: "..."
64
+ const hooksMatch = frontmatter.match(/hooks:\s*\n((?:\s+.+\n?)*)/);
65
+ if (!hooksMatch)
66
+ return [];
67
+ // For now, we extract hooks defined in the Claude Code native format
68
+ // The skill frontmatter hooks are handled natively by Claude Code
69
+ // We just need to detect them for the doctor command
70
+ const commandMatches = frontmatter.matchAll(/command:\s*["']?([^"'\n]+)["']?/g);
71
+ for (const match of commandMatches) {
72
+ hooks.push({
73
+ event: "PreToolUse",
74
+ command: match[1].trim(),
75
+ skillName,
76
+ });
77
+ }
78
+ return hooks;
79
+ }
80
+ /**
81
+ * Collect all hooks from all enabled skills.
82
+ */
83
+ function collectAllHooks(projectRoot) {
84
+ const config = (0, config_loader_1.loadConfig)(projectRoot);
85
+ const allHooks = [];
86
+ const categories = (0, paths_1.getCategories)();
87
+ for (const category of categories) {
88
+ const skills = (0, paths_1.getSkillsInCategory)(category);
89
+ for (const skill of skills) {
90
+ if (!(0, config_loader_1.isSkillEnabled)(config, category, skill))
91
+ continue;
92
+ const skillMd = path.join((0, paths_1.getSkillSourcePath)(category, skill), "SKILL.md");
93
+ const hooks = parseSkillHooks(skillMd, skill);
94
+ allHooks.push(...hooks);
95
+ }
96
+ }
97
+ return allHooks;
98
+ }
99
+ /**
100
+ * Register hooks into .claude/settings.local.json.
101
+ * Note: Claude Code handles hooks in SKILL.md frontmatter natively,
102
+ * so this is mainly for custom hooks that need project-level registration.
103
+ */
104
+ function registerHooks(projectRoot) {
105
+ const hooks = collectAllHooks(projectRoot);
106
+ if (hooks.length === 0) {
107
+ return 0;
108
+ }
109
+ const settingsPath = path.join(projectRoot, ".claude", "settings.local.json");
110
+ let settings = {};
111
+ if (fs.existsSync(settingsPath)) {
112
+ try {
113
+ settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
114
+ }
115
+ catch {
116
+ // Start fresh if corrupted
117
+ }
118
+ }
119
+ // Don't overwrite existing hooks — Claude Code handles skill frontmatter hooks natively
120
+ // This function is mainly for reporting purposes
121
+ logger_1.logger.dim(`Found ${hooks.length} hook(s) across installed skills (managed by Claude Code)`);
122
+ return hooks.length;
123
+ }
124
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/utils/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const logger: {
2
+ info(msg: string): void;
3
+ success(msg: string): void;
4
+ warn(msg: string): void;
5
+ error(msg: string): void;
6
+ step(msg: string): void;
7
+ dim(msg: string): void;
8
+ header(msg: string): void;
9
+ table(rows: [string, string][]): void;
10
+ list(items: string[], indent?: number): void;
11
+ br(): void;
12
+ };
13
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,MAAM;cACP,MAAM;iBAIH,MAAM;cAIT,MAAM;eAIL,MAAM;cAIP,MAAM;aAIP,MAAM;gBAIH,MAAM;gBAIN,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;gBAOlB,MAAM,EAAE;;CAUrB,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logger = void 0;
4
+ const COLORS = {
5
+ reset: "\x1b[0m",
6
+ bold: "\x1b[1m",
7
+ dim: "\x1b[2m",
8
+ red: "\x1b[31m",
9
+ green: "\x1b[32m",
10
+ yellow: "\x1b[33m",
11
+ blue: "\x1b[34m",
12
+ magenta: "\x1b[35m",
13
+ cyan: "\x1b[36m",
14
+ gray: "\x1b[90m",
15
+ };
16
+ function c(color, text) {
17
+ return `${COLORS[color]}${text}${COLORS.reset}`;
18
+ }
19
+ exports.logger = {
20
+ info(msg) {
21
+ console.log(`${c("cyan", "ℹ")} ${msg}`);
22
+ },
23
+ success(msg) {
24
+ console.log(`${c("green", "✔")} ${msg}`);
25
+ },
26
+ warn(msg) {
27
+ console.log(`${c("yellow", "⚠")} ${msg}`);
28
+ },
29
+ error(msg) {
30
+ console.error(`${c("red", "✖")} ${msg}`);
31
+ },
32
+ step(msg) {
33
+ console.log(`${c("blue", "→")} ${msg}`);
34
+ },
35
+ dim(msg) {
36
+ console.log(`${c("gray", msg)}`);
37
+ },
38
+ header(msg) {
39
+ console.log(`\n${c("bold", c("magenta", msg))}`);
40
+ },
41
+ table(rows) {
42
+ const maxKey = Math.max(...rows.map(([k]) => k.length));
43
+ for (const [key, value] of rows) {
44
+ console.log(` ${c("cyan", key.padEnd(maxKey))} ${value}`);
45
+ }
46
+ },
47
+ list(items, indent = 2) {
48
+ const pad = " ".repeat(indent);
49
+ for (const item of items) {
50
+ console.log(`${pad}${c("dim", "•")} ${item}`);
51
+ }
52
+ },
53
+ br() {
54
+ console.log();
55
+ },
56
+ };
57
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,SAAS,CAAC,CAAC,KAA0B,EAAE,IAAY;IACjD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC;AAEY,QAAA,MAAM,GAAG;IACpB,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAW;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAwB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAe,EAAE,MAAM,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,EAAE;QACA,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;CACF,CAAC"}