@hasna/skills 0.1.18 → 0.1.20

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/README.md +108 -372
  2. package/bin/index.js +10455 -9282
  3. package/bin/mcp.js +4793 -3402
  4. package/dist/cli/commands/completion.d.ts +5 -0
  5. package/dist/cli/commands/create-sync-config.d.ts +5 -0
  6. package/dist/cli/commands/diagnostic.d.ts +5 -0
  7. package/dist/cli/commands/init.d.ts +5 -0
  8. package/dist/cli/commands/install.d.ts +5 -0
  9. package/dist/cli/commands/introspect.d.ts +5 -0
  10. package/dist/cli/commands/list.d.ts +5 -0
  11. package/dist/cli/commands/runtime.d.ts +5 -0
  12. package/dist/cli/commands/schedule.d.ts +5 -0
  13. package/dist/index.js +197 -97
  14. package/dist/lib/config.d.ts +1 -1
  15. package/dist/lib/registry.d.ts +1 -11
  16. package/dist/lib/scheduler.d.ts +1 -1
  17. package/dist/lib/scheduler.test.d.ts +4 -0
  18. package/dist/lib/search.d.ts +17 -0
  19. package/package.json +3 -3
  20. package/skills/skill-commitpush/SKILL.md +57 -0
  21. package/skills/skill-commitpush/package.json +34 -0
  22. package/skills/skill-commitpush/src/index.ts +34 -0
  23. package/skills/skill-commitpush/tsconfig.json +17 -0
  24. package/skills/skill-commitpushpr/SKILL.md +55 -0
  25. package/skills/skill-commitpushpr/package.json +34 -0
  26. package/skills/skill-commitpushpr/src/index.ts +34 -0
  27. package/skills/skill-commitpushpr/tsconfig.json +17 -0
  28. package/skills/skill-monitor/SKILL.md +69 -0
  29. package/skills/skill-monitor/package.json +34 -0
  30. package/skills/skill-monitor/src/index.ts +34 -0
  31. package/skills/skill-monitor/tsconfig.json +17 -0
  32. package/skills/skill-read-csv/SKILL.md +62 -0
  33. package/skills/skill-read-csv/package.json +38 -0
  34. package/skills/skill-read-csv/src/index.ts +331 -0
  35. package/skills/skill-read-csv/tsconfig.json +17 -0
  36. package/skills/skill-read-excel/SKILL.md +64 -0
  37. package/skills/skill-read-excel/package.json +37 -0
  38. package/skills/skill-read-excel/src/index.ts +253 -0
  39. package/skills/skill-read-excel/tsconfig.json +17 -0
  40. package/skills/skill-read-image/SKILL.md +47 -0
  41. package/skills/skill-read-image/package.json +34 -0
  42. package/skills/skill-read-image/src/index.ts +264 -0
  43. package/skills/skill-read-image/tsconfig.json +17 -0
  44. package/skills/skill-read-pdf/SKILL.md +52 -0
  45. package/skills/skill-read-pdf/package.json +37 -0
  46. package/skills/skill-read-pdf/src/index.ts +376 -0
  47. package/skills/skill-read-pdf/tsconfig.json +17 -0
  48. package/skills/skill-tmux-session/SKILL.md +109 -0
  49. package/skills/skill-tmux-session/package.json +34 -0
  50. package/skills/skill-tmux-session/src/index.ts +34 -0
  51. package/skills/skill-tmux-session/tsconfig.json +17 -0
  52. package/skills/skill-academic-journal-matcher/bin/cli.ts +0 -34
  53. package/skills/skill-action-item-router/bin/cli.ts +0 -34
  54. package/skills/skill-ad-creative-generator/bin/cli.ts +0 -34
  55. package/skills/skill-advanced-math/bin/cli.ts +0 -34
  56. package/skills/skill-analyze-data/bin/cli.ts +0 -19
  57. package/skills/skill-anomaly-investigator/bin/cli.ts +0 -34
  58. package/skills/skill-api-test-suite/bin/cli.ts +0 -34
  59. package/skills/skill-apidocs/bin/cli.ts +0 -87
  60. package/skills/skill-audio-cleanup-lab/bin/cli.ts +0 -6
  61. package/skills/skill-audiobook-chapter-proofer/bin/cli.ts +0 -34
  62. package/skills/skill-banner-ad-suite/bin/cli.ts +0 -34
  63. package/skills/skill-benchmark-finder/bin/cli.ts +0 -34
  64. package/skills/skill-bio-sequence-tool/bin/cli.ts +0 -34
  65. package/skills/skill-blog-topic-cluster/bin/cli.ts +0 -34
  66. package/skills/skill-brand-style-guide/bin/cli.ts +0 -19
  67. package/skills/skill-brand-voice-audit/bin/cli.ts +0 -34
  68. package/skills/skill-budget-variance-analyzer/bin/cli.ts +0 -6
  69. package/skills/skill-businessactivity/bin/cli.ts +0 -28
  70. package/skills/skill-calendar-events/bin/cli.ts +0 -34
  71. package/skills/skill-campaign-metric-brief/bin/cli.ts +0 -34
  72. package/skills/skill-campaign-moodboard/bin/cli.ts +0 -34
  73. package/skills/skill-caption-style-stylist/bin/cli.ts +0 -34
  74. package/skills/skill-chemistry-calculator/bin/cli.ts +0 -34
  75. package/skills/skill-churn-risk-notifier/bin/cli.ts +0 -34
  76. package/skills/skill-citation-formatter/bin/cli.ts +0 -34
  77. package/skills/skill-classroom-newsletter-kit/bin/cli.ts +0 -34
  78. package/skills/skill-color-palette-harmonizer/bin/cli.ts +0 -34
  79. package/skills/skill-competitor-ad-analyzer/bin/cli.ts +0 -34
  80. package/skills/skill-compliance-copy-check/bin/cli.ts +0 -34
  81. package/skills/skill-compliance-report-pack/bin/cli.ts +0 -34
  82. package/skills/skill-compress-video/bin/cli.ts +0 -19
  83. package/skills/skill-consolelog/bin/cli.ts +0 -884
  84. package/skills/skill-contract-plainlanguage/bin/cli.ts +0 -34
  85. package/skills/skill-copytone-translator/bin/cli.ts +0 -34
  86. package/skills/skill-create-blog-article/bin/cli.ts +0 -34
  87. package/skills/skill-create-ebook/bin/cli.ts +0 -34
  88. package/skills/skill-crm-note-enhancer/bin/cli.ts +0 -34
  89. package/skills/skill-customer-journey-mapper/bin/cli.ts +0 -34
  90. package/skills/skill-dashboard-builder/bin/cli.ts +0 -34
  91. package/skills/skill-dashboard-narrator/bin/cli.ts +0 -34
  92. package/skills/skill-data-anonymizer/bin/cli.ts +0 -34
  93. package/skills/skill-database-explorer/bin/cli.ts +0 -34
  94. package/skills/skill-dataset-health-check/bin/cli.ts +0 -34
  95. package/skills/skill-decision-journal/bin/cli.ts +0 -34
  96. package/skills/skill-delegation-brief-writer/bin/cli.ts +0 -34
  97. package/skills/skill-destination-briefing/bin/cli.ts +0 -34
  98. package/skills/skill-diff-viewer/bin/cli.ts +0 -34
  99. package/skills/skill-domainpurchase/bin/cli.ts +0 -683
  100. package/skills/skill-domainsearch/bin/cli.ts +0 -410
  101. package/skills/skill-educational-resource-finder/bin/cli.ts +0 -34
  102. package/skills/skill-email-campaign/bin/cli.ts +0 -34
  103. package/skills/skill-exam-readiness-check/bin/cli.ts +0 -34
  104. package/skills/skill-experiment-power-calculator/bin/cli.ts +0 -34
  105. package/skills/skill-extract-audio/bin/cli.ts +0 -19
  106. package/skills/skill-extract-frames/bin/cli.ts +0 -34
  107. package/skills/skill-extract-invoice/bin/cli.ts +0 -34
  108. package/skills/skill-family-activity-curator/bin/cli.ts +0 -34
  109. package/skills/skill-faq-packager/bin/cli.ts +0 -34
  110. package/skills/skill-feedback-survey-designer/bin/cli.ts +0 -34
  111. package/skills/skill-field-trip-planner/bin/cli.ts +0 -34
  112. package/skills/skill-file-organizer/bin/cli.ts +0 -34
  113. package/skills/skill-folder-tree/bin/cli.ts +0 -34
  114. package/skills/skill-forecast-scenario-lab/bin/cli.ts +0 -34
  115. package/skills/skill-form-filler/bin/cli.ts +0 -34
  116. package/skills/skill-generate-api-client/bin/cli.ts +0 -34
  117. package/skills/skill-generate-book-cover/bin/cli.ts +0 -34
  118. package/skills/skill-generate-chart/bin/cli.ts +0 -34
  119. package/skills/skill-generate-diagram/bin/cli.ts +0 -34
  120. package/skills/skill-generate-dockerfile/bin/cli.ts +0 -34
  121. package/skills/skill-generate-documentation/bin/cli.ts +0 -34
  122. package/skills/skill-generate-docx/bin/cli.ts +0 -6
  123. package/skills/skill-generate-env/bin/cli.ts +0 -34
  124. package/skills/skill-generate-excel/bin/cli.ts +0 -34
  125. package/skills/skill-generate-favicon/bin/cli.ts +0 -34
  126. package/skills/skill-generate-mock-data/bin/cli.ts +0 -34
  127. package/skills/skill-generate-pdf/bin/cli.ts +0 -6
  128. package/skills/skill-generate-pr-description/bin/cli.ts +0 -34
  129. package/skills/skill-generate-presentation/bin/cli.ts +0 -34
  130. package/skills/skill-generate-qrcode/bin/cli.ts +0 -34
  131. package/skills/skill-generate-regex/bin/cli.ts +0 -34
  132. package/skills/skill-generate-resume/bin/cli.ts +0 -34
  133. package/skills/skill-generate-sitemap/bin/cli.ts +0 -34
  134. package/skills/skill-generate-social-posts/bin/cli.ts +0 -34
  135. package/skills/skill-generate-sql/bin/cli.ts +0 -34
  136. package/skills/skill-gif-maker/bin/cli.ts +0 -34
  137. package/skills/skill-github-manager/bin/cli.ts +0 -34
  138. package/skills/skill-gmail/bin/cli.ts +0 -34
  139. package/skills/skill-goal-quarterly-roadmap/bin/cli.ts +0 -34
  140. package/skills/skill-grant-application-drafter/bin/cli.ts +0 -34
  141. package/skills/skill-grocery-basket-optimizer/bin/cli.ts +0 -34
  142. package/skills/skill-guest-communication-suite/bin/cli.ts +0 -34
  143. package/skills/skill-habit-reflection-digest/bin/cli.ts +0 -34
  144. package/skills/skill-highlight-reel-generator/bin/cli.ts +0 -34
  145. package/skills/skill-homework-feedback-coach/bin/cli.ts +0 -34
  146. package/skills/skill-household-maintenance-mgr/bin/cli.ts +0 -34
  147. package/skills/skill-http-server/bin/cli.ts +0 -34
  148. package/skills/skill-implementation-agent/bin/cli.ts +0 -34
  149. package/skills/skill-implementation-plan/bin/cli.ts +0 -34
  150. package/skills/skill-implementation-todo/bin/cli.ts +0 -34
  151. package/skills/skill-inbox-priority-planner/bin/cli.ts +0 -34
  152. package/skills/skill-invoice/bin/cli.ts +0 -20
  153. package/skills/skill-invoice-dispute-helper/bin/cli.ts +0 -34
  154. package/skills/skill-itinerary-architect/bin/cli.ts +0 -34
  155. package/skills/skill-jingle-composer/bin/cli.ts +0 -34
  156. package/skills/skill-kpi-digest-generator/bin/cli.ts +0 -34
  157. package/skills/skill-lab-notebook-formatter/bin/cli.ts +0 -34
  158. package/skills/skill-landing-page-copy/bin/cli.ts +0 -34
  159. package/skills/skill-latex-table-generator/bin/cli.ts +0 -34
  160. package/skills/skill-learning-style-profiler/bin/cli.ts +0 -34
  161. package/skills/skill-lesson-plan-customizer/bin/cli.ts +0 -34
  162. package/skills/skill-livestream-runofshow/bin/cli.ts +0 -34
  163. package/skills/skill-longform-structurer/bin/cli.ts +0 -34
  164. package/skills/skill-lorem-generator/bin/cli.ts +0 -34
  165. package/skills/skill-managehook/bin/cli.ts +0 -241
  166. package/skills/skill-managemcp/bin/cli.ts +0 -241
  167. package/skills/skill-manageskill/bin/cli.ts +0 -241
  168. package/skills/skill-markdown-validator/bin/cli.ts +0 -34
  169. package/skills/skill-mcp-builder/bin/cli.ts +0 -34
  170. package/skills/skill-meal-plan-designer/bin/cli.ts +0 -34
  171. package/skills/skill-meeting-insight-summarizer/bin/cli.ts +0 -34
  172. package/skills/skill-merge-pdfs/bin/cli.ts +0 -34
  173. package/skills/skill-microcopy-generator/bin/cli.ts +0 -34
  174. package/skills/skill-mindfulness-prompt-cache/bin/cli.ts +0 -34
  175. package/skills/skill-notion-manager/bin/cli.ts +0 -34
  176. package/skills/skill-onboarding-sequence-builder/bin/cli.ts +0 -34
  177. package/skills/skill-onsite-ops-checklist/bin/cli.ts +0 -34
  178. package/skills/skill-outreach-cadence-designer/bin/cli.ts +0 -34
  179. package/skills/skill-packaging-concept-studio/bin/cli.ts +0 -34
  180. package/skills/skill-packing-plan-pro/bin/cli.ts +0 -34
  181. package/skills/skill-parent-teacher-brief/bin/cli.ts +0 -34
  182. package/skills/skill-partner-kit-assembler/bin/cli.ts +0 -34
  183. package/skills/skill-payroll-change-prepper/bin/cli.ts +0 -34
  184. package/skills/skill-persona-based-adwriter/bin/cli.ts +0 -34
  185. package/skills/skill-persona-generator/bin/cli.ts +0 -34
  186. package/skills/skill-personal-daily-ops/bin/cli.ts +0 -34
  187. package/skills/skill-pet-care-scheduler/bin/cli.ts +0 -34
  188. package/skills/skill-podcast-show-notes/bin/cli.ts +0 -34
  189. package/skills/skill-presentation-theme-maker/bin/cli.ts +0 -34
  190. package/skills/skill-press-release-drafter/bin/cli.ts +0 -34
  191. package/skills/skill-print-collateral-designer/bin/cli.ts +0 -34
  192. package/skills/skill-procurement-scorecard/bin/cli.ts +0 -34
  193. package/skills/skill-product-demo-script/bin/cli.ts +0 -34
  194. package/skills/skill-product-mockup/bin/cli.ts +0 -34
  195. package/skills/skill-project-retro-companion/bin/cli.ts +0 -34
  196. package/skills/skill-proposal-redline-advisor/bin/cli.ts +0 -34
  197. package/skills/skill-regex-tester/bin/cli.ts +0 -34
  198. package/skills/skill-remove-background/bin/cli.ts +0 -34
  199. package/skills/skill-risk-disclosure-kit/bin/cli.ts +0 -34
  200. package/skills/skill-roi-comparison-tool/bin/cli.ts +0 -34
  201. package/skills/skill-sales-call-recapper/bin/cli.ts +0 -34
  202. package/skills/skill-salescopy/bin/cli.ts +0 -20
  203. package/skills/skill-scaffold-project/bin/cli.ts +0 -34
  204. package/skills/skill-scholarship-tracker/bin/cli.ts +0 -34
  205. package/skills/skill-scientific-figure-check/bin/cli.ts +0 -34
  206. package/skills/skill-seating-chart-maker/bin/cli.ts +0 -34
  207. package/skills/skill-security-audit/bin/cli.ts +0 -34
  208. package/skills/skill-seo-brief-builder/bin/cli.ts +0 -34
  209. package/skills/skill-slack-assistant/bin/cli.ts +0 -34
  210. package/skills/skill-sleep-routine-analyzer/bin/cli.ts +0 -34
  211. package/skills/skill-social-media-kit/bin/cli.ts +0 -34
  212. package/skills/skill-split-pdf/bin/cli.ts +0 -34
  213. package/skills/skill-sponsorship-proposal-lab/bin/cli.ts +0 -34
  214. package/skills/skill-spreadsheet-cleanroom/bin/cli.ts +0 -34
  215. package/skills/skill-statistical-test-selector/bin/cli.ts +0 -34
  216. package/skills/skill-stress-relief-playbook/bin/cli.ts +0 -34
  217. package/skills/skill-study-guide-builder/bin/cli.ts +0 -34
  218. package/skills/skill-subscription-spend-watcher/bin/cli.ts +0 -34
  219. package/skills/skill-subtitle/bin/cli.ts +0 -20
  220. package/skills/skill-survey-insight-extractor/bin/cli.ts +0 -34
  221. package/skills/skill-terraform-generator/bin/cli.ts +0 -34
  222. package/skills/skill-testimonial-graphics/bin/cli.ts +0 -34
  223. package/skills/skill-timesheet/bin/cli.ts +0 -47
  224. package/skills/skill-travel-budget-balancer/bin/cli.ts +0 -34
  225. package/skills/skill-validate-config/bin/cli.ts +0 -34
  226. package/skills/skill-video-cut-suggester/bin/cli.ts +0 -34
  227. package/skills/skill-video-downloader/bin/cli.ts +0 -34
  228. package/skills/skill-video-thumbnail/bin/cli.ts +0 -34
  229. package/skills/skill-voiceover-casting-assistant/bin/cli.ts +0 -34
  230. package/skills/skill-watermark/bin/cli.ts +0 -34
  231. package/skills/skill-webcrawling/bin/cli.ts +0 -21
  232. package/skills/skill-webinar-script-coach/bin/cli.ts +0 -34
  233. package/skills/skill-wellness-progress-reporter/bin/cli.ts +0 -34
  234. package/skills/skill-workout-cycle-planner/bin/cli.ts +0 -34
