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 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/qwen-seed/
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/qwen-seed/
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
- function copyDir(srcDir, destDir, skipDirs = []) {
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()) copyDir(srcPath, destPath, skipDirs);
65
- else fs.copyFileSync(srcPath, destPath);
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/qwen-seed/${reset}
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', 'qwen-seed');
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
- fs.copyFileSync(path.join(src, 'seed.md'), path.join(seedDest, 'seed.md'));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwen-seed",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Typed project incubator — guided ideation through graduation for Qwen Code",
5
5
  "bin": {
6
6
  "qwen-seed": "bin/install.js"
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/qwen-seed/tasks/ideate.md} (when user runs /seed or /seed ideate)
58
- @{~/.qwen/commands/qwen-seed/tasks/graduate.md} (when user runs /seed graduate)
59
- @{~/.qwen/commands/qwen-seed/tasks/launch.md} (when user runs /seed launch)
60
- @{~/.qwen/commands/qwen-seed/tasks/status.md} (when user runs /seed status)
61
- @{~/.qwen/commands/qwen-seed/tasks/add-type.md} (when user runs /seed add-type)
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/qwen-seed/data/{type}/guide.md} (after type selection during ideation — conversation sections)
65
- @{~/.qwen/commands/qwen-seed/data/{type}/config.md} (after type selection — rigor level, demeanor, section requirements)
66
- @{~/.qwen/commands/qwen-seed/data/{type}/skill-loadout.md} (during skill loadout step — ecosystem tool recommendations)
67
- @{~/.qwen/commands/qwen-seed/templates/planning-{type}.md} (during PLANNING.md generation)
68
- @{~/.qwen/commands/qwen-seed/checklists/planning-quality.md} (before graduate/launch — quality gate)
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/qwen-seed/data/application/guide.md} (reference for guide structure)
17
- @{~/.qwen/commands/qwen-seed/data/application/config.md} (reference for config structure)
18
- @{~/.qwen/commands/qwen-seed/data/application/skill-loadout.md} (reference for loadout structure)
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/qwen-seed/seed.md}
17
- @{~/.qwen/commands/qwen-seed/checklists/planning-quality.md} (quality gate — loaded before graduation)
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/qwen-seed/seed.md}
18
- @{~/.qwen/commands/qwen-seed/data/{type}/guide.md} (loaded after type selection)
19
- @{~/.qwen/commands/qwen-seed/data/{type}/config.md} (loaded after type selection)
20
- @{~/.qwen/commands/qwen-seed/data/{type}/skill-loadout.md} (loaded during skill loadout step)
21
- @{~/.qwen/commands/qwen-seed/templates/planning-{type}.md} (loaded during output generation)
22
- @{~/.qwen/commands/qwen-seed/checklists/planning-quality.md} (referenced as quality gate before output)
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/qwen-seed/seed.md}
17
- @{~/.qwen/commands/qwen-seed/tasks/graduate.md} (delegation target — launch wraps this flow)
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>