@hasna/skills 0.1.30 → 0.1.31

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 (197) hide show
  1. package/bin/index.js +1593 -10958
  2. package/bin/mcp.js +1516 -11651
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.js +686 -9552
  5. package/dist/lib/auth-store.d.ts +1 -1
  6. package/dist/lib/config.d.ts +1 -0
  7. package/dist/lib/discovery.d.ts +23 -0
  8. package/dist/lib/pricing.d.ts +89 -0
  9. package/dist/lib/remote-client.d.ts +18 -0
  10. package/dist/lib/remote-run-contract.d.ts +29 -0
  11. package/dist/mcp/http.d.ts +1 -1
  12. package/package.json +3 -14
  13. package/skills/apidocs/.claude/settings.json +5 -0
  14. package/skills/security-audit/src/index.ts +1 -1
  15. package/skills/skill-academic-journal-matcher/bin/cli.ts +0 -34
  16. package/skills/skill-action-item-router/bin/cli.ts +0 -34
  17. package/skills/skill-ad-creative-generator/bin/cli.ts +0 -34
  18. package/skills/skill-advanced-math/bin/cli.ts +0 -34
  19. package/skills/skill-analyze-data/bin/cli.ts +0 -19
  20. package/skills/skill-anomaly-investigator/bin/cli.ts +0 -34
  21. package/skills/skill-api-test-suite/bin/cli.ts +0 -34
  22. package/skills/skill-apidocs/bin/cli.ts +0 -87
  23. package/skills/skill-audio-cleanup-lab/bin/cli.ts +0 -6
  24. package/skills/skill-audiobook-chapter-proofer/bin/cli.ts +0 -34
  25. package/skills/skill-banner-ad-suite/bin/cli.ts +0 -34
  26. package/skills/skill-benchmark-finder/bin/cli.ts +0 -34
  27. package/skills/skill-bio-sequence-tool/bin/cli.ts +0 -34
  28. package/skills/skill-blog-topic-cluster/bin/cli.ts +0 -34
  29. package/skills/skill-brand-style-guide/bin/cli.ts +0 -19
  30. package/skills/skill-brand-voice-audit/bin/cli.ts +0 -34
  31. package/skills/skill-budget-variance-analyzer/bin/cli.ts +0 -6
  32. package/skills/skill-businessactivity/bin/cli.ts +0 -28
  33. package/skills/skill-calendar-events/bin/cli.ts +0 -34
  34. package/skills/skill-campaign-metric-brief/bin/cli.ts +0 -34
  35. package/skills/skill-campaign-moodboard/bin/cli.ts +0 -34
  36. package/skills/skill-caption-style-stylist/bin/cli.ts +0 -34
  37. package/skills/skill-chemistry-calculator/bin/cli.ts +0 -34
  38. package/skills/skill-churn-risk-notifier/bin/cli.ts +0 -34
  39. package/skills/skill-citation-formatter/bin/cli.ts +0 -34
  40. package/skills/skill-classroom-newsletter-kit/bin/cli.ts +0 -34
  41. package/skills/skill-color-palette-harmonizer/bin/cli.ts +0 -34
  42. package/skills/skill-competitor-ad-analyzer/bin/cli.ts +0 -34
  43. package/skills/skill-compliance-copy-check/bin/cli.ts +0 -34
  44. package/skills/skill-compliance-report-pack/bin/cli.ts +0 -34
  45. package/skills/skill-compress-video/bin/cli.ts +0 -19
  46. package/skills/skill-consolelog/bin/cli.ts +0 -884
  47. package/skills/skill-contract-plainlanguage/bin/cli.ts +0 -34
  48. package/skills/skill-copytone-translator/bin/cli.ts +0 -34
  49. package/skills/skill-create-blog-article/bin/cli.ts +0 -34
  50. package/skills/skill-create-ebook/bin/cli.ts +0 -34
  51. package/skills/skill-crm-note-enhancer/bin/cli.ts +0 -34
  52. package/skills/skill-customer-journey-mapper/bin/cli.ts +0 -34
  53. package/skills/skill-dashboard-builder/bin/cli.ts +0 -34
  54. package/skills/skill-dashboard-narrator/bin/cli.ts +0 -34
  55. package/skills/skill-data-anonymizer/bin/cli.ts +0 -34
  56. package/skills/skill-database-explorer/bin/cli.ts +0 -34
  57. package/skills/skill-dataset-health-check/bin/cli.ts +0 -34
  58. package/skills/skill-decision-journal/bin/cli.ts +0 -34
  59. package/skills/skill-delegation-brief-writer/bin/cli.ts +0 -34
  60. package/skills/skill-destination-briefing/bin/cli.ts +0 -34
  61. package/skills/skill-diff-viewer/bin/cli.ts +0 -34
  62. package/skills/skill-domainpurchase/bin/cli.ts +0 -683
  63. package/skills/skill-domainsearch/bin/cli.ts +0 -410
  64. package/skills/skill-educational-resource-finder/bin/cli.ts +0 -34
  65. package/skills/skill-email-campaign/bin/cli.ts +0 -34
  66. package/skills/skill-exam-readiness-check/bin/cli.ts +0 -34
  67. package/skills/skill-experiment-power-calculator/bin/cli.ts +0 -34
  68. package/skills/skill-extract-audio/bin/cli.ts +0 -19
  69. package/skills/skill-extract-frames/bin/cli.ts +0 -34
  70. package/skills/skill-extract-invoice/bin/cli.ts +0 -34
  71. package/skills/skill-family-activity-curator/bin/cli.ts +0 -34
  72. package/skills/skill-faq-packager/bin/cli.ts +0 -34
  73. package/skills/skill-feedback-survey-designer/bin/cli.ts +0 -34
  74. package/skills/skill-field-trip-planner/bin/cli.ts +0 -34
  75. package/skills/skill-file-organizer/bin/cli.ts +0 -34
  76. package/skills/skill-folder-tree/bin/cli.ts +0 -34
  77. package/skills/skill-forecast-scenario-lab/bin/cli.ts +0 -34
  78. package/skills/skill-form-filler/bin/cli.ts +0 -34
  79. package/skills/skill-generate-api-client/bin/cli.ts +0 -34
  80. package/skills/skill-generate-book-cover/bin/cli.ts +0 -34
  81. package/skills/skill-generate-chart/bin/cli.ts +0 -34
  82. package/skills/skill-generate-diagram/bin/cli.ts +0 -34
  83. package/skills/skill-generate-dockerfile/bin/cli.ts +0 -34
  84. package/skills/skill-generate-documentation/bin/cli.ts +0 -34
  85. package/skills/skill-generate-docx/bin/cli.ts +0 -6
  86. package/skills/skill-generate-env/bin/cli.ts +0 -34
  87. package/skills/skill-generate-excel/bin/cli.ts +0 -34
  88. package/skills/skill-generate-favicon/bin/cli.ts +0 -34
  89. package/skills/skill-generate-mock-data/bin/cli.ts +0 -34
  90. package/skills/skill-generate-pdf/bin/cli.ts +0 -6
  91. package/skills/skill-generate-pr-description/bin/cli.ts +0 -34
  92. package/skills/skill-generate-presentation/bin/cli.ts +0 -34
  93. package/skills/skill-generate-qrcode/bin/cli.ts +0 -34
  94. package/skills/skill-generate-regex/bin/cli.ts +0 -34
  95. package/skills/skill-generate-resume/bin/cli.ts +0 -34
  96. package/skills/skill-generate-sitemap/bin/cli.ts +0 -34
  97. package/skills/skill-generate-social-posts/bin/cli.ts +0 -34
  98. package/skills/skill-generate-sql/bin/cli.ts +0 -34
  99. package/skills/skill-gif-maker/bin/cli.ts +0 -34
  100. package/skills/skill-github-manager/bin/cli.ts +0 -34
  101. package/skills/skill-gmail/bin/cli.ts +0 -34
  102. package/skills/skill-goal-quarterly-roadmap/bin/cli.ts +0 -34
  103. package/skills/skill-grant-application-drafter/bin/cli.ts +0 -34
  104. package/skills/skill-grocery-basket-optimizer/bin/cli.ts +0 -34
  105. package/skills/skill-guest-communication-suite/bin/cli.ts +0 -34
  106. package/skills/skill-habit-reflection-digest/bin/cli.ts +0 -34
  107. package/skills/skill-highlight-reel-generator/bin/cli.ts +0 -34
  108. package/skills/skill-homework-feedback-coach/bin/cli.ts +0 -34
  109. package/skills/skill-household-maintenance-mgr/bin/cli.ts +0 -34
  110. package/skills/skill-http-server/bin/cli.ts +0 -34
  111. package/skills/skill-implementation-agent/bin/cli.ts +0 -34
  112. package/skills/skill-implementation-plan/bin/cli.ts +0 -34
  113. package/skills/skill-implementation-todo/bin/cli.ts +0 -34
  114. package/skills/skill-inbox-priority-planner/bin/cli.ts +0 -34
  115. package/skills/skill-invoice/bin/cli.ts +0 -20
  116. package/skills/skill-invoice-dispute-helper/bin/cli.ts +0 -34
  117. package/skills/skill-itinerary-architect/bin/cli.ts +0 -34
  118. package/skills/skill-jingle-composer/bin/cli.ts +0 -34
  119. package/skills/skill-kpi-digest-generator/bin/cli.ts +0 -34
  120. package/skills/skill-lab-notebook-formatter/bin/cli.ts +0 -34
  121. package/skills/skill-landing-page-copy/bin/cli.ts +0 -34
  122. package/skills/skill-latex-table-generator/bin/cli.ts +0 -34
  123. package/skills/skill-learning-style-profiler/bin/cli.ts +0 -34
  124. package/skills/skill-lesson-plan-customizer/bin/cli.ts +0 -34
  125. package/skills/skill-livestream-runofshow/bin/cli.ts +0 -34
  126. package/skills/skill-longform-structurer/bin/cli.ts +0 -34
  127. package/skills/skill-lorem-generator/bin/cli.ts +0 -34
  128. package/skills/skill-managehook/bin/cli.ts +0 -241
  129. package/skills/skill-managemcp/bin/cli.ts +0 -241
  130. package/skills/skill-manageskill/bin/cli.ts +0 -241
  131. package/skills/skill-markdown-validator/bin/cli.ts +0 -34
  132. package/skills/skill-mcp-builder/bin/cli.ts +0 -34
  133. package/skills/skill-meal-plan-designer/bin/cli.ts +0 -34
  134. package/skills/skill-meeting-insight-summarizer/bin/cli.ts +0 -34
  135. package/skills/skill-merge-pdfs/bin/cli.ts +0 -34
  136. package/skills/skill-microcopy-generator/bin/cli.ts +0 -34
  137. package/skills/skill-mindfulness-prompt-cache/bin/cli.ts +0 -34
  138. package/skills/skill-notion-manager/bin/cli.ts +0 -34
  139. package/skills/skill-onboarding-sequence-builder/bin/cli.ts +0 -34
  140. package/skills/skill-onsite-ops-checklist/bin/cli.ts +0 -34
  141. package/skills/skill-outreach-cadence-designer/bin/cli.ts +0 -34
  142. package/skills/skill-packaging-concept-studio/bin/cli.ts +0 -34
  143. package/skills/skill-packing-plan-pro/bin/cli.ts +0 -34
  144. package/skills/skill-parent-teacher-brief/bin/cli.ts +0 -34
  145. package/skills/skill-partner-kit-assembler/bin/cli.ts +0 -34
  146. package/skills/skill-payroll-change-prepper/bin/cli.ts +0 -34
  147. package/skills/skill-persona-based-adwriter/bin/cli.ts +0 -34
  148. package/skills/skill-persona-generator/bin/cli.ts +0 -34
  149. package/skills/skill-personal-daily-ops/bin/cli.ts +0 -34
  150. package/skills/skill-pet-care-scheduler/bin/cli.ts +0 -34
  151. package/skills/skill-podcast-show-notes/bin/cli.ts +0 -34
  152. package/skills/skill-presentation-theme-maker/bin/cli.ts +0 -34
  153. package/skills/skill-press-release-drafter/bin/cli.ts +0 -34
  154. package/skills/skill-print-collateral-designer/bin/cli.ts +0 -34
  155. package/skills/skill-procurement-scorecard/bin/cli.ts +0 -34
  156. package/skills/skill-product-demo-script/bin/cli.ts +0 -34
  157. package/skills/skill-product-mockup/bin/cli.ts +0 -34
  158. package/skills/skill-project-retro-companion/bin/cli.ts +0 -34
  159. package/skills/skill-proposal-redline-advisor/bin/cli.ts +0 -34
  160. package/skills/skill-regex-tester/bin/cli.ts +0 -34
  161. package/skills/skill-remove-background/bin/cli.ts +0 -34
  162. package/skills/skill-risk-disclosure-kit/bin/cli.ts +0 -34
  163. package/skills/skill-roi-comparison-tool/bin/cli.ts +0 -34
  164. package/skills/skill-sales-call-recapper/bin/cli.ts +0 -34
  165. package/skills/skill-salescopy/bin/cli.ts +0 -20
  166. package/skills/skill-scaffold-project/bin/cli.ts +0 -34
  167. package/skills/skill-scholarship-tracker/bin/cli.ts +0 -34
  168. package/skills/skill-scientific-figure-check/bin/cli.ts +0 -34
  169. package/skills/skill-seating-chart-maker/bin/cli.ts +0 -34
  170. package/skills/skill-security-audit/bin/cli.ts +0 -34
  171. package/skills/skill-seo-brief-builder/bin/cli.ts +0 -34
  172. package/skills/skill-slack-assistant/bin/cli.ts +0 -34
  173. package/skills/skill-sleep-routine-analyzer/bin/cli.ts +0 -34
  174. package/skills/skill-social-media-kit/bin/cli.ts +0 -34
  175. package/skills/skill-split-pdf/bin/cli.ts +0 -34
  176. package/skills/skill-sponsorship-proposal-lab/bin/cli.ts +0 -34
  177. package/skills/skill-spreadsheet-cleanroom/bin/cli.ts +0 -34
  178. package/skills/skill-statistical-test-selector/bin/cli.ts +0 -34
  179. package/skills/skill-stress-relief-playbook/bin/cli.ts +0 -34
  180. package/skills/skill-study-guide-builder/bin/cli.ts +0 -34
  181. package/skills/skill-subscription-spend-watcher/bin/cli.ts +0 -34
  182. package/skills/skill-subtitle/bin/cli.ts +0 -20
  183. package/skills/skill-survey-insight-extractor/bin/cli.ts +0 -34
  184. package/skills/skill-terraform-generator/bin/cli.ts +0 -34
  185. package/skills/skill-testimonial-graphics/bin/cli.ts +0 -34
  186. package/skills/skill-timesheet/bin/cli.ts +0 -47
  187. package/skills/skill-travel-budget-balancer/bin/cli.ts +0 -34
  188. package/skills/skill-validate-config/bin/cli.ts +0 -34
  189. package/skills/skill-video-cut-suggester/bin/cli.ts +0 -34
  190. package/skills/skill-video-downloader/bin/cli.ts +0 -34
  191. package/skills/skill-video-thumbnail/bin/cli.ts +0 -34
  192. package/skills/skill-voiceover-casting-assistant/bin/cli.ts +0 -34
  193. package/skills/skill-watermark/bin/cli.ts +0 -34
  194. package/skills/skill-webcrawling/bin/cli.ts +0 -21
  195. package/skills/skill-webinar-script-coach/bin/cli.ts +0 -34
  196. package/skills/skill-wellness-progress-reporter/bin/cli.ts +0 -34
  197. package/skills/skill-workout-cycle-planner/bin/cli.ts +0 -34