@@ -0,0 +1,5 @@
1
+ /**
2
+ * completion — shell completion generation
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerCompletion(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * config / create / sync — configuration and scaffolding commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerCreateSync(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * test / doctor / auth / whoami / outdated — diagnostic commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerDiagnostic(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * init / export / import — project setup and sharing commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerSetup(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * install / remove / update — skill lifecycle commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerInstall(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * info / docs / requires / validate / diff — skill introspection commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerIntrospect(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * list / search / categories / tags — browsing commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerBrowse(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * run / mcp / serve / self-update — runtime commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerRuntime(parent: Command): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * schedule — cron-based skill scheduling commands
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerSchedule(parent: Command): void;
package/dist/index.js CHANGED
@@ -3,6 +3,94 @@
3
3
  import { existsSync, readFileSync, readdirSync } from "fs";
4
4
  import { join } from "path";
5
5
  import { homedir } from "os";
6
+
7
+ // src/lib/search.ts
8
+ function editDistance(a, b) {
9
+ if (a === b)
10
+ return 0;
11
+ if (a.length === 0)
12
+ return b.length;
13
+ if (b.length === 0)
14
+ return a.length;
15
+ const prev = Array.from({ length: b.length + 1 }, (_, i) => i);
16
+ const curr = new Array(b.length + 1);
17
+ for (let i = 1;i <= a.length; i++) {
18
+ curr[0] = i;
19
+ for (let j = 1;j <= b.length; j++) {
20
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
21
+ curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
22
+ }
23
+ prev.splice(0, prev.length, ...curr);
24
+ }
25
+ return prev[b.length];
26
+ }
27
+ function fuzzyMatchScore(word, target) {
28
+ if (target.includes(word))
29
+ return 1;
30
+ const tokens = target.split(/[\s\-_]+/).filter(Boolean);
31
+ for (const token of tokens) {
32
+ if (token.startsWith(word))
33
+ return 0.6;
34
+ }
35
+ if (word.length >= 3) {
36
+ const maxDist = word.length <= 3 ? 1 : 2;
37
+ for (const token of tokens) {
38
+ if (Math.abs(token.length - word.length) <= maxDist) {
39
+ const dist = editDistance(word, token);
40
+ if (dist <= maxDist)
41
+ return 0.4;
42
+ }
43
+ }
44
+ }
45
+ return 0;
46
+ }
47
+ function searchSkills(query) {
48
+ const words = query.toLowerCase().split(/\s+/).filter(Boolean);
49
+ if (words.length === 0)
50
+ return [];
51
+ const scored = [];
52
+ for (const skill of loadRegistry()) {
53
+ const nameLower = skill.name.toLowerCase();
54
+ const displayNameLower = skill.displayName.toLowerCase();
55
+ const descriptionLower = skill.description.toLowerCase();
56
+ const tagsLower = skill.tags.map((t) => t.toLowerCase());
57
+ const tagsCombined = tagsLower.join(" ");
58
+ let score = 0;
59
+ let allWordsMatch = true;
60
+ for (const word of words) {
61
+ let wordScore = 0;
62
+ const nameMatch = fuzzyMatchScore(word, nameLower);
63
+ if (nameMatch > 0)
64
+ wordScore += 10 * nameMatch;
65
+ const displayMatch = fuzzyMatchScore(word, displayNameLower);
66
+ if (displayMatch > 0)
67
+ wordScore += 7 * displayMatch;
68
+ const tagMatch = Math.max(...tagsLower.map((t) => fuzzyMatchScore(word, t)), fuzzyMatchScore(word, tagsCombined));
69
+ if (tagMatch > 0)
70
+ wordScore += 5 * tagMatch;
71
+ const descMatch = fuzzyMatchScore(word, descriptionLower);
72
+ if (descMatch > 0)
73
+ wordScore += 2 * descMatch;
74
+ if (wordScore === 0) {
75
+ allWordsMatch = false;
76
+ break;
77
+ }
78
+ score += wordScore;
79
+ }
80
+ if (allWordsMatch && score > 0) {
81
+ scored.push({ skill, score });
82
+ }
83
+ }
84
+ scored.sort((a, b) => b.score - a.score);
85
+ return scored.map((s) => s.skill);
86
+ }
87
+ function findSimilarSkills(query, maxResults = 3) {
88
+ const q = query.toLowerCase();
89
+ const scored = loadRegistry().map((s) => ({ name: s.name, dist: editDistance(q, s.name.toLowerCase()) })).filter((s) => s.dist <= Math.max(3, Math.floor(q.length / 2))).sort((a, b) => a.dist - b.dist);
90
+ return scored.slice(0, maxResults).map((s) => s.name);
91
+ }
92
+
93
+ // src/lib/registry.ts
6
94
  var CATEGORIES = [
7
95
  "Development Tools",
8
96
  "Business & Marketing",
@@ -44,6 +132,21 @@ var SKILLS = [
44
132
  category: "Development Tools",
45
133
  tags: ["code", "linting", "formatting", "quality"]
46
134
  },
135
+ {
136
+ name: "commitpush",
137
+ displayName: "Commit Push",
138
+ description: "Create logical commits from repo changes and push directly to the main branch",
139
+ category: "Development Tools",
140
+ tags: ["git", "commit", "push", "automation"]
141
+ },
142
+ {
143
+ name: "commitpushpr",
144
+ displayName: "Commit Push PR",
145
+ description: "Create logical commits, push a feature branch, and open a GitHub pull request",
146
+ category: "Development Tools",
147
+ tags: ["git", "commit", "pull-request", "github", "automation"],
148
+ dependencies: ["commitpush"]
149
+ },
47
150
  {
48
151
  name: "consolelog",
49
152
  displayName: "Console Log",
@@ -205,6 +308,13 @@ var SKILLS = [
205
308
  category: "Development Tools",
206
309
  tags: ["mcp", "builder", "scaffold", "server"]
207
310
  },
311
+ {
312
+ name: "monitor",
313
+ displayName: "Monitor",
314
+ description: "Operate the open-monitor MCP for machine health, processes, cron jobs, and cleanup workflows",
315
+ category: "Development Tools",
316
+ tags: ["monitoring", "mcp", "processes", "operations"]
317
+ },
208
318
  {
209
319
  name: "npmpublish",
210
320
  displayName: "NPM Publish",
@@ -255,6 +365,13 @@ var SKILLS = [
255
365
  category: "Development Tools",
256
366
  tags: ["terraform", "iac", "infrastructure", "devops"]
257
367
  },
368
+ {
369
+ name: "tmux-session",
370
+ displayName: "Tmux Session",
371
+ description: "Create and manage grouped tmux sessions with workspace-aware naming and window layout guidance",
372
+ category: "Development Tools",
373
+ tags: ["tmux", "terminal", "sessions", "workspace"]
374
+ },
258
375
  {
259
376
  name: "validate-config",
260
377
  displayName: "Validate Config",
@@ -857,6 +974,34 @@ var SKILLS = [
857
974
  category: "Data & Analysis",
858
975
  tags: ["kpi", "digest", "metrics", "reporting"]
859
976
  },
977
+ {
978
+ name: "read-csv",
979
+ displayName: "Read CSV",
980
+ description: "Parse CSV files into structured JSON with delimiter and encoding detection",
981
+ category: "Data & Analysis",
982
+ tags: ["csv", "parsing", "tabular", "data"]
983
+ },
984
+ {
985
+ name: "read-excel",
986
+ displayName: "Read Excel",
987
+ description: "Parse XLS and XLSX workbooks into structured JSON with sheet and formatted cell metadata",
988
+ category: "Data & Analysis",
989
+ tags: ["excel", "spreadsheet", "xlsx", "data"]
990
+ },
991
+ {
992
+ name: "read-image",
993
+ displayName: "Read Image",
994
+ description: "Analyze local or remote images with Claude vision and extract visible text and visual structure",
995
+ category: "Data & Analysis",
996
+ tags: ["image", "vision", "ocr", "analysis"]
997
+ },
998
+ {
999
+ name: "read-pdf",
1000
+ displayName: "Read PDF",
1001
+ description: "Extract text and structured content from PDF files with chunked Claude document analysis",
1002
+ category: "Data & Analysis",
1003
+ tags: ["pdf", "documents", "extraction", "analysis"]
1004
+ },
860
1005
  {
861
1006
  name: "spreadsheet-cleanroom",
862
1007
  displayName: "Spreadsheet Cleanroom",
@@ -1542,85 +1687,6 @@ function clearRegistryCache() {
1542
1687
  function getSkillsByCategory(category) {
1543
1688
  return loadRegistry().filter((s) => s.category === category);
1544
1689
  }
1545
- function editDistance(a, b) {
1546
- if (a === b)
1547
- return 0;
1548
- if (a.length === 0)
1549
- return b.length;
1550
- if (b.length === 0)
1551
- return a.length;
1552
- const prev = Array.from({ length: b.length + 1 }, (_, i) => i);
1553
- const curr = new Array(b.length + 1);
1554
- for (let i = 1;i <= a.length; i++) {
1555
- curr[0] = i;
1556
- for (let j = 1;j <= b.length; j++) {
1557
- const cost = a[i - 1] === b[j - 1] ? 0 : 1;
1558
- curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
1559
- }
1560
- prev.splice(0, prev.length, ...curr);
1561
- }
1562
- return prev[b.length];
1563
- }
1564
- function fuzzyMatchScore(word, target) {
1565
- if (target.includes(word))
1566
- return 1;
1567
- const tokens = target.split(/[\s\-_]+/).filter(Boolean);
1568
- for (const token of tokens) {
1569
- if (token.startsWith(word))
1570
- return 0.6;
1571
- }
1572
- if (word.length >= 3) {
1573
- const maxDist = word.length <= 3 ? 1 : 2;
1574
- for (const token of tokens) {
1575
- if (Math.abs(token.length - word.length) <= maxDist) {
1576
- const dist = editDistance(word, token);
1577
- if (dist <= maxDist)
1578
- return 0.4;
1579
- }
1580
- }
1581
- }
1582
- return 0;
1583
- }
1584
- function searchSkills(query) {
1585
- const words = query.toLowerCase().split(/\s+/).filter(Boolean);
1586
- if (words.length === 0)
1587
- return [];
1588
- const scored = [];
1589
- for (const skill of loadRegistry()) {
1590
- const nameLower = skill.name.toLowerCase();
1591
- const displayNameLower = skill.displayName.toLowerCase();
1592
- const descriptionLower = skill.description.toLowerCase();
1593
- const tagsLower = skill.tags.map((t) => t.toLowerCase());
1594
- const tagsCombined = tagsLower.join(" ");
1595
- let score = 0;
1596
- let allWordsMatch = true;
1597
- for (const word of words) {
1598
- let wordScore = 0;
1599
- const nameMatch = fuzzyMatchScore(word, nameLower);
1600
- if (nameMatch > 0)
1601
- wordScore += 10 * nameMatch;
1602
- const displayMatch = fuzzyMatchScore(word, displayNameLower);
1603
- if (displayMatch > 0)
1604
- wordScore += 7 * displayMatch;
1605
- const tagMatch = Math.max(...tagsLower.map((t) => fuzzyMatchScore(word, t)), fuzzyMatchScore(word, tagsCombined));
1606
- if (tagMatch > 0)
1607
- wordScore += 5 * tagMatch;
1608
- const descMatch = fuzzyMatchScore(word, descriptionLower);
1609
- if (descMatch > 0)
1610
- wordScore += 2 * descMatch;
1611
- if (wordScore === 0) {
1612
- allWordsMatch = false;
1613
- break;
1614
- }
1615
- score += wordScore;
1616
- }
1617
- if (allWordsMatch && score > 0) {
1618
- scored.push({ skill, score });
1619
- }
1620
- }
1621
- scored.sort((a, b) => b.score - a.score);
1622
- return scored.map((s) => s.skill);
1623
- }
1624
1690
  function getSkill(name) {
1625
1691
  return loadRegistry().find((s) => s.name === name);
1626
1692
  }
@@ -1631,27 +1697,11 @@ function getSkillsByTag(tag) {
1631
1697
  function getAllTags() {
1632
1698
  const tagSet = new Set;
1633
1699
  for (const skill of loadRegistry()) {
1634
- for (const tag of skill.tags) {
1700
+ for (const tag of skill.tags)
1635
1701
  tagSet.add(tag.toLowerCase());
1636
- }
1637
1702
  }
1638
1703
  return Array.from(tagSet).sort();
1639
1704
  }
1640
- function levenshtein(a, b) {
1641
- const m = a.length, n = b.length;
1642
- const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (_2, j) => i === 0 ? j : j === 0 ? i : 0));
1643
- for (let i = 1;i <= m; i++) {
1644
- for (let j = 1;j <= n; j++) {
1645
- dp[i][j] = a[i - 1] === b[j - 1] ? dp[i - 1][j - 1] : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
1646
- }
1647
- }
1648
- return dp[m][n];
1649
- }
1650
- function findSimilarSkills(query, maxResults = 3) {
1651
- const q = query.toLowerCase();
1652
- const scored = loadRegistry().map((s) => ({ name: s.name, dist: levenshtein(q, s.name.toLowerCase()) })).filter((s) => s.dist <= Math.max(3, Math.floor(q.length / 2))).sort((a, b) => a.dist - b.dist);
1653
- return scored.slice(0, maxResults).map((s) => s.name);
1654
- }
1655
1705
  // src/lib/installer.ts
1656
1706
  import { existsSync as existsSync2, cpSync, mkdirSync, writeFileSync, rmSync, readdirSync as readdirSync2, statSync, readFileSync as readFileSync2, accessSync, constants } from "fs";
1657
1707
  import { join as join2, dirname } from "path";
@@ -2223,7 +2273,7 @@ import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync
2223
2273
  import { join as join4, dirname as dirname2 } from "path";
2224
2274
  import { homedir as homedir3 } from "os";
2225
2275
  var VALID_KEYS = {
2226
- defaultAgent: ["claude", "codex", "gemini", "all"],
2276
+ defaultAgent: ["claude", "codex", "gemini", "pi", "opencode", "all"],
2227
2277
  defaultScope: ["global", "project"],
2228
2278
  format: ["compact", "json", "csv"]
2229
2279
  };
@@ -2322,11 +2372,61 @@ function saveSchedules(data, targetDir = process.cwd()) {
2322
2372
  mkdirSync3(dir, { recursive: true });
2323
2373
  writeFileSync3(path, JSON.stringify(data, null, 2));
2324
2374
  }
2375
+ function validateCronField(expr, min, max, label) {
2376
+ for (const part of expr.split(",")) {
2377
+ if (part === "*")
2378
+ continue;
2379
+ let valuePart = part;
2380
+ if (part.includes("/")) {
2381
+ const slashIdx = part.indexOf("/");
2382
+ valuePart = part.slice(0, slashIdx);
2383
+ const stepStr = part.slice(slashIdx + 1);
2384
+ const step = parseInt(stepStr);
2385
+ if (isNaN(step) || step < 1)
2386
+ return { valid: false, error: `Invalid step value in "${part}" in ${label}` };
2387
+ }
2388
+ if (valuePart === "*")
2389
+ continue;
2390
+ if (valuePart.includes("-")) {
2391
+ const rangeParts = valuePart.split("-");
2392
+ if (rangeParts.length !== 2)
2393
+ return { valid: false, error: `Invalid range expression "${valuePart}" in ${label}` };
2394
+ const lo = parseInt(rangeParts[0]);
2395
+ const hi = parseInt(rangeParts[1]);
2396
+ if (isNaN(lo) || isNaN(hi))
2397
+ return { valid: false, error: `Invalid range "${valuePart}" in ${label}` };
2398
+ if (lo < min || hi > max || lo > hi) {
2399
+ return { valid: false, error: `Range ${lo}-${hi} outside valid ${min}-${max} in ${label}` };
2400
+ }
2401
+ continue;
2402
+ }
2403
+ const n = parseInt(valuePart);
2404
+ if (isNaN(n))
2405
+ return { valid: false, error: `Invalid value "${valuePart}" in ${label}` };
2406
+ if (n < min || n > max) {
2407
+ return { valid: false, error: `Value ${n} outside valid ${min}-${max} in ${label}` };
2408
+ }
2409
+ }
2410
+ return { valid: true };
2411
+ }
2325
2412
  function validateCron(expr) {
2326
2413
  const fields = expr.trim().split(/\s+/);
2327
2414
  if (fields.length !== 5) {
2328
2415
  return { valid: false, error: `Expected 5 fields, got ${fields.length}. Format: "minute hour day-of-month month day-of-week"` };
2329
2416
  }
2417
+ const [minuteF, hourF, domF, monthF, dowF] = fields;
2418
+ const checks = [
2419
+ { expr: minuteF, min: 0, max: 59, label: "minute" },
2420
+ { expr: hourF, min: 0, max: 23, label: "hour" },
2421
+ { expr: domF, min: 1, max: 31, label: "day-of-month" },
2422
+ { expr: monthF, min: 1, max: 12, label: "month" },
2423
+ { expr: dowF, min: 0, max: 6, label: "day-of-week" }
2424
+ ];
2425
+ for (const { expr: f, min, max, label } of checks) {
2426
+ const result = validateCronField(f, min, max, label);
2427
+ if (!result.valid)
2428
+ return result;
2429
+ }
2330
2430
  return { valid: true };
2331
2431
  }
2332
2432
  function getNextRun(cron, from = new Date) {
@@ -9,7 +9,7 @@
9
9
  * Values from the project config override global config.
10
10
  */
