@hasna/skills 0.1.21 → 0.1.23

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 (270) hide show
  1. package/bin/index.js +341 -287
  2. package/bin/mcp.js +297 -245
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +79 -24
  5. package/dist/lib/basic-skills.test.d.ts +1 -0
  6. package/dist/lib/registry.d.ts +5 -0
  7. package/dist/lib/search.d.ts +2 -2
  8. package/package.json +1 -1
  9. package/skills/skill-academic-journal-matcher/package.json +1 -7
  10. package/skills/skill-action-item-router/package.json +1 -7
  11. package/skills/skill-ad-creative-generator/package.json +1 -7
  12. package/skills/skill-advanced-math/package.json +1 -7
  13. package/skills/skill-anomaly-investigator/package.json +1 -7
  14. package/skills/skill-api-test-suite/package.json +1 -7
  15. package/skills/skill-apidocs/package.json +0 -6
  16. package/skills/skill-audio/SKILL.md +3 -1
  17. package/skills/skill-audio/package.json +0 -5
  18. package/skills/skill-audio/src/index-local.ts +4 -1
  19. package/skills/skill-audio/src/providers/minimax.ts +83 -0
  20. package/skills/skill-audio/src/types.ts +1 -1
  21. package/skills/skill-audio-cleanup-lab/package.json +1 -5
  22. package/skills/{skill-extract-audio → skill-audio-extract}/SKILL.md +3 -3
  23. package/skills/{skill-extract-audio → skill-audio-extract}/package.json +3 -7
  24. package/skills/skill-audiobook-chapter-proofer/package.json +1 -7
  25. package/skills/skill-banner-ad-suite/package.json +1 -7
  26. package/skills/skill-benchmark-finder/package.json +1 -7
  27. package/skills/skill-bio-sequence-tool/package.json +1 -7
  28. package/skills/skill-blog-topic-cluster/package.json +1 -7
  29. package/skills/skill-brand-voice-audit/package.json +1 -7
  30. package/skills/skill-browse/package.json +0 -5
  31. package/skills/skill-businessactivity/package.json +1 -3
  32. package/skills/skill-calendar-events/package.json +1 -7
  33. package/skills/skill-campaign-metric-brief/package.json +1 -7
  34. package/skills/skill-campaign-moodboard/package.json +1 -7
  35. package/skills/skill-caption-style-stylist/package.json +1 -7
  36. package/skills/skill-chemistry-calculator/package.json +1 -7
  37. package/skills/skill-churn-risk-notifier/package.json +1 -7
  38. package/skills/skill-citation-formatter/package.json +1 -7
  39. package/skills/skill-classroom-newsletter-kit/package.json +1 -7
  40. package/skills/skill-codefix/package.json +0 -4
  41. package/skills/skill-color-palette-harmonizer/package.json +1 -7
  42. package/skills/skill-colorextract/package.json +17 -5
  43. package/skills/skill-commitpush/package.json +0 -1
  44. package/skills/skill-commitpushpr/package.json +0 -1
  45. package/skills/skill-competitor-ad-analyzer/package.json +1 -7
  46. package/skills/skill-compliance-copy-check/package.json +1 -7
  47. package/skills/skill-compliance-report-pack/package.json +1 -7
  48. package/skills/skill-compress-video/package.json +1 -5
  49. package/skills/skill-consolelog/package.json +1 -7
  50. package/skills/skill-contract-plainlanguage/package.json +1 -7
  51. package/skills/skill-convert/SKILL.md +7 -0
  52. package/skills/skill-convert/package.json +0 -4
  53. package/skills/skill-copytone-translator/package.json +1 -7
  54. package/skills/skill-create-blog-article/package.json +1 -7
  55. package/skills/skill-create-ebook/package.json +1 -7
  56. package/skills/skill-crm-note-enhancer/package.json +1 -7
  57. package/skills/skill-customer-journey-mapper/package.json +1 -7
  58. package/skills/skill-dashboard-builder/package.json +1 -7
  59. package/skills/skill-dashboard-narrator/package.json +1 -7
  60. package/skills/skill-data-anonymizer/package.json +1 -7
  61. package/skills/skill-database-explorer/package.json +1 -7
  62. package/skills/skill-dataset-health-check/package.json +1 -7
  63. package/skills/skill-decision-journal/package.json +1 -7
  64. package/skills/skill-deepresearch/package.json +0 -5
  65. package/skills/skill-delegation-brief-writer/package.json +1 -7
  66. package/skills/skill-deploy/package.json +0 -4
  67. package/skills/skill-destination-briefing/package.json +1 -7
  68. package/skills/skill-diff-viewer/package.json +1 -7
  69. package/skills/{skill-generate-docx → skill-doc-generate}/SKILL.md +2 -2
  70. package/skills/{skill-generate-pdf → skill-doc-generate}/package.json +9 -4
  71. package/skills/{skill-generate-docx → skill-doc-generate}/src/index.ts +91 -28
  72. package/skills/skill-doc-read/SKILL.md +45 -0
  73. package/skills/skill-doc-read/package.json +29 -0
  74. package/skills/skill-doc-read/src/index.ts +324 -0
  75. package/skills/skill-doc-read/tsconfig.json +8 -0
  76. package/skills/skill-domainpurchase/package.json +1 -7
  77. package/skills/skill-domainsearch/package.json +1 -7
  78. package/skills/skill-e2bswarm/package.json +0 -6
  79. package/skills/skill-educational-resource-finder/package.json +1 -7
  80. package/skills/skill-email-campaign/package.json +1 -7
  81. package/skills/skill-emoji/package.json +0 -1
  82. package/skills/skill-exam-readiness-check/package.json +1 -7
  83. package/skills/skill-excel/SKILL.md +38 -0
  84. package/skills/skill-excel/package.json +30 -0
  85. package/skills/{skill-generate-excel → skill-excel}/src/index.ts +41 -14
  86. package/skills/skill-experiment-power-calculator/package.json +1 -7
  87. package/skills/skill-extract/package.json +0 -5
  88. package/skills/skill-extract-frames/package.json +1 -7
  89. package/skills/skill-extract-invoice/package.json +1 -7
  90. package/skills/skill-family-activity-curator/package.json +1 -7
  91. package/skills/skill-faq-packager/package.json +1 -7
  92. package/skills/skill-feedback-survey-designer/package.json +1 -7
  93. package/skills/skill-field-trip-planner/package.json +1 -7
  94. package/skills/skill-file-organizer/package.json +1 -7
  95. package/skills/skill-folder-tree/package.json +1 -7
  96. package/skills/skill-forecast-scenario-lab/package.json +1 -7
  97. package/skills/skill-form-filler/package.json +1 -7
  98. package/skills/skill-generate-api-client/package.json +1 -7
  99. package/skills/skill-generate-book-cover/package.json +1 -7
  100. package/skills/skill-generate-chart/package.json +1 -7
  101. package/skills/skill-generate-diagram/package.json +1 -7
  102. package/skills/skill-generate-dockerfile/package.json +1 -7
  103. package/skills/skill-generate-documentation/package.json +1 -7
  104. package/skills/skill-generate-env/package.json +1 -7
  105. package/skills/skill-generate-favicon/package.json +1 -7
  106. package/skills/skill-generate-mock-data/package.json +1 -7
  107. package/skills/skill-generate-pr-description/package.json +1 -7
  108. package/skills/skill-generate-presentation/package.json +1 -7
  109. package/skills/skill-generate-qrcode/package.json +1 -7
  110. package/skills/skill-generate-regex/package.json +1 -7
  111. package/skills/skill-generate-resume/package.json +1 -7
  112. package/skills/skill-generate-sitemap/package.json +1 -7
  113. package/skills/skill-generate-social-posts/package.json +1 -7
  114. package/skills/skill-generate-sql/package.json +1 -7
  115. package/skills/skill-gif-maker/package.json +1 -7
  116. package/skills/skill-github-manager/package.json +1 -7
  117. package/skills/skill-gmail/package.json +1 -7
  118. package/skills/skill-goal-quarterly-roadmap/package.json +1 -7
  119. package/skills/skill-grant-application-drafter/package.json +1 -7
  120. package/skills/skill-grocery-basket-optimizer/package.json +1 -7
  121. package/skills/skill-guest-communication-suite/package.json +1 -7
  122. package/skills/skill-habit-reflection-digest/package.json +1 -7
  123. package/skills/skill-highlight-reel-generator/package.json +1 -7
  124. package/skills/skill-homework-feedback-coach/package.json +1 -7
  125. package/skills/skill-hook/package.json +0 -6
  126. package/skills/skill-household-maintenance-mgr/package.json +1 -7
  127. package/skills/skill-http-server/package.json +1 -7
  128. package/skills/skill-image/SKILL.md +2 -0
  129. package/skills/skill-image/package.json +0 -5
  130. package/skills/skill-image/src/index-local.ts +5 -3
  131. package/skills/skill-image/src/providers/minimax.ts +94 -0
  132. package/skills/skill-image/src/types.ts +1 -1
  133. package/skills/skill-implementation/package.json +0 -6
  134. package/skills/skill-implementation-agent/package.json +1 -7
  135. package/skills/skill-implementation-plan/package.json +1 -7
  136. package/skills/skill-implementation-todo/package.json +1 -7
  137. package/skills/skill-inbox-priority-planner/package.json +1 -7
  138. package/skills/skill-invoice-dispute-helper/package.json +1 -7
  139. package/skills/skill-itinerary-architect/package.json +1 -7
  140. package/skills/skill-kpi-digest-generator/package.json +1 -7
  141. package/skills/skill-lab-notebook-formatter/package.json +1 -7
  142. package/skills/skill-landing-page-copy/package.json +1 -7
  143. package/skills/skill-latex-table-generator/package.json +1 -7
  144. package/skills/skill-learning-style-profiler/package.json +1 -7
  145. package/skills/skill-lesson-plan-customizer/package.json +1 -7
  146. package/skills/skill-livestream-runofshow/package.json +1 -7
  147. package/skills/skill-longform-structurer/package.json +1 -7
  148. package/skills/skill-lorem-generator/package.json +1 -7
  149. package/skills/skill-managehook/package.json +1 -3
  150. package/skills/skill-managemcp/package.json +1 -3
  151. package/skills/skill-manageskill/package.json +1 -3
  152. package/skills/skill-markdown-validator/package.json +1 -7
  153. package/skills/skill-mcp-builder/package.json +1 -7
  154. package/skills/skill-meal-plan-designer/package.json +1 -7
  155. package/skills/skill-meeting-insight-summarizer/package.json +1 -7
  156. package/skills/skill-merge-pdfs/package.json +1 -7
  157. package/skills/skill-microcopy-generator/package.json +1 -7
  158. package/skills/skill-mindfulness-prompt-cache/package.json +1 -7
  159. package/skills/skill-monitor/package.json +0 -1
  160. package/skills/skill-music/CLAUDE.md +9 -0
  161. package/skills/skill-music/SKILL.md +35 -0
  162. package/skills/{skill-generate-excel → skill-music}/package.json +4 -10
  163. package/skills/skill-music/src/index.ts +192 -0
  164. package/skills/skill-notion-manager/package.json +1 -7
  165. package/skills/skill-npmpublish/package.json +0 -5
  166. package/skills/skill-onboarding-sequence-builder/package.json +1 -7
  167. package/skills/skill-onsite-ops-checklist/package.json +1 -7
  168. package/skills/skill-outreach-cadence-designer/package.json +1 -7
  169. package/skills/skill-packaging-concept-studio/package.json +1 -7
  170. package/skills/skill-packing-plan-pro/package.json +1 -7
  171. package/skills/skill-parent-teacher-brief/package.json +1 -7
  172. package/skills/skill-partner-kit-assembler/package.json +1 -7
  173. package/skills/skill-payroll-change-prepper/package.json +1 -7
  174. package/skills/{skill-generate-pdf → skill-pdf-generate}/SKILL.md +2 -2
  175. package/skills/{skill-generate-docx → skill-pdf-generate}/package.json +6 -4
  176. package/skills/{skill-generate-pdf → skill-pdf-generate}/src/index.ts +109 -8
  177. package/skills/skill-pdf-read/SKILL.md +56 -0
  178. package/skills/skill-pdf-read/package.json +29 -0
  179. package/skills/skill-pdf-read/src/index.ts +320 -0
  180. package/skills/skill-pdf-read/tsconfig.json +8 -0
  181. package/skills/skill-persona-based-adwriter/package.json +1 -7
  182. package/skills/skill-persona-generator/package.json +1 -7
  183. package/skills/skill-personal-daily-ops/package.json +1 -7
  184. package/skills/skill-pet-care-scheduler/package.json +1 -7
  185. package/skills/skill-podcast-show-notes/package.json +1 -7
  186. package/skills/skill-presentation-theme-maker/package.json +1 -7
  187. package/skills/skill-press-release-drafter/package.json +1 -7
  188. package/skills/skill-print-collateral-designer/package.json +1 -7
  189. package/skills/skill-procurement-scorecard/package.json +1 -7
  190. package/skills/skill-product-demo-script/package.json +1 -7
  191. package/skills/skill-product-mockup/package.json +1 -7
  192. package/skills/skill-project-retro-companion/package.json +1 -7
  193. package/skills/skill-proposal-redline-advisor/package.json +1 -7
  194. package/skills/skill-read-csv/SKILL.md +1 -1
  195. package/skills/skill-read-csv/package.json +0 -1
  196. package/skills/skill-read-csv/src/index.ts +30 -5
  197. package/skills/skill-read-excel/SKILL.md +1 -1
  198. package/skills/skill-read-excel/package.json +0 -1
  199. package/skills/skill-read-excel/src/index.ts +21 -8
  200. package/skills/skill-read-image/SKILL.md +1 -1
  201. package/skills/skill-read-image/package.json +0 -1
  202. package/skills/skill-read-pdf/SKILL.md +1 -1
  203. package/skills/skill-read-pdf/package.json +0 -1
  204. package/skills/skill-read-pdf/src/index.ts +15 -3
  205. package/skills/skill-regex-tester/package.json +1 -7
  206. package/skills/skill-remove-background/package.json +1 -7
  207. package/skills/skill-risk-disclosure-kit/package.json +1 -7
  208. package/skills/skill-roi-comparison-tool/package.json +1 -7
  209. package/skills/skill-sales-call-recapper/package.json +1 -7
  210. package/skills/skill-scaffold-project/package.json +1 -7
  211. package/skills/skill-scancommitpr/package.json +0 -2
  212. package/skills/skill-scancommitpush/package.json +0 -2
  213. package/skills/skill-scholarship-tracker/package.json +1 -7
  214. package/skills/skill-scientific-figure-check/package.json +1 -7
  215. package/skills/skill-seating-chart-maker/package.json +1 -7
  216. package/skills/skill-security-audit/package.json +1 -7
  217. package/skills/skill-seo-brief-builder/package.json +1 -7
  218. package/skills/skill-siteanalyze/package.json +19 -5
  219. package/skills/skill-slack-assistant/package.json +1 -7
  220. package/skills/skill-sleep-routine-analyzer/package.json +1 -7
  221. package/skills/skill-sms/package.json +0 -1
  222. package/skills/skill-social-media-kit/package.json +1 -7
  223. package/skills/skill-sound-effects/SKILL.md +34 -0
  224. package/skills/{skill-jingle-composer → skill-sound-effects}/package.json +4 -10
  225. package/skills/skill-sound-effects/src/index.ts +172 -0
  226. package/skills/skill-sound-effects/tsconfig.json +8 -0
  227. package/skills/skill-split-pdf/package.json +1 -7
  228. package/skills/skill-sponsorship-proposal-lab/package.json +1 -7
  229. package/skills/skill-spreadsheet-cleanroom/package.json +1 -7
  230. package/skills/skill-statistical-test-selector/package.json +1 -7
  231. package/skills/skill-stress-relief-playbook/package.json +1 -7
  232. package/skills/skill-study-guide-builder/package.json +1 -7
  233. package/skills/skill-subscription-spend-watcher/package.json +1 -7
  234. package/skills/skill-subtitle/package.json +0 -6
  235. package/skills/skill-survey-insight-extractor/package.json +1 -7
  236. package/skills/skill-terraform-generator/package.json +1 -7
  237. package/skills/skill-testimonial-graphics/package.json +1 -7
  238. package/skills/skill-timesheet/package.json +0 -6
  239. package/skills/skill-tmux-session/package.json +0 -1
  240. package/skills/skill-transcript/SKILL.md +3 -1
  241. package/skills/skill-transcript/package.json +0 -5
  242. package/skills/skill-travel-budget-balancer/package.json +1 -7
  243. package/skills/skill-validate-config/package.json +1 -7
  244. package/skills/skill-video/SKILL.md +3 -1
  245. package/skills/skill-video/package.json +0 -5
  246. package/skills/skill-video/src/providers/index.ts +4 -1
  247. package/skills/skill-video/src/providers/minimax.ts +100 -0
  248. package/skills/skill-video/src/types.ts +1 -1
  249. package/skills/skill-video-cut-suggester/package.json +1 -7
  250. package/skills/skill-video-downloader/package.json +1 -7
  251. package/skills/skill-video-thumbnail/package.json +1 -7
  252. package/skills/skill-voiceover-casting-assistant/package.json +1 -7
  253. package/skills/skill-watermark/package.json +1 -7
  254. package/skills/skill-webcrawling/package.json +11 -8
  255. package/skills/skill-webinar-script-coach/package.json +1 -7
  256. package/skills/skill-wellness-progress-reporter/package.json +1 -7
  257. package/skills/skill-workout-cycle-planner/package.json +1 -7
  258. package/skills/skill-write/package.json +0 -5
  259. package/skills/skill-jingle-composer/CLAUDE.md +0 -19
  260. package/skills/skill-jingle-composer/src/index.ts +0 -250
  261. /package/skills/{skill-extract-audio → skill-audio-extract}/CLAUDE.md +0 -0
  262. /package/skills/{skill-extract-audio → skill-audio-extract}/src/index.ts +0 -0
  263. /package/skills/{skill-extract-audio → skill-audio-extract}/tsconfig.json +0 -0
  264. /package/skills/{skill-generate-docx → skill-doc-generate}/CLAUDE.md +0 -0
  265. /package/skills/{skill-generate-docx → skill-doc-generate}/tsconfig.json +0 -0
  266. /package/skills/{skill-generate-excel → skill-excel}/CLAUDE.md +0 -0
  267. /package/skills/{skill-generate-excel → skill-excel}/tsconfig.json +0 -0
  268. /package/skills/{skill-jingle-composer → skill-music}/tsconfig.json +0 -0
  269. /package/skills/{skill-generate-pdf → skill-pdf-generate}/CLAUDE.md +0 -0
  270. /package/skills/{skill-generate-pdf → skill-pdf-generate}/tsconfig.json +0 -0