@@ -9,5 +9,5 @@ export declare function getAuthConfig(): AuthConfig | null;
9
9
  export declare function saveAuthConfig(config: AuthConfig): void;
10
10
  export declare function clearAuthConfig(): void;
11
11
  export declare function getApiKey(): string | null;
12
- export declare function normalizePlatformApiOrigin(apiUrl: string): string;
12
+ export declare function normalizeSkillsApiOrigin(apiUrl: string): string;
13
13
  export declare function getApiUrl(): string;
@@ -9,6 +9,7 @@
9
9
  * Values from the project config override global config.
10
10
  */
11
11
  export interface SkillsConfig {
12
+ mode?: "local" | "skills.md";
12
13
  defaultAgent?: "claude" | "codex" | "gemini" | "pi" | "opencode" | "all";
13
14
  defaultScope?: "global" | "project";
14
15
  format?: "compact" | "json" | "csv";
@@ -0,0 +1,23 @@
1
+ import type { SkillMeta } from "./registry-types.js";
2
+ import { type PublicSkillPricing } from "./pricing.js";
3
+ export interface CompactSkillDiscovery {
4
+ name: string;
5
+ category: string;
6
+ pricing: PublicSkillPricing;
7
+ }
8
+ export type PublicSkillDiscovery<T extends SkillMeta = SkillMeta> = Omit<T, "description" | "tags"> & {
9
+ description: string;
10
+ tags: string[];
11
+ pricing: PublicSkillPricing;
12
+ };
13
+ export declare function getCompactSkillDiscovery(skill: SkillMeta): CompactSkillDiscovery;
14
+ export declare function getPublicSkillDiscovery<T extends SkillMeta>(skill: T): PublicSkillDiscovery<T>;
15
+ export declare function publicDiscoveryPriceLabel(skill: {
16
+ name: string;
17
+ pricing?: PublicSkillPricing;
18
+ }): string;
19
+ export declare function publicDiscoveryTags(tags: string[]): string[];
20
+ export declare function sanitizePublicDiscoveryText(text: string): string;
21
+ export declare function publicDiscoveryEnvVars(skillName: string, envVars: string[]): string[];
22
+ export declare function publicDiscoveryDependencies(skillName: string, dependencies: Record<string, string>): Record<string, string>;
23
+ export declare function publicDiscoveryDocumentation(skill: SkillMeta, documentation: string | null): string | null;
@@ -0,0 +1,89 @@
1
+ export type BillingTier = "free" | "premium";
2
+ export interface SkillPricing {
3
+ slug: string;
4
+ displayName: string;
5
+ tier: BillingTier;
6
+ costCents: number;
7
+ providers: string[];
8
+ description: string;
9
+ provider?: string;
10
+ model?: string;
11
+ costMicros?: number;
12
+ }
13
+ export interface PublicSkillPricing {
14
+ tier: BillingTier;
15
+ billingUnit: "run" | "image" | "second" | "character" | "song" | "thousand_tokens" | "article";
16
+ costCents: number;
17
+ formattedCost: string;
18
+ formattedUnitCost?: string;
19
+ unitCount?: number;
20
+ estimated: boolean;
21
+ quoteDependsOnInput: boolean;
22
+ quoteRequired: boolean;
23
+ description: string;
24
+ }
25
+ export type SkillCatalogBillingMode = "free" | "credits" | "subscription" | "metered";
26
+ export interface SkillCatalogBillingFields {
27
+ billingMode: SkillCatalogBillingMode;
28
+ creditsPerExecution: number;
29
+ }
30
+ export type MediaModality = "image" | "video" | "audio" | "music";
31
+ export type MediaProvider = "openai" | "minimax" | "gemini" | "seedance";
32
+ type PriceUnit = "image" | "second" | "character" | "song" | "thousand_tokens";
33
+ interface MediaPrice {
34
+ slug: MediaModality;
35
+ provider: MediaProvider;
36
+ model: string;
37
+ unit: PriceUnit;
38
+ costMicros: number;
39
+ description: string;
40
+ default?: boolean;
41
+ resolution?: string;
42
+ durationSeconds?: number;
43
+ }
44
+ export declare const MUSIC_ALBUM_SLUG = "music-album";
45
+ export declare const MUSIC_ALBUM_SONG_COUNTS: readonly [7, 14, 21];
46
+ export declare const PREMIUM_SKILLS: SkillPricing[];
47
+ export declare const ARTICLE_GENERATION_SLUG = "blog-article";
48
+ export declare const ARTICLE_MAX_COUNT = 12;
49
+ export declare const ARTICLE_COUNT_ERROR = "Count must be an integer between 1 and 12.";
50
+ declare const ARTICLE_TONES: readonly ["professional", "casual", "technical", "friendly"];
51
+ declare const ARTICLE_LENGTHS: readonly ["short", "medium", "long"];
52
+ export type ArticleTone = typeof ARTICLE_TONES[number];
53
+ export type ArticleLength = typeof ARTICLE_LENGTHS[number];
54
+ export interface BlogArticleRunOptions {
55
+ topic?: string;
56
+ audience?: string;
57
+ tone: ArticleTone;
58
+ length: ArticleLength;
59
+ seo: boolean;
60
+ outline?: string;
61
+ count: number;
62
+ }
63
+ export type BlogArticleValidationResult = {
64
+ ok: true;
65
+ options: BlogArticleRunOptions;
66
+ input: Record<string, unknown>;
67
+ errors: [];
68
+ } | {
69
+ ok: false;
70
+ input: Record<string, unknown>;
71
+ errors: string[];
72
+ };
73
+ export declare const MEDIA_GENERATION_PRICES: MediaPrice[];
74
+ export declare function getSkillPricing(slug: string): SkillPricing | null;
75
+ export declare function isPremiumSkill(slug: string): boolean;
76
+ export declare function getSkillCostCents(slug: string): number;
77
+ export declare function getSkillRunPricing(slug: string, input?: unknown, args?: string[]): SkillPricing | null;
78
+ export declare function validateBlogArticleRunOptions(input?: unknown, args?: string[], validation?: {
79
+ requireTopic?: boolean;
80
+ }): BlogArticleValidationResult;
81
+ export declare function getSkillRunCostCents(slug: string, input?: unknown, args?: string[]): number;
82
+ export declare function getPublicSkillPricing(slug: string, input?: unknown, args?: string[]): PublicSkillPricing;
83
+ export declare function getSkillCatalogBillingFields(slug: string, input?: unknown, args?: string[]): SkillCatalogBillingFields;
84
+ export declare function formatPublicPricing(slug: string, input?: unknown, args?: string[]): string;
85
+ export declare function isMediaGenerationSkill(slug: string): boolean;
86
+ export declare function getMediaProviders(slug: MediaModality): string[];
87
+ export declare function formatCost(cents: number): string;
88
+ export declare function getAllPremiumSlugs(): string[];
89
+ export {};
@@ -0,0 +1,18 @@
1
+ import { type RemoteSkillRunContract } from "./remote-run-contract.js";
2
+ export declare class RemoteSkillsClient {
3
+ private apiUrl;
4
+ private apiKey;
5
+ constructor(apiKey: string, apiUrl?: string);
6
+ private request;
7
+ listSkills(): Promise<any[]>;
8
+ getSkillMd(slug: string): Promise<string | null>;
9
+ getSkill(slug: string): Promise<any | null>;
10
+ quoteSkill(slug: string, input?: Record<string, unknown>, args?: string[]): Promise<any>;
11
+ submitRun(slug: string, input?: Record<string, unknown>, args?: string[]): Promise<RemoteSkillRunContract>;
12
+ getRun(runId: string): Promise<RemoteSkillRunContract | null>;
13
+ getRunLogs(runId: string): Promise<any[]>;
14
+ listRuns(limit?: number): Promise<any[]>;
15
+ getRunArtifacts(runId: string): Promise<any[]>;
16
+ downloadRunArtifact(runId: string, artifactId: string): Promise<Response>;
17
+ }
18
+ export declare function createRemoteSkillsClient(): RemoteSkillsClient | null;
@@ -0,0 +1,29 @@
1
+ import type { PublicSkillPricing } from "./pricing";
2
+ export declare const REMOTE_SKILL_RUN_CONTRACT_VERSION: 1;
3
+ export interface RemoteSkillRunContract {
4
+ contractVersion: typeof REMOTE_SKILL_RUN_CONTRACT_VERSION;
5
+ id?: string;
6
+ skill?: string;
7
+ requestedSlug?: string;
8
+ status?: string;
9
+ exitCode?: number;
10
+ correlationId?: string;
11
+ costCents?: number;
12
+ cost?: string;
13
+ pricing?: PublicSkillPricing;
14
+ createdAt?: string;
15
+ startedAt?: string;
16
+ completedAt?: string;
17
+ durationMs?: number;
18
+ outputType?: string;
19
+ outputPreview?: unknown;
20
+ errorCode?: string;
21
+ errorMessage?: string;
22
+ creditsUsed?: number;
23
+ error?: string;
24
+ code?: string;
25
+ details?: unknown;
26
+ balance?: string;
27
+ balanceCents?: number;
28
+ }
29
+ export declare function normalizeRemoteSkillRunContract(payload: unknown, fallbackSkill?: string): RemoteSkillRunContract;
@@ -1,5 +1,5 @@
1
1
  import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
2
- export declare const MCP_HTTP_DEFAULT_PORT = 8879;
2
+ export declare const MCP_HTTP_DEFAULT_PORT = 8836;
3
3
  export declare const MCP_HTTP_SERVICE_NAME = "skills";
4
4
  export declare function isMcpHttpMode(argv?: string[]): boolean;
5
5
  export declare function isMcpStdioMode(argv?: string[]): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.1.30",
3
+ "version": "0.1.31",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,17 +36,6 @@
36
36
  "dev:watch": "bun --watch run ./src/cli/index.tsx",
37
37
  "dev:mcp": "bun --watch run ./src/mcp/index.ts",
38
38
  "typecheck": "tsc --noEmit",
39
- "db:migrate:preview": "bun run scripts/apply_database_migrations.ts",
40
- "aws:bootstrap:ecs": "bash scripts/bootstrap_ecs_foundation.sh",
41
- "aws:bootstrap:s3": "bash scripts/bootstrap_s3_buckets.sh",
42
- "aws:bootstrap:secrets": "bash scripts/bootstrap_secrets.sh",
43
- "aws:bootstrap:preview-edge": "bash scripts/bootstrap_preview_edge.sh",
44
- "aws:bootstrap:preview-stripe": "bash scripts/preview_bootstrap_stripe.sh",
45
- "aws:verify:preview-stripe": "bash scripts/preview_verify_stripe.sh",
46
- "aws:bootstrap:production-edge": "bash scripts/bootstrap_production_edge.sh",
47
- "aws:bootstrap:production-stripe": "bash scripts/production_bootstrap_stripe.sh",
48
- "aws:production:readiness": "bash scripts/production_readiness.sh",
49
- "upstream:check": "bash scripts/check_upstream_sync.sh",
50
39
  "prepublishOnly": "bun run build",
51
40
  "postinstall": "mkdir -p $HOME/.hasna/skills/custom 2>/dev/null || true"
52
41
  },