11
11
  export interface SkillsConfig {
12
- defaultAgent?: "claude" | "codex" | "gemini" | "all";
12
+ defaultAgent?: "claude" | "codex" | "gemini" | "pi" | "opencode" | "all";
13
13
  defaultScope?: "global" | "project";
14
14
  format?: "compact" | "json" | "csv";
15
15
  }
@@ -26,17 +26,7 @@ export declare function loadRegistry(cwd?: string): SkillMeta[];
26
26
  /** Invalidate the registry cache (e.g. after installing a custom skill). */
27
27
  export declare function clearRegistryCache(): void;
28
28
  export declare function getSkillsByCategory(category: Category): SkillMeta[];
29
- export declare function searchSkills(query: string): SkillMeta[];
29
+ export { searchSkills, findSimilarSkills } from "./search.js";
30
30
  export declare function getSkill(name: string): SkillMeta | undefined;
31
- /**
32
- * Return all skills whose tags include a partial case-insensitive match for `tag`.
33
- */
34
31
  export declare function getSkillsByTag(tag: string): SkillMeta[];
35
- /**
36
- * Return all unique tags across every skill, sorted alphabetically.
37
- */
38
32
  export declare function getAllTags(): string[];
39
- /**
40
- * Find skills with names similar to the given query (for "did you mean?" suggestions)
41
- */
42
- export declare function findSimilarSkills(query: string, maxResults?: number): string[];
@@ -19,7 +19,7 @@ export interface SkillSchedule {
19
19
  lastRunStatus?: "success" | "error";
20
20
  nextRun?: string;
21
21
  }
