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.
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/bin/superskills +6 -0
- package/dist/catalog/index.d.ts +11 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +203 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/tools-catalog.json +243 -0
- package/dist/catalog/types.d.ts +59 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +2 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/catalog/ui.d.ts +4 -0
- package/dist/catalog/ui.d.ts.map +1 -0
- package/dist/catalog/ui.js +86 -0
- package/dist/catalog/ui.js.map +1 -0
- package/dist/cli/colors.d.ts +8 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +11 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/discovery/analyze.d.ts +5 -0
- package/dist/discovery/analyze.d.ts.map +1 -0
- package/dist/discovery/analyze.js +190 -0
- package/dist/discovery/analyze.js.map +1 -0
- package/dist/discovery/core.d.ts +16 -0
- package/dist/discovery/core.d.ts.map +1 -0
- package/dist/discovery/core.js +51 -0
- package/dist/discovery/core.js.map +1 -0
- package/dist/discovery/index.d.ts +4 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +233 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/schema.d.ts +111 -0
- package/dist/discovery/schema.d.ts.map +1 -0
- package/dist/discovery/schema.js +87 -0
- package/dist/discovery/schema.js.map +1 -0
- package/dist/discovery/types.d.ts +56 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +2 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +523 -0
- package/dist/index.js.map +1 -0
- package/dist/scaffold/index.d.ts +4 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +262 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates/claude-md.d.ts +4 -0
- package/dist/scaffold/templates/claude-md.d.ts.map +1 -0
- package/dist/scaffold/templates/claude-md.js +229 -0
- package/dist/scaffold/templates/claude-md.js.map +1 -0
- package/dist/scaffold/templates/claude-settings.d.ts +3 -0
- package/dist/scaffold/templates/claude-settings.d.ts.map +1 -0
- package/dist/scaffold/templates/claude-settings.js +48 -0
- package/dist/scaffold/templates/claude-settings.js.map +1 -0
- package/dist/scaffold/templates/env-example.d.ts +3 -0
- package/dist/scaffold/templates/env-example.d.ts.map +1 -0
- package/dist/scaffold/templates/env-example.js +103 -0
- package/dist/scaffold/templates/env-example.js.map +1 -0
- package/dist/scaffold/templates/package-json.d.ts +2 -0
- package/dist/scaffold/templates/package-json.d.ts.map +1 -0
- package/dist/scaffold/templates/package-json.js +56 -0
- package/dist/scaffold/templates/package-json.js.map +1 -0
- package/dist/scaffold/templates/project-files.d.ts +4 -0
- package/dist/scaffold/templates/project-files.d.ts.map +1 -0
- package/dist/scaffold/templates/project-files.js +459 -0
- package/dist/scaffold/templates/project-files.js.map +1 -0
- package/dist/scaffold/templates/skill-agents.d.ts +4 -0
- package/dist/scaffold/templates/skill-agents.d.ts.map +1 -0
- package/dist/scaffold/templates/skill-agents.js +68 -0
- package/dist/scaffold/templates/skill-agents.js.map +1 -0
- package/dist/scaffold/templates/skill-commands.d.ts +3 -0
- package/dist/scaffold/templates/skill-commands.d.ts.map +1 -0
- package/dist/scaffold/templates/skill-commands.js +509 -0
- package/dist/scaffold/templates/skill-commands.js.map +1 -0
- package/dist/scaffold/templates/teammate-prompts.d.ts +8 -0
- package/dist/scaffold/templates/teammate-prompts.d.ts.map +1 -0
- package/dist/scaffold/templates/teammate-prompts.js +506 -0
- package/dist/scaffold/templates/teammate-prompts.js.map +1 -0
- package/dist/scaffold/types.d.ts +68 -0
- package/dist/scaffold/types.d.ts.map +1 -0
- package/dist/scaffold/types.js +2 -0
- package/dist/scaffold/types.js.map +1 -0
- package/dist/scaffold/ui.d.ts +5 -0
- package/dist/scaffold/ui.d.ts.map +1 -0
- package/dist/scaffold/ui.js +127 -0
- package/dist/scaffold/ui.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +8 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export function generateEnvExample(tools) {
|
|
2
|
+
const envVars = new Set();
|
|
3
|
+
for (const suggestion of tools.all) {
|
|
4
|
+
for (const envVar of suggestion.tool.envVars) {
|
|
5
|
+
envVars.add(envVar);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
// Always include shadcnblocks (design system, not a tool)
|
|
9
|
+
envVars.add('SHADCNBLOCKS_API_KEY');
|
|
10
|
+
const lines = [
|
|
11
|
+
'# Environment Variables',
|
|
12
|
+
'# Copy this file to .env.local and fill in the values',
|
|
13
|
+
'',
|
|
14
|
+
'# ===================',
|
|
15
|
+
'# Core Services',
|
|
16
|
+
'# ===================',
|
|
17
|
+
''
|
|
18
|
+
];
|
|
19
|
+
// Group by service
|
|
20
|
+
const grouped = {
|
|
21
|
+
supabase: [],
|
|
22
|
+
vercel: [],
|
|
23
|
+
inngest: [],
|
|
24
|
+
anthropic: [],
|
|
25
|
+
openai: [],
|
|
26
|
+
shadcnblocks: [],
|
|
27
|
+
brevo: [],
|
|
28
|
+
telegram: [],
|
|
29
|
+
slack: [],
|
|
30
|
+
discord: [],
|
|
31
|
+
apify: [],
|
|
32
|
+
supermemory: [],
|
|
33
|
+
other: []
|
|
34
|
+
};
|
|
35
|
+
for (const envVar of envVars) {
|
|
36
|
+
const lower = envVar.toLowerCase();
|
|
37
|
+
if (lower.includes('supabase')) {
|
|
38
|
+
grouped.supabase.push(envVar);
|
|
39
|
+
}
|
|
40
|
+
else if (lower.includes('vercel')) {
|
|
41
|
+
grouped.vercel.push(envVar);
|
|
42
|
+
}
|
|
43
|
+
else if (lower.includes('inngest')) {
|
|
44
|
+
grouped.inngest.push(envVar);
|
|
45
|
+
}
|
|
46
|
+
else if (lower.includes('anthropic')) {
|
|
47
|
+
grouped.anthropic.push(envVar);
|
|
48
|
+
}
|
|
49
|
+
else if (lower.includes('openai')) {
|
|
50
|
+
grouped.openai.push(envVar);
|
|
51
|
+
}
|
|
52
|
+
else if (lower.includes('shadcnblocks')) {
|
|
53
|
+
grouped.shadcnblocks.push(envVar);
|
|
54
|
+
}
|
|
55
|
+
else if (lower.includes('brevo')) {
|
|
56
|
+
grouped.brevo.push(envVar);
|
|
57
|
+
}
|
|
58
|
+
else if (lower.includes('telegram')) {
|
|
59
|
+
grouped.telegram.push(envVar);
|
|
60
|
+
}
|
|
61
|
+
else if (lower.includes('slack')) {
|
|
62
|
+
grouped.slack.push(envVar);
|
|
63
|
+
}
|
|
64
|
+
else if (lower.includes('discord')) {
|
|
65
|
+
grouped.discord.push(envVar);
|
|
66
|
+
}
|
|
67
|
+
else if (lower.includes('apify')) {
|
|
68
|
+
grouped.apify.push(envVar);
|
|
69
|
+
}
|
|
70
|
+
else if (lower.includes('supermemory')) {
|
|
71
|
+
grouped.supermemory.push(envVar);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
grouped.other.push(envVar);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const sectionNames = {
|
|
78
|
+
supabase: 'Supabase',
|
|
79
|
+
vercel: 'Vercel',
|
|
80
|
+
inngest: 'Inngest',
|
|
81
|
+
anthropic: 'Claude (Anthropic)',
|
|
82
|
+
openai: 'OpenAI',
|
|
83
|
+
shadcnblocks: 'shadcnblocks (UI blocks, optional)',
|
|
84
|
+
brevo: 'Brevo (Email/SMS/WhatsApp)',
|
|
85
|
+
telegram: 'Telegram',
|
|
86
|
+
slack: 'Slack',
|
|
87
|
+
discord: 'Discord',
|
|
88
|
+
apify: 'Apify',
|
|
89
|
+
supermemory: 'Supermemory',
|
|
90
|
+
other: 'Other'
|
|
91
|
+
};
|
|
92
|
+
for (const [key, vars] of Object.entries(grouped)) {
|
|
93
|
+
if (vars.length > 0) {
|
|
94
|
+
lines.push(`# ${sectionNames[key]}`);
|
|
95
|
+
for (const v of vars.sort()) {
|
|
96
|
+
lines.push(`${v}=`);
|
|
97
|
+
}
|
|
98
|
+
lines.push('');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return lines.join('\n');
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=env-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-example.js","sourceRoot":"","sources":["../../../src/scaffold/templates/env-example.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/package-json.ts"],"names":[],"mappings":"AAgBA,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA2CnF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Pinned versions for generated projects
|
|
2
|
+
const SDK_VERSIONS = {
|
|
3
|
+
'@supabase/supabase-js': '^2.49.0',
|
|
4
|
+
'inngest': '^3.31.0',
|
|
5
|
+
'@anthropic-ai/sdk': '^0.76.0',
|
|
6
|
+
'openai': '^4.85.0',
|
|
7
|
+
'@getbrevo/brevo': '^2.2.0',
|
|
8
|
+
'grammy': '^1.35.0',
|
|
9
|
+
'@slack/bolt': '^4.3.0',
|
|
10
|
+
'discord.js': '^14.17.0',
|
|
11
|
+
'@whiskeysockets/baileys': '^6.7.0',
|
|
12
|
+
'apify-client': '^2.11.0',
|
|
13
|
+
'@supermemory/ai-sdk': '^0.1.0',
|
|
14
|
+
'@playwright/test': '^1.49.0'
|
|
15
|
+
};
|
|
16
|
+
export function generatePackageJson(projectName, packages) {
|
|
17
|
+
const dependencies = {
|
|
18
|
+
"next": "^15.3.0",
|
|
19
|
+
"react": "^19.1.0",
|
|
20
|
+
"react-dom": "^19.1.0",
|
|
21
|
+
"clsx": "^2.1.0",
|
|
22
|
+
"tailwind-merge": "^2.6.0"
|
|
23
|
+
};
|
|
24
|
+
// Add selected packages with pinned versions
|
|
25
|
+
for (const pkg of packages) {
|
|
26
|
+
dependencies[pkg] = SDK_VERSIONS[pkg] || '^0.1.0';
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
"name": projectName,
|
|
30
|
+
"version": "0.1.0",
|
|
31
|
+
"private": true,
|
|
32
|
+
"scripts": {
|
|
33
|
+
"dev": "next dev",
|
|
34
|
+
"build": "next build",
|
|
35
|
+
"start": "next start",
|
|
36
|
+
"lint": "next lint",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest",
|
|
39
|
+
"test:e2e": "npx playwright test",
|
|
40
|
+
"inngest:dev": "npx inngest-cli@latest dev"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": Object.fromEntries(Object.entries(dependencies).sort(([a], [b]) => a.localeCompare(b))),
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@playwright/test": "^1.49.0",
|
|
45
|
+
"@types/node": "^22.15.0",
|
|
46
|
+
"@types/react": "^19.1.0",
|
|
47
|
+
"@types/react-dom": "^19.1.0",
|
|
48
|
+
"autoprefixer": "^10.4.0",
|
|
49
|
+
"postcss": "^8.5.0",
|
|
50
|
+
"tailwindcss": "^3.4.0",
|
|
51
|
+
"typescript": "^5.8.0",
|
|
52
|
+
"vitest": "^4.0.0"
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=package-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/scaffold/templates/package-json.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,YAAY,GAA2B;IAC3C,uBAAuB,EAAE,SAAS;IAClC,SAAS,EAAE,SAAS;IACpB,mBAAmB,EAAE,SAAS;IAC9B,QAAQ,EAAE,SAAS;IACnB,iBAAiB,EAAE,QAAQ;IAC3B,QAAQ,EAAE,SAAS;IACnB,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,UAAU;IACxB,yBAAyB,EAAE,QAAQ;IACnC,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,QAAQ;IAC/B,kBAAkB,EAAE,SAAS;CAC9B,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,QAAkB;IACzE,MAAM,YAAY,GAA2B;QAC3C,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,QAAQ;QAChB,gBAAgB,EAAE,QAAQ;KAC3B,CAAC;IAEF,6CAA6C;IAC7C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,YAAY,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;IACpD,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE;YACT,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,YAAY;YACpB,YAAY,EAAE,QAAQ;YACtB,UAAU,EAAE,qBAAqB;YACjC,aAAa,EAAE,4BAA4B;SAC5C;QACD,cAAc,EAAE,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACpE;QACD,iBAAiB,EAAE;YACjB,kBAAkB,EAAE,SAAS;YAC7B,aAAa,EAAE,UAAU;YACzB,cAAc,EAAE,SAAS;YACzB,kBAAkB,EAAE,SAAS;YAC7B,cAAc,EAAE,SAAS;YACzB,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,QAAQ;YACvB,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,QAAQ;SACnB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DiscoveryResult } from '../../discovery/types.js';
|
|
2
|
+
import type { SelectionResult } from '../../catalog/types.js';
|
|
3
|
+
export declare function generateProjectFiles(discovery: DiscoveryResult, _tools: SelectionResult): Promise<Record<string, string>>;
|
|
4
|
+
//# sourceMappingURL=project-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-files.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/project-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAudjC"}
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
export async function generateProjectFiles(discovery, _tools) {
|
|
2
|
+
const files = {};
|
|
3
|
+
// TypeScript config
|
|
4
|
+
files['tsconfig.json'] = JSON.stringify({
|
|
5
|
+
"compilerOptions": {
|
|
6
|
+
"target": "ES2022",
|
|
7
|
+
"lib": ["dom", "dom.iterable", "ES2022"],
|
|
8
|
+
"allowJs": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"strict": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"esModuleInterop": true,
|
|
13
|
+
"module": "esnext",
|
|
14
|
+
"moduleResolution": "bundler",
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"jsx": "preserve",
|
|
18
|
+
"incremental": true,
|
|
19
|
+
"plugins": [{ "name": "next" }],
|
|
20
|
+
"paths": { "@/*": ["./src/*"] }
|
|
21
|
+
},
|
|
22
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
23
|
+
"exclude": ["node_modules"]
|
|
24
|
+
}, null, 2);
|
|
25
|
+
// Next.js config
|
|
26
|
+
files['next.config.ts'] = `import type { NextConfig } from 'next';
|
|
27
|
+
|
|
28
|
+
const nextConfig: NextConfig = {
|
|
29
|
+
// AI-native app config
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default nextConfig;
|
|
33
|
+
`;
|
|
34
|
+
// Tailwind config — extends from CSS variables in globals.css
|
|
35
|
+
files['tailwind.config.ts'] = `import type { Config } from 'tailwindcss';
|
|
36
|
+
|
|
37
|
+
const config: Config = {
|
|
38
|
+
content: [
|
|
39
|
+
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
|
|
40
|
+
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
41
|
+
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
42
|
+
],
|
|
43
|
+
theme: {
|
|
44
|
+
extend: {
|
|
45
|
+
colors: {
|
|
46
|
+
border: 'hsl(var(--border))',
|
|
47
|
+
input: 'hsl(var(--input))',
|
|
48
|
+
ring: 'hsl(var(--ring))',
|
|
49
|
+
background: 'hsl(var(--background))',
|
|
50
|
+
foreground: 'hsl(var(--foreground))',
|
|
51
|
+
primary: {
|
|
52
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
53
|
+
foreground: 'hsl(var(--primary-foreground))',
|
|
54
|
+
},
|
|
55
|
+
secondary: {
|
|
56
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
57
|
+
foreground: 'hsl(var(--secondary-foreground))',
|
|
58
|
+
},
|
|
59
|
+
destructive: {
|
|
60
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
61
|
+
foreground: 'hsl(var(--destructive-foreground))',
|
|
62
|
+
},
|
|
63
|
+
muted: {
|
|
64
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
65
|
+
foreground: 'hsl(var(--muted-foreground))',
|
|
66
|
+
},
|
|
67
|
+
accent: {
|
|
68
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
69
|
+
foreground: 'hsl(var(--accent-foreground))',
|
|
70
|
+
},
|
|
71
|
+
popover: {
|
|
72
|
+
DEFAULT: 'hsl(var(--popover))',
|
|
73
|
+
foreground: 'hsl(var(--popover-foreground))',
|
|
74
|
+
},
|
|
75
|
+
card: {
|
|
76
|
+
DEFAULT: 'hsl(var(--card))',
|
|
77
|
+
foreground: 'hsl(var(--card-foreground))',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
borderRadius: {
|
|
81
|
+
lg: 'var(--radius)',
|
|
82
|
+
md: 'calc(var(--radius) - 2px)',
|
|
83
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
plugins: [],
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export default config;
|
|
91
|
+
`;
|
|
92
|
+
// shadcn components.json with shadcnblocks registry
|
|
93
|
+
files['components.json'] = JSON.stringify({
|
|
94
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
95
|
+
"style": "default",
|
|
96
|
+
"rsc": true,
|
|
97
|
+
"tsx": true,
|
|
98
|
+
"tailwind": {
|
|
99
|
+
"config": "tailwind.config.ts",
|
|
100
|
+
"css": "src/app/globals.css",
|
|
101
|
+
"baseColor": "neutral",
|
|
102
|
+
"cssVariables": true
|
|
103
|
+
},
|
|
104
|
+
"aliases": {
|
|
105
|
+
"components": "@/components",
|
|
106
|
+
"utils": "@/lib/utils",
|
|
107
|
+
"ui": "@/components/ui",
|
|
108
|
+
"lib": "@/lib",
|
|
109
|
+
"hooks": "@/hooks"
|
|
110
|
+
},
|
|
111
|
+
"registries": {
|
|
112
|
+
"@shadcnblocks": {
|
|
113
|
+
"url": "https://shadcnblocks.com/r",
|
|
114
|
+
"headers": {
|
|
115
|
+
"Authorization": "Bearer ${SHADCNBLOCKS_API_KEY}"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, null, 2);
|
|
120
|
+
// PostCSS config
|
|
121
|
+
files['postcss.config.mjs'] = `/** @type {import('postcss-load-config').Config} */
|
|
122
|
+
const config = {
|
|
123
|
+
plugins: {
|
|
124
|
+
tailwindcss: {},
|
|
125
|
+
autoprefixer: {},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export default config;
|
|
130
|
+
`;
|
|
131
|
+
// App layout
|
|
132
|
+
files['src/app/layout.tsx'] = `import type { Metadata } from 'next';
|
|
133
|
+
import './globals.css';
|
|
134
|
+
|
|
135
|
+
export const metadata: Metadata = {
|
|
136
|
+
title: '${discovery.projectName}',
|
|
137
|
+
description: '${discovery.desiredOutcome}',
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export default function RootLayout({
|
|
141
|
+
children,
|
|
142
|
+
}: {
|
|
143
|
+
children: React.ReactNode;
|
|
144
|
+
}) {
|
|
145
|
+
return (
|
|
146
|
+
<html lang="en">
|
|
147
|
+
<body className="min-h-screen bg-background font-sans antialiased">{children}</body>
|
|
148
|
+
</html>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
`;
|
|
152
|
+
// Global styles — design tokens as CSS custom properties
|
|
153
|
+
// The /design-init skill customizes these values for the project's brand
|
|
154
|
+
files['src/app/globals.css'] = `@tailwind base;
|
|
155
|
+
@tailwind components;
|
|
156
|
+
@tailwind utilities;
|
|
157
|
+
|
|
158
|
+
@layer base {
|
|
159
|
+
:root {
|
|
160
|
+
--background: 0 0% 100%;
|
|
161
|
+
--foreground: 240 10% 3.9%;
|
|
162
|
+
--card: 0 0% 100%;
|
|
163
|
+
--card-foreground: 240 10% 3.9%;
|
|
164
|
+
--popover: 0 0% 100%;
|
|
165
|
+
--popover-foreground: 240 10% 3.9%;
|
|
166
|
+
--primary: 240 5.9% 10%;
|
|
167
|
+
--primary-foreground: 0 0% 98%;
|
|
168
|
+
--secondary: 240 4.8% 95.9%;
|
|
169
|
+
--secondary-foreground: 240 5.9% 10%;
|
|
170
|
+
--muted: 240 4.8% 95.9%;
|
|
171
|
+
--muted-foreground: 240 3.8% 46.1%;
|
|
172
|
+
--accent: 240 4.8% 95.9%;
|
|
173
|
+
--accent-foreground: 240 5.9% 10%;
|
|
174
|
+
--destructive: 0 84.2% 60.2%;
|
|
175
|
+
--destructive-foreground: 0 0% 98%;
|
|
176
|
+
--border: 240 5.9% 90%;
|
|
177
|
+
--input: 240 5.9% 90%;
|
|
178
|
+
--ring: 240 5.9% 10%;
|
|
179
|
+
--radius: 0.5rem;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.dark {
|
|
183
|
+
--background: 240 10% 3.9%;
|
|
184
|
+
--foreground: 0 0% 98%;
|
|
185
|
+
--card: 240 10% 3.9%;
|
|
186
|
+
--card-foreground: 0 0% 98%;
|
|
187
|
+
--popover: 240 10% 3.9%;
|
|
188
|
+
--popover-foreground: 0 0% 98%;
|
|
189
|
+
--primary: 0 0% 98%;
|
|
190
|
+
--primary-foreground: 240 5.9% 10%;
|
|
191
|
+
--secondary: 240 3.7% 15.9%;
|
|
192
|
+
--secondary-foreground: 0 0% 98%;
|
|
193
|
+
--muted: 240 3.7% 15.9%;
|
|
194
|
+
--muted-foreground: 240 5% 64.9%;
|
|
195
|
+
--accent: 240 3.7% 15.9%;
|
|
196
|
+
--accent-foreground: 0 0% 98%;
|
|
197
|
+
--destructive: 0 62.8% 30.6%;
|
|
198
|
+
--destructive-foreground: 0 0% 98%;
|
|
199
|
+
--border: 240 3.7% 15.9%;
|
|
200
|
+
--input: 240 3.7% 15.9%;
|
|
201
|
+
--ring: 240 4.9% 83.9%;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@layer base {
|
|
206
|
+
* {
|
|
207
|
+
@apply border-border;
|
|
208
|
+
}
|
|
209
|
+
body {
|
|
210
|
+
@apply bg-background text-foreground;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
`;
|
|
214
|
+
// Home page — uses semantic Tailwind classes from design tokens
|
|
215
|
+
files['src/app/page.tsx'] = `export default function Home() {
|
|
216
|
+
return (
|
|
217
|
+
<main className="min-h-screen p-8">
|
|
218
|
+
<h1 className="text-3xl font-bold mb-4">${discovery.projectName}</h1>
|
|
219
|
+
<p className="text-muted-foreground mb-8">${discovery.desiredOutcome}</p>
|
|
220
|
+
|
|
221
|
+
<div className="grid gap-4 md:grid-cols-4">
|
|
222
|
+
<div className="rounded-lg border bg-card p-4 text-card-foreground">
|
|
223
|
+
<h2 className="font-semibold mb-2">Enrichment</h2>
|
|
224
|
+
<p className="text-sm text-muted-foreground">
|
|
225
|
+
${discovery.eiidMapping.enrichment.existingData.slice(0, 2).join(', ')}
|
|
226
|
+
</p>
|
|
227
|
+
</div>
|
|
228
|
+
<div className="rounded-lg border bg-card p-4 text-card-foreground">
|
|
229
|
+
<h2 className="font-semibold mb-2">Inference</h2>
|
|
230
|
+
<p className="text-sm text-muted-foreground">
|
|
231
|
+
${discovery.eiidMapping.inference.patterns.slice(0, 2).join(', ')}
|
|
232
|
+
</p>
|
|
233
|
+
</div>
|
|
234
|
+
<div className="rounded-lg border bg-card p-4 text-card-foreground">
|
|
235
|
+
<h2 className="font-semibold mb-2">Interpretation</h2>
|
|
236
|
+
<p className="text-sm text-muted-foreground">
|
|
237
|
+
${discovery.eiidMapping.interpretation.insights.slice(0, 2).join(', ')}
|
|
238
|
+
</p>
|
|
239
|
+
</div>
|
|
240
|
+
<div className="rounded-lg border bg-card p-4 text-card-foreground">
|
|
241
|
+
<h2 className="font-semibold mb-2">Delivery</h2>
|
|
242
|
+
<p className="text-sm text-muted-foreground">
|
|
243
|
+
${discovery.eiidMapping.delivery.channels.join(', ')}
|
|
244
|
+
</p>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</main>
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
`;
|
|
251
|
+
// shadcn utility — cn() for className merging
|
|
252
|
+
files['src/lib/utils.ts'] = `import { type ClassValue, clsx } from 'clsx';
|
|
253
|
+
import { twMerge } from 'tailwind-merge';
|
|
254
|
+
|
|
255
|
+
export function cn(...inputs: ClassValue[]) {
|
|
256
|
+
return twMerge(clsx(inputs));
|
|
257
|
+
}
|
|
258
|
+
`;
|
|
259
|
+
// Supabase client
|
|
260
|
+
files['src/lib/supabase.ts'] = `import { createClient } from '@supabase/supabase-js';
|
|
261
|
+
|
|
262
|
+
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
|
|
263
|
+
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;
|
|
264
|
+
|
|
265
|
+
export const supabase = createClient(supabaseUrl, supabaseAnonKey);
|
|
266
|
+
|
|
267
|
+
// Server-side client with service role
|
|
268
|
+
export function createServerClient() {
|
|
269
|
+
return createClient(
|
|
270
|
+
process.env.SUPABASE_URL!,
|
|
271
|
+
process.env.SUPABASE_SERVICE_ROLE_KEY!
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
`;
|
|
275
|
+
// AI client
|
|
276
|
+
files['src/lib/ai.ts'] = `import Anthropic from '@anthropic-ai/sdk';
|
|
277
|
+
|
|
278
|
+
const anthropic = new Anthropic({
|
|
279
|
+
apiKey: process.env.ANTHROPIC_API_KEY!,
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
const MODEL = process.env.SUPERSKILLS_MODEL || 'claude-opus-4-6';
|
|
283
|
+
|
|
284
|
+
export async function generateInsight(prompt: string): Promise<string> {
|
|
285
|
+
const response = await anthropic.messages.create({
|
|
286
|
+
model: MODEL,
|
|
287
|
+
max_tokens: 1024,
|
|
288
|
+
messages: [{ role: 'user', content: prompt }],
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
const textContent = response.content.find(c => c.type === 'text');
|
|
292
|
+
return textContent?.type === 'text' ? textContent.text : '';
|
|
293
|
+
}
|
|
294
|
+
`;
|
|
295
|
+
// Inngest client
|
|
296
|
+
files['src/inngest/client.ts'] = `import { Inngest } from 'inngest';
|
|
297
|
+
|
|
298
|
+
export const inngest = new Inngest({
|
|
299
|
+
id: '${slugify(discovery.projectName)}',
|
|
300
|
+
});
|
|
301
|
+
`;
|
|
302
|
+
// Sample Inngest function
|
|
303
|
+
const triggers = discovery.eiidMapping.delivery.triggers;
|
|
304
|
+
files['src/inngest/functions/analyze.ts'] = `import { inngest } from '../client';
|
|
305
|
+
import { generateInsight } from '@/lib/ai';
|
|
306
|
+
|
|
307
|
+
// Triggered by: ${triggers.join(', ') || 'events'}
|
|
308
|
+
export const analyzeAndDeliver = inngest.createFunction(
|
|
309
|
+
{ id: 'analyze-and-deliver' },
|
|
310
|
+
{ event: 'app/data.received' },
|
|
311
|
+
async ({ event, step }) => {
|
|
312
|
+
// Step 1: Analyze data
|
|
313
|
+
const insight = await step.run('generate-insight', async () => {
|
|
314
|
+
return generateInsight(\`
|
|
315
|
+
Analyze this data and provide actionable insights:
|
|
316
|
+
\${JSON.stringify(event.data)}
|
|
317
|
+
\`);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
// Step 2: Decide if notification needed
|
|
321
|
+
const shouldNotify = await step.run('decide-notification', async () => {
|
|
322
|
+
// Add your decision logic here
|
|
323
|
+
return insight.length > 0;
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// Step 3: Deliver to user
|
|
327
|
+
if (shouldNotify) {
|
|
328
|
+
await step.run('deliver-notification', async () => {
|
|
329
|
+
// Delivery channels: ${discovery.eiidMapping.delivery.channels.join(', ')}
|
|
330
|
+
console.log('Delivering insight:', insight);
|
|
331
|
+
// TODO: Implement delivery via Brevo/Telegram/Slack
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return { success: true, insight };
|
|
336
|
+
}
|
|
337
|
+
);
|
|
338
|
+
`;
|
|
339
|
+
// Inngest route
|
|
340
|
+
files['src/app/api/inngest/route.ts'] = `import { serve } from 'inngest/next';
|
|
341
|
+
import { inngest } from '@/inngest/client';
|
|
342
|
+
import { analyzeAndDeliver } from '@/inngest/functions/analyze';
|
|
343
|
+
|
|
344
|
+
export const { GET, POST, PUT } = serve({
|
|
345
|
+
client: inngest,
|
|
346
|
+
functions: [analyzeAndDeliver],
|
|
347
|
+
});
|
|
348
|
+
`;
|
|
349
|
+
// Delivery stub
|
|
350
|
+
const channels = discovery.eiidMapping.delivery.channels;
|
|
351
|
+
files['src/lib/delivery/index.ts'] = `// Delivery channels: ${channels.join(', ')}
|
|
352
|
+
|
|
353
|
+
export interface DeliveryMessage {
|
|
354
|
+
channel: 'email' | 'sms' | 'whatsapp' | 'telegram' | 'slack' | 'discord';
|
|
355
|
+
recipient: string;
|
|
356
|
+
subject?: string;
|
|
357
|
+
body: string;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export async function deliver(message: DeliveryMessage): Promise<boolean> {
|
|
361
|
+
switch (message.channel) {
|
|
362
|
+
case 'email':
|
|
363
|
+
case 'sms':
|
|
364
|
+
case 'whatsapp':
|
|
365
|
+
return deliverViaBrevo(message);
|
|
366
|
+
case 'telegram':
|
|
367
|
+
return deliverViaTelegram(message);
|
|
368
|
+
case 'slack':
|
|
369
|
+
return deliverViaSlack(message);
|
|
370
|
+
case 'discord':
|
|
371
|
+
return deliverViaDiscord(message);
|
|
372
|
+
default:
|
|
373
|
+
throw new Error(\`Unknown channel: \${message.channel}\`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
async function deliverViaBrevo(message: DeliveryMessage): Promise<boolean> {
|
|
378
|
+
// TODO: Implement Brevo delivery
|
|
379
|
+
console.log('Brevo delivery:', message);
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
async function deliverViaTelegram(message: DeliveryMessage): Promise<boolean> {
|
|
384
|
+
// TODO: Implement Telegram delivery
|
|
385
|
+
console.log('Telegram delivery:', message);
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
async function deliverViaSlack(message: DeliveryMessage): Promise<boolean> {
|
|
390
|
+
// TODO: Implement Slack delivery
|
|
391
|
+
console.log('Slack delivery:', message);
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
async function deliverViaDiscord(message: DeliveryMessage): Promise<boolean> {
|
|
396
|
+
// TODO: Implement Discord delivery
|
|
397
|
+
console.log('Discord delivery:', message);
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
`;
|
|
401
|
+
// Supabase migrations folder
|
|
402
|
+
files['supabase/migrations/.gitkeep'] = '';
|
|
403
|
+
// Supabase config
|
|
404
|
+
files['supabase/config.toml'] = `[project]
|
|
405
|
+
id = "${slugify(discovery.projectName)}"
|
|
406
|
+
name = "${discovery.projectName}"
|
|
407
|
+
`;
|
|
408
|
+
// Playwright config
|
|
409
|
+
files['playwright.config.ts'] = `import { defineConfig, devices } from '@playwright/test';
|
|
410
|
+
|
|
411
|
+
export default defineConfig({
|
|
412
|
+
testDir: './tests/e2e',
|
|
413
|
+
fullyParallel: true,
|
|
414
|
+
forbidOnly: !!process.env.CI,
|
|
415
|
+
retries: process.env.CI ? 2 : 0,
|
|
416
|
+
workers: process.env.CI ? 1 : undefined,
|
|
417
|
+
reporter: 'html',
|
|
418
|
+
use: {
|
|
419
|
+
baseURL: 'http://localhost:3000',
|
|
420
|
+
trace: 'on-first-retry',
|
|
421
|
+
},
|
|
422
|
+
projects: [
|
|
423
|
+
{
|
|
424
|
+
name: 'chromium',
|
|
425
|
+
use: { ...devices['Desktop Chrome'] },
|
|
426
|
+
},
|
|
427
|
+
],
|
|
428
|
+
webServer: {
|
|
429
|
+
command: 'npm run dev',
|
|
430
|
+
url: 'http://localhost:3000',
|
|
431
|
+
reuseExistingServer: !process.env.CI,
|
|
432
|
+
},
|
|
433
|
+
});
|
|
434
|
+
`;
|
|
435
|
+
// Sample E2E smoke test
|
|
436
|
+
files['tests/e2e/smoke.spec.ts'] = `import { test, expect } from '@playwright/test';
|
|
437
|
+
|
|
438
|
+
test('home page loads and displays project name', async ({ page }) => {
|
|
439
|
+
await page.goto('/');
|
|
440
|
+
await expect(page.locator('h1')).toContainText('${discovery.projectName}');
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
test('home page shows EIID sections', async ({ page }) => {
|
|
444
|
+
await page.goto('/');
|
|
445
|
+
await expect(page.locator('text=Enrichment')).toBeVisible();
|
|
446
|
+
await expect(page.locator('text=Inference')).toBeVisible();
|
|
447
|
+
await expect(page.locator('text=Interpretation')).toBeVisible();
|
|
448
|
+
await expect(page.locator('text=Delivery')).toBeVisible();
|
|
449
|
+
});
|
|
450
|
+
`;
|
|
451
|
+
return files;
|
|
452
|
+
}
|
|
453
|
+
function slugify(text) {
|
|
454
|
+
return text
|
|
455
|
+
.toLowerCase()
|
|
456
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
457
|
+
.replace(/^-|-$/g, '');
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=project-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../../src/scaffold/templates/project-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DiscoveryResult } from '../../discovery/types.js';
|
|
2
|
+
import type { SelectionResult } from '../../catalog/types.js';
|
|
3
|
+
export declare function generateSkillAgents(discovery: DiscoveryResult, tools?: SelectionResult): Record<string, string>;
|
|
4
|
+
//# sourceMappingURL=skill-agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-agents.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/skill-agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAmE9D,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,eAAe,EAC1B,KAAK,CAAC,EAAE,eAAe,GACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBxB"}
|