seed-qwen-ai 1.0.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 +309 -0
- package/bin/install.js +210 -0
- package/checklists/planning-quality.md +81 -0
- package/data/application/config.md +29 -0
- package/data/application/guide.md +184 -0
- package/data/application/skill-loadout.md +48 -0
- package/data/campaign/config.md +23 -0
- package/data/campaign/guide.md +102 -0
- package/data/campaign/skill-loadout.md +34 -0
- package/data/client/config.md +23 -0
- package/data/client/guide.md +102 -0
- package/data/client/skill-loadout.md +34 -0
- package/data/utility/config.md +22 -0
- package/data/utility/guide.md +90 -0
- package/data/utility/skill-loadout.md +29 -0
- package/data/workflow/config.md +23 -0
- package/data/workflow/guide.md +100 -0
- package/data/workflow/skill-loadout.md +34 -0
- package/package.json +37 -0
- package/tasks/add-type.md +112 -0
- package/tasks/graduate.md +102 -0
- package/tasks/ideate.md +97 -0
- package/tasks/launch.md +90 -0
- package/tasks/status.md +63 -0
- package/templates/planning-application.md +204 -0
- package/templates/planning-campaign.md +154 -0
- package/templates/planning-client.md +142 -0
- package/templates/planning-utility.md +110 -0
- package/templates/planning-workflow.md +125 -0
package/README.md
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# SEED-Qwen
|
|
2
|
+
|
|
3
|
+
**Typed Project Incubator** for Qwen CLI — guided ideation through graduation into buildable projects.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What is SEED?
|
|
8
|
+
|
|
9
|
+
SEED takes raw ideas through structured, type-aware exploration and produces comprehensive `PLANNING.md` documents ready for building.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Raw Idea → SEED → PLANNING.md → PAUL → Built Project
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
### Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx seed-qwen-ai
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or specify location:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Global (all projects)
|
|
29
|
+
npx seed-qwen-ai --global
|
|
30
|
+
|
|
31
|
+
# Local (current project)
|
|
32
|
+
npx seed-qwen-ai --local
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Start Ideation
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
/seed
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Launch with PAUL
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
/seed launch
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This graduates your project AND initializes PAUL in one step — no re-asking questions.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Project Types (5)
|
|
52
|
+
|
|
53
|
+
| Type | Rigor | Purpose |
|
|
54
|
+
|------|-------|---------|
|
|
55
|
+
| **Application** | Deep | Software with UI, data model, API, deployment |
|
|
56
|
+
| **Workflow** | Standard | Claude Code commands, hooks, skills |
|
|
57
|
+
| **Client** | Standard | Client websites — business context, conversion |
|
|
58
|
+
| **Utility** | Tight | Small tools, scripts, single-purpose |
|
|
59
|
+
| **Campaign** | Creative | Content, marketing, launches |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Commands
|
|
64
|
+
|
|
65
|
+
| Command | Description |
|
|
66
|
+
|---------|-------------|
|
|
67
|
+
| `/seed` | Start guided ideation (default) |
|
|
68
|
+
| `/seed graduate` | Move to `apps/` with git repo + README |
|
|
69
|
+
| `/seed launch` | Graduate + initialize PAUL (headless) |
|
|
70
|
+
| `/seed status` | Show all projects in pipeline |
|
|
71
|
+
| `/seed add-type` | Create custom project type |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## The SEED → PAUL Pipeline
|
|
76
|
+
|
|
77
|
+
### Step 1: Ideation (`/seed`)
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
1. Select project type
|
|
81
|
+
2. Guided conversation (type-specific)
|
|
82
|
+
3. Generate PLANNING.md
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Step 2: Graduation (`/seed graduate`)
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
1. Quality gate check
|
|
89
|
+
2. Move to apps/{name}/
|
|
90
|
+
3. Git init + README
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Step 3: Launch (`/seed launch`)
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
1. All Graduation steps
|
|
97
|
+
2. PAUL initialized headlessly
|
|
98
|
+
3. PLANNING.md → ROADMAP.md, PROJECT.md
|
|
99
|
+
4. Ready for /paul/plan
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## File Structure
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
projects/
|
|
108
|
+
└── {project-name}/
|
|
109
|
+
└── PLANNING.md # Generated during ideation
|
|
110
|
+
|
|
111
|
+
apps/
|
|
112
|
+
└── {project-name}/
|
|
113
|
+
├── PLANNING.md # Copied from projects/
|
|
114
|
+
├── README.md # Generated during graduation
|
|
115
|
+
└── .paul/ # Created by /seed launch
|
|
116
|
+
├── PROJECT.md
|
|
117
|
+
├── ROADMAP.md
|
|
118
|
+
└── STATE.md
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Example Session
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Start ideation
|
|
127
|
+
/seed
|
|
128
|
+
|
|
129
|
+
# Select: Application
|
|
130
|
+
# Answer guided questions...
|
|
131
|
+
# PLANNING.md generated
|
|
132
|
+
|
|
133
|
+
# Graduate and launch
|
|
134
|
+
/seed launch my-app
|
|
135
|
+
|
|
136
|
+
# Now in apps/my-app/ with PAUL ready
|
|
137
|
+
/paul/plan # Create first executable plan
|
|
138
|
+
/paul/apply # Build it
|
|
139
|
+
/paul/unify # Close loop
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Custom Project Types
|
|
145
|
+
|
|
146
|
+
Add your own types:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
/seed add-type
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Creates:
|
|
153
|
+
- `~/.qwen/seed-framework/data/{type}/config.md`
|
|
154
|
+
- `~/.qwen/seed-framework/data/{type}/guide.md`
|
|
155
|
+
- `~/.qwen/seed-framework/data/{type}/skill-loadout.md`
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Quality Gates
|
|
160
|
+
|
|
161
|
+
Before graduation, SEED verifies:
|
|
162
|
+
|
|
163
|
+
**Universal:**
|
|
164
|
+
- Problem statement clear
|
|
165
|
+
- Target users defined
|
|
166
|
+
- Phases outlined
|
|
167
|
+
- Next actions clear
|
|
168
|
+
|
|
169
|
+
**Type-Specific:**
|
|
170
|
+
- Application: Tech stack resolved, data model defined
|
|
171
|
+
- Workflow: Trigger mechanism clear
|
|
172
|
+
- Client: Conversion path defined
|
|
173
|
+
- Utility: Single purpose (no scope creep)
|
|
174
|
+
- Campaign: Measurable goal, timeline set
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Integration with PAUL-Qwen
|
|
179
|
+
|
|
180
|
+
SEED works standalone or with PAUL-Qwen:
|
|
181
|
+
|
|
182
|
+
**Standalone:**
|
|
183
|
+
```bash
|
|
184
|
+
/seed graduate # Just create the project
|
|
185
|
+
# Build however you want
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**With PAUL:**
|
|
189
|
+
```bash
|
|
190
|
+
/seed launch # Graduate + PAUL init
|
|
191
|
+
/paul/plan # Start structured build
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Installation Options
|
|
197
|
+
|
|
198
|
+
### Interactive (Default)
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
npx seed-qwen
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Non-Interactive
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# Global
|
|
208
|
+
npx seed-qwen --global
|
|
209
|
+
|
|
210
|
+
# Local
|
|
211
|
+
npx seed-qwen --local
|
|
212
|
+
|
|
213
|
+
# Custom path
|
|
214
|
+
npx seed-qwen --config-dir ~/.qwen-custom
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Help
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
npx seed-qwen --help
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Updating
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
npx seed-qwen@latest
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Comparison: SEED vs Ad-Hoc Planning
|
|
234
|
+
|
|
235
|
+
| Aspect | Ad-Hoc | SEED |
|
|
236
|
+
|--------|--------|------|
|
|
237
|
+
| Structure | None | Type-guided |
|
|
238
|
+
| Output | Notes, fragments | Structured PLANNING.md |
|
|
239
|
+
| Graduation | Manual | Automated |
|
|
240
|
+
| PAUL Handoff | Re-asks questions | Headless (zero re-asking) |
|
|
241
|
+
| Quality | Variable | Gate-checked |
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## When to Use SEED
|
|
246
|
+
|
|
247
|
+
### Good Fit
|
|
248
|
+
|
|
249
|
+
- New project from scratch
|
|
250
|
+
- Vague idea needs shaping
|
|
251
|
+
- Want structured plan before building
|
|
252
|
+
- Team alignment needed
|
|
253
|
+
|
|
254
|
+
### Overkill
|
|
255
|
+
|
|
256
|
+
- Quick scripts (use Utility type anyway)
|
|
257
|
+
- Experiments/prototypes
|
|
258
|
+
- Already have detailed spec
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Troubleshooting
|
|
263
|
+
|
|
264
|
+
### Commands Not Found
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# Verify installation
|
|
268
|
+
ls ~/.qwen/commands/seed/
|
|
269
|
+
|
|
270
|
+
# Restart Qwen CLI
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### PLANNING.md Incomplete
|
|
274
|
+
|
|
275
|
+
Run quality gate manually:
|
|
276
|
+
```bash
|
|
277
|
+
/seed graduate # Will show what's missing
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Contributing
|
|
283
|
+
|
|
284
|
+
1. Fork the repo
|
|
285
|
+
2. Make changes
|
|
286
|
+
3. Test with real projects
|
|
287
|
+
4. Submit PR
|
|
288
|
+
|
|
289
|
+
**GitHub:** https://github.com/tyler1350/seed-qwen
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## License
|
|
294
|
+
|
|
295
|
+
MIT License — see LICENSE file.
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Credits
|
|
300
|
+
|
|
301
|
+
SEED-Qwen is a port of the [SEED Framework](https://github.com/ChristopherKahler/seed) by Chris Kahler, adapted for Qwen CLI.
|
|
302
|
+
|
|
303
|
+
Part of the PAUL ecosystem:
|
|
304
|
+
- **SEED** — Project incubator (ideation → planning)
|
|
305
|
+
- **PAUL** — Project orchestration (plan → apply → unify)
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
*SEED-Qwen v1.0 | For Qwen CLI | Typed Project Incubator*
|
package/bin/install.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
|
|
8
|
+
// Colors
|
|
9
|
+
const cyan = '\x1b[36m';
|
|
10
|
+
const green = '\x1b[32m';
|
|
11
|
+
const yellow = '\x1b[33m';
|
|
12
|
+
const dim = '\x1b[2m';
|
|
13
|
+
const reset = '\x1b[0m';
|
|
14
|
+
|
|
15
|
+
// Get version from package.json
|
|
16
|
+
const pkg = require('../package.json');
|
|
17
|
+
|
|
18
|
+
const banner = `
|
|
19
|
+
${cyan} ███████╗██╗ ██╗ █████╗ ██████╗ ${reset}
|
|
20
|
+
${cyan} ██╔════╝╚██╗██╔╝██╔══██╗██╔══██╗${reset}
|
|
21
|
+
${cyan} █████╗ ╚███╔╝ ███████║██████╔╝${reset}
|
|
22
|
+
${cyan} ██╔══╝ ██╔██╗ ██╔══██║██╔══██╗${reset}
|
|
23
|
+
${cyan} ██║ ██╔╝ ██╗██║ ██║██║ ██║${reset}
|
|
24
|
+
${cyan} ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝${reset}
|
|
25
|
+
|
|
26
|
+
${cyan}SEED-Qwen${reset} Framework ${dim}v${pkg.version}${reset}
|
|
27
|
+
Typed Project Incubator for Qwen CLI
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
// Parse args
|
|
31
|
+
const args = process.argv.slice(2);
|
|
32
|
+
const hasGlobal = args.includes('--global') || args.includes('-g');
|
|
33
|
+
const hasLocal = args.includes('--local') || args.includes('-l');
|
|
34
|
+
|
|
35
|
+
// Parse --config-dir argument
|
|
36
|
+
function parseConfigDirArg() {
|
|
37
|
+
const configDirIndex = args.findIndex(arg => arg === '--config-dir' || arg === '-c');
|
|
38
|
+
if (configDirIndex !== -1) {
|
|
39
|
+
const nextArg = args[configDirIndex + 1];
|
|
40
|
+
if (!nextArg || nextArg.startsWith('-')) {
|
|
41
|
+
console.error(` ${yellow}--config-dir requires a path argument${reset}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
return nextArg;
|
|
45
|
+
}
|
|
46
|
+
const configDirArg = args.find(arg => arg.startsWith('--config-dir=') || arg.startsWith('-c='));
|
|
47
|
+
if (configDirArg) {
|
|
48
|
+
return configDirArg.split('=')[1];
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const explicitConfigDir = parseConfigDirArg();
|
|
53
|
+
const hasHelp = args.includes('--help') || args.includes('-h');
|
|
54
|
+
|
|
55
|
+
console.log(banner);
|
|
56
|
+
|
|
57
|
+
// Show help if requested
|
|
58
|
+
if (hasHelp) {
|
|
59
|
+
console.log(` ${yellow}Usage:${reset} npx seed-qwen [options]
|
|
60
|
+
|
|
61
|
+
${yellow}Options:${reset}
|
|
62
|
+
${cyan}-g, --global${reset} Install globally (to Qwen config directory)
|
|
63
|
+
${cyan}-l, --local${reset} Install locally (to ./.qwen in current directory)
|
|
64
|
+
${cyan}-c, --config-dir <path>${reset} Specify custom Qwen config directory
|
|
65
|
+
${cyan}-h, --help${reset} Show this help message
|
|
66
|
+
|
|
67
|
+
${yellow}Examples:${reset}
|
|
68
|
+
${dim}# Install to default ~/.qwen directory${reset}
|
|
69
|
+
npx seed-qwen --global
|
|
70
|
+
|
|
71
|
+
${dim}# Install to custom config directory${reset}
|
|
72
|
+
npx seed-qwen --global --config-dir ~/.qwen-custom
|
|
73
|
+
|
|
74
|
+
${dim}# Install to current project only${reset}
|
|
75
|
+
npx seed-qwen --local
|
|
76
|
+
|
|
77
|
+
${yellow}What gets installed:${reset}
|
|
78
|
+
commands/seed/ - Slash commands (/seed, /seed/graduate, /seed/launch)
|
|
79
|
+
seed-framework/ - Tasks, data types, templates, checklists
|
|
80
|
+
`);
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Expand ~ to home directory
|
|
86
|
+
*/
|
|
87
|
+
function expandTilde(filePath) {
|
|
88
|
+
if (filePath && filePath.startsWith('~/')) {
|
|
89
|
+
return path.join(os.homedir(), filePath.slice(2));
|
|
90
|
+
}
|
|
91
|
+
return filePath;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Recursively copy directory, replacing paths in .md files
|
|
96
|
+
*/
|
|
97
|
+
function copyWithPathReplacement(srcDir, destDir, pathPrefix) {
|
|
98
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
99
|
+
|
|
100
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
101
|
+
|
|
102
|
+
for (const entry of entries) {
|
|
103
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
104
|
+
const destPath = path.join(destDir, entry.name);
|
|
105
|
+
|
|
106
|
+
if (entry.isDirectory()) {
|
|
107
|
+
copyWithPathReplacement(srcPath, destPath, pathPrefix);
|
|
108
|
+
} else if (entry.name.endsWith('.md')) {
|
|
109
|
+
// Replace ~/.qwen/ with the appropriate prefix in markdown files
|
|
110
|
+
let content = fs.readFileSync(srcPath, 'utf8');
|
|
111
|
+
content = content.replace(/~\/\.qwen\//g, pathPrefix);
|
|
112
|
+
fs.writeFileSync(destPath, content);
|
|
113
|
+
} else {
|
|
114
|
+
fs.copyFileSync(srcPath, destPath);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Install to the specified directory
|
|
121
|
+
*/
|
|
122
|
+
function install(isGlobal) {
|
|
123
|
+
const src = path.join(__dirname, '..');
|
|
124
|
+
const configDir = expandTilde(explicitConfigDir) || expandTilde(process.env.QWEN_CONFIG_DIR);
|
|
125
|
+
const defaultGlobalDir = configDir || path.join(os.homedir(), '.qwen');
|
|
126
|
+
const qwenDir = isGlobal
|
|
127
|
+
? defaultGlobalDir
|
|
128
|
+
: path.join(process.cwd(), '.qwen');
|
|
129
|
+
|
|
130
|
+
const locationLabel = isGlobal
|
|
131
|
+
? qwenDir.replace(os.homedir(), '~')
|
|
132
|
+
: qwenDir.replace(process.cwd(), '.');
|
|
133
|
+
|
|
134
|
+
// Path prefix for file references
|
|
135
|
+
const pathPrefix = isGlobal
|
|
136
|
+
? (configDir ? `${qwenDir}/` : '~/.qwen/')
|
|
137
|
+
: './.qwen/';
|
|
138
|
+
|
|
139
|
+
console.log(` Installing to ${cyan}${locationLabel}${reset}\n`);
|
|
140
|
+
|
|
141
|
+
// Create commands directory
|
|
142
|
+
const commandsDir = path.join(qwenDir, 'commands');
|
|
143
|
+
fs.mkdirSync(commandsDir, { recursive: true });
|
|
144
|
+
|
|
145
|
+
// Copy commands/seed to commands/seed
|
|
146
|
+
const commandsSrc = path.join(src, 'commands', 'seed');
|
|
147
|
+
const commandsDest = path.join(commandsDir, 'seed');
|
|
148
|
+
copyWithPathReplacement(commandsSrc, commandsDest, pathPrefix);
|
|
149
|
+
console.log(` ${green}✓${reset} Installed commands/seed`);
|
|
150
|
+
|
|
151
|
+
// Copy seed-framework/ to qwen/seed-framework/
|
|
152
|
+
const frameworkDest = path.join(qwenDir, 'seed-framework');
|
|
153
|
+
fs.mkdirSync(frameworkDest, { recursive: true });
|
|
154
|
+
|
|
155
|
+
const srcDirs = ['tasks', 'data', 'templates', 'checklists'];
|
|
156
|
+
for (const dir of srcDirs) {
|
|
157
|
+
const dirSrc = path.join(src, dir);
|
|
158
|
+
const dirDest = path.join(frameworkDest, dir);
|
|
159
|
+
if (fs.existsSync(dirSrc)) {
|
|
160
|
+
copyWithPathReplacement(dirSrc, dirDest, pathPrefix);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
console.log(` ${green}✓${reset} Installed seed-framework`);
|
|
164
|
+
|
|
165
|
+
console.log(`
|
|
166
|
+
${green}Done!${reset} Launch Qwen CLI and run ${cyan}/seed${reset}.
|
|
167
|
+
`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Prompt for install location
|
|
172
|
+
*/
|
|
173
|
+
function promptLocation() {
|
|
174
|
+
const rl = readline.createInterface({
|
|
175
|
+
input: process.stdin,
|
|
176
|
+
output: process.stdout
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const configDir = expandTilde(explicitConfigDir) || expandTilde(process.env.QWEN_CONFIG_DIR);
|
|
180
|
+
const globalPath = configDir || path.join(os.homedir(), '.qwen');
|
|
181
|
+
const globalLabel = globalPath.replace(os.homedir(), '~');
|
|
182
|
+
|
|
183
|
+
console.log(` ${yellow}Where would you like to install?${reset}
|
|
184
|
+
|
|
185
|
+
${cyan}1${reset}) Global ${dim}(${globalLabel})${reset} - available in all projects
|
|
186
|
+
${cyan}2${reset}) Local ${dim}(./.qwen)${reset} - this project only
|
|
187
|
+
`);
|
|
188
|
+
|
|
189
|
+
rl.question(` Choice ${dim}[1]${reset}: `, (answer) => {
|
|
190
|
+
rl.close();
|
|
191
|
+
const choice = answer.trim() || '1';
|
|
192
|
+
const isGlobal = choice !== '2';
|
|
193
|
+
install(isGlobal);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Main
|
|
198
|
+
if (hasGlobal && hasLocal) {
|
|
199
|
+
console.error(` ${yellow}Cannot specify both --global and --local${reset}`);
|
|
200
|
+
process.exit(1);
|
|
201
|
+
} else if (explicitConfigDir && hasLocal) {
|
|
202
|
+
console.error(` ${yellow}Cannot use --config-dir with --local${reset}`);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
} else if (hasGlobal) {
|
|
205
|
+
install(true);
|
|
206
|
+
} else if (hasLocal) {
|
|
207
|
+
install(false);
|
|
208
|
+
} else {
|
|
209
|
+
promptLocation();
|
|
210
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Planning Quality Checklist
|
|
2
|
+
|
|
3
|
+
**Purpose:** Quality gate before graduation or launch.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Universal Checks (All Types)
|
|
8
|
+
|
|
9
|
+
- [ ] Problem statement is clear and specific
|
|
10
|
+
- [ ] Target users/audience defined
|
|
11
|
+
- [ ] At least 2 phases outlined
|
|
12
|
+
- [ ] Next actions are clear
|
|
13
|
+
- [ ] No "TBD" in critical sections
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Type-Specific Checks
|
|
18
|
+
|
|
19
|
+
### Application
|
|
20
|
+
|
|
21
|
+
- [ ] Tech stack fully resolved (no "React or Vue")
|
|
22
|
+
- [ ] Data entities defined (3-5 core entities)
|
|
23
|
+
- [ ] API routes outlined
|
|
24
|
+
- [ ] Deployment target specified
|
|
25
|
+
- [ ] Security considerations addressed
|
|
26
|
+
|
|
27
|
+
### Workflow
|
|
28
|
+
|
|
29
|
+
- [ ] Trigger mechanism clear
|
|
30
|
+
- [ ] Integration points defined
|
|
31
|
+
- [ ] Error handling approach specified
|
|
32
|
+
- [ ] Usage examples provided
|
|
33
|
+
|
|
34
|
+
### Client
|
|
35
|
+
|
|
36
|
+
- [ ] Business goal is measurable
|
|
37
|
+
- [ ] Target audience is specific
|
|
38
|
+
- [ ] Conversion path defined
|
|
39
|
+
- [ ] Content requirements listed
|
|
40
|
+
- [ ] Timeline realistic
|
|
41
|
+
|
|
42
|
+
### Utility
|
|
43
|
+
|
|
44
|
+
- [ ] Single purpose (not expanding)
|
|
45
|
+
- [ ] Input/output clearly defined
|
|
46
|
+
- [ ] Usage examples work
|
|
47
|
+
- [ ] Edge cases considered
|
|
48
|
+
- [ ] Can be built in one session
|
|
49
|
+
|
|
50
|
+
### Campaign
|
|
51
|
+
|
|
52
|
+
- [ ] Goal is measurable (number, not "awareness")
|
|
53
|
+
- [ ] Timeline has specific dates
|
|
54
|
+
- [ ] Content types and quantities defined
|
|
55
|
+
- [ ] Channels selected
|
|
56
|
+
- [ ] Success metrics identified
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Pass/Fail Decision
|
|
61
|
+
|
|
62
|
+
**Pass:** All universal checks + all type-specific checks
|
|
63
|
+
|
|
64
|
+
**Conditional Pass:** 1-2 minor gaps, can be filled during build
|
|
65
|
+
|
|
66
|
+
**Fail:** Major gaps (problem unclear, tech stack TBD, no phases)
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## If Fail
|
|
71
|
+
|
|
72
|
+
Offer user:
|
|
73
|
+
1. Continue ideation to fill gaps
|
|
74
|
+
2. Graduate anyway (at own risk)
|
|
75
|
+
3. Switch to simpler type (e.g., Application → Utility)
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## If Pass
|
|
80
|
+
|
|
81
|
+
Proceed to graduation or launch.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Application Type Config
|
|
2
|
+
|
|
3
|
+
**Rigor:** Deep
|
|
4
|
+
**Description:** Software applications with UI, data model, API, and deployment
|
|
5
|
+
|
|
6
|
+
## Sections Required
|
|
7
|
+
1. Problem Statement
|
|
8
|
+
2. Target Users
|
|
9
|
+
3. Tech Stack
|
|
10
|
+
4. Data Model
|
|
11
|
+
5. API Surface
|
|
12
|
+
6. UI/UX Needs
|
|
13
|
+
7. Deployment Strategy
|
|
14
|
+
8. Security Considerations
|
|
15
|
+
9. Phase Breakdown
|
|
16
|
+
10. Success Criteria
|
|
17
|
+
|
|
18
|
+
## Demeanor
|
|
19
|
+
- Thorough and architectural
|
|
20
|
+
- Don't rush decisions
|
|
21
|
+
- Challenge assumptions
|
|
22
|
+
- Ensure scalability considerations
|
|
23
|
+
|
|
24
|
+
## Minimum for Graduation
|
|
25
|
+
- Tech stack fully resolved (no "TBD")
|
|
26
|
+
- Data entities defined
|
|
27
|
+
- API routes outlined
|
|
28
|
+
- Phase breakdown with 2+ phases
|
|
29
|
+
- Deployment target specified
|