22
- /** Validate a 5-field cron expression (basic syntax check). */
22
+ /** Validate a 5-field cron expression with range checking. */
23
23
  export declare function validateCron(expr: string): {
24
24
  valid: boolean;
25
25
  error?: string;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Scheduler tests — cron validation, getNextRun, and schedule CRUD
3
+ */
4
+ export {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Skill search — fuzzy matching with edit-distance and prefix scoring
3
+ */
4
+ import { type SkillMeta } from "./registry.js";
5
+ /**
6
+ * Compute Levenshtein edit distance between two strings.
7
+ * Uses a 2-row DP approach — no external deps.
8
+ */
9
+ export declare function editDistance(a: string, b: string): number;
10
+ /**
11
+ * Search skills by name, description, and tags using fuzzy matching.
12
+ */
13
+ export declare function searchSkills(query: string): SkillMeta[];
14
+ /**
15
+ * Find skills with names similar to the given query (for "did you mean?" suggestions).
16
+ */
17
+ export declare function findSimilarSkills(query: string, maxResults?: number): string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -61,7 +61,7 @@
61
61
  "typescript": "^5"
62
62
  },
63
63
  "dependencies": {
64
- "@hasna/cloud": "^0.1.0",
64
+ "@hasna/cloud": "^0.1.24",
65
65
  "@modelcontextprotocol/sdk": "^1.26.0",
66
66
  "chalk": "^5.3.0",
67
67
  "commander": "^12.1.0",
@@ -83,4 +83,4 @@
83
83
  "type": "git",
84
84
  "url": "git+https://github.com/hasna/skills.git"
85
85
  }
86
- }
86
+ }
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: skill-commitpush
3
+ description: Create logical commits from all staged and unstaged changes, then push directly to main. Groups related changes into separate commits with conventional commit messages. Use when you want to commit and push without creating a PR.
4
+ user_invocable: true
5
+ ---
6
+
7
+ # Commit & Push to Main
8
+
9
+ Create logical, well-organized commits from the current working directory changes and push directly to `main`.
10
+
11
+ ## Workflow
12
+
13
+ 1. Analyze changes: run `git status` and `git diff --stat`.
14
+ 2. Group logically:
15
+ - feature code and its tests
16
+ - documentation changes
17
+ - config or dependency changes
18
+ - refactors separate from new behavior
19
+ 3. Skip temp or generated files:
20
+ - `.agents-data/`, `.tmp/`, uploaded blobs
21
+ - non-package-manager lockfiles
22
+ - `.claude/scheduled_tasks.lock`
23
+ 4. Stage and commit each logical group:
24
+ - use `git add <specific files>`
25
+ - write a conventional commit message (`feat:`, `fix:`, `docs:`, `test:`, `chore:`, `refactor:`)
26
+ - explain why in the body when needed
27
+ 5. Push to `origin main`
28
+ 6. Report the commits created with short hashes and messages
29
+
30
+ ## Commit message format
31
+
32
+ ```text
33
+ type: concise description of the change
34
+
35
+ Optional body explaining why the change was made,
36
+ not what was changed.
37
+ ```
38
+
39
+ Use a heredoc when the message needs a body:
40
+
41
+ ```bash
42
+ git commit -m "$(cat <<'EOF'
43
+ type: description
44
+
45
+ Body if needed.
46
+ EOF
47
+ )"
48
+ ```
49
+
50
+ ## Rules
51
+
52
+ - Never use `git add .` or `git add -A`
53
+ - Never commit secrets, `.env` files, or credentials
54
+ - Never amend existing commits unless the user explicitly asks
55
+ - Never force-push
56
+ - If there are no changes, say so and stop
57
+ - Prefer fewer, well-scoped commits over many tiny ones
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@hasnaxyz/skill-commitpush",
3
+ "version": "0.1.0",
4
+ "description": "Instruction-set skill for logical commits and direct pushes to main",
5
+ "type": "module",
6
+ "main": "src/index.ts",
7
+ "bin": {
8
+ "skill-commitpush": "src/index.ts"
9
+ },
10
+ "files": [
11
+ "src",
12
+ "SKILL.md",
13
+ "tsconfig.json"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "restricted"
17
+ },
18
+ "keywords": [
19
+ "git",
20
+ "commit",
21
+ "push",
22
+ "automation",
23
+ "skill"
24
+ ],
25
+ "license": "Apache-2.0",
26
+ "scripts": {
27
+ "start": "bun run src/index.ts",
28
+ "typecheck": "tsc --noEmit"
29
+ },
30
+ "devDependencies": {
31
+ "@types/bun": "latest",
32
+ "typescript": "^5.7.0"
33
+ }
34
+ }
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ const VERSION = "0.1.0";
4
+
5
+ function printHelp(): void {
6
+ console.log(`skill-commitpush - Instruction-set skill
7
+
8
+ DESCRIPTION:
9
+ Guides an agent through:
10
+ - scanning repo changes
11
+ - grouping them into logical commits
12
+ - writing conventional commit messages
13
+ - pushing directly to origin/main
14
+
15
+ USAGE:
16
+ skills docs commitpush
17
+ skills install commitpush --for claude
18
+ `);
19
+ }
20
+
21
+ const args = process.argv.slice(2);
22
+
23
+ if (args.includes("--version") || args.includes("-v")) {
24
+ console.log(VERSION);
25
+ process.exit(0);
26
+ }
27
+
28
+ if (args.includes("--help") || args.includes("-h") || args.length === 0) {
29
+ printHelp();
30
+ process.exit(0);
31
+ }
32
+
33
+ console.log("This is an instruction-set skill. Install it for an agent with:");
34
+ console.log(" skills install commitpush --for claude");
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "ESNext",
5
+ "outDir": "./dist",
6
+ "rootDir": "./src",
7
+ "resolveJsonModule": true,
8
+ "noEmit": true
9
+ },
10
+ "include": [
11
+ "src/**/*"
12
+ ],
13
+ "exclude": [
14
+ "node_modules",
15
+ "dist"
16
+ ]
17
+ }