qwen-seed 1.0.2 → 1.0.4
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 +2 -2
- package/bin/install.js +35 -13
- package/package.json +1 -1
- package/seed.md +10 -10
- package/tasks/add-type.md +3 -3
- package/tasks/graduate.md +2 -2
- package/tasks/ideate.md +6 -6
- package/tasks/launch.md +2 -2
package/README.md
CHANGED
|
@@ -81,7 +81,7 @@ Types are composable. Run `/seed add-type` to create your own — just drop file
|
|
|
81
81
|
## Architecture
|
|
82
82
|
|
|
83
83
|
```
|
|
84
|
-
commands/
|
|
84
|
+
commands/seed/
|
|
85
85
|
├── seed.md Entry point (routing + persona)
|
|
86
86
|
├── tasks/
|
|
87
87
|
│ ├── ideate.md Type-first guided ideation
|
|
@@ -148,7 +148,7 @@ The installer prompts you to choose:
|
|
|
148
148
|
### What Gets Installed
|
|
149
149
|
|
|
150
150
|
```
|
|
151
|
-
~/.qwen/commands/
|
|
151
|
+
~/.qwen/commands/seed/
|
|
152
152
|
├── seed.md Entry point (routing + persona)
|
|
153
153
|
├── tasks/ 5 task files
|
|
154
154
|
├── data/ 15 type-specific data files (5 types × 3 files)
|
package/bin/install.js
CHANGED
|
@@ -5,7 +5,6 @@ const path = require('path');
|
|
|
5
5
|
const os = require('os');
|
|
6
6
|
const readline = require('readline');
|
|
7
7
|
|
|
8
|
-
// Colors
|
|
9
8
|
const green = '\x1b[32m';
|
|
10
9
|
const cyan = '\x1b[36m';
|
|
11
10
|
const yellow = '\x1b[33m';
|
|
@@ -17,8 +16,8 @@ const pkg = require('../package.json');
|
|
|
17
16
|
const banner = `
|
|
18
17
|
${green} \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
19
18
|
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d
|
|
20
|
-
\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557
|
|
21
|
-
\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255d
|
|
19
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557
|
|
20
|
+
\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255d
|
|
22
21
|
\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
23
22
|
\u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u2550\u255d${reset}
|
|
24
23
|
|
|
@@ -54,15 +53,27 @@ function expandTilde(filePath) {
|
|
|
54
53
|
return filePath;
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Recursively copy directory, replacing ~/.qwen/ paths in .md files
|
|
58
|
+
* For global installs: pathPrefix = ~/.qwen/
|
|
59
|
+
* For local installs: pathPrefix = ./.qwen/
|
|
60
|
+
*/
|
|
61
|
+
function copyDir(srcDir, destDir, pathPrefix, skipDirs = []) {
|
|
58
62
|
fs.mkdirSync(destDir, { recursive: true });
|
|
59
63
|
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
60
64
|
for (const entry of entries) {
|
|
61
65
|
if (skipDirs.includes(entry.name)) continue;
|
|
62
66
|
const srcPath = path.join(srcDir, entry.name);
|
|
63
67
|
const destPath = path.join(destDir, entry.name);
|
|
64
|
-
if (entry.isDirectory())
|
|
65
|
-
|
|
68
|
+
if (entry.isDirectory()) {
|
|
69
|
+
copyDir(srcPath, destPath, pathPrefix, skipDirs);
|
|
70
|
+
} else if (entry.name.endsWith('.md')) {
|
|
71
|
+
let content = fs.readFileSync(srcPath, 'utf8');
|
|
72
|
+
content = content.replace(/~\/\.qwen\//g, pathPrefix);
|
|
73
|
+
fs.writeFileSync(destPath, content);
|
|
74
|
+
} else {
|
|
75
|
+
fs.copyFileSync(srcPath, destPath);
|
|
76
|
+
}
|
|
66
77
|
}
|
|
67
78
|
}
|
|
68
79
|
|
|
@@ -96,7 +107,7 @@ if (hasHelp) {
|
|
|
96
107
|
npx qwen-seed --local
|
|
97
108
|
|
|
98
109
|
${yellow}What gets installed:${reset}
|
|
99
|
-
${cyan}commands/
|
|
110
|
+
${cyan}commands/seed/${reset}
|
|
100
111
|
seed.md Entry point (routing + persona)
|
|
101
112
|
tasks/ 5 task files
|
|
102
113
|
data/ 15 type-specific data files
|
|
@@ -111,7 +122,10 @@ function install(isGlobal) {
|
|
|
111
122
|
const configDir = expandTilde(explicitConfigDir) || expandTilde(process.env.QWEN_CONFIG_DIR);
|
|
112
123
|
const globalDir = configDir || path.join(os.homedir(), '.qwen');
|
|
113
124
|
const qwenDir = isGlobal ? globalDir : path.join(process.cwd(), '.qwen');
|
|
114
|
-
const seedDest = path.join(qwenDir, 'commands', '
|
|
125
|
+
const seedDest = path.join(qwenDir, 'commands', 'seed');
|
|
126
|
+
|
|
127
|
+
// Path prefix for @-reference replacement in .md files
|
|
128
|
+
const pathPrefix = isGlobal ? '~/.qwen/' : './.qwen/';
|
|
115
129
|
|
|
116
130
|
const locationLabel = isGlobal
|
|
117
131
|
? seedDest.replace(os.homedir(), '~')
|
|
@@ -126,28 +140,36 @@ function install(isGlobal) {
|
|
|
126
140
|
console.log(` Installing to ${cyan}${locationLabel}${reset}\n`);
|
|
127
141
|
|
|
128
142
|
fs.mkdirSync(seedDest, { recursive: true });
|
|
129
|
-
|
|
143
|
+
|
|
144
|
+
// Copy seed.md with path replacement
|
|
145
|
+
let seedContent = fs.readFileSync(path.join(src, 'seed.md'), 'utf8');
|
|
146
|
+
seedContent = seedContent.replace(/~\/\.qwen\//g, pathPrefix);
|
|
147
|
+
fs.writeFileSync(path.join(seedDest, 'seed.md'), seedContent);
|
|
130
148
|
console.log(` ${green}+${reset} seed.md ${dim}(entry point)${reset}`);
|
|
131
149
|
|
|
150
|
+
// Copy tasks with path replacement
|
|
132
151
|
const tasksSrc = path.join(src, 'tasks');
|
|
133
152
|
const tasksDest = path.join(seedDest, 'tasks');
|
|
134
|
-
copyDir(tasksSrc, tasksDest);
|
|
153
|
+
copyDir(tasksSrc, tasksDest, pathPrefix);
|
|
135
154
|
console.log(` ${green}+${reset} tasks/ ${dim}(${countFiles(tasksSrc, '.md')} task files)${reset}`);
|
|
136
155
|
|
|
156
|
+
// Copy data with path replacement
|
|
137
157
|
const dataSrc = path.join(src, 'data');
|
|
138
158
|
const dataDest = path.join(seedDest, 'data');
|
|
139
|
-
copyDir(dataSrc, dataDest);
|
|
159
|
+
copyDir(dataSrc, dataDest, pathPrefix);
|
|
140
160
|
const typeCount = fs.readdirSync(dataSrc, { withFileTypes: true }).filter(e => e.isDirectory()).length;
|
|
141
161
|
console.log(` ${green}+${reset} data/ ${dim}(${typeCount} types, ${countFiles(dataSrc, '.md')} files)${reset}`);
|
|
142
162
|
|
|
163
|
+
// Copy templates with path replacement
|
|
143
164
|
const templatesSrc = path.join(src, 'templates');
|
|
144
165
|
const templatesDest = path.join(seedDest, 'templates');
|
|
145
|
-
copyDir(templatesSrc, templatesDest);
|
|
166
|
+
copyDir(templatesSrc, templatesDest, pathPrefix);
|
|
146
167
|
console.log(` ${green}+${reset} templates/ ${dim}(${countFiles(templatesSrc, '.md')} templates)${reset}`);
|
|
147
168
|
|
|
169
|
+
// Copy checklists with path replacement
|
|
148
170
|
const checklistsSrc = path.join(src, 'checklists');
|
|
149
171
|
const checklistsDest = path.join(seedDest, 'checklists');
|
|
150
|
-
copyDir(checklistsSrc, checklistsDest);
|
|
172
|
+
copyDir(checklistsSrc, checklistsDest, pathPrefix);
|
|
151
173
|
console.log(` ${green}+${reset} checklists/ ${dim}(planning quality gate)${reset}`);
|
|
152
174
|
|
|
153
175
|
console.log(`
|
package/package.json
CHANGED
package/seed.md
CHANGED
|
@@ -54,18 +54,18 @@ Project coach — helps shape raw ideas into structured, buildable plans.
|
|
|
54
54
|
Nothing — SEED is lightweight until a command is invoked.
|
|
55
55
|
|
|
56
56
|
## Load on Command
|
|
57
|
-
@{~/.qwen/commands/
|
|
58
|
-
@{~/.qwen/commands/
|
|
59
|
-
@{~/.qwen/commands/
|
|
60
|
-
@{~/.qwen/commands/
|
|
61
|
-
@{~/.qwen/commands/
|
|
57
|
+
@{~/.qwen/commands/seed/tasks/ideate.md} (when user runs /seed or /seed ideate)
|
|
58
|
+
@{~/.qwen/commands/seed/tasks/graduate.md} (when user runs /seed graduate)
|
|
59
|
+
@{~/.qwen/commands/seed/tasks/launch.md} (when user runs /seed launch)
|
|
60
|
+
@{~/.qwen/commands/seed/tasks/status.md} (when user runs /seed status)
|
|
61
|
+
@{~/.qwen/commands/seed/tasks/add-type.md} (when user runs /seed add-type)
|
|
62
62
|
|
|
63
63
|
## Load on Demand
|
|
64
|
-
@{~/.qwen/commands/
|
|
65
|
-
@{~/.qwen/commands/
|
|
66
|
-
@{~/.qwen/commands/
|
|
67
|
-
@{~/.qwen/commands/
|
|
68
|
-
@{~/.qwen/commands/
|
|
64
|
+
@{~/.qwen/commands/seed/data/{type}/guide.md} (after type selection during ideation — conversation sections)
|
|
65
|
+
@{~/.qwen/commands/seed/data/{type}/config.md} (after type selection — rigor level, demeanor, section requirements)
|
|
66
|
+
@{~/.qwen/commands/seed/data/{type}/skill-loadout.md} (during skill loadout step — ecosystem tool recommendations)
|
|
67
|
+
@{~/.qwen/commands/seed/templates/planning-{type}.md} (during PLANNING.md generation)
|
|
68
|
+
@{~/.qwen/commands/seed/checklists/planning-quality.md} (before graduate/launch — quality gate)
|
|
69
69
|
</routing>
|
|
70
70
|
|
|
71
71
|
<greeting>
|
package/tasks/add-type.md
CHANGED
|
@@ -13,9 +13,9 @@ As a builder with a project category SEED doesn't cover, I want to add a custom
|
|
|
13
13
|
</when-to-use>
|
|
14
14
|
|
|
15
15
|
<context>
|
|
16
|
-
@{~/.qwen/commands/
|
|
17
|
-
@{~/.qwen/commands/
|
|
18
|
-
@{~/.qwen/commands/
|
|
16
|
+
@{~/.qwen/commands/seed/data/application/guide.md} (reference for guide structure)
|
|
17
|
+
@{~/.qwen/commands/seed/data/application/config.md} (reference for config structure)
|
|
18
|
+
@{~/.qwen/commands/seed/data/application/skill-loadout.md} (reference for loadout structure)
|
|
19
19
|
</context>
|
|
20
20
|
|
|
21
21
|
<steps>
|
package/tasks/graduate.md
CHANGED
|
@@ -13,8 +13,8 @@ As a builder with a completed PLANNING.md, I want to graduate my project into a
|
|
|
13
13
|
</when-to-use>
|
|
14
14
|
|
|
15
15
|
<context>
|
|
16
|
-
@{~/.qwen/commands/
|
|
17
|
-
@{~/.qwen/commands/
|
|
16
|
+
@{~/.qwen/commands/seed/seed.md}
|
|
17
|
+
@{~/.qwen/commands/seed/checklists/planning-quality.md} (quality gate — loaded before graduation)
|
|
18
18
|
</context>
|
|
19
19
|
|
|
20
20
|
<steps>
|
package/tasks/ideate.md
CHANGED
|
@@ -14,12 +14,12 @@ As a builder with a raw idea, I want guided exploration shaped by my project typ
|
|
|
14
14
|
</when-to-use>
|
|
15
15
|
|
|
16
16
|
<context>
|
|
17
|
-
@{~/.qwen/commands/
|
|
18
|
-
@{~/.qwen/commands/
|
|
19
|
-
@{~/.qwen/commands/
|
|
20
|
-
@{~/.qwen/commands/
|
|
21
|
-
@{~/.qwen/commands/
|
|
22
|
-
@{~/.qwen/commands/
|
|
17
|
+
@{~/.qwen/commands/seed/seed.md}
|
|
18
|
+
@{~/.qwen/commands/seed/data/{type}/guide.md} (loaded after type selection)
|
|
19
|
+
@{~/.qwen/commands/seed/data/{type}/config.md} (loaded after type selection)
|
|
20
|
+
@{~/.qwen/commands/seed/data/{type}/skill-loadout.md} (loaded during skill loadout step)
|
|
21
|
+
@{~/.qwen/commands/seed/templates/planning-{type}.md} (loaded during output generation)
|
|
22
|
+
@{~/.qwen/commands/seed/checklists/planning-quality.md} (referenced as quality gate before output)
|
|
23
23
|
</context>
|
|
24
24
|
|
|
25
25
|
<steps>
|
package/tasks/launch.md
CHANGED
|
@@ -13,8 +13,8 @@ As a builder ready to start building, I want to graduate my project and set up P
|
|
|
13
13
|
</when-to-use>
|
|
14
14
|
|
|
15
15
|
<context>
|
|
16
|
-
@{~/.qwen/commands/
|
|
17
|
-
@{~/.qwen/commands/
|
|
16
|
+
@{~/.qwen/commands/seed/seed.md}
|
|
17
|
+
@{~/.qwen/commands/seed/tasks/graduate.md} (delegation target — launch wraps this flow)
|
|
18
18
|
</context>
|
|
19
19
|
|
|
20
20
|
<steps>
|