@tinkcarlos/skillora 0.2.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 (234) hide show
  1. package/.claude/skills/.temp-skill-index.md +245 -0
  2. package/.claude/skills/SKILL.md +264 -0
  3. package/.claude/skills/api-scaffolding/SKILL.md +431 -0
  4. package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
  5. package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
  6. package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
  7. package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
  8. package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
  9. package/.claude/skills/api-testing-observability/SKILL.md +583 -0
  10. package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
  11. package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
  12. package/.claude/skills/brainstorming/SKILL.md +283 -0
  13. package/.claude/skills/bug-fixing/SKILL.md +382 -0
  14. package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
  15. package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
  16. package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
  17. package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
  18. package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
  19. package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
  20. package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
  21. package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
  22. package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
  23. package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
  24. package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
  25. package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
  26. package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
  27. package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
  28. package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
  29. package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
  30. package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
  31. package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
  32. package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
  33. package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
  34. package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
  35. package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
  36. package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
  37. package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
  38. package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
  39. package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
  40. package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
  41. package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
  42. package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
  43. package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
  44. package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
  45. package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
  46. package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
  47. package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
  48. package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
  49. package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
  50. package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
  51. package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
  52. package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
  53. package/.claude/skills/code-review/SKILL.md +535 -0
  54. package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
  55. package/.claude/skills/code-review/references/automated-analysis.md +456 -0
  56. package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
  57. package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
  58. package/.claude/skills/code-review/references/backend-review.md +868 -0
  59. package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
  60. package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
  61. package/.claude/skills/code-review/references/common-patterns.md +321 -0
  62. package/.claude/skills/code-review/references/configuration-review.md +425 -0
  63. package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
  64. package/.claude/skills/code-review/references/database-review.md +298 -0
  65. package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
  66. package/.claude/skills/code-review/references/external-standards.md +51 -0
  67. package/.claude/skills/code-review/references/feature-review.md +329 -0
  68. package/.claude/skills/code-review/references/file-review-template.md +326 -0
  69. package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
  70. package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
  71. package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
  72. package/.claude/skills/code-review/references/frontend-review.md +783 -0
  73. package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
  74. package/.claude/skills/code-review/references/fullstack-review.md +477 -0
  75. package/.claude/skills/code-review/references/functional-completeness.md +386 -0
  76. package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
  77. package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
  78. package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
  79. package/.claude/skills/code-review/references/iteration-review.md +264 -0
  80. package/.claude/skills/code-review/references/job-review.md +335 -0
  81. package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
  82. package/.claude/skills/code-review/references/logic-completeness.md +535 -0
  83. package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
  84. package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
  85. package/.claude/skills/code-review/references/new-project-review.md +226 -0
  86. package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
  87. package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
  88. package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
  89. package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
  90. package/.claude/skills/code-review/references/python-patterns.md +494 -0
  91. package/.claude/skills/code-review/references/rca-techniques.md +362 -0
  92. package/.claude/skills/code-review/references/report-template.md +430 -0
  93. package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
  94. package/.claude/skills/code-review/references/review-dimensions.md +311 -0
  95. package/.claude/skills/code-review/references/review-guide.md +202 -0
  96. package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
  97. package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
  98. package/.claude/skills/code-review/references/review-record-template.md +195 -0
  99. package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
  100. package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
  101. package/.claude/skills/containerization/SKILL.md +313 -0
  102. package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
  103. package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
  104. package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
  105. package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
  106. package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
  107. package/.claude/skills/frontend-design/LICENSE.txt +177 -0
  108. package/.claude/skills/frontend-design/SKILL.md +587 -0
  109. package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
  110. package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
  111. package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
  112. package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
  113. package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
  114. package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
  115. package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
  116. package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
  117. package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
  118. package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
  119. package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
  120. package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
  121. package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
  122. package/.claude/skills/fullstack-developer/SKILL.md +512 -0
  123. package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
  124. package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
  125. package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
  126. package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
  127. package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
  128. package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
  129. package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
  130. package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
  131. package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
  132. package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
  133. package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
  134. package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
  135. package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
  136. package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
  137. package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
  138. package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
  139. package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
  140. package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
  141. package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
  142. package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
  143. package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
  144. package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
  145. package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
  146. package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
  147. package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
  148. package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
  149. package/.claude/skills/performance-optimization/SKILL.md +250 -0
  150. package/.claude/skills/product-requirements/SKILL.md +357 -0
  151. package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
  152. package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
  153. package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
  154. package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
  155. package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
  156. package/.claude/skills/product-requirements/references/external-standards.md +62 -0
  157. package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
  158. package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
  159. package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
  160. package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
  161. package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
  162. package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
  163. package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
  164. package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
  165. package/.claude/skills/react-best-practices/SKILL.md +198 -0
  166. package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
  167. package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
  168. package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
  169. package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
  170. package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
  171. package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
  172. package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
  173. package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
  174. package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
  175. package/.claude/skills/security-audit/SKILL.md +226 -0
  176. package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
  177. package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
  178. package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
  179. package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
  180. package/.claude/skills/shared-references/skill-call-graph.md +230 -0
  181. package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
  182. package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
  183. package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
  184. package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
  185. package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
  186. package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
  187. package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
  188. package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
  189. package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
  190. package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
  191. package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
  192. package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
  193. package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
  194. package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
  195. package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
  196. package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
  197. package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
  198. package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
  199. package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
  200. package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
  201. package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
  202. package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
  203. package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
  204. package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
  205. package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
  206. package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
  207. package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
  208. package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
  209. package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
  210. package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
  211. package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
  212. package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
  213. package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
  214. package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
  215. package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
  216. package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
  217. package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
  218. package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
  219. package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
  220. package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
  221. package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
  222. package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
  223. package/.claude/skills/test-driven-development/SKILL.md +246 -0
  224. package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
  225. package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
  226. package/.claude/skills/using-skillstack/SKILL.md +127 -0
  227. package/.claude/skills/vercel-deploy/SKILL.md +166 -0
  228. package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
  229. package/.claude/skills/verification-before-completion/SKILL.md +305 -0
  230. package/.claude/skills/writing-plans/SKILL.md +259 -0
  231. package/README.md +69 -0
  232. package/bin/cli.js +468 -0
  233. package/lib/init.js +333 -0
  234. package/package.json +29 -0