@@ -70,11 +59,10 @@
70
59
  "license": "Apache-2.0",
71
60
  "devDependencies": {
72
61
  "@types/bun": "latest",
62
+ "@types/react": "^18.2.0",
73
63
  "typescript": "^5"
74
64
  },
75
65
  "dependencies": {
76
- "@hasna/cloud": "^0.1.24",
77
- "@hasna/skills": "0.1.27",
78
66
  "@modelcontextprotocol/sdk": "^1.26.0",
79
67
  "chalk": "^5.3.0",
80
68
  "commander": "^12.1.0",
@@ -82,6 +70,7 @@
82
70
  "ink-select-input": "^6.0.0",
83
71
  "ink-spinner": "^5.0.0",
84
72
  "ink-text-input": "^6.0.0",
73
+ "react": "^18.2.0",
85
74
  "zod": "^4.3.6"
86
75
  },
87
76
  "engines": {
@@ -0,0 +1,5 @@
1
+ {
2
+ "env": {
3
+ "CLAUDE_CODE_TASK_LIST_ID": "service-apidocs-dev"
4
+ }
5
+ }
@@ -53,7 +53,7 @@ const PATTERNS = [
53
53
  { name: "Eval Usage", regex: /eval\(/, severity: "MEDIUM" },
54
54
  {
55
55
  name: "Insecure HTTP",
56
- regex: /http:\/\/(?!localhost(?:[:/$]|$)|127\.0\.0\.1(?:[:/$]|$)|0\.0\.0\.0(?:[:/$]|$))/,
56
+ regex: /http:\/\/(?!localhost(?:[:/$]|$)|127\.0\.0\.1(?:[:/$]|$)|0\.0\.0\.0(?:[:/$]|$)|\$\{)/,
57
57
  severity: "LOW",
58
58
  },
59
59
  ];
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-academic-journal-matcher");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-academic-journal-matcher")
15
- .description("Academic Journal Matcher skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-action-item-router");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-action-item-router")
15
- .description("Action Item Router skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-ad-creative-generator");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-ad-creative-generator")
15
- .description("Ad Creative Generator skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-advanced-math");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-advanced-math")
15
- .description("Advanced Math skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { Command } from "commander";
3
-
4
- const program = new Command();
5
-
6
- program
7
- .name("skill-analyze-data")
8
- .description("Data science insights for CSV and JSON")
9
- .version("0.1.0");
10
-
11
- program
12
- .command("run", { isDefault: true })
13
- .description("Run the skill")
14
- .allowUnknownOption(true)
15
- .action(async () => {
16
- await import("../src/index.js");
17
- });
18
-
19
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-anomaly-investigator");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-anomaly-investigator")
15
- .description("Anomaly Investigator skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-api-test-suite");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-api-test-suite")
15
- .description("Api Test Suite skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,87 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from 'commander';
4
- import { add } from '../src/commands/add.js';
5
- import { query } from '../src/commands/query.js';
6
- import { list } from '../src/commands/list.js';
7
- import { sync } from '../src/commands/sync.js';
8
- import { remove } from '../src/commands/remove.js';
9
- import { endpoints } from '../src/commands/endpoints.js';
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name('service-apidocs')
15
- .description('Agentic web crawler for API documentation indexing and semantic search')
16
- .version('0.3.0');
17
-
18
- // Add command
19
- program
20
- .command('add <website-url>')
21
- .description('Add documentation from a website URL')
22
- .option('-n, --name <name>', 'Custom library name')
23
- .option('-m, --max-pages <number>', 'Maximum pages to crawl', (v) => parseInt(v, 10))
24
- .action(async (websiteUrl: string, options) => {
25
- await add(websiteUrl, options);
26
- });
27
-
28
- // Query command
29
- program
30
- .command('query <library> <question>')
31
- .description('Query documentation semantically')
32
- .option('--tokens <number>', 'Maximum tokens in response', (v) => parseInt(v, 10))
33
- .option('--top-k <number>', 'Number of results to retrieve', (v) => parseInt(v, 10))
34
- .option('--json', 'Output as JSON')
35
- .action(async (library: string, question: string, options) => {
36
- await query(library, question, {
37
- library,
38
- question,
39
- tokens: options.tokens,
40
- topK: options.topK,
41
- json: options.json,
42
- });
43
- });
44
-
45
- // List command
46
- program
47
- .command('list')
48
- .description('List all indexed libraries')
49
- .action(async () => {
50
- await list();
51
- });
52
-
53
- // Sync command
54
- program
55
- .command('sync [library]')
56
- .description('Re-crawl and sync a library\'s documentation')
57
- .option('--all', 'Sync all indexed libraries')
58
- .option('-m, --max-pages <number>', 'Maximum pages to crawl', (v) => parseInt(v, 10))
59
- .action(async (library: string | undefined, options) => {
60
- await sync(library, options);
61
- });
62
-
63
- // Remove command
64
- program
65
- .command('remove <library>')
66
- .description('Remove a library from the index')
67
- .action(async (library: string) => {
68
- await remove(library);
69
- });
70
-
71
- // Endpoints command
72
- program
73
- .command('endpoints <library>')
74
- .description('List API endpoints from indexed documentation')
75
- .option('--json', 'Output as JSON')
76
- .option('--group-by <type>', 'Group by: resource (default) or method', 'resource')
77
- .option('--filter <method>', 'Filter by HTTP method (GET, POST, PUT, DELETE, etc.)')
78
- .action(async (library: string, options) => {
79
- await endpoints(library, {
80
- json: options.json,
81
- groupBy: options.groupBy as 'resource' | 'method',
82
- filter: options.filter,
83
- });
84
- });
85
-
86
- // Parse and run
87
- program.parse();
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { Command } from "commander";
3
- const program = new Command();
4
- program.name("skill-audio-cleanup-lab").description("Professional audio cleanup recipes").version("0.1.0");
5
- program.command("run", { isDefault: true }).description("Run the skill").allowUnknownOption(true).action(async () => { await import("../src/index.js"); });
6
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-audiobook-chapter-proofer");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-audiobook-chapter-proofer")
15
- .description("Audiobook Chapter Proofer skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { Command } from "commander";
4
- import { homedir } from "os";
5
- import { join } from "path";
6
-
7
- function getDataDir(): string {
8
- return process.env.DATA_DIR || join(homedir(), ".skill", "skill-banner-ad-suite");
9
- }
10
-
11
- const program = new Command();
12
-
13
- program
14
- .name("skill-banner-ad-suite")
15
- .description("Banner Ad Suite skill")
16
- .version("0.1.0");
17
-
18
- program
19
- .command("run")
20
- .description("Run the skill")
21
- .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
- .allowUnknownOption(true)
23
- .action(async (options, command) => {
24
- try {
25
- const args = command.args;
26
- process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
- await import("../src/index.js");
28
- } catch (err) {
29
- console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
- process.exit(1);
31
- }
32
- });
33
-
34
- program.parse();