startup-builder 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/README.md +179 -0
- package/dist/chunk-DTWFVPYU.js +190 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +218 -0
- package/dist/index.d.ts +122 -0
- package/dist/index.js +22 -0
- package/package.json +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# startup-builder
|
|
2
|
+
|
|
3
|
+
Business-as-Code. Define your startup in minutes.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx startup-builder
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install startup-builder
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## What You Get
|
|
18
|
+
|
|
19
|
+
One command. Complete startup foundation.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
startup-builder "AI code review for engineering teams"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
✓ Foundation Sprint Complete problem/solution definition
|
|
27
|
+
✓ Lean Canvas One-page business model
|
|
28
|
+
✓ ICP Ideal customer profile
|
|
29
|
+
✓ Jobs-to-be-Done Customer motivation map
|
|
30
|
+
✓ StoryBrand Clear messaging framework
|
|
31
|
+
✓ Name Startup name + domain
|
|
32
|
+
✓ Landing Page Ready to deploy
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## CLI
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Full guided experience
|
|
39
|
+
startup-builder
|
|
40
|
+
|
|
41
|
+
# Start from idea
|
|
42
|
+
startup-builder "your startup idea"
|
|
43
|
+
|
|
44
|
+
# Run specific modules
|
|
45
|
+
startup-builder foundation # Foundation sprint
|
|
46
|
+
startup-builder canvas # Lean canvas
|
|
47
|
+
startup-builder icp # Ideal customer profile
|
|
48
|
+
startup-builder jtbd # Jobs to be done
|
|
49
|
+
startup-builder story # StoryBrand messaging
|
|
50
|
+
startup-builder name # Name generation
|
|
51
|
+
startup-builder landing # Landing page
|
|
52
|
+
|
|
53
|
+
# Export everything
|
|
54
|
+
startup-builder export --format md
|
|
55
|
+
startup-builder export --format json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## SDK
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { builder } from 'startup-builder'
|
|
62
|
+
|
|
63
|
+
// Build complete startup foundation
|
|
64
|
+
const startup = await builder.create({
|
|
65
|
+
idea: 'AI code review for engineering teams',
|
|
66
|
+
founder: {
|
|
67
|
+
capabilities: ['ML expertise', 'DevTools experience'],
|
|
68
|
+
insight: 'Code review is the biggest bottleneck',
|
|
69
|
+
motivation: 'Hated waiting for reviews'
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// Returns complete startup package
|
|
74
|
+
// {
|
|
75
|
+
// foundation: { problem, customer, solution, mvp, validation },
|
|
76
|
+
// canvas: { ... 9 boxes ... },
|
|
77
|
+
// icp: { firmographics, buyer, problems, goals, buying },
|
|
78
|
+
// jtbd: { mainJob, relatedJobs, forces },
|
|
79
|
+
// story: { character, problem, guide, plan, cta, failure, success },
|
|
80
|
+
// name: { name, tagline, domain },
|
|
81
|
+
// landing: { url, sections }
|
|
82
|
+
// }
|
|
83
|
+
|
|
84
|
+
// Build incrementally
|
|
85
|
+
const foundation = await builder.foundation('AI code review')
|
|
86
|
+
const canvas = await builder.canvas(foundation)
|
|
87
|
+
const icp = await builder.icp(foundation)
|
|
88
|
+
const story = await builder.story(foundation, icp)
|
|
89
|
+
const name = await builder.name(foundation)
|
|
90
|
+
const landing = await builder.landing(name, story)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## The Flow
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
97
|
+
│ 1. FOUNDATION SPRINT │
|
|
98
|
+
│ Problem → Customer → Solution → MVP → Validation │
|
|
99
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
100
|
+
│ 2. LEAN CANVAS │
|
|
101
|
+
│ Complete business model on one page │
|
|
102
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
103
|
+
│ 3. IDEAL CUSTOMER PROFILE │
|
|
104
|
+
│ Know exactly who you're building for │
|
|
105
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
106
|
+
│ 4. JOBS TO BE DONE │
|
|
107
|
+
│ Understand why customers will buy │
|
|
108
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
109
|
+
│ 5. STORYBRAND │
|
|
110
|
+
│ Clarify your message │
|
|
111
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
112
|
+
│ 6. NAME + DOMAIN │
|
|
113
|
+
│ Find the perfect name, claim the domain │
|
|
114
|
+
├─────────────────────────────────────────────────────────────────────┤
|
|
115
|
+
│ 7. LANDING PAGE │
|
|
116
|
+
│ Deploy and start collecting signups │
|
|
117
|
+
└─────────────────────────────────────────────────────────────────────┘
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Output
|
|
121
|
+
|
|
122
|
+
Everything syncs to your Startups.Studio dashboard and exports to code:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
my-startup/
|
|
126
|
+
├── startup.mdx # Complete startup definition
|
|
127
|
+
├── canvas.mdx # Lean canvas
|
|
128
|
+
├── icp.mdx # Ideal customer profile
|
|
129
|
+
├── messaging.mdx # StoryBrand script
|
|
130
|
+
├── experiments.mdx # Validation experiments
|
|
131
|
+
└── landing/ # Deployable landing page
|
|
132
|
+
├── index.html
|
|
133
|
+
└── styles.css
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Deploy
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// Deploy everything
|
|
140
|
+
const deployed = await builder.deploy(startup, {
|
|
141
|
+
domain: 'acme.hq.sb' // Or your own domain
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
// {
|
|
145
|
+
// landing: 'https://acme.hq.sb',
|
|
146
|
+
// dashboard: 'https://startups.studio/acme'
|
|
147
|
+
// }
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## MCP Server
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"mcpServers": {
|
|
155
|
+
"startup-builder": {
|
|
156
|
+
"command": "npx",
|
|
157
|
+
"args": ["startup-builder", "mcp"]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> "Build a startup around AI code review"
|
|
164
|
+
> "Create a lean canvas for my idea"
|
|
165
|
+
> "What should my MVP look like?"
|
|
166
|
+
|
|
167
|
+
## Includes
|
|
168
|
+
|
|
169
|
+
- [foundation-sprint](../foundation-sprint) - Foundation definition
|
|
170
|
+
- [lean-canvas](../lean-canvas) - Business model canvas
|
|
171
|
+
- [ideal-customer-profile](../ideal-customer-profile) - Customer targeting
|
|
172
|
+
- [jobs-to-be-done](../jobs-to-be-done) - Customer jobs
|
|
173
|
+
- [storybrand](../storybrand) - Messaging framework
|
|
174
|
+
- [startup-names](../startup-names) - Name generation
|
|
175
|
+
- [landing-page](../landing-page) - Page generation
|
|
176
|
+
|
|
177
|
+
## License
|
|
178
|
+
|
|
179
|
+
MIT
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { sprint } from "foundation-sprint";
|
|
3
|
+
import { canvas } from "lean-canvas";
|
|
4
|
+
import { icp } from "ideal-customer-profile";
|
|
5
|
+
import { jtbd } from "jobs-to-be-done";
|
|
6
|
+
import { story } from "storybrand";
|
|
7
|
+
import { startup } from "startup-names";
|
|
8
|
+
import { landing } from "landing-page";
|
|
9
|
+
import { sprint as sprint2 } from "foundation-sprint";
|
|
10
|
+
import { canvas as canvas2 } from "lean-canvas";
|
|
11
|
+
import { icp as icp2 } from "ideal-customer-profile";
|
|
12
|
+
import { jtbd as jtbd2 } from "jobs-to-be-done";
|
|
13
|
+
import { story as story2 } from "storybrand";
|
|
14
|
+
import { startup as names } from "startup-names";
|
|
15
|
+
import { landing as landing2 } from "landing-page";
|
|
16
|
+
var builder = {
|
|
17
|
+
/**
|
|
18
|
+
* Create complete startup foundation from idea
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const startup = await builder.create({
|
|
23
|
+
* idea: 'AI code review for engineering teams',
|
|
24
|
+
* founder: {
|
|
25
|
+
* capabilities: ['ML expertise', 'DevTools experience'],
|
|
26
|
+
* insight: 'Code review is the biggest bottleneck',
|
|
27
|
+
* motivation: 'Hated waiting for reviews'
|
|
28
|
+
* }
|
|
29
|
+
* })
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
async create(options) {
|
|
33
|
+
const { idea, founder } = options;
|
|
34
|
+
console.log("\n\u{1F680} Phase 1/7: Foundation Sprint");
|
|
35
|
+
const foundation = await sprint2.run({
|
|
36
|
+
idea,
|
|
37
|
+
founder
|
|
38
|
+
});
|
|
39
|
+
console.log("\n\u{1F4CA} Phase 2/7: Lean Canvas");
|
|
40
|
+
const leanCanvas = await canvas2.generate(idea);
|
|
41
|
+
console.log("\n\u{1F3AF} Phase 3/7: Ideal Customer Profile");
|
|
42
|
+
const customerProfile = await icp2.generate(idea);
|
|
43
|
+
console.log("\n\u{1F4BC} Phase 4/7: Jobs to be Done");
|
|
44
|
+
const jobs = await jtbd2.discover(idea);
|
|
45
|
+
console.log("\n\u{1F4D6} Phase 5/7: StoryBrand Messaging");
|
|
46
|
+
const brandStory = await story2.generate(idea);
|
|
47
|
+
console.log("\n\u2728 Phase 6/7: Name Generation");
|
|
48
|
+
const nameResult = await names.generate({
|
|
49
|
+
description: idea,
|
|
50
|
+
count: 5,
|
|
51
|
+
industry: options.industry,
|
|
52
|
+
tone: options.tone,
|
|
53
|
+
founderNames: founder?.founderNames
|
|
54
|
+
});
|
|
55
|
+
console.log("\n\u{1F3A8} Phase 7/7: Landing Page");
|
|
56
|
+
const productName = nameResult.names?.[0]?.name || idea;
|
|
57
|
+
const landingPage = await landing2.generate({
|
|
58
|
+
product: productName,
|
|
59
|
+
customization: { storybrand: brandStory }
|
|
60
|
+
});
|
|
61
|
+
console.log("\n\u2705 Startup foundation complete!");
|
|
62
|
+
return {
|
|
63
|
+
foundation,
|
|
64
|
+
canvas: leanCanvas,
|
|
65
|
+
icp: customerProfile,
|
|
66
|
+
jtbd: jobs,
|
|
67
|
+
story: brandStory,
|
|
68
|
+
name: nameResult,
|
|
69
|
+
landing: landingPage
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
/**
|
|
73
|
+
* Run foundation sprint
|
|
74
|
+
*/
|
|
75
|
+
async foundation(idea, founder) {
|
|
76
|
+
return sprint2.run({ idea, founder });
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Generate lean canvas
|
|
80
|
+
*/
|
|
81
|
+
async canvas(input) {
|
|
82
|
+
if (typeof input === "string") {
|
|
83
|
+
return canvas2.generate(input);
|
|
84
|
+
}
|
|
85
|
+
const description = input.problem?.statement || input.idea || JSON.stringify(input);
|
|
86
|
+
return canvas2.generate(description);
|
|
87
|
+
},
|
|
88
|
+
/**
|
|
89
|
+
* Generate ideal customer profile
|
|
90
|
+
*/
|
|
91
|
+
async icp(input) {
|
|
92
|
+
if (typeof input === "string") {
|
|
93
|
+
return icp2.generate(input);
|
|
94
|
+
}
|
|
95
|
+
const description = input.problem?.statement || input.idea || JSON.stringify(input);
|
|
96
|
+
return icp2.generate(description);
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* Generate jobs to be done
|
|
100
|
+
*/
|
|
101
|
+
async jtbd(input) {
|
|
102
|
+
if (typeof input === "string") {
|
|
103
|
+
return jtbd2.discover(input);
|
|
104
|
+
}
|
|
105
|
+
const description = input.problem?.statement || input.idea || JSON.stringify(input);
|
|
106
|
+
return jtbd2.discover(description);
|
|
107
|
+
},
|
|
108
|
+
/**
|
|
109
|
+
* Generate story brand messaging
|
|
110
|
+
*/
|
|
111
|
+
async story(input, customerProfile) {
|
|
112
|
+
if (typeof input === "string") {
|
|
113
|
+
return story2.generate(input);
|
|
114
|
+
}
|
|
115
|
+
const description = input.problem?.statement || input.idea || JSON.stringify(input);
|
|
116
|
+
return story2.generate(description);
|
|
117
|
+
},
|
|
118
|
+
/**
|
|
119
|
+
* Generate startup name
|
|
120
|
+
*/
|
|
121
|
+
async name(input, options) {
|
|
122
|
+
if (typeof input === "string") {
|
|
123
|
+
return names.generate({
|
|
124
|
+
description: input,
|
|
125
|
+
...options
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
const description = input.problem?.statement || input.idea || JSON.stringify(input);
|
|
129
|
+
return names.generate({
|
|
130
|
+
description,
|
|
131
|
+
...options
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
/**
|
|
135
|
+
* Generate landing page
|
|
136
|
+
*/
|
|
137
|
+
async landing(name, brandStory) {
|
|
138
|
+
const productName = typeof name === "string" ? name : name.name || name.names?.[0]?.name || "Startup";
|
|
139
|
+
return landing2.generate({
|
|
140
|
+
product: productName,
|
|
141
|
+
customization: brandStory ? { storybrand: brandStory } : void 0
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
/**
|
|
145
|
+
* Deploy startup to web
|
|
146
|
+
*/
|
|
147
|
+
async deploy(startup2, options) {
|
|
148
|
+
const nameData = startup2.name;
|
|
149
|
+
let domain = options?.domain;
|
|
150
|
+
if (!domain && nameData) {
|
|
151
|
+
if (typeof nameData === "object") {
|
|
152
|
+
if (nameData.names && Array.isArray(nameData.names)) {
|
|
153
|
+
const firstWithFree = nameData.names.find(
|
|
154
|
+
(n) => n.domains?.some((d) => d.type === "free")
|
|
155
|
+
);
|
|
156
|
+
if (firstWithFree) {
|
|
157
|
+
domain = firstWithFree.domains.find((d) => d.type === "free")?.domain;
|
|
158
|
+
}
|
|
159
|
+
} else if (nameData.domains?.free) {
|
|
160
|
+
domain = nameData.domains.free;
|
|
161
|
+
} else if (nameData.name) {
|
|
162
|
+
domain = `${nameData.name.toLowerCase().replace(/\s+/g, "-")}.hq.sb`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
domain = domain || "startup.hq.sb";
|
|
167
|
+
console.log(`
|
|
168
|
+
\u{1F680} Deploying to ${domain}...`);
|
|
169
|
+
console.log(` Note: Deployment functionality not yet implemented`);
|
|
170
|
+
return {
|
|
171
|
+
landing: `https://${domain}`,
|
|
172
|
+
dashboard: `https://startups.studio/${nameData?.name?.toLowerCase() || "startup"}`
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
async function buildStartup(idea, founder) {
|
|
177
|
+
return builder.create({ idea, founder });
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export {
|
|
181
|
+
builder,
|
|
182
|
+
buildStartup,
|
|
183
|
+
sprint,
|
|
184
|
+
canvas,
|
|
185
|
+
icp,
|
|
186
|
+
jtbd,
|
|
187
|
+
story,
|
|
188
|
+
startup,
|
|
189
|
+
landing
|
|
190
|
+
};
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
builder
|
|
4
|
+
} from "./chunk-DTWFVPYU.js";
|
|
5
|
+
|
|
6
|
+
// src/cli.ts
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
import prompts from "prompts";
|
|
9
|
+
import pc from "picocolors";
|
|
10
|
+
var program = new Command();
|
|
11
|
+
program.name("startup-builder").description("Business-as-Code. Define your startup in minutes.").version("0.1.0");
|
|
12
|
+
program.argument("[idea]", "Your startup idea").option("--industry <type>", "Industry (fintech, health, devtools, etc)").option("--tone <tone>", "Tone (professional, playful, modern, traditional)").option("--deploy", "Deploy landing page after building").action(async (idea, options) => {
|
|
13
|
+
console.log(pc.bold(pc.cyan("\n\u{1F680} Startup Builder\n")));
|
|
14
|
+
console.log("Business-as-Code. Define your startup in minutes.\n");
|
|
15
|
+
if (!idea) {
|
|
16
|
+
const response = await prompts({
|
|
17
|
+
type: "text",
|
|
18
|
+
name: "idea",
|
|
19
|
+
message: "What's your startup idea?",
|
|
20
|
+
validate: (value) => value.length > 0 ? true : "Please enter an idea"
|
|
21
|
+
});
|
|
22
|
+
if (!response.idea) {
|
|
23
|
+
console.log(pc.red("\n\u274C Cancelled"));
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
idea = response.idea;
|
|
27
|
+
}
|
|
28
|
+
const founderResponse = await prompts([
|
|
29
|
+
{
|
|
30
|
+
type: "text",
|
|
31
|
+
name: "capabilities",
|
|
32
|
+
message: "Your unique capabilities (optional):",
|
|
33
|
+
initial: ""
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
type: "text",
|
|
37
|
+
name: "insight",
|
|
38
|
+
message: "Your unique insight (optional):",
|
|
39
|
+
initial: ""
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
name: "motivation",
|
|
44
|
+
message: "Your motivation (optional):",
|
|
45
|
+
initial: ""
|
|
46
|
+
}
|
|
47
|
+
]);
|
|
48
|
+
const founder = {
|
|
49
|
+
capabilities: founderResponse.capabilities ? [founderResponse.capabilities] : void 0,
|
|
50
|
+
insight: founderResponse.insight || void 0,
|
|
51
|
+
motivation: founderResponse.motivation || void 0
|
|
52
|
+
};
|
|
53
|
+
console.log(pc.dim("\nBuilding your startup foundation...\n"));
|
|
54
|
+
try {
|
|
55
|
+
const startup = await builder.create({
|
|
56
|
+
idea,
|
|
57
|
+
founder,
|
|
58
|
+
industry: options.industry,
|
|
59
|
+
tone: options.tone
|
|
60
|
+
});
|
|
61
|
+
console.log(pc.bold(pc.green("\n\u2705 Complete!\n")));
|
|
62
|
+
console.log(pc.bold("Your Startup Foundation:"));
|
|
63
|
+
console.log(` Name: ${pc.cyan(startup.name.name || "Generated")}`);
|
|
64
|
+
console.log(` Domain: ${pc.cyan(startup.name.domains?.free || "Available")}`);
|
|
65
|
+
console.log("");
|
|
66
|
+
if (options.deploy) {
|
|
67
|
+
const deployment = await builder.deploy(startup);
|
|
68
|
+
console.log(pc.bold(pc.green("\n\u{1F680} Deployed!")));
|
|
69
|
+
console.log(` Landing: ${pc.cyan(deployment.landing)}`);
|
|
70
|
+
if (deployment.dashboard) {
|
|
71
|
+
console.log(` Dashboard: ${pc.cyan(deployment.dashboard)}`);
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
const deployResponse = await prompts({
|
|
75
|
+
type: "confirm",
|
|
76
|
+
name: "deploy",
|
|
77
|
+
message: "Deploy landing page now?",
|
|
78
|
+
initial: true
|
|
79
|
+
});
|
|
80
|
+
if (deployResponse.deploy) {
|
|
81
|
+
const deployment = await builder.deploy(startup);
|
|
82
|
+
console.log(pc.bold(pc.green("\n\u{1F680} Deployed!")));
|
|
83
|
+
console.log(` Landing: ${pc.cyan(deployment.landing)}`);
|
|
84
|
+
if (deployment.dashboard) {
|
|
85
|
+
console.log(` Dashboard: ${pc.cyan(deployment.dashboard)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
console.log(pc.dim("\nNext steps:"));
|
|
90
|
+
console.log(pc.dim(" \u2022 Review your foundation"));
|
|
91
|
+
console.log(pc.dim(" \u2022 Run validation experiments"));
|
|
92
|
+
console.log(pc.dim(" \u2022 Start building your MVP"));
|
|
93
|
+
console.log("");
|
|
94
|
+
} catch (error) {
|
|
95
|
+
console.error(pc.red("\n\u274C Error:"), error instanceof Error ? error.message : error);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
program.command("foundation").alias("sprint").description("Run foundation sprint").argument("[idea]", "Your startup idea").action(async (idea) => {
|
|
100
|
+
if (!idea) {
|
|
101
|
+
const response = await prompts({
|
|
102
|
+
type: "text",
|
|
103
|
+
name: "idea",
|
|
104
|
+
message: "What's your startup idea?"
|
|
105
|
+
});
|
|
106
|
+
idea = response.idea;
|
|
107
|
+
}
|
|
108
|
+
console.log(pc.cyan("\n\u{1F680} Foundation Sprint\n"));
|
|
109
|
+
const foundation = await builder.foundation(idea);
|
|
110
|
+
console.log(pc.green("\n\u2705 Foundation complete!"));
|
|
111
|
+
console.log(foundation);
|
|
112
|
+
});
|
|
113
|
+
program.command("canvas").description("Generate lean canvas").argument("[idea]", "Your startup idea").action(async (idea) => {
|
|
114
|
+
if (!idea) {
|
|
115
|
+
const response = await prompts({
|
|
116
|
+
type: "text",
|
|
117
|
+
name: "idea",
|
|
118
|
+
message: "What's your startup idea?"
|
|
119
|
+
});
|
|
120
|
+
idea = response.idea;
|
|
121
|
+
}
|
|
122
|
+
console.log(pc.cyan("\n\u{1F4CA} Lean Canvas\n"));
|
|
123
|
+
const leanCanvas = await builder.canvas(idea);
|
|
124
|
+
console.log(pc.green("\n\u2705 Canvas complete!"));
|
|
125
|
+
console.log(leanCanvas);
|
|
126
|
+
});
|
|
127
|
+
program.command("icp").description("Generate ideal customer profile").argument("[idea]", "Your startup idea").action(async (idea) => {
|
|
128
|
+
if (!idea) {
|
|
129
|
+
const response = await prompts({
|
|
130
|
+
type: "text",
|
|
131
|
+
name: "idea",
|
|
132
|
+
message: "What's your startup idea?"
|
|
133
|
+
});
|
|
134
|
+
idea = response.idea;
|
|
135
|
+
}
|
|
136
|
+
console.log(pc.cyan("\n\u{1F3AF} Ideal Customer Profile\n"));
|
|
137
|
+
const customerProfile = await builder.icp(idea);
|
|
138
|
+
console.log(pc.green("\n\u2705 ICP complete!"));
|
|
139
|
+
console.log(customerProfile);
|
|
140
|
+
});
|
|
141
|
+
program.command("jtbd").description("Generate jobs to be done").argument("[idea]", "Your startup idea").action(async (idea) => {
|
|
142
|
+
if (!idea) {
|
|
143
|
+
const response = await prompts({
|
|
144
|
+
type: "text",
|
|
145
|
+
name: "idea",
|
|
146
|
+
message: "What's your startup idea?"
|
|
147
|
+
});
|
|
148
|
+
idea = response.idea;
|
|
149
|
+
}
|
|
150
|
+
console.log(pc.cyan("\n\u{1F4BC} Jobs to be Done\n"));
|
|
151
|
+
const jobs = await builder.jtbd(idea);
|
|
152
|
+
console.log(pc.green("\n\u2705 JTBD complete!"));
|
|
153
|
+
console.log(jobs);
|
|
154
|
+
});
|
|
155
|
+
program.command("story").description("Generate StoryBrand messaging").argument("[idea]", "Your startup idea").action(async (idea) => {
|
|
156
|
+
if (!idea) {
|
|
157
|
+
const response = await prompts({
|
|
158
|
+
type: "text",
|
|
159
|
+
name: "idea",
|
|
160
|
+
message: "What's your startup idea?"
|
|
161
|
+
});
|
|
162
|
+
idea = response.idea;
|
|
163
|
+
}
|
|
164
|
+
console.log(pc.cyan("\n\u{1F4D6} StoryBrand Messaging\n"));
|
|
165
|
+
const brandStory = await builder.story(idea);
|
|
166
|
+
console.log(pc.green("\n\u2705 Story complete!"));
|
|
167
|
+
console.log(brandStory);
|
|
168
|
+
});
|
|
169
|
+
program.command("name").description("Generate startup name").argument("[idea]", "Your startup idea").option("--industry <type>", "Industry").option("--tone <tone>", "Tone").option("--count <number>", "Number of names to generate", "10").action(async (idea, options) => {
|
|
170
|
+
if (!idea) {
|
|
171
|
+
const response = await prompts({
|
|
172
|
+
type: "text",
|
|
173
|
+
name: "idea",
|
|
174
|
+
message: "What's your startup idea?"
|
|
175
|
+
});
|
|
176
|
+
idea = response.idea;
|
|
177
|
+
}
|
|
178
|
+
console.log(pc.cyan("\n\u2728 Name Generation\n"));
|
|
179
|
+
const name = await builder.name(idea, {
|
|
180
|
+
industry: options.industry,
|
|
181
|
+
tone: options.tone,
|
|
182
|
+
count: parseInt(options.count)
|
|
183
|
+
});
|
|
184
|
+
console.log(pc.green("\n\u2705 Names generated!"));
|
|
185
|
+
console.log(name);
|
|
186
|
+
});
|
|
187
|
+
program.command("landing").description("Generate landing page").argument("[idea]", "Your startup idea").action(async (idea) => {
|
|
188
|
+
if (!idea) {
|
|
189
|
+
const response = await prompts({
|
|
190
|
+
type: "text",
|
|
191
|
+
name: "idea",
|
|
192
|
+
message: "What's your startup idea?"
|
|
193
|
+
});
|
|
194
|
+
idea = response.idea;
|
|
195
|
+
}
|
|
196
|
+
console.log(pc.cyan("\n\u{1F3A8} Landing Page\n"));
|
|
197
|
+
const name = await builder.name(idea);
|
|
198
|
+
const brandStory = await builder.story(idea);
|
|
199
|
+
const page = await builder.landing(name, brandStory);
|
|
200
|
+
console.log(pc.green("\n\u2705 Landing page complete!"));
|
|
201
|
+
console.log(page);
|
|
202
|
+
});
|
|
203
|
+
program.command("build").description("Build complete startup foundation").argument("[idea]", "Your startup idea").option("--industry <type>", "Industry").option("--tone <tone>", "Tone").option("--deploy", "Deploy landing page").action(async (idea, options) => {
|
|
204
|
+
await program.parseAsync(["node", "cli", idea, ...process.argv.slice(3)].filter(Boolean));
|
|
205
|
+
});
|
|
206
|
+
program.command("export").description("Export startup definition").option("--format <type>", "Export format (md, json)", "md").action(async (options) => {
|
|
207
|
+
console.log(pc.cyan(`
|
|
208
|
+
Exporting as ${options.format}...
|
|
209
|
+
`));
|
|
210
|
+
console.log(pc.yellow("\u26A0\uFE0F Export not yet implemented"));
|
|
211
|
+
console.log(pc.dim(" Coming soon: Export to markdown and JSON"));
|
|
212
|
+
});
|
|
213
|
+
program.command("mcp").description("Start MCP server").action(async () => {
|
|
214
|
+
console.log(pc.cyan("\n\u{1F50C} MCP Server\n"));
|
|
215
|
+
console.log(pc.yellow("\u26A0\uFE0F MCP server not yet implemented"));
|
|
216
|
+
console.log(pc.dim(" Coming soon: Model Context Protocol server"));
|
|
217
|
+
});
|
|
218
|
+
program.parse();
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as landing_page from 'landing-page';
|
|
2
|
+
export { landing } from 'landing-page';
|
|
3
|
+
import * as startup_names from 'startup-names';
|
|
4
|
+
export { startup as names } from 'startup-names';
|
|
5
|
+
import * as storybrand from 'storybrand';
|
|
6
|
+
export { story } from 'storybrand';
|
|
7
|
+
import * as jobs_to_be_done from 'jobs-to-be-done';
|
|
8
|
+
export { jtbd } from 'jobs-to-be-done';
|
|
9
|
+
import * as ideal_customer_profile from 'ideal-customer-profile';
|
|
10
|
+
export { icp } from 'ideal-customer-profile';
|
|
11
|
+
import * as lean_canvas from 'lean-canvas';
|
|
12
|
+
export { canvas } from 'lean-canvas';
|
|
13
|
+
import * as foundation_sprint from 'foundation-sprint';
|
|
14
|
+
export { sprint } from 'foundation-sprint';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Complete startup package returned by builder.create()
|
|
18
|
+
*/
|
|
19
|
+
interface StartupPackage {
|
|
20
|
+
foundation: any;
|
|
21
|
+
canvas: any;
|
|
22
|
+
icp: any;
|
|
23
|
+
jtbd: any;
|
|
24
|
+
story: any;
|
|
25
|
+
name: any;
|
|
26
|
+
landing: any;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Founder information used to personalize the startup
|
|
30
|
+
*/
|
|
31
|
+
interface FounderInfo {
|
|
32
|
+
capabilities?: string[];
|
|
33
|
+
insight?: string;
|
|
34
|
+
motivation?: string;
|
|
35
|
+
founderNames?: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options for creating a startup
|
|
39
|
+
*/
|
|
40
|
+
interface CreateOptions {
|
|
41
|
+
idea: string;
|
|
42
|
+
founder?: FounderInfo;
|
|
43
|
+
industry?: string;
|
|
44
|
+
tone?: 'professional' | 'playful' | 'modern' | 'traditional';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Options for deploying a startup
|
|
48
|
+
*/
|
|
49
|
+
interface DeployOptions {
|
|
50
|
+
domain?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Deploy result
|
|
54
|
+
*/
|
|
55
|
+
interface DeployResult {
|
|
56
|
+
landing: string;
|
|
57
|
+
dashboard?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Main builder API
|
|
61
|
+
*/
|
|
62
|
+
declare const builder: {
|
|
63
|
+
/**
|
|
64
|
+
* Create complete startup foundation from idea
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const startup = await builder.create({
|
|
69
|
+
* idea: 'AI code review for engineering teams',
|
|
70
|
+
* founder: {
|
|
71
|
+
* capabilities: ['ML expertise', 'DevTools experience'],
|
|
72
|
+
* insight: 'Code review is the biggest bottleneck',
|
|
73
|
+
* motivation: 'Hated waiting for reviews'
|
|
74
|
+
* }
|
|
75
|
+
* })
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
create(options: CreateOptions): Promise<StartupPackage>;
|
|
79
|
+
/**
|
|
80
|
+
* Run foundation sprint
|
|
81
|
+
*/
|
|
82
|
+
foundation(idea: string, founder?: FounderInfo): Promise<foundation_sprint.Foundation>;
|
|
83
|
+
/**
|
|
84
|
+
* Generate lean canvas
|
|
85
|
+
*/
|
|
86
|
+
canvas(input: string | any): Promise<lean_canvas.LeanCanvas>;
|
|
87
|
+
/**
|
|
88
|
+
* Generate ideal customer profile
|
|
89
|
+
*/
|
|
90
|
+
icp(input: string | any): Promise<ideal_customer_profile.GenerateResult>;
|
|
91
|
+
/**
|
|
92
|
+
* Generate jobs to be done
|
|
93
|
+
*/
|
|
94
|
+
jtbd(input: string | any): Promise<jobs_to_be_done.DiscoverResult>;
|
|
95
|
+
/**
|
|
96
|
+
* Generate story brand messaging
|
|
97
|
+
*/
|
|
98
|
+
story(input: string | any, customerProfile?: any): Promise<storybrand.StoryBrandScript>;
|
|
99
|
+
/**
|
|
100
|
+
* Generate startup name
|
|
101
|
+
*/
|
|
102
|
+
name(input: string | any, options?: any): Promise<startup_names.GenerateResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Generate landing page
|
|
105
|
+
*/
|
|
106
|
+
landing(name: any, brandStory?: any): Promise<landing_page.LandingPageOutput>;
|
|
107
|
+
/**
|
|
108
|
+
* Deploy startup to web
|
|
109
|
+
*/
|
|
110
|
+
deploy(startup: StartupPackage, options?: DeployOptions): Promise<DeployResult>;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Build complete startup from idea (convenience function)
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* const startup = await buildStartup('AI code review for teams')
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
declare function buildStartup(idea: string, founder?: FounderInfo): Promise<StartupPackage>;
|
|
121
|
+
|
|
122
|
+
export { type CreateOptions, type DeployOptions, type DeployResult, type FounderInfo, type StartupPackage, buildStartup, builder };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildStartup,
|
|
3
|
+
builder,
|
|
4
|
+
canvas,
|
|
5
|
+
icp,
|
|
6
|
+
jtbd,
|
|
7
|
+
landing,
|
|
8
|
+
sprint,
|
|
9
|
+
startup,
|
|
10
|
+
story
|
|
11
|
+
} from "./chunk-DTWFVPYU.js";
|
|
12
|
+
export {
|
|
13
|
+
buildStartup,
|
|
14
|
+
builder,
|
|
15
|
+
canvas,
|
|
16
|
+
icp,
|
|
17
|
+
jtbd,
|
|
18
|
+
landing,
|
|
19
|
+
startup as names,
|
|
20
|
+
sprint,
|
|
21
|
+
story
|
|
22
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "startup-builder",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Business-as-Code. Define your startup in minutes.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"startup-builder": "./dist/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup src/index.ts src/cli.ts --format esm --dts --clean",
|
|
23
|
+
"dev": "tsup src/index.ts src/cli.ts --format esm --dts --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"startup",
|
|
28
|
+
"builder",
|
|
29
|
+
"business",
|
|
30
|
+
"lean-canvas",
|
|
31
|
+
"mvp"
|
|
32
|
+
],
|
|
33
|
+
"author": "Startups.Studio",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"api.sb": "workspace:*",
|
|
37
|
+
"db.sb": "workspace:*",
|
|
38
|
+
"foundation-sprint": "workspace:*",
|
|
39
|
+
"lean-canvas": "workspace:*",
|
|
40
|
+
"ideal-customer-profile": "workspace:*",
|
|
41
|
+
"jobs-to-be-done": "workspace:*",
|
|
42
|
+
"storybrand": "workspace:*",
|
|
43
|
+
"startup-names": "workspace:*",
|
|
44
|
+
"landing-page": "workspace:*",
|
|
45
|
+
"commander": "^12.0.0",
|
|
46
|
+
"picocolors": "^1.1.0",
|
|
47
|
+
"prompts": "^2.4.2"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.0.0",
|
|
51
|
+
"@types/prompts": "^2.4.9",
|
|
52
|
+
"tsup": "^8.0.0",
|
|
53
|
+
"typescript": "^5.5.0"
|
|
54
|
+
}
|
|
55
|
+
}
|