package/bin/cli.js ADDED
@@ -0,0 +1,468 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const { Command } = require("commander");
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+ const os = require("os");
8
+
9
+ const packageRoot = path.resolve(__dirname, "..");
10
+ const bundledSkillsDir = path.join(packageRoot, ".claude", "skills");
11
+ const pkg = require(path.join(packageRoot, "package.json"));
12
+
13
+ const program = new Command();
14
+
15
+ function resolveTargetDir(options) {
16
+ if (options.target) {
17
+ return path.resolve(options.target);
18
+ }
19
+ const baseDir = options.global ? os.homedir() : process.cwd();
20
+ const rootDir = options.universal ? ".agent" : ".claude";
21
+ return path.join(baseDir, rootDir, "skills");
22
+ }
23
+
24
+ function ensureDir(dirPath) {
25
+ fs.mkdirSync(dirPath, { recursive: true });
26
+ }
27
+
28
+ function listSkillDirs(rootDir) {
29
+ if (!fs.existsSync(rootDir)) {
30
+ return [];
31
+ }
32
+ return fs
33
+ .readdirSync(rootDir, { withFileTypes: true })
34
+ .filter((entry) => entry.isDirectory())
35
+ .map((entry) => path.join(rootDir, entry.name))
36
+ .filter((dir) => fs.existsSync(path.join(dir, "SKILL.md")));
37
+ }
38
+
39
+ function stripQuotes(value) {
40
+ if (
41
+ (value.startsWith('"') && value.endsWith('"')) ||
42
+ (value.startsWith("'") && value.endsWith("'"))
43
+ ) {
44
+ return value.slice(1, -1);
45
+ }
46
+ return value;
47
+ }
48
+
49
+ function validateSkillName(rawName) {
50
+ if (typeof rawName !== "string") {
51
+ throw new Error("Skill name must be a string.");
52
+ }
53
+ const name = rawName.trim();
54
+ if (!name) {
55
+ throw new Error("Skill name is required.");
56
+ }
57
+ if (name === "." || name === "..") {
58
+ throw new Error('Skill name cannot be "." or "..".');
59
+ }
60
+ if (name.includes("/") || name.includes("\\")) {
61
+ throw new Error("Skill name must not contain path separators.");
62
+ }
63
+ if (name.includes(":")) {
64
+ throw new Error('Skill name must not contain ":" characters.');
65
+ }
66
+ if (name.includes("\0")) {
67
+ throw new Error("Skill name contains invalid characters.");
68
+ }
69
+ return name;
70
+ }
71
+
72
+ function parseFrontmatter(content) {
73
+ if (!content || !content.startsWith("---")) {
74
+ return {};
75
+ }
76
+ const endIndex = content.indexOf("\n---", 3);
77
+ if (endIndex === -1) {
78
+ return {};
79
+ }
80
+ const raw = content.slice(3, endIndex).trim();
81
+ const lines = raw.split(/\r?\n/);
82
+ const data = {};
83
+ let currentKey = null;
84
+ let multilineValue = [];
85
+
86
+ for (const line of lines) {
87
+ const indented = line.startsWith(" ") || line.startsWith("\t");
88
+ if (indented && currentKey) {
89
+ multilineValue.push(line.trim());
90
+ continue;
91
+ }
92
+
93
+ if (currentKey && multilineValue.length > 0) {
94
+ data[currentKey] = multilineValue.join(" ").trim();
95
+ multilineValue = [];
96
+ }
97
+
98
+ const idx = line.indexOf(":");
99
+ if (idx === -1) {
100
+ continue;
101
+ }
102
+ const key = line.slice(0, idx).trim();
103
+ const rawValue = line.slice(idx + 1).trim();
104
+
105
+ if (rawValue === "|" || rawValue === ">") {
106
+ currentKey = key;
107
+ multilineValue = [];
108
+ continue;
109
+ }
110
+
111
+ const value = stripQuotes(rawValue);
112
+ if (key && value) {
113
+ data[key] = value;
114
+ }
115
+ currentKey = null;
116
+ }
117
+
118
+ if (currentKey && multilineValue.length > 0) {
119
+ data[currentKey] = multilineValue.join(" ").trim();
120
+ }
121
+
122
+ return data;
123
+ }
124
+
125
+ function readSkillMeta(skillDir) {
126
+ const skillPath = path.join(skillDir, "SKILL.md");
127
+ try {
128
+ const content = fs.readFileSync(skillPath, "utf8");
129
+ const frontmatter = parseFrontmatter(content);
130
+ return {
131
+ name: frontmatter.name || path.basename(skillDir),
132
+ description: frontmatter.description || "",
133
+ userInvocable: frontmatter["user-invocable"] !== "false",
134
+ };
135
+ } catch (err) {
136
+ console.error(`Warning: Failed to read ${skillPath}: ${err.message}`);
137
+ return {
138
+ name: path.basename(skillDir),
139
+ description: "",
140
+ userInvocable: true,
141
+ };
142
+ }
143
+ }
144
+
145
+ function copySkillDir(srcDir, destDir, force) {
146
+ if (fs.existsSync(destDir)) {
147
+ if (!force) {
148
+ return { skipped: true };
149
+ }
150
+ try {
151
+ fs.rmSync(destDir, { recursive: true, force: true });
152
+ } catch (err) {
153
+ console.error(`Warning: Failed to remove ${destDir}: ${err.message}`);
154
+ return { skipped: true, error: err.message };
155
+ }
156
+ }
157
+ try {
158
+ fs.cpSync(srcDir, destDir, { recursive: true });
159
+ return { skipped: false };
160
+ } catch (err) {
161
+ console.error(`Warning: Failed to copy ${srcDir}: ${err.message}`);
162
+ return { skipped: true, error: err.message };
163
+ }
164
+ }
165
+
166
+ function getSearchRoots() {
167
+ const cwd = process.cwd();
168
+ const home = os.homedir();
169
+ return [
170
+ path.join(cwd, ".agent", "skills"),
171
+ path.join(home, ".agent", "skills"),
172
+ path.join(cwd, ".claude", "skills"),
173
+ path.join(home, ".claude", "skills"),
174
+ bundledSkillsDir,
175
+ ];
176
+ }
177
+
178
+ function findSkillDir(skillName, options) {
179
+ const hasTargetOption = options.target || options.global || options.universal;
180
+ if (hasTargetOption) {
181
+ const targetDir = resolveTargetDir(options);
182
+ const candidate = path.join(targetDir, skillName);
183
+ if (fs.existsSync(path.join(candidate, "SKILL.md"))) {
184
+ return candidate;
185
+ }
186
+ return null;
187
+ }
188
+
189
+ for (const root of getSearchRoots()) {
190
+ const candidate = path.join(root, skillName);
191
+ if (fs.existsSync(path.join(candidate, "SKILL.md"))) {
192
+ return candidate;
193
+ }
194
+ }
195
+ return null;
196
+ }
197
+
198
+ function escapeXml(value) {
199
+ return value
200
+ .replace(/&/g, "&")
201
+ .replace(/</g, "&lt;")
202
+ .replace(/>/g, "&gt;");
203
+ }
204
+
205
+ function renderSkillsTable(skills, cliName) {
206
+ const invocableSkills = skills.filter((s) => s.userInvocable);
207
+ const slashCommands = invocableSkills.map((s) => `/${s.name}`).join(", ");
208
+
209
+ const usage = [
210
+ "<usage>",
211
+ "When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively.",
212
+ "",
213
+ "How to invoke skills:",
214
+ "",
215
+ "**Claude Code (native):**",
216
+ `- Slash command: ${slashCommands || "(none)"}`,
217
+ '- Or use Skill tool: Skill("skill-name")',
218
+ "",
219
+ "**Cursor / Codex / Gemini / Windsurf / Aider:**",
220
+ `- Run: \`${cliName} read <skill-name>\``,
221
+ "- The skill content will load with detailed instructions",
222
+ "",
223
+ "Usage notes:",
224
+ "- Only use skills listed in <available_skills> below",
225
+ "- Do not invoke a skill that is already loaded in your context",
226
+ "</usage>",
227
+ ].join("\n");
228
+
229
+ const entries = skills
230
+ .map((skill) => {
231
+ const name = escapeXml(skill.name);
232
+ const description = escapeXml(skill.description);
233
+ const invocable = skill.userInvocable ? "true" : "false";
234
+ return [
235
+ "<skill>",
236
+ `<name>${name}</name>`,
237
+ `<description>${description}</description>`,
238
+ `<user-invocable>${invocable}</user-invocable>`,
239
+ "<location>project</location>",
240
+ "</skill>",
241
+ ].join("\n");
242
+ })
243
+ .join("\n\n");
244
+
245
+ return [
246
+ "<!-- SKILLS_TABLE_START -->",
247
+ usage,
248
+ "",
249
+ "<available_skills>",
250
+ "",
251
+ entries,
252
+ "",
253
+ "</available_skills>",
254
+ "<!-- SKILLS_TABLE_END -->",
255
+ ].join("\n");
256
+ }
257
+
258
+ function buildSkillsSystemBlock(skillsTable) {
259
+ return [
260
+ '<skills_system priority="1">',
261
+ "",
262
+ "## Available Skills",
263
+ "",
264
+ skillsTable,
265
+ "",
266
+ "</skills_system>",
267
+ ].join("\n");
268
+ }
269
+
270
+ function updateAgentsMdContent(content, skillsTable) {
271
+ const startMarker = "<!-- SKILLS_TABLE_START -->";
272
+ const endMarker = "<!-- SKILLS_TABLE_END -->";
273
+ const startIndex = content.indexOf(startMarker);
274
+ const endIndex = content.indexOf(endMarker);
275
+
276
+ if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
277
+ const before = content.slice(0, startIndex);
278
+ const after = content.slice(endIndex + endMarker.length);
279
+ return `${before}${skillsTable}${after}`.trimEnd() + "\n";
280
+ }
281
+
282
+ const block = buildSkillsSystemBlock(skillsTable);
283
+ if (!content.trim()) {
284
+ return `${block}\n`;
285
+ }
286
+ return `${content.trimEnd()}\n\n${block}\n`;
287
+ }
288
+
289
+ const { runInit } = require("../lib/init");
290
+
291
+ program
292
+ .name("skillora")
293
+ .description("Install and load bundled Claude Code skills")
294
+ .version(pkg.version);
295
+
296
+ program
297
+ .command("init")
298
+ .description("Initialize project with skills (interactive)")
299
+ .option(
300
+ "-p, --platform <platforms>",
301
+ "Platforms to configure (comma-separated: claude-code,cursor,codex,gemini,windsurf,aider)",
302
+ )
303
+ .option("-g, --global", "Install to global ~/.claude/skills/")
304
+ .option(
305
+ "-u, --universal",
306
+ "Install to .agent/skills/ (multi-agent compatible)",
307
+ )
308
+ .option("-f, --force", "Overwrite existing skills")
309
+ .action(async (options) => {
310
+ if (!fs.existsSync(bundledSkillsDir)) {
311
+ console.error("Bundled skills directory not found.");
312
+ process.exit(1);
313
+ }
314
+ try {
315
+ await runInit(options, bundledSkillsDir);
316
+ } catch (err) {
317
+ console.error("Error:", err.message);
318
+ process.exit(1);
319
+ }
320
+ });
321
+
322
+ program
323
+ .command("install")
324
+ .description("Install bundled skills into the target directory")
325
+ .option("-g, --global", "Install globally (default: project install)")
326
+ .option("-u, --universal", "Install to .agent/skills (universal)")
327
+ .option("-t, --target <path>", "Install to a custom directory")
328
+ .option("-f, --force", "Overwrite existing skills")
329
+ .action((options) => {
330
+ if (!fs.existsSync(bundledSkillsDir)) {
331
+ console.error("Bundled skills directory not found.");
332
+ process.exit(1);
333
+ }
334
+
335
+ const targetDir = resolveTargetDir(options);
336
+ ensureDir(targetDir);
337
+
338
+ const skillDirs = listSkillDirs(bundledSkillsDir);
339
+ if (skillDirs.length === 0) {
340
+ console.log("No bundled skills found to install.");
341
+ return;
342
+ }
343
+
344
+ let installed = 0;
345
+ let skipped = 0;
346
+ for (const skillDir of skillDirs) {
347
+ const destDir = path.join(targetDir, path.basename(skillDir));
348
+ const result = copySkillDir(skillDir, destDir, options.force);
349
+ if (result.skipped) {
350
+ skipped += 1;
351
+ } else {
352
+ installed += 1;
353
+ }
354
+ }
355
+
356
+ console.log(`Installed: ${installed}, Skipped: ${skipped}`);
357
+ console.log(`Target: ${targetDir}`);
358
+ });
359
+
360
+ program
361
+ .command("list")
362
+ .description("List installed skills in the target directory")
363
+ .option("-g, --global", "List global skills")
364
+ .option("-u, --universal", "List skills in .agent/skills")
365
+ .option("-t, --target <path>", "List skills in a custom directory")
366
+ .action((options) => {
367
+ const targetDir = resolveTargetDir(options);
368
+ const skillDirs = listSkillDirs(targetDir);
369
+ if (skillDirs.length === 0) {
370
+ console.log("No skills found.");
371
+ return;
372
+ }
373
+ for (const skillDir of skillDirs) {
374
+ console.log(path.basename(skillDir));
375
+ }
376
+ });
377
+
378
+ program
379
+ .command("read <skill-name>")
380
+ .description("Read a skill to stdout (for AI agents)")
381
+ .option("-g, --global", "Read from global skills directory")
382
+ .option("-u, --universal", "Read from .agent/skills")
383
+ .option("-t, --target <path>", "Read from a custom directory")
384
+ .action((skillName, options) => {
385
+ let safeName;
386
+ try {
387
+ safeName = validateSkillName(skillName);
388
+ } catch (err) {
389
+ console.error(err.message);
390
+ process.exit(1);
391
+ }
392
+ const skillDir = findSkillDir(safeName, options);
393
+ if (!skillDir) {
394
+ console.error(`Skill not found: ${safeName}`);
395
+ process.exit(1);
396
+ }
397
+
398
+ const skillPath = path.join(skillDir, "SKILL.md");
399
+ let content;
400
+ try {
401
+ content = fs.readFileSync(skillPath, "utf8");
402
+ } catch (err) {
403
+ console.error(`Failed to read skill: ${err.message}`);
404
+ process.exit(1);
405
+ }
406
+ process.stdout.write(`Reading: ${safeName}\n`);
407
+ process.stdout.write(`Base directory: ${skillDir}\n\n`);
408
+ process.stdout.write(content);
409
+ if (!content.endsWith("\n")) {
410
+ process.stdout.write("\n");
411
+ }
412
+ });
413
+
414
+ program
415
+ .command("sync")
416
+ .description("Update AGENTS.md with installed skills")
417
+ .option("-o, --output <path>", "Output file path (default: AGENTS.md)")
418
+ .option("-g, --global", "Sync global skills")
419
+ .option("-u, --universal", "Sync skills in .agent/skills")
420
+ .option("-t, --target <path>", "Sync skills from a custom directory")
421
+ .action((options) => {
422
+ const targetDir = resolveTargetDir(options);
423
+ const outputPath = options.output
424
+ ? path.resolve(options.output)
425
+ : path.join(process.cwd(), "AGENTS.md");
426
+
427
+ const skillDirs = listSkillDirs(targetDir);
428
+ const skills = skillDirs
429
+ .map(readSkillMeta)
430
+ .sort((a, b) => a.name.localeCompare(b.name));
431
+
432
+ const cliName = program.name();
433
+ const skillsTable = renderSkillsTable(skills, cliName);
434
+ const existing = fs.existsSync(outputPath)
435
+ ? fs.readFileSync(outputPath, "utf8")
436
+ : "";
437
+ const updated = updateAgentsMdContent(existing, skillsTable);
438
+ fs.writeFileSync(outputPath, updated, "utf8");
439
+
440
+ console.log(`Synced ${skills.length} skill(s) to ${outputPath}`);
441
+ });
442
+
443
+ program
444
+ .command("remove <skill-name>")
445
+ .alias("rm")
446
+ .description("Remove a skill from the target directory")
447
+ .option("-g, --global", "Remove from global skills directory")
448
+ .option("-u, --universal", "Remove from .agent/skills")
449
+ .option("-t, --target <path>", "Remove from a custom directory")
450
+ .action((skillName, options) => {
451
+ let safeName;
452
+ try {
453
+ safeName = validateSkillName(skillName);
454
+ } catch (err) {
455
+ console.error(err.message);
456
+ process.exit(1);
457
+ }
458
+ const targetDir = resolveTargetDir(options);
459
+ const skillDir = path.join(targetDir, safeName);
460
+ if (!fs.existsSync(skillDir)) {
461
+ console.error(`Skill not found: ${safeName}`);
462
+ process.exit(1);
463
+ }
464
+ fs.rmSync(skillDir, { recursive: true, force: true });
465
+ console.log(`Removed: ${safeName}`);
466
+ });
467
+
468
+ program.parse();