superskills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/bin/superskills +6 -0
  4. package/dist/catalog/index.d.ts +11 -0
  5. package/dist/catalog/index.d.ts.map +1 -0
  6. package/dist/catalog/index.js +203 -0
  7. package/dist/catalog/index.js.map +1 -0
  8. package/dist/catalog/tools-catalog.json +243 -0
  9. package/dist/catalog/types.d.ts +59 -0
  10. package/dist/catalog/types.d.ts.map +1 -0
  11. package/dist/catalog/types.js +2 -0
  12. package/dist/catalog/types.js.map +1 -0
  13. package/dist/catalog/ui.d.ts +4 -0
  14. package/dist/catalog/ui.d.ts.map +1 -0
  15. package/dist/catalog/ui.js +86 -0
  16. package/dist/catalog/ui.js.map +1 -0
  17. package/dist/cli/colors.d.ts +8 -0
  18. package/dist/cli/colors.d.ts.map +1 -0
  19. package/dist/cli/colors.js +11 -0
  20. package/dist/cli/colors.js.map +1 -0
  21. package/dist/discovery/analyze.d.ts +5 -0
  22. package/dist/discovery/analyze.d.ts.map +1 -0
  23. package/dist/discovery/analyze.js +190 -0
  24. package/dist/discovery/analyze.js.map +1 -0
  25. package/dist/discovery/core.d.ts +16 -0
  26. package/dist/discovery/core.d.ts.map +1 -0
  27. package/dist/discovery/core.js +51 -0
  28. package/dist/discovery/core.js.map +1 -0
  29. package/dist/discovery/index.d.ts +4 -0
  30. package/dist/discovery/index.d.ts.map +1 -0
  31. package/dist/discovery/index.js +233 -0
  32. package/dist/discovery/index.js.map +1 -0
  33. package/dist/discovery/schema.d.ts +111 -0
  34. package/dist/discovery/schema.d.ts.map +1 -0
  35. package/dist/discovery/schema.js +87 -0
  36. package/dist/discovery/schema.js.map +1 -0
  37. package/dist/discovery/types.d.ts +56 -0
  38. package/dist/discovery/types.d.ts.map +1 -0
  39. package/dist/discovery/types.js +2 -0
  40. package/dist/discovery/types.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +523 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/scaffold/index.d.ts +4 -0
  46. package/dist/scaffold/index.d.ts.map +1 -0
  47. package/dist/scaffold/index.js +262 -0
  48. package/dist/scaffold/index.js.map +1 -0
  49. package/dist/scaffold/templates/claude-md.d.ts +4 -0
  50. package/dist/scaffold/templates/claude-md.d.ts.map +1 -0
  51. package/dist/scaffold/templates/claude-md.js +229 -0
  52. package/dist/scaffold/templates/claude-md.js.map +1 -0
  53. package/dist/scaffold/templates/claude-settings.d.ts +3 -0
  54. package/dist/scaffold/templates/claude-settings.d.ts.map +1 -0
  55. package/dist/scaffold/templates/claude-settings.js +48 -0
  56. package/dist/scaffold/templates/claude-settings.js.map +1 -0
  57. package/dist/scaffold/templates/env-example.d.ts +3 -0
  58. package/dist/scaffold/templates/env-example.d.ts.map +1 -0
  59. package/dist/scaffold/templates/env-example.js +103 -0
  60. package/dist/scaffold/templates/env-example.js.map +1 -0
  61. package/dist/scaffold/templates/package-json.d.ts +2 -0
  62. package/dist/scaffold/templates/package-json.d.ts.map +1 -0
  63. package/dist/scaffold/templates/package-json.js +56 -0
  64. package/dist/scaffold/templates/package-json.js.map +1 -0
  65. package/dist/scaffold/templates/project-files.d.ts +4 -0
  66. package/dist/scaffold/templates/project-files.d.ts.map +1 -0
  67. package/dist/scaffold/templates/project-files.js +459 -0
  68. package/dist/scaffold/templates/project-files.js.map +1 -0
  69. package/dist/scaffold/templates/skill-agents.d.ts +4 -0
  70. package/dist/scaffold/templates/skill-agents.d.ts.map +1 -0
  71. package/dist/scaffold/templates/skill-agents.js +68 -0
  72. package/dist/scaffold/templates/skill-agents.js.map +1 -0
  73. package/dist/scaffold/templates/skill-commands.d.ts +3 -0
  74. package/dist/scaffold/templates/skill-commands.d.ts.map +1 -0
  75. package/dist/scaffold/templates/skill-commands.js +509 -0
  76. package/dist/scaffold/templates/skill-commands.js.map +1 -0
  77. package/dist/scaffold/templates/teammate-prompts.d.ts +8 -0
  78. package/dist/scaffold/templates/teammate-prompts.d.ts.map +1 -0
  79. package/dist/scaffold/templates/teammate-prompts.js +506 -0
  80. package/dist/scaffold/templates/teammate-prompts.js.map +1 -0
  81. package/dist/scaffold/types.d.ts +68 -0
  82. package/dist/scaffold/types.d.ts.map +1 -0
  83. package/dist/scaffold/types.js +2 -0
  84. package/dist/scaffold/types.js.map +1 -0
  85. package/dist/scaffold/ui.d.ts +5 -0
  86. package/dist/scaffold/ui.d.ts.map +1 -0
  87. package/dist/scaffold/ui.js +127 -0
  88. package/dist/scaffold/ui.js.map +1 -0
  89. package/dist/utils/logger.d.ts +3 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +8 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/package.json +69 -0