@@ -1,250 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * skill-jingle-composer
4
- * Generates jingle composition briefs using OpenAI.
5
- */
6
-
7
- import { parseArgs } from "util";
8
- import { existsSync, mkdirSync, appendFileSync } from "fs";
9
- import { join, dirname } from "path";
10
-
11
- type OutputFormat = "markdown" | "json";
12
-
13
- interface SkillOptions {
14
- brief: string;
15
- tone?: string;
16
- tempo?: string;
17
- length: number;
18
- instruments?: string;
19
- format: OutputFormat;
20
- model: string;
21
- output?: string;
22
- }
23
-
24
- interface OpenAIChatResponse {
25
- choices?: Array<{
26
- message?: {
27
- content?: string | null;
28
- };
29
- }>;
30
- error?: {
31
- message?: string;
32
- };
33
- }
34
-
35
- const SKILL_SLUG = "jingle-composer";
36
-
37
- function ensureDir(path: string) {
38
- if (!existsSync(path)) {
39
- mkdirSync(path, { recursive: true });
40
- }
41
- }
42
-
43
- function getPaths() {
44
- const sessionStamp = new Date().toISOString().replace(/[:.]/g, "_").replace(/-/g, "_");
45
- const exportsRoot = process.env.SKILLS_EXPORTS_DIR || join(process.cwd(), ".skills", "exports");
46
- const logsRoot = process.env.SKILLS_LOGS_DIR || join(process.cwd(), ".skills", "logs");
47
-
48
- const skillExportsDir = join(exportsRoot, SKILL_SLUG);
49
- const skillLogsDir = join(logsRoot, SKILL_SLUG);
50
-
51
- ensureDir(skillExportsDir);
52
- ensureDir(skillLogsDir);
53
-
54
- return {
55
- sessionStamp,
56
- skillExportsDir,
57
- skillLogsDir,
58
- };
59
- }
60
-
61
- function createLogger(logDir: string, sessionStamp: string) {
62
- const logFile = join(logDir, `log_${sessionStamp}.txt`);
63
-
64
- function write(level: "info" | "success" | "error", message: string) {
65
- const timestamp = new Date().toISOString();
66
- const entry = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
67
- appendFileSync(logFile, entry);
68
- const prefix = level === "success" ? "✅" : level === "error" ? "❌" : "ℹ️";
69
- console.log(`${prefix} ${message}`);
70
- }
71
-
72
- return {
73
- info: (message: string) => write("info", message),
74
- success: (message: string) => write("success", message),
75
- error: (message: string) => write("error", message),
76
- logFile,
77
- };
78
- }
79
-
80
- function slugify(value: string): string {
81
- return value
82
- .toLowerCase()
83
- .replace(/[^a-z0-9]+/g, "-")
84
- .replace(/^-+|-+$/g, "")
85
- .slice(0, 40) || "jingle";
86
- }
87
-
88
- function parseOptions(): SkillOptions {
89
- const { values, positionals } = parseArgs({
90
- args: Bun.argv.slice(2),
91
- options: {
92
- brief: { type: "string" },
93
- tone: { type: "string" },
94
- tempo: { type: "string" },
95
- length: { type: "string" },
96
- instruments: { type: "string" },
97
- format: { type: "string", default: "markdown" },
98
- model: { type: "string", default: "gpt-4o-mini" },
99
- output: { type: "string" },
100
- },
101
- allowPositionals: true,
102
- });
103
-
104
- const brief = values.brief || positionals.join(" ").trim();
105
- if (!brief) {
106
- throw new Error("Provide a campaign brief via positional text or --brief.");
107
- }
108
-
109
- const length = values.length ? parseInt(values.length, 10) : 20;
110
- if (Number.isNaN(length) || length < 5) {
111
- throw new Error("--length must be an integer >= 5 seconds.");
112
- }
113
-
114
- const format: OutputFormat =
115
- values.format === "json" ? "json" : values.format === "markdown" ? "markdown" : "markdown";
116
-
117
- return {
118
- brief,
119
- tone: values.tone,
120
- tempo: values.tempo,
121
- length,
122
- instruments: values.instruments,
123
- format,
124
- model: values.model,
125
- output: values.output,
126
- };
127
- }
128
-
129
- function buildPrompt(options: SkillOptions) {
130
- const system = `You are a music director and jingle composer.
131
- Create a composition brief that includes:
132
- - Concept overview and storytelling (tied to brief).
133
- - Musical direction: key, tempo (${options.tempo || "110 BPM"}), rhythm feel, genre influences (${options.tone || "upbeat, friendly"}).
134
- - Chord progression suggestions and melodic motifs for intro, verse, tagline/hook.
135
- - Lyric ideas referencing product benefits (verse + hook) with optional alternatives.
136
- - Instrumentation plan featuring ${options.instruments || "guitar, bass, drums, synth"}.
137
- - Production notes (mix, FX, transitions, stingers).
138
- - Delivery guidance for ${options.length}-second edit, including 5s/15s cutdown tips.
139
- - AI music model prompts or human composer briefing summary.`;
140
-
141
- const instructions =
142
- options.format === "json"
143
- ? "Respond in JSON with keys: overview, musical_direction, chord_progressions, lyrics, instrumentation, production, delivery, prompts. Musical direction should include key, tempo, groove, style."
144
- : "Respond in polished Markdown. Start with an executive summary blockquote, use tables for chord progressions and instrumentation, bullet lists for lyrics and production notes.";
145
-
146
- const userPayload = {
147
- campaign_brief: options.brief,
148
- tone: options.tone,
149
- tempo: options.tempo,
150
- length_seconds: options.length,
151
- instruments: options.instruments,
152
- format: options.format,
153
- };
154
-
155
- const user = `${instructions}\n\n${JSON.stringify(userPayload, null, 2)}`;
156
-
157
- return { system, user };
158
- }
159
-
160
- async function callOpenAI(options: SkillOptions, system: string, user: string): Promise<string> {
161
- const apiKey = process.env.OPENAI_API_KEY;
162
-
163
- if (!apiKey) {
164
- throw new Error("OPENAI_API_KEY environment variable is required.");
165
- }
166
-
167
- const body = {
168
- model: options.model,
169
- messages: [
170
- { role: "system", content: system },
171
- { role: "user", content: user },
172
- ],
173
- temperature: 0.62,
174
- max_tokens: options.format === "json" ? 2400 : 2100,
175
- };
176
-
177
- const response = await fetch("https://api.openai.com/v1/chat/completions", {
178
- method: "POST",
179
- headers: {
180
- "Content-Type": "application/json",
181
- Authorization: `Bearer ${apiKey}`,
182
- },
183
- body: JSON.stringify(body),
184
- });
185
-
186
- const data: OpenAIChatResponse = await response.json();
187
-
188
- if (!response.ok) {
189
- throw new Error(data.error?.message || `OpenAI API error (${response.status})`);
190
- const content = data.choices?.[0]?.message?.content;
191
-
192
- if (!content) {
193
- throw new Error("OpenAI response did not include content.");
194
- }
195
-
196
- return content.trim();
197
- }
198
-
199
- async function writeExport(path: string, content: string) {
200
- ensureDir(dirname(path));
201
- await Bun.write(path, content);
202
- }
203
-
204
- async function run() {
205
- const options = parseOptions();
206
- const { sessionStamp, skillExportsDir, skillLogsDir } = getPaths();
207
- const logger = createLogger(skillLogsDir, sessionStamp);
208
-
209
- try {
210
- logger.info("Composing jingle brief.");
211
- logger.info(`Format: ${options.format.toUpperCase()}, Model: ${options.model}`);
212
-
213
- const { system, user } = buildPrompt(options);
214
- const content = await callOpenAI(options, system, user);
215
-
216
- const slugBase = options.brief.split(/\s+/).slice(0, 4).join("-");
217
- const briefSlug = slugify(slugBase);
218
- const extension = options.format === "json" ? "json" : "md";
219
- const defaultPath = join(skillExportsDir, `jingle-brief-${briefSlug}-${sessionStamp}.${extension}`);
220
- const targetPath = options.output ? options.output : defaultPath;
221
-
222
- let finalContent = content;
223
-
224
- if (options.format === "json") {
225
- try {
226
- finalContent = JSON.stringify(JSON.parse(content), null, 2);
227
- } catch {
228
- logger.error("Model response was not valid JSON. Wrapping raw response.");
229
- finalContent = JSON.stringify({ raw: content }, null, 2);
230
- }
231
- }
232
-
233
- await writeExport(targetPath, finalContent);
234
-
235
- logger.success("Jingle composition brief generated successfully.");
236
- console.log("\n=== Jingle Brief Preview ===\n");
237
- console.log(finalContent.slice(0, 1500));
238
- if (finalContent.length > 1500) {
239
- console.log("\n… (truncated)");
240
- }
241
- console.log(`\nExport saved to: ${targetPath}`);
242
- console.log(`Logs written to: ${skillLogsDir}`);
243
- } catch (error) {
244
- const message = error instanceof Error ? error.message : String(error);
245
- logger.error(message);
246
- process.exit(1);
247
- }
248
- }
249
-
250
- run();