@@ -0,0 +1,243 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "categories": {
4
+ "core": "Always included in every project",
5
+ "delivery": "Push intelligence TO the user",
6
+ "enrichment": "Get external data",
7
+ "community": "Free channels with official APIs",
8
+ "testing": "Verify behavior and quality"
9
+ },
10
+ "tools": [
11
+ {
12
+ "id": "supabase",
13
+ "name": "Supabase",
14
+ "category": "core",
15
+ "description": "PostgreSQL + Auth + Storage + pgvector + Edge Functions",
16
+ "sdk": "@supabase/supabase-js",
17
+ "envVars": ["SUPABASE_URL", "SUPABASE_ANON_KEY", "SUPABASE_SERVICE_ROLE_KEY"],
18
+ "gdpr": {
19
+ "compliant": true,
20
+ "dpaAvailable": true,
21
+ "dataLocation": "EU (Frankfurt)"
22
+ },
23
+ "provides": ["database", "auth", "storage", "vectors", "edge-functions"]
24
+ },
25
+ {
26
+ "id": "vercel",
27
+ "name": "Vercel",
28
+ "category": "core",
29
+ "description": "Hosting + Edge + Preview deployments",
30
+ "sdk": null,
31
+ "envVars": ["VERCEL_URL"],
32
+ "gdpr": {
33
+ "compliant": true,
34
+ "dpaAvailable": true,
35
+ "dataLocation": "Global (configurable)"
36
+ },
37
+ "provides": ["hosting", "edge", "preview"]
38
+ },
39
+ {
40
+ "id": "inngest",
41
+ "name": "Inngest",
42
+ "category": "core",
43
+ "description": "Workflow engine + Cron + Retry + Step functions",
44
+ "sdk": "inngest",
45
+ "envVars": ["INNGEST_EVENT_KEY", "INNGEST_SIGNING_KEY"],
46
+ "gdpr": {
47
+ "compliant": true,
48
+ "dpaAvailable": true,
49
+ "dataLocation": "US (EU available)"
50
+ },
51
+ "provides": ["cron", "workflows", "retry", "events"]
52
+ },
53
+ {
54
+ "id": "claude",
55
+ "name": "Claude",
56
+ "category": "core",
57
+ "description": "LLM for intelligence layer",
58
+ "sdk": "@anthropic-ai/sdk",
59
+ "envVars": ["ANTHROPIC_API_KEY"],
60
+ "gdpr": {
61
+ "compliant": true,
62
+ "dpaAvailable": true,
63
+ "dataLocation": "US"
64
+ },
65
+ "provides": ["llm", "reasoning", "generation"]
66
+ },
67
+ {
68
+ "id": "openai",
69
+ "name": "OpenAI",
70
+ "category": "core",
71
+ "description": "Embeddings for vector search",
72
+ "sdk": "openai",
73
+ "envVars": ["OPENAI_API_KEY"],
74
+ "gdpr": {
75
+ "compliant": true,
76
+ "dpaAvailable": true,
77
+ "dataLocation": "US"
78
+ },
79
+ "provides": ["embeddings"],
80
+ "note": "Use text-embedding-3-small for cost efficiency"
81
+ },
82
+ {
83
+ "id": "brevo",
84
+ "name": "Brevo",
85
+ "category": "delivery",
86
+ "description": "Email + SMS + WhatsApp Business (official)",
87
+ "sdk": "@getbrevo/brevo",
88
+ "envVars": ["BREVO_API_KEY"],
89
+ "gdpr": {
90
+ "compliant": true,
91
+ "dpaAvailable": true,
92
+ "dataLocation": "EU"
93
+ },
94
+ "provides": ["email", "sms", "whatsapp"],
95
+ "channels": ["email", "sms", "whatsapp"],
96
+ "note": "Official WhatsApp Business API, EU-based"
97
+ },
98
+ {
99
+ "id": "telegram",
100
+ "name": "Telegram Bot API",
101
+ "category": "community",
102
+ "description": "Telegram bot for push notifications",
103
+ "sdk": "grammy",
104
+ "envVars": ["TELEGRAM_BOT_TOKEN"],
105
+ "gdpr": {
106
+ "compliant": true,
107
+ "dpaAvailable": false,
108
+ "dataLocation": "Global"
109
+ },
110
+ "provides": ["telegram"],
111
+ "channels": ["telegram"],
112
+ "note": "Official API, free, zero ban risk"
113
+ },
114
+ {
115
+ "id": "slack",
116
+ "name": "Slack",
117
+ "category": "community",
118
+ "description": "Slack bot/webhooks for team notifications",
119
+ "sdk": "@slack/bolt",
120
+ "envVars": ["SLACK_BOT_TOKEN", "SLACK_SIGNING_SECRET"],
121
+ "gdpr": {
122
+ "compliant": true,
123
+ "dpaAvailable": true,
124
+ "dataLocation": "US (EU available)"
125
+ },
126
+ "provides": ["slack"],
127
+ "channels": ["slack"],
128
+ "note": "Official API, free tier available"
129
+ },
130
+ {
131
+ "id": "discord",
132
+ "name": "Discord",
133
+ "category": "community",
134
+ "description": "Discord bot for community notifications",
135
+ "sdk": "discord.js",
136
+ "envVars": ["DISCORD_BOT_TOKEN"],
137
+ "gdpr": {
138
+ "compliant": true,
139
+ "dpaAvailable": true,
140
+ "dataLocation": "US"
141
+ },
142
+ "provides": ["discord"],
143
+ "channels": ["discord"],
144
+ "note": "Official API, free"
145
+ },
146
+ {
147
+ "id": "baileys",
148
+ "name": "Baileys (WhatsApp)",
149
+ "category": "community",
150
+ "description": "WhatsApp Web protocol (unofficial)",
151
+ "sdk": "@whiskeysockets/baileys",
152
+ "envVars": [],
153
+ "gdpr": {
154
+ "compliant": false,
155
+ "dpaAvailable": false,
156
+ "dataLocation": "Local"
157
+ },
158
+ "provides": ["whatsapp-personal"],
159
+ "channels": ["whatsapp"],
160
+ "note": "Unofficial, free, ban risk. Use for dev/personal only. OpenClaw best practice.",
161
+ "risk": "Account ban possible. Not for production/business use."
162
+ },
163
+ {
164
+ "id": "apify",
165
+ "name": "Apify",
166
+ "category": "enrichment",
167
+ "description": "Web scraping + pre-built actors",
168
+ "sdk": "apify-client",
169
+ "envVars": ["APIFY_API_TOKEN"],
170
+ "gdpr": {
171
+ "compliant": true,
172
+ "dpaAvailable": true,
173
+ "dataLocation": "EU"
174
+ },
175
+ "provides": ["scraping", "crawling"],
176
+ "note": "Handles proxies, captchas, rate limits"
177
+ },
178
+ {
179
+ "id": "supermemory",
180
+ "name": "Supermemory",
181
+ "category": "enrichment",
182
+ "description": "Memory API + RAG + Connectors (Drive, Notion, OneDrive)",
183
+ "sdk": "@supermemory/ai-sdk",
184
+ "envVars": ["SUPERMEMORY_API_KEY"],
185
+ "gdpr": {
186
+ "compliant": true,
187
+ "dpaAvailable": true,
188
+ "dataLocation": "Global (Cloudflare)"
189
+ },
190
+ "provides": ["memory", "rag", "connectors"],
191
+ "note": "Use when you need auto-sync from external sources. Otherwise Supabase + pgvector is enough.",
192
+ "optional": true
193
+ },
194
+ {
195
+ "id": "playwright",
196
+ "name": "Playwright",
197
+ "category": "testing",
198
+ "description": "Browser automation for E2E tests, visual regression, accessibility auditing, and web scraping",
199
+ "sdk": "@playwright/test",
200
+ "envVars": [],
201
+ "gdpr": {
202
+ "compliant": true,
203
+ "dpaAvailable": false,
204
+ "dataLocation": "Local"
205
+ },
206
+ "provides": ["e2e-testing", "visual-regression", "accessibility-audit", "browser-scraping", "enrichment-scraping"],
207
+ "channels": [],
208
+ "note": "Self-hosted, no API costs. Testing and dev scraping. Apify for production scraping at scale with proxy management."
209
+ }
210
+ ],
211
+ "stacks": {
212
+ "minimal": {
213
+ "description": "Simplest AI-native app",
214
+ "tools": ["supabase", "vercel", "claude", "brevo"]
215
+ },
216
+ "standard": {
217
+ "description": "Full AI-native with workflows",
218
+ "tools": ["supabase", "vercel", "inngest", "claude", "openai", "brevo"]
219
+ },
220
+ "multichannel": {
221
+ "description": "Push to all channels",
222
+ "tools": ["supabase", "vercel", "inngest", "claude", "openai", "brevo", "telegram", "slack"]
223
+ }
224
+ },
225
+ "eiidMapping": {
226
+ "enrichment": {
227
+ "description": "Connect data, fill gaps, normalize",
228
+ "tools": ["supabase", "apify", "supermemory", "playwright"]
229
+ },
230
+ "inference": {
231
+ "description": "Patterns, predictions, anomalies",
232
+ "tools": ["claude", "openai", "supabase"]
233
+ },
234
+ "interpretation": {
235
+ "description": "Generate insights from inference results",
236
+ "tools": ["claude"]
237
+ },
238
+ "delivery": {
239
+ "description": "Push insights where users are",
240
+ "tools": ["brevo", "telegram", "slack", "discord", "baileys"]
241
+ }
242
+ }
243
+ }
@@ -0,0 +1,59 @@
1
+ export interface GdprInfo {
2
+ compliant: boolean;
3
+ dpaAvailable: boolean;
4
+ dataLocation: string;
5
+ }
6
+ export interface Tool {
7
+ id: string;
8
+ name: string;
9
+ category: 'core' | 'delivery' | 'community' | 'enrichment' | 'testing';
10
+ description: string;
11
+ sdk: string | null;
12
+ envVars: string[];
13
+ gdpr: GdprInfo;
14
+ provides: string[];
15
+ channels?: string[];
16
+ note?: string;
17
+ risk?: string;
18
+ optional?: boolean;
19
+ }
20
+ export interface ToolsCatalog {
21
+ version: string;
22
+ categories: Record<string, string>;
23
+ tools: Tool[];
24
+ stacks: Record<string, {
25
+ description: string;
26
+ tools: string[];
27
+ }>;
28
+ eiidMapping: {
29
+ enrichment: {
30
+ description: string;
31
+ tools: string[];
32
+ };
33
+ inference: {
34
+ description: string;
35
+ tools: string[];
36
+ };
37
+ interpretation: {
38
+ description: string;
39
+ tools: string[];
40
+ };
41
+ delivery: {
42
+ description: string;
43
+ tools: string[];
44
+ };
45
+ };
46
+ }
47
+ export interface ToolSuggestion {
48
+ tool: Tool;
49
+ reason: string;
50
+ required: boolean;
51
+ }
52
+ export interface SelectionResult {
53
+ core: ToolSuggestion[];
54
+ delivery: ToolSuggestion[];
55
+ enrichment: ToolSuggestion[];
56
+ testing: ToolSuggestion[];
57
+ all: ToolSuggestion[];
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,WAAW,EAAE;QACX,UAAU,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACrD,SAAS,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACpD,cAAc,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACzD,QAAQ,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;KACpD,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,GAAG,EAAE,cAAc,EAAE,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { DiscoveryResult } from '../discovery/types.js';
2
+ import type { SelectionResult } from './types.js';
3
+ export declare function runToolSelection(discoveryResult: DiscoveryResult): Promise<SelectionResult | null>;
4
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/catalog/ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAGlE,wBAAsB,gBAAgB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuDxG"}
@@ -0,0 +1,86 @@
1
+ import * as p from '@clack/prompts';
2
+ import pc from 'picocolors';
3
+ import { selectTools, getEnvVars, getSdkPackages } from './index.js';
4
+ export async function runToolSelection(discoveryResult) {
5
+ p.intro(pc.bgMagenta(pc.black(' Tool Selection ')));
6
+ console.log(pc.dim('\n Selecting tools based on your EIID mapping.\n'));
7
+ const spinner = p.spinner();
8
+ spinner.start('Analyzing requirements...');
9
+ const suggestions = await selectTools(discoveryResult);
10
+ spinner.stop('Analysis complete');
11
+ // Display core tools (always included)
12
+ console.log('');
13
+ p.note(suggestions.core.map(s => `${pc.bold(s.tool.name)}\n${pc.dim(s.tool.description)}\n${pc.dim(`SDK: ${s.tool.sdk || 'N/A'}`)}`).join('\n\n'), 'Core Stack (always included)');
14
+ // Let user confirm/modify delivery tools
15
+ if (suggestions.delivery.length > 0) {
16
+ const deliveryChoices = await confirmDeliveryTools(suggestions.delivery);
17
+ if (!deliveryChoices)
18
+ return null;
19
+ // Update suggestions based on user choices
20
+ suggestions.delivery = suggestions.delivery.filter(s => deliveryChoices.includes(s.tool.id));
21
+ }
22
+ // Let user confirm/modify enrichment tools
23
+ if (suggestions.enrichment.length > 0) {
24
+ const enrichmentChoices = await confirmEnrichmentTools(suggestions.enrichment);
25
+ if (!enrichmentChoices)
26
+ return null;
27
+ suggestions.enrichment = suggestions.enrichment.filter(s => enrichmentChoices.includes(s.tool.id));
28
+ }
29
+ // Update all list
30
+ suggestions.all = [
31
+ ...suggestions.core,
32
+ ...suggestions.delivery,
33
+ ...suggestions.enrichment,
34
+ ...suggestions.testing
35
+ ];
36
+ // Display summary
37
+ displaySummary(suggestions);
38
+ p.outro(pc.green('Tool selection complete.'));
39
+ return suggestions;
40
+ }
41
+ async function confirmDeliveryTools(suggestions) {
42
+ const options = suggestions.map(s => ({
43
+ value: s.tool.id,
44
+ label: s.tool.name,
45
+ hint: s.reason + (s.tool.risk ? ` (${s.tool.risk})` : '')
46
+ }));
47
+ const selected = await p.multiselect({
48
+ message: 'Confirm delivery tools:',
49
+ options,
50
+ initialValues: suggestions.filter(s => s.required).map(s => s.tool.id),
51
+ required: false
52
+ });
53
+ if (p.isCancel(selected)) {
54
+ p.cancel('Cancelled');
55
+ return null;
56
+ }
57
+ return selected;
58
+ }
59
+ async function confirmEnrichmentTools(suggestions) {
60
+ const options = suggestions.map(s => ({
61
+ value: s.tool.id,
62
+ label: s.tool.name,
63
+ hint: s.reason
64
+ }));
65
+ const selected = await p.multiselect({
66
+ message: 'Confirm enrichment tools (optional):',
67
+ options,
68
+ initialValues: [],
69
+ required: false
70
+ });
71
+ if (p.isCancel(selected)) {
72
+ p.cancel('Cancelled');
73
+ return null;
74
+ }
75
+ return selected;
76
+ }
77
+ function displaySummary(result) {
78
+ console.log('');
79
+ const packages = getSdkPackages(result);
80
+ const envVars = getEnvVars(result);
81
+ const toolList = result.all.map(s => `• ${s.tool.name}`).join('\n');
82
+ p.note(pc.bold('Selected Tools:\n') + pc.dim(toolList) + '\n\n' +
83
+ pc.bold('NPM Packages:\n') + pc.dim(packages.join('\n')) + '\n\n' +
84
+ pc.bold('Environment Variables:\n') + pc.dim(envVars.join('\n')), 'Summary');
85
+ }
86
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/catalog/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Brand colors for CLI output
3
+ * PlayNew orange: #ff4d00 = RGB(255, 77, 0)
4
+ */
5
+ export declare const orange: (text: string) => string;
6
+ export declare const orangeLight: (text: string) => string;
7
+ export declare const bgOrange: (text: string) => string;
8
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,WAAyC,CAAC;AAG7E,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,WAA2C,CAAC;AAGpF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,WAAyC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Brand colors for CLI output
3
+ * PlayNew orange: #ff4d00 = RGB(255, 77, 0)
4
+ */
5
+ // ANSI true color escape codes for PlayNew brand orange
6
+ export const orange = (text) => `\x1b[38;2;255;77;0m${text}\x1b[39m`;
7
+ // Lighter orange for secondary elements
8
+ export const orangeLight = (text) => `\x1b[38;2;255;102;32m${text}\x1b[39m`;
9
+ // Background orange with black text
10
+ export const bgOrange = (text) => `\x1b[48;2;255;77;0m${text}\x1b[49m`;
11
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wDAAwD;AACxD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,sBAAsB,IAAI,UAAU,CAAC;AAE7E,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,wBAAwB,IAAI,UAAU,CAAC;AAEpF,oCAAoC;AACpC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,sBAAsB,IAAI,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DiscoveryInput, DiscoveryResult } from './types.js';
2
+ export declare function stripMarkdownFences(text: string): string;
3
+ export declare function analyzeDiscoveryInput(input: DiscoveryInput): Promise<DiscoveryResult>;
4
+ export declare function analyzeRawContent(content: string, contentType: 'text' | 'file', fileName?: string): Promise<DiscoveryResult>;
5
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/discovery/analyze.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+DlE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAyC3F;AA8CD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAsD1B"}
@@ -0,0 +1,190 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import { StrategicAnalysisSchema, EIIDMappingSchema } from './schema.js';
3
+ const ANALYSIS_PROMPT = `Generate strategic analysis for the following project.
4
+
5
+ ANALYSIS FRAMEWORKS:
6
+
7
+ 1. Value Movement (Wardley for mapping, Reshuffle for AI-era value shifts)
8
+ - What's commoditizing in this industry
9
+ - Where value is shifting
10
+ - New coordination possibilities
11
+ - Falling constraints
12
+
13
+ 2. EIID Framework (four layers)
14
+ - Enrichment: existing data, missing data, sources to fill gaps
15
+ - Inference: patterns to detect, predictions to make, anomalies to watch
16
+ - Interpretation: insights to generate from inference results
17
+ - Delivery: channels to reach users, triggers that determine timing
18
+
19
+ 3. AI-Native Architecture (Steinberger principle: intelligence goes where the user is)
20
+ - Push insights to users proactively
21
+ - Deliver where users already are (email, Slack, WhatsApp, Telegram)
22
+ - Dashboard for configuration, not for discovering problems
23
+
24
+ OUTPUT: JSON only, no markdown, no explanation.
25
+
26
+ {
27
+ "strategicAnalysis": {
28
+ "industryContext": "Industry dynamics and trends",
29
+ "valueMovement": "Where value is shifting",
30
+ "currentPosition": "Current position",
31
+ "targetPosition": "Strategic target position",
32
+ "opportunities": ["opportunity 1", "opportunity 2"]
33
+ },
34
+ "eiidMapping": {
35
+ "enrichment": {
36
+ "existingData": ["source 1"],
37
+ "missingData": ["missing 1"],
38
+ "sources": ["where to get it"]
39
+ },
40
+ "inference": {
41
+ "patterns": ["pattern"],
42
+ "predictions": ["prediction"],
43
+ "anomalies": ["anomaly"]
44
+ },
45
+ "interpretation": {
46
+ "insights": ["insight"]
47
+ },
48
+ "delivery": {
49
+ "channels": ["email", "slack"],
50
+ "triggers": ["trigger condition"]
51
+ }
52
+ }
53
+ }
54
+
55
+ STYLE: Direct statements. No "I recommend", no "you should". Facts and analysis only.`;
56
+ const DEFAULT_MODEL = 'claude-opus-4-6';
57
+ function getModel() {
58
+ return process.env.SUPERSKILLS_MODEL || DEFAULT_MODEL;
59
+ }
60
+ export function stripMarkdownFences(text) {
61
+ const match = text.match(/^\s*```(?:json)?\s*\n?([\s\S]*?)\n?\s*```\s*$/);
62
+ return match ? match[1] : text;
63
+ }
64
+ export async function analyzeDiscoveryInput(input) {
65
+ const apiKey = process.env.ANTHROPIC_API_KEY;
66
+ if (!apiKey) {
67
+ throw new Error('ANTHROPIC_API_KEY environment variable required');
68
+ }
69
+ const client = new Anthropic({ apiKey });
70
+ const inputText = formatInputForAnalysis(input);
71
+ const response = await client.messages.create({
72
+ model: getModel(),
73
+ max_tokens: 4096,
74
+ messages: [{
75
+ role: 'user',
76
+ content: `${ANALYSIS_PROMPT}\n\n---\n\nPROJECT INFORMATION:\n\n${inputText}`
77
+ }]
78
+ });
79
+ const textContent = response.content.find(c => c.type === 'text');
80
+ if (!textContent || textContent.type !== 'text') {
81
+ throw new Error('No text response from API');
82
+ }
83
+ const cleaned = stripMarkdownFences(textContent.text);
84
+ let analysis;
85
+ try {
86
+ analysis = JSON.parse(cleaned);
87
+ }
88
+ catch {
89
+ throw new Error(`Failed to parse analysis response: ${cleaned.slice(0, 200)}...`);
90
+ }
91
+ const strategicAnalysis = StrategicAnalysisSchema.parse(analysis.strategicAnalysis);
92
+ const eiidMapping = EIIDMappingSchema.parse(analysis.eiidMapping);
93
+ return {
94
+ ...input,
95
+ strategicAnalysis,
96
+ eiidMapping,
97
+ createdAt: new Date().toISOString()
98
+ };
99
+ }
100
+ function formatInputForAnalysis(input) {
101
+ const lines = [];
102
+ lines.push(`Project: ${input.projectName}`);
103
+ lines.push('');
104
+ lines.push('CONTEXT:');
105
+ if (input.context.forWhom === 'client') {
106
+ lines.push(`Client: ${input.context.companyName || 'Not specified'}`);
107
+ }
108
+ else if (input.context.forWhom === 'my_company') {
109
+ lines.push(`Company: ${input.context.companyName || 'Own company'}`);
110
+ }
111
+ else {
112
+ lines.push('For: Personal/freelance project');
113
+ }
114
+ lines.push(`Business: ${input.context.businessDescription}`);
115
+ if (input.context.industry)
116
+ lines.push(`Industry: ${input.context.industry}`);
117
+ if (input.context.employees)
118
+ lines.push(`Employees: ${input.context.employees}`);
119
+ if (input.context.revenue)
120
+ lines.push(`Revenue: ${input.context.revenue}`);
121
+ if (input.context.yearsInBusiness)
122
+ lines.push(`Years in business: ${input.context.yearsInBusiness}`);
123
+ lines.push('');
124
+ lines.push('PROBLEM:');
125
+ lines.push(input.problem);
126
+ lines.push('');
127
+ lines.push('DESIRED OUTCOME:');
128
+ lines.push(input.desiredOutcome);
129
+ lines.push('');
130
+ lines.push('CURRENT PROCESS:');
131
+ input.currentProcess.forEach((step, i) => {
132
+ lines.push(`${i + 1}. ${step}`);
133
+ });
134
+ lines.push('');
135
+ lines.push('AVAILABLE DATA:');
136
+ input.availableData.forEach(data => {
137
+ lines.push(`- ${data}`);
138
+ });
139
+ return lines.join('\n');
140
+ }
141
+ export async function analyzeRawContent(content, contentType, fileName) {
142
+ const apiKey = process.env.ANTHROPIC_API_KEY;
143
+ if (!apiKey) {
144
+ throw new Error('ANTHROPIC_API_KEY environment variable required');
145
+ }
146
+ const client = new Anthropic({ apiKey });
147
+ const extractPrompt = `Extract project information from this ${contentType === 'file' ? `file (${fileName})` : 'text'}.
148
+
149
+ Return a JSON object with these fields (infer what you can, leave empty string if not found):
150
+
151
+ {
152
+ "projectName": "suggested project name based on content",
153
+ "context": {
154
+ "forWhom": "me" | "my_company" | "client",
155
+ "companyName": "company name if mentioned",
156
+ "businessDescription": "what the business does",
157
+ "industry": "industry/sector",
158
+ "employees": "number if mentioned",
159
+ "revenue": "revenue if mentioned",
160
+ "yearsInBusiness": "years if mentioned"
161
+ },
162
+ "problem": "the problem being solved",
163
+ "desiredOutcome": "what success looks like",
164
+ "currentProcess": ["step 1", "step 2", "..."],
165
+ "availableData": ["data source 1", "..."]
166
+ }
167
+
168
+ Content to analyze:
169
+
170
+ ${content}`;
171
+ const extractResponse = await client.messages.create({
172
+ model: getModel(),
173
+ max_tokens: 2048,
174
+ messages: [{ role: 'user', content: extractPrompt }]
175
+ });
176
+ const extractText = extractResponse.content.find(c => c.type === 'text');
177
+ if (!extractText || extractText.type !== 'text') {
178
+ throw new Error('No response from extraction');
179
+ }
180
+ const cleanedExtract = stripMarkdownFences(extractText.text);
181
+ let input;
182
+ try {
183
+ input = JSON.parse(cleanedExtract);
184
+ }
185
+ catch {
186
+ throw new Error(`Failed to extract structure: ${cleanedExtract.slice(0, 200)}...`);
187
+ }
188
+ return analyzeDiscoveryInput(input);
189
+ }
190
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/discovery/analyze.ts"],"names":[],"mappings":"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"}