ideabox 1.0.0 → 1.0.2

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.
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "ideabox",
3
+ "version": "1.0.2",
4
+ "description": "Data-driven project idea engine. Researches real market demand, scores ideas on monetization and open-source impact, and orchestrates a full pipeline from idea to shipped code.",
5
+ "author": {
6
+ "name": "Pawan Paudel"
7
+ },
8
+ "repository": "https://github.com/pawanpaudel93/ideabox",
9
+ "homepage": "https://github.com/pawanpaudel93/ideabox",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "ideabox",
13
+ "ideas",
14
+ "project-ideas",
15
+ "monetization",
16
+ "research",
17
+ "developer-tools",
18
+ "agent-skill"
19
+ ]
20
+ }
package/README.md CHANGED
@@ -1,24 +1,19 @@
1
- <p align="center">
2
- <h1 align="center">IdeaBox</h1>
3
- <p align="center">Data-driven project idea engine for coding agents</p>
4
- </p>
1
+ # IdeaBox
5
2
 
6
- <p align="center">
7
- <a href="https://www.npmjs.com/package/ideabox"><img src="https://img.shields.io/npm/v/ideabox.svg" alt="npm version"></a>
8
- <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
9
- <a href="https://github.com/pawanpaudel93/ideabox"><img src="https://img.shields.io/github/stars/pawanpaudel93/ideabox?style=social" alt="GitHub stars"></a>
10
- </p>
3
+ [![npm version](https://img.shields.io/npm/v/ideabox.svg)](https://www.npmjs.com/package/ideabox)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+ [![GitHub stars](https://img.shields.io/github/stars/pawanpaudel93/ideabox?style=social)](https://github.com/pawanpaudel93/ideabox)
11
6
 
12
- ---
13
-
14
- Researches real market demand, scores ideas on monetization and open-source impact, and orchestrates a full **9-phase pipeline** from idea to shipped code. Self-improving — gets smarter with every session.
7
+ > Data-driven project idea engine for coding agents. Researches real market demand, scores ideas on monetization and open-source impact, and orchestrates a full **9-phase pipeline** from idea to shipped code. Self-improving — gets smarter with every session.
15
8
 
16
9
  ## Table of Contents
17
10
 
18
- - [The Problem](#the-problem)
19
- - [The Solution](#the-solution)
11
+ - [Problem](#the-problem)
12
+ - [Solution](#the-solution)
20
13
  - [Features](#features)
21
14
  - [Installation](#installation)
15
+ - [Requirements](#requirements)
16
+ - [Permissions](#permissions)
22
17
  - [Usage](#usage)
23
18
  - [How It Works](#how-it-works)
24
19
  - [Scoring](#scoring)
@@ -27,13 +22,14 @@ Researches real market demand, scores ideas on monetization and open-source impa
27
22
  - [Persistence](#persistence)
28
23
  - [Architecture](#architecture)
29
24
  - [CLI](#cli)
30
- - [Requirements](#requirements)
31
25
  - [Contributing](#contributing)
26
+ - [Acknowledgements](#acknowledgements)
32
27
  - [License](#license)
33
28
 
34
29
  ## The Problem
35
30
 
36
31
  You have Claude Code tokens but no idea what to build. Existing idea generators are either:
32
+
37
33
  - **Static lists** frozen in time (91K+ stars on app-ideas, never updated)
38
34
  - **Thin AI wrappers** that hallucinate untested concepts
39
35
  - **Validation-only tools** that require you already have an idea
@@ -71,21 +67,95 @@ IdeaBox researches **real demand signals** from 6 source categories — HN, GitH
71
67
  claude plugin add pawanpaudel93/ideabox
72
68
  ```
73
69
 
74
- ### Via npm
70
+ ### Via npm (recommended for CLI install)
75
71
 
76
72
  ```bash
77
73
  npx ideabox init
78
74
  ```
79
75
 
76
+ This copies skills into your project's `.claude/skills/` directory with all phase files and references bundled into each skill.
77
+
80
78
  ### From Source
81
79
 
82
80
  ```bash
83
81
  git clone https://github.com/pawanpaudel93/ideabox.git
84
82
  cd ideabox
85
- npm install
83
+ pnpm install
86
84
  node bin/cli.mjs init
87
85
  ```
88
86
 
87
+ ## Requirements
88
+
89
+ - [Claude Code](https://code.claude.com) or [Codex CLI](https://github.com/openai/codex)
90
+ - Node.js >= 18
91
+ - `gh` CLI (recommended — higher GitHub API rate limits)
92
+
93
+ ## Permissions
94
+
95
+ IdeaBox uses these tools during its pipeline:
96
+
97
+ | Tool | Phase | Purpose |
98
+ |------|-------|---------|
99
+ | `WebSearch` | Research | Search HN, GitHub, Reddit for demand signals |
100
+ | `WebFetch` | Research | Hit structured APIs (HN Algolia, npm, Reddit JSON) |
101
+ | `Agent` | Research, Build | Parallel subagents for research and implementation |
102
+ | `Read` | All | Read files, state, research artifacts |
103
+ | `Write` | All | Write phase outputs, state, profiles |
104
+ | `Edit` | Build, Polish | Modify source code |
105
+ | `Bash` | Build, QA, Ship | Run tests, git commands, CLI tools |
106
+ | `Glob` / `Grep` | Build, QA | Search codebase |
107
+
108
+ ### Claude Code
109
+
110
+ **Auto mode (recommended)** — press `Shift+Tab` to toggle. Approves most tool calls with background safety checks. Requires Team/Enterprise/API plan with Sonnet 4.6+ or Opus 4.6+.
111
+
112
+ **Accept edits mode** — press `Shift+Tab` to select `acceptEdits`. Auto-approves file changes, prompts for Bash and network.
113
+
114
+ **Custom permission rules** — add to `.claude/settings.json` (project) or `~/.claude/settings.json` (global):
115
+
116
+ ```json
117
+ {
118
+ "permissions": {
119
+ "allow": [
120
+ "WebSearch",
121
+ "WebFetch",
122
+ "Glob",
123
+ "Grep",
124
+ "Read",
125
+ "Edit",
126
+ "Write",
127
+ "Bash(git *)",
128
+ "Bash(gh *)",
129
+ "Bash(npm *)",
130
+ "Bash(pnpm *)",
131
+ "Bash(node *)"
132
+ ]
133
+ }
134
+ }
135
+ ```
136
+
137
+ > **Note:** `deny` rules take precedence over `allow`. Protected paths (`.git/`, `.env`) always prompt regardless of mode.
138
+
139
+ ### Codex CLI
140
+
141
+ ```bash
142
+ # Recommended: workspace-write sandbox with auto-approvals
143
+ codex --full-auto "run ideabox research"
144
+
145
+ # More control: approval mode + sandbox separately
146
+ codex -a untrusted -s workspace-write "run ideabox"
147
+
148
+ # Maximum access (use with caution)
149
+ codex --yolo "run ideabox"
150
+ ```
151
+
152
+ | Codex Flag | Claude Code Equivalent |
153
+ |-----------|----------------------|
154
+ | `-a on-request` | `default` mode |
155
+ | `-a untrusted` | `acceptEdits` mode |
156
+ | `--full-auto` | `auto` mode (sandboxed) |
157
+ | `--yolo` | `bypassPermissions` mode |
158
+
89
159
  ## Usage
90
160
 
91
161
  ```
@@ -93,8 +163,7 @@ node bin/cli.mjs init
93
163
  /ideabox research # Browse ideas without building
94
164
  /ideabox backlog # View saved ideas
95
165
  /ideabox backlog compare 1 3 # Head-to-head idea comparison
96
- /ideabox profile # Set up or edit your profile
97
- /ideabox profile # Reset learning data (choose "reset learning")
166
+ /ideabox profile # Set up, edit, or reset learning
98
167
  ```
99
168
 
100
169
  ### First Run
@@ -226,15 +295,19 @@ All research uses **token-efficient structured APIs** (not generic web scraping)
226
295
  IdeaBox gets smarter the more you use it through **4 auto-iterating loops**:
227
296
 
228
297
  ### 1. Preference Learning (immediate)
298
+
229
299
  Tracks which ideas you accept, dismiss, start, complete, or abandon. Updates category/complexity/monetization scores. Anti-echo-chamber: always reserves 10% for diverse suggestions.
230
300
 
231
301
  ### 2. Source Quality Tracking (after 5 sessions)
302
+
232
303
  Tracks which research sources contribute to ideas you actually choose. High-performing sources get expanded queries; low-performing sources get reduced. Scores clamped to [0.1, 1.0] — nothing fully eliminated.
233
304
 
234
305
  ### 3. Scoring Weight Adaptation (after 10 outcomes)
306
+
235
307
  Tracks which scoring dimensions predict ideas that actually ship. Auto-adjusts weights (e.g., demand signal matters more than feasibility for you). Clamped to [0.5x, 1.5x] to prevent over-fitting.
236
308
 
237
309
  ### 4. Query Evolution (after 3 uses per query)
310
+
238
311
  Tracks which search queries return useful results. Productive queries spawn variations; dead queries retire. Retired queries archived for trend analysis.
239
312
 
240
313
  **Reset:** `/ideabox profile` -> choose "reset learning"
@@ -269,15 +342,15 @@ ideabox/
269
342
  │ ├── ideabox/ # Main skill (/ideabox)
270
343
  │ │ ├── SKILL.md # Pipeline router (~3KB)
271
344
  │ │ ├── phases/
272
- │ │ │ ├── 01-research.md # Parallel API research
273
- │ │ │ ├── 02-brainstorm.md # Design spec creation
274
- │ │ │ ├── 03-plan.md # TDD implementation plan
275
- │ │ │ ├── 04-build.md # Subagent-driven development
276
- │ │ │ ├── 05-qa.md # Health score testing
277
- │ │ │ ├── 06-polish.md # Visual QA + AI slop detection
278
- │ │ │ ├── 07-ship.md # PR + version + changelog
279
- │ │ │ ├── 08-post-ship.md # Canary + docs sync
280
- │ │ │ └── 09-learn.md # Self-improvement
345
+ │ │ │ ├── 01-research.md
346
+ │ │ │ ├── 02-brainstorm.md
347
+ │ │ │ ├── 03-plan.md
348
+ │ │ │ ├── 04-build.md
349
+ │ │ │ ├── 05-qa.md
350
+ │ │ │ ├── 06-polish.md
351
+ │ │ │ ├── 07-ship.md
352
+ │ │ │ ├── 08-post-ship.md
353
+ │ │ │ └── 09-learn.md
281
354
  │ │ └── references/
282
355
  │ │ ├── research-sources.md
283
356
  │ │ ├── scoring-rubric.md
@@ -302,86 +375,13 @@ npx ideabox doctor # Run health checks
302
375
  ```
303
376
 
304
377
  The `doctor` command verifies:
378
+
305
379
  - Node.js >= 18
306
380
  - Data directory (`~/.ideabox/`)
307
381
  - Profile configured
308
382
  - Skills installed (checks Claude Code and Codex paths)
309
383
  - CLI availability
310
384
 
311
- ## Requirements
312
-
313
- - [Claude Code](https://code.claude.com) or [Codex CLI](https://github.com/openai/codex)
314
- - Node.js >= 18
315
- - `gh` CLI recommended (for GitHub API access with higher rate limits)
316
-
317
- ## Permissions
318
-
319
- IdeaBox uses these tools during its pipeline:
320
-
321
- | Tool | Phase | Purpose |
322
- |------|-------|---------|
323
- | `WebSearch` | Research | Search HN, GitHub, Reddit for demand signals |
324
- | `WebFetch` | Research | Hit structured APIs (HN Algolia, npm, Reddit JSON) |
325
- | `Agent` | Research, Build | Parallel subagents for research and implementation |
326
- | `Read` | All | Read files, state, research artifacts |
327
- | `Write` | All | Write phase outputs, state, profiles |
328
- | `Edit` | Build, Polish | Modify source code |
329
- | `Bash` | Build, QA, Ship | Run tests, git commands, CLI tools |
330
- | `Glob` / `Grep` | Build, QA | Search codebase |
331
-
332
- ### Claude Code
333
-
334
- **Option 1: Auto mode (recommended)** — press `Shift+Tab` to toggle. Approves most tool calls with background safety checks. Requires Team/Enterprise/API plan with Sonnet 4.6+ or Opus 4.6+.
335
-
336
- **Option 2: Accept edits mode** — press `Shift+Tab` to select `acceptEdits`. Auto-approves file changes, prompts for Bash and network.
337
-
338
- **Option 3: Custom permission rules** — add to `.claude/settings.json` (project) or `~/.claude/settings.json` (global):
339
-
340
- ```json
341
- {
342
- "permissions": {
343
- "allow": [
344
- "WebSearch",
345
- "WebFetch",
346
- "Glob",
347
- "Grep",
348
- "Read",
349
- "Edit",
350
- "Write",
351
- "Bash(git *)",
352
- "Bash(gh *)",
353
- "Bash(npm *)",
354
- "Bash(pnpm *)",
355
- "Bash(node *)"
356
- ]
357
- }
358
- }
359
- ```
360
-
361
- > **Note:** `deny` rules take precedence over `allow`. Protected paths (`.git/`, `.env`) always prompt regardless of mode.
362
-
363
- ### Codex CLI
364
-
365
- Codex CLI uses different permission flags:
366
-
367
- ```bash
368
- # Recommended: workspace-write sandbox with auto-approvals
369
- codex --full-auto "run ideabox research"
370
-
371
- # More control: approval mode + sandbox separately
372
- codex -a untrusted -s workspace-write "run ideabox"
373
-
374
- # Maximum access (use with caution)
375
- codex --yolo "run ideabox"
376
- ```
377
-
378
- | Codex Flag | Claude Code Equivalent |
379
- |-----------|----------------------|
380
- | `-a on-request` | `default` mode |
381
- | `-a untrusted` | `acceptEdits` mode |
382
- | `--full-auto` | `auto` mode (sandboxed) |
383
- | `--yolo` | `bypassPermissions` mode |
384
-
385
385
  ## Contributing
386
386
 
387
387
  Contributions welcome! Please:
@@ -397,7 +397,7 @@ Contributions welcome! Please:
397
397
  IdeaBox's pipeline design was inspired by patterns and approaches from these projects:
398
398
 
399
399
  | Project | Inspiration |
400
- |---------|--------------|
400
+ |---------|-------------|
401
401
  | [superpowers](https://github.com/obra/superpowers) | Brainstorming workflow, TDD discipline, writing-plans, subagent-driven development, verification-before-completion, systematic debugging |
402
402
  | [gstack](https://github.com/garrytan/gstack) | QA health score rubric, design review with AI slop detection, ship workflow, canary monitoring, office-hours forcing questions |
403
403
  | [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode) | Deep-interview validation, artifact-based phase skipping, autopilot phase chaining |
package/bin/cli.mjs CHANGED
@@ -18,11 +18,58 @@ const __dirname = dirname(__filename);
18
18
  const ROOT = resolve(__dirname, "..");
19
19
 
20
20
  const SKILLS = ["ideabox", "research", "backlog", "profile"];
21
+ const VALID_TARGETS = ["claude", "codex", "codex-project"];
21
22
  const MARKER_START = "<!-- ideabox:start -->";
22
23
  const MARKER_END = "<!-- ideabox:end -->";
24
+ const INSTALL_MARKER = ".ideabox-installed";
23
25
  const HOME = homedir();
24
26
  const DATA_DIR = join(HOME, ".ideabox");
25
27
 
28
+ // ASCII-safe status indicators (work on all terminals)
29
+ const OK = "[OK]";
30
+ const FAIL = "[X] ";
31
+ const WARN = "[!] ";
32
+ const INFO = "[-] ";
33
+
34
+ function readPackageVersion() {
35
+ try {
36
+ const pkg = JSON.parse(readFileSync(join(ROOT, "package.json"), "utf-8"));
37
+ return pkg.version || "unknown";
38
+ } catch {
39
+ return "unknown";
40
+ }
41
+ }
42
+
43
+ function printHelp() {
44
+ console.log(`
45
+ ideabox v${readPackageVersion()}
46
+ Data-driven project idea engine for coding agents
47
+
48
+ Usage:
49
+ ideabox <command> [targets...] [options]
50
+
51
+ Commands:
52
+ init [targets...] Install skills to current project
53
+ uninstall [targets...] Remove skills from current project
54
+ doctor Run health checks
55
+ --version, -v Show version
56
+ --help, -h Show this help
57
+
58
+ Targets:
59
+ claude Install to .claude/skills/ (project)
60
+ codex Install to ~/.codex/skills/ (user)
61
+ codex-project Install to .codex/skills/ (project)
62
+
63
+ If no target is specified, auto-detects based on installed CLIs.
64
+
65
+ Examples:
66
+ ideabox init Auto-detect and install
67
+ ideabox init claude Install only to Claude Code
68
+ ideabox init claude codex Install to both Claude and Codex
69
+ ideabox doctor Check installation health
70
+ `);
71
+ }
72
+
26
73
  function hasCommand(cmd) {
27
74
  try {
28
75
  const check = process.platform === "win32" ? `where ${cmd}` : `command -v ${cmd}`;
@@ -44,6 +91,15 @@ function autoDetect() {
44
91
  return targets;
45
92
  }
46
93
 
94
+ function validateTargets(targets) {
95
+ const invalid = targets.filter((t) => !VALID_TARGETS.includes(t));
96
+ if (invalid.length > 0) {
97
+ console.error(`\nError: Unknown target(s): ${invalid.join(", ")}`);
98
+ console.error(`Valid targets: ${VALID_TARGETS.join(", ")}\n`);
99
+ process.exit(1);
100
+ }
101
+ }
102
+
47
103
  function getSkillsDir(target) {
48
104
  switch (target) {
49
105
  case "claude":
@@ -53,11 +109,12 @@ function getSkillsDir(target) {
53
109
  case "codex-project":
54
110
  return join(process.cwd(), ".codex", "skills");
55
111
  default:
56
- return join(process.cwd(), ".claude", "skills");
112
+ throw new Error(`Unknown target: ${target}`);
57
113
  }
58
114
  }
59
115
 
60
116
  function getInstructionFile(target) {
117
+ // Codex reads AGENTS.md from project root even for global install
61
118
  if (target === "codex" || target === "codex-project") {
62
119
  return join(process.cwd(), "AGENTS.md");
63
120
  }
@@ -132,6 +189,9 @@ function installSkills(target) {
132
189
  }
133
190
  }
134
191
 
192
+ // Write marker file so uninstall knows this skill was ours
193
+ writeFileSync(join(dest, INSTALL_MARKER), `ideabox v${readPackageVersion()}\n`);
194
+
135
195
  console.log(` Installed ${skill}`);
136
196
  }
137
197
  }
@@ -151,7 +211,7 @@ function install(targets) {
151
211
  console.log(`Target: ${target}`);
152
212
  installSkills(target);
153
213
  mergeInstructionFile(target);
154
- console.log(` Merged instruction file for ${target}`);
214
+ console.log(` Merged instruction file: ${getInstructionFile(target)}`);
155
215
  }
156
216
 
157
217
  console.log("\nDone! Run /ideabox to get started.\n");
@@ -165,9 +225,14 @@ function uninstall(targets) {
165
225
 
166
226
  for (const skill of SKILLS) {
167
227
  const dest = join(skillsDir, skill);
168
- if (existsSync(dest)) {
228
+ if (!existsSync(dest)) continue;
229
+
230
+ // Only remove skills that have our install marker
231
+ if (existsSync(join(dest, INSTALL_MARKER))) {
169
232
  rmSync(dest, { recursive: true });
170
233
  console.log(` Removed ${skill}`);
234
+ } else {
235
+ console.log(` Skipped ${skill} (not installed by ideabox)`);
171
236
  }
172
237
  }
173
238
 
@@ -184,58 +249,69 @@ function uninstall(targets) {
184
249
  console.log(`\nNote: ${DATA_DIR} was kept. Delete it manually if you want to remove all data.\n`);
185
250
  }
186
251
 
252
+ function checkSkillsAt(label, skillsDir) {
253
+ if (!existsSync(skillsDir)) return null;
254
+ const installed = SKILLS.filter((s) => existsSync(join(skillsDir, s)));
255
+ return { label, path: skillsDir, installed };
256
+ }
257
+
187
258
  function doctor() {
188
259
  console.log("\nIdeaBox -- Health Check\n");
189
260
  let ok = true;
190
261
 
191
262
  // Check 1: Node version
192
- const nodeVersion = parseInt(process.version.slice(1));
263
+ const nodeVersion = parseInt(process.version.slice(1), 10);
193
264
  if (nodeVersion >= 18) {
194
- console.log(` Node.js ${process.version}`);
265
+ console.log(` ${OK} Node.js ${process.version}`);
195
266
  } else {
196
- console.log(` Node.js ${process.version} (need >= 18)`);
267
+ console.log(` ${FAIL} Node.js ${process.version} (need >= 18)`);
197
268
  ok = false;
198
269
  }
199
270
 
200
271
  // Check 2: Data directory
201
272
  if (existsSync(DATA_DIR)) {
202
- console.log(` Data directory exists (${DATA_DIR})`);
273
+ console.log(` ${OK} Data directory exists (${DATA_DIR})`);
203
274
  } else {
204
- console.log(` Data directory missing (${DATA_DIR})`);
275
+ console.log(` ${FAIL} Data directory missing (${DATA_DIR})`);
205
276
  ok = false;
206
277
  }
207
278
 
208
279
  // Check 3: Profile
209
280
  const profilePath = join(DATA_DIR, "profile.json");
210
281
  if (existsSync(profilePath)) {
211
- console.log(` Profile configured`);
282
+ console.log(` ${OK} Profile configured`);
212
283
  } else {
213
- console.log(` No profile yet (will be created on first /ideas run)`);
284
+ console.log(` ${INFO} No profile yet (will be created on first /ideabox run)`);
214
285
  }
215
286
 
216
- // Check 4: Skills installed (check both Claude and Codex paths)
217
- const claudeSkills = join(process.cwd(), ".claude", "skills");
218
- const codexSkills = join(HOME, ".codex", "skills");
219
- const claudeInstalled = SKILLS.filter((s) => existsSync(join(claudeSkills, s)));
220
- const codexInstalled = SKILLS.filter((s) => existsSync(join(codexSkills, s)));
221
- const installed = claudeInstalled.length >= codexInstalled.length ? claudeInstalled : codexInstalled;
222
- const installTarget = claudeInstalled.length >= codexInstalled.length ? "Claude" : "Codex";
223
- if (installed.length === SKILLS.length) {
224
- console.log(` All ${SKILLS.length} skills installed (${installTarget})`);
225
- } else if (installed.length > 0) {
226
- console.log(` △ ${installed.length}/${SKILLS.length} skills installed (${installed.join(", ")})`);
227
- } else {
228
- console.log(` ✗ No skills installed in current project`);
287
+ // Check 4: Skills installed (check all target paths)
288
+ const paths = [
289
+ checkSkillsAt("Claude (.claude/skills)", join(process.cwd(), ".claude", "skills")),
290
+ checkSkillsAt("Codex user (~/.codex/skills)", join(HOME, ".codex", "skills")),
291
+ checkSkillsAt("Codex project (./.codex/skills)", join(process.cwd(), ".codex", "skills")),
292
+ ].filter(Boolean);
293
+
294
+ const anyInstalled = paths.some((p) => p.installed.length > 0);
295
+ if (!anyInstalled) {
296
+ console.log(` ${FAIL} No skills installed in current project`);
229
297
  ok = false;
298
+ } else {
299
+ for (const p of paths) {
300
+ if (p.installed.length === SKILLS.length) {
301
+ console.log(` ${OK} ${p.label}: ${p.installed.length}/${SKILLS.length} skills`);
302
+ } else if (p.installed.length > 0) {
303
+ console.log(` ${WARN} ${p.label}: ${p.installed.length}/${SKILLS.length} skills (${p.installed.join(", ")})`);
304
+ }
305
+ }
230
306
  }
231
307
 
232
308
  // Check 5: Claude Code / Codex available
233
309
  if (hasCommand("claude")) {
234
- console.log(` Claude Code CLI detected`);
310
+ console.log(` ${OK} Claude Code CLI detected`);
235
311
  } else if (hasCommand("codex")) {
236
- console.log(` Codex CLI detected`);
312
+ console.log(` ${OK} Codex CLI detected`);
237
313
  } else {
238
- console.log(` No supported CLI found (optional)`);
314
+ console.log(` ${INFO} No supported CLI found (optional)`);
239
315
  }
240
316
 
241
317
  console.log(ok ? "\n All checks passed!\n" : "\n Some issues found.\n");
@@ -244,13 +320,26 @@ function doctor() {
244
320
  // --- Main ---
245
321
  function parseTargets(args) {
246
322
  const explicit = args.slice(1).filter((a) => !a.startsWith("-") && a !== "--");
247
- return explicit.length > 0 ? explicit : autoDetect();
323
+ if (explicit.length > 0) {
324
+ validateTargets(explicit);
325
+ return explicit;
326
+ }
327
+ return autoDetect();
248
328
  }
249
329
 
250
330
  const args = process.argv.slice(2);
251
331
  const command = args[0] || "init";
252
332
 
253
333
  switch (command) {
334
+ case "--version":
335
+ case "-v":
336
+ console.log(`ideabox v${readPackageVersion()}`);
337
+ break;
338
+ case "--help":
339
+ case "-h":
340
+ case "help":
341
+ printHelp();
342
+ break;
254
343
  case "init":
255
344
  install(parseTargets(args));
256
345
  break;
@@ -261,7 +350,7 @@ switch (command) {
261
350
  doctor();
262
351
  break;
263
352
  default:
264
- console.log(`Unknown command: ${command}`);
265
- console.log("Usage: ideabox-agent [init|uninstall|doctor]");
353
+ console.log(`Unknown command: ${command}\n`);
354
+ printHelp();
266
355
  process.exit(1);
267
356
  }
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "ideabox",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Data-driven project idea engine for coding agents. Research, brainstorm, plan, and build — all from one command.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "ideabox": "bin/cli.mjs"
8
8
  },
9
9
  "files": [
10
+ ".claude-plugin/",
10
11
  "bin/",
11
12
  "skills/",
12
13
  "CLAUDE.md",
@@ -33,7 +34,7 @@
33
34
  "bumpp": "^10.4.1"
34
35
  },
35
36
  "scripts": {
36
- "version": "node --input-type=commonjs -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('.claude-plugin/plugin.json'));p.version=require('./package.json').version;fs.writeFileSync('.claude-plugin/plugin.json',JSON.stringify(p,null,2)+'\\n');\"",
37
- "release": "bumpp && pnpm publish"
37
+ "version": "node --input-type=commonjs -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('.claude-plugin/plugin.json'));p.version=require('./package.json').version;fs.writeFileSync('.claude-plugin/plugin.json',JSON.stringify(p,null,2)+'\\n');\" && git add .claude-plugin/plugin.json",
38
+ "release": "bumpp --all && pnpm publish"
38
39
  }
39
40
  }
@@ -19,15 +19,15 @@ Read `~/.ideabox/ideas.jsonl`. Each line is a JSON object. There are two record
19
19
  To get the current status of an idea: find the latest `status_update` for that `idea_id`. If no status_update exists, use the idea record's `status` field.
20
20
 
21
21
  Parse arguments from the user's command:
22
- - `/ideas backlog` — show all ideas grouped by status
23
- - `/ideas backlog saved` — show only saved ideas
24
- - `/ideas backlog dismissed` — show only dismissed ideas
25
- - `/ideas backlog built` — show only built ideas
22
+ - `/ideabox backlog` — show all ideas grouped by status
23
+ - `/ideabox backlog saved` — show only saved ideas
24
+ - `/ideabox backlog dismissed` — show only dismissed ideas
25
+ - `/ideabox backlog built` — show only built ideas
26
26
 
27
27
  ## Display Format
28
28
 
29
29
  ### If ideas.jsonl does not exist or is empty
30
- "No ideas in your backlog yet. Run `/ideas` to research your first batch!"
30
+ "No ideas in your backlog yet. Run `/ideabox` to research your first batch!"
31
31
 
32
32
  ### If ideas exist
33
33
 
@@ -50,14 +50,14 @@ Group by current status and display:
50
50
  |---|------|-------|---------|
51
51
 
52
52
  ### Dismissed
53
- Showing {count} dismissed ideas. Use `/ideas backlog dismissed` for details.
53
+ Showing {count} dismissed ideas. Use `/ideabox backlog dismissed` for details.
54
54
  ```
55
55
 
56
56
  ## Actions
57
57
 
58
58
  After displaying, offer:
59
59
  - "Pick a number to brainstorm and build that idea"
60
- - "Or run `/ideas` for fresh research"
60
+ - "Or run `/ideabox` for fresh research"
61
61
 
62
62
  If the user picks a saved idea by number:
63
63
  1. Read the full idea record from `ideas.jsonl`
@@ -69,23 +69,23 @@ If the user picks a saved idea by number:
69
69
  {"type":"status_update","idea_id":"{id}","old_status":"saved","new_status":"planned","timestamp":"{ISO}"}
70
70
  ```
71
71
  b. Create `.ideabox/` and `.ideabox/session/` directories if they don't exist
72
- c. Initialize `.ideabox/state.json`:
72
+ c. Write the idea details to `.ideabox/session/01-research.md` first (so phase 02 has context and state references a real file)
73
+ d. Initialize `.ideabox/state.json` with the artifact path populated:
73
74
  ```json
74
75
  {
75
76
  "session_id": "sess_YYYYMMDD_HHMMSS",
76
77
  "current_phase": "02-brainstorm",
77
- "phases_completed": [],
78
+ "phases_completed": ["01-research"],
78
79
  "idea": {"id": "{id}", "title": "{title}", "problem": "{problem}"},
79
- "artifacts": {},
80
+ "artifacts": {"research": ".ideabox/session/01-research.md"},
80
81
  "started_at": "{ISO}"
81
82
  }
82
83
  ```
83
- d. Write the idea details to `.ideabox/session/01-research.md` (so phase 02 has context)
84
84
  e. Read `${CLAUDE_SKILL_DIR}/phases/02-brainstorm.md` and follow it
85
85
 
86
86
  ## Comparison Mode
87
87
 
88
- If the user says `/ideas backlog compare N M` (e.g., `compare 1 3`):
88
+ If the user says `/ideabox backlog compare N M` (e.g., `compare 1 3`):
89
89
 
90
90
  1. Load both idea records from `ideas.jsonl`
91
91
  2. Present using the visual comparison format from `${CLAUDE_SKILL_DIR}/references/scoring-rubric.md` (Head-to-Head section) — with score bars, evidence, and a recommendation
@@ -10,14 +10,14 @@ argument-hint: "[research|backlog|profile]"
10
10
 
11
11
  # IdeaBox — Full Pipeline
12
12
 
13
- Research -> Present -> Pick -> Brainstorm -> Plan -> Build -> QA -> Polish -> Ship -> Post-Ship -> Learn
13
+ Research -> Brainstorm -> Plan -> Build -> QA -> Polish -> Ship -> Post-Ship -> Learn
14
14
 
15
15
  ## Subcommand Routing
16
16
 
17
17
  Check if the user passed a subcommand:
18
- - `/ideabox research` -> invoke `ideabox:research` skill
19
- - `/ideabox backlog` -> invoke `ideabox:backlog` skill
20
- - `/ideabox profile` -> invoke `ideabox:profile` skill
18
+ - `/ideabox research` -> invoke the `research` skill (namespaced as `ideabox:research` when installed as plugin)
19
+ - `/ideabox backlog` -> invoke the `backlog` skill (namespaced as `ideabox:backlog` when installed as plugin)
20
+ - `/ideabox profile` -> invoke the `profile` skill (namespaced as `ideabox:profile` when installed as plugin)
21
21
  - `/ideabox` (no subcommand) -> continue with pipeline below
22
22
  - `/ideabox [anything else]` -> respond: "Unknown subcommand. Available: `/ideabox`, `/ideabox research`, `/ideabox backlog`, `/ideabox profile`"
23
23
 
@@ -33,10 +33,13 @@ Ask: "You have an in-progress session (Phase: {current_phase}, Idea: {idea.title
33
33
  **If no state.json or starting fresh:**
34
34
  1. Create `.ideabox/` and `.ideabox/session/` directories
35
35
  2. Add `.ideabox/` to the project's `.gitignore` if not already present (session state should not be committed)
36
- 3. Check for existing artifacts (phase skipping):
37
- - If `~/.ideabox/research/` has a file from today -> ask: "You already researched today. Use those results or research fresh?"
38
- - If `.ideabox/session/02-brainstorm-spec.md` exists -> ask: "Found an existing spec. Resume from planning?"
39
- - If `.ideabox/session/03-plan.md` exists -> ask: "Found an existing plan. Resume from building?"
36
+ 3. Check for existing artifacts (phase skipping). Scan `.ideabox/session/` for any of these files and offer to skip ahead:
37
+ - `01-research.md` exists -> ask: "Found research results. Resume from brainstorm?"
38
+ - `02-brainstorm-spec.md` exists -> ask: "Found an existing spec. Resume from planning?"
39
+ - `03-plan.md` exists -> ask: "Found an existing plan. Resume from building?"
40
+ - `04-handoff.md` exists -> ask: "Found build results. Resume from QA?"
41
+ - `05-qa-report.md` exists -> ask: "Found QA results. Resume from polish?"
42
+ - Also check `~/.ideabox/research/` for a file from today -> ask: "You already researched today. Use those results or research fresh?"
40
43
  4. Initialize `.ideabox/state.json` with the appropriate starting phase:
41
44
  ```json
42
45
  {
@@ -87,7 +90,7 @@ After each phase completes and its gate condition is met:
87
90
  - **yes**: read next phase file and follow it
88
91
  - **revise**: stay in current phase, user explains what to change
89
92
  - **skip**: jump to phase 09 (learn) to save progress, then end
90
- - **abort**: save state, end session (can resume later with `/ideas`)
93
+ - **abort**: save state, end session (can resume later with `/ideabox`)
91
94
 
92
95
  ## Phase Rules
93
96
 
@@ -100,11 +103,11 @@ After each phase completes and its gate condition is met:
100
103
  - **Re-read state** before every phase transition to prevent drift
101
104
  - **Each phase writes output** to `.ideabox/session/` (e.g., `01-research.md`, `02-brainstorm-spec.md`, `03-plan.md`, `05-qa-report.md`)
102
105
  - **Next phase reads** only its own instructions + the previous phase's output (not all phases)
103
- - **If context is running low:** save state to `.ideabox/state.json`, tell user: "Context getting full. Run `/ideas` in a new session to resume from phase {current_phase}."
106
+ - **If context is running low:** save state to `.ideabox/state.json`, tell user: "Context getting full. Run `/ideabox` in a new session to resume from phase {current_phase}."
104
107
 
105
108
  ## Error Handling
106
109
 
107
110
  - **Phase gate fails:** stay in current phase, explain what's needed to pass
108
- - **User aborts:** save state, they resume later with `/ideas`
111
+ - **User aborts:** save state, they resume later with `/ideabox`
109
112
  - **Subagent fails:** note the failure, offer to retry or skip
110
113
  - **No profile:** run profile setup inline (don't tell user to run another command)
@@ -11,9 +11,9 @@ Research project ideas from multiple data sources using parallel subagents. Pres
11
11
 
12
12
  Read `${CLAUDE_SKILL_DIR}/references/self-improvement.md` for the full self-improvement engine specification, then load adaptive data:
13
13
 
14
- 1. **Source quality** — read `~/.ideabox/source-quality.jsonl` (if exists, 5+ entries). Compute source scores. Allocate more queries to high-quality sources, reduce queries for low-quality sources.
15
- 2. **Scoring weights** — read `~/.ideabox/scoring-feedback.jsonl` (if exists, 10+ outcomes). Compute adapted dimension weights. If insufficient data, use default equal weights (1.0 each).
16
- 3. **Query evolution** — read `~/.ideabox/query-performance.jsonl` (if exists). Build the active query set: drop RETIRED queries, add variations for PRODUCTIVE queries. If no data, use default queries from `${CLAUDE_SKILL_DIR}/references/research-sources.md`.
14
+ 1. **Source quality** — read `~/.ideabox/source-quality.jsonl` if it exists. Compute source scores only if the file has 5+ entries; otherwise use default equal allocation. Allocate more queries to high-quality sources, reduce queries for low-quality sources.
15
+ 2. **Scoring weights** — read `~/.ideabox/scoring-feedback.jsonl` if it exists. Compute adapted dimension weights only if the file has 10+ outcomes; otherwise use default equal weights (1.0 each).
16
+ 3. **Query evolution** — read `~/.ideabox/query-performance.jsonl` if it exists. Build the active query set: drop RETIRED queries, add variations for PRODUCTIVE queries. If no data, use default queries from `${CLAUDE_SKILL_DIR}/references/research-sources.md`.
17
17
 
18
18
  If any self-improvement file doesn't exist or has insufficient data, use defaults silently — no error messages for new users.
19
19
 
@@ -60,7 +60,7 @@ Return JSON array with: source_category: 'indie_hacker', source_url, signal_type
60
60
  Return JSON array with: source_category: 'packages', source_url, signal_type, title, description, evidence, demand_score."
61
61
 
62
62
  **Subagent 6 — User's GitHub Profile:**
63
- "Fetch the GitHub profile for {profile.github_username}. Use WebFetch on `https://api.github.com/users/{username}/repos?sort=updated&per_page=30`. Extract primary languages, frameworks, project types, and notable repos with star counts.
63
+ "Fetch the GitHub profile for {profile.github_username}. Prefer `gh api '/users/{username}/repos?sort=updated&per_page=30'` if `gh` CLI is available (5000 req/hr authenticated). Otherwise fall back to WebFetch on `https://api.github.com/users/{username}/repos?sort=updated&per_page=30` (60 req/hr unauthenticated). Extract primary languages, frameworks, project types, and notable repos with star counts.
64
64
  Return a JSON object: {languages: [...], frameworks: [...], project_types: [...], notable_repos: [{name, stars, description}]}"
65
65
 
66
66
  ## Step 2: Score & Filter
@@ -69,7 +69,7 @@ Once all subagents return:
69
69
 
70
70
  1. **Merge** all findings into a single list
71
71
  2. **Synthesize** — look for ideas that combine signals from multiple findings (same gap from different sources = one stronger idea, not two weak ones)
72
- 3. **Cross-reference bonus** — ideas appearing across 2+ sources get +2 demand signal; 3+ sources get +3 (capped at 10)
72
+ 3. **Cross-reference bonus** — When rating demand signal, first rate based on the strongest single source (1-10), THEN add bonus: +2 if appeared in 2 sources, +3 if 3+ sources (capped at 10). Do not pre-inflate the base rating for multi-source evidence.
73
73
  4. **Apply agentic AI bonus** — ideas in agentic AI / MCP / AI tooling space get +2 trend momentum (capped at 10)
74
74
  5. **Filter history** — load dismissed/built ideas from `~/.ideabox/ideas.jsonl`, remove ideas with >70% title+problem similarity
75
75
  6. **Filter avoid topics** — remove ideas matching `profile.avoid_topics`
@@ -79,7 +79,7 @@ Once all subagents return:
79
79
  - Apply adapted scoring weights from Step 0 (if available). Multiply each dimension score by its weight before summing.
80
80
  - If using adapted weights, show them: "Scoring with adapted weights: Revenue 1.2x, Demand 1.3x, ..."
81
81
  - Compute weighted total
82
- 8. **Filter** — remove ideas scoring below 25 (adjusted for weight changes)
82
+ 8. **Filter** — remove ideas scoring below 25 (scale is always 0-60 regardless of weight adaptation)
83
83
  9. **Rank** — sort by total score descending
84
84
  10. **Update profile stacks** — if GitHub subagent returned language data, update `~/.ideabox/profile.json` stacks field
85
85
  11. **Record query performance** — for each subagent's queries, append to `~/.ideabox/query-performance.jsonl`: query text, results count, useful results count, contributed to any presented idea
@@ -137,13 +137,13 @@ Then ask:
137
137
  ## Step 7: Handle User Choice
138
138
 
139
139
  **If user picks an idea to build:**
140
- 1. Append the full idea record to `~/.ideabox/ideas.jsonl` with status "planned"
141
- 2. Update `.ideabox/state.json`:
140
+ 1. Write research summary to `.ideabox/session/01-research.md` (idea details + evidence + scores)
141
+ 2. Append the full idea record to `~/.ideabox/ideas.jsonl` with status "planned"
142
+ 3. Update `.ideabox/state.json` (AFTER writing the artifact so state always points to a real file):
142
143
  - Set `idea` field with id, title, problem
143
144
  - Set `current_phase` to "02-brainstorm"
144
145
  - Add "01-research" to `phases_completed`
145
146
  - Set `artifacts.research` to `.ideabox/session/01-research.md`
146
- 3. Write research summary to `.ideabox/session/01-research.md` (idea details + evidence + scores)
147
147
  4. Do NOT log to sessions.jsonl here — Phase 09 (Learn) handles the final session log with complete outcome data
148
148
  5. Proceed to Phase 02
149
149
 
@@ -78,6 +78,25 @@ Compute a health score (0-100) based on findings:
78
78
  - Medium: -8
79
79
  - Low: -3
80
80
 
81
+ **Computation (in order):**
82
+ 1. Compute each category's score (0-100) based on issue count
83
+ 2. Compute `base_score = sum(category_score * weight)` across all 8 categories — yields 0-100
84
+ 3. For each distinct bug found, subtract its severity deduction from `base_score`
85
+ 4. Clamp final score to `[0, 100]` (never go negative)
86
+
87
+ **Worked example:**
88
+ - Console: 0 errors → 100 × 15% = 15.0
89
+ - Links: 0 broken → 100 × 10% = 10.0
90
+ - Visual: 2 issues → 70 × 10% = 7.0
91
+ - Functional: 0 bugs → 100 × 20% = 20.0
92
+ - UX: 1 issue → 70 × 15% = 10.5
93
+ - Performance: 0 issues → 100 × 10% = 10.0
94
+ - Content: 0 issues → 100 × 5% = 5.0
95
+ - Accessibility: 3 issues → 70 × 15% = 10.5
96
+ - `base_score` = 88.0
97
+ - Found 1 critical, 2 high = -25 + -15 + -15 = -55
98
+ - `final_score` = max(0, 88 - 55) = **33/100** (fails QA gate of 70)
99
+
81
100
  ## Step 4: Fix-Verify Loop
82
101
 
83
102
  For each bug found (prioritized by severity — critical first):
@@ -10,10 +10,12 @@ Create PR, bump version, update changelog, and prepare for deployment.
10
10
 
11
11
  ## Step 2: Merge Base Branch
12
12
 
13
- Ensure you're up to date with the base branch:
13
+ Detect the base branch dynamically (don't assume `main`):
14
14
  ```bash
15
- git fetch origin main && git merge origin/main --no-edit
15
+ BASE=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||') || BASE="main"
16
+ git fetch origin "$BASE" && git merge "origin/$BASE" --no-edit
16
17
  ```
18
+ Common base branch names: `main`, `master`, `develop`. If detection fails or yields the wrong branch, ask the user.
17
19
  If merge conflicts: resolve them, run tests, commit.
18
20
 
19
21
  ## Step 3: Run Tests
@@ -4,16 +4,16 @@ Track what happened, update preferences, and improve future suggestions. This ph
4
4
 
5
5
  ## Step 1: Record Session Outcome
6
6
 
7
- Determine the session outcome based on which phases completed:
7
+ Determine the session outcome based on which phases completed. **Read top-to-bottom and use the first row that matches** (the table is ordered most-specific first):
8
8
 
9
9
  | Phases Completed | Outcome | Event |
10
10
  |-----------------|---------|-------|
11
- | 01 only | browsed | User looked at ideas but didn't pick one |
12
- | 01-02 | brainstormed | User refined an idea but didn't plan/build |
13
- | 01-03 | planned | User planned but didn't build |
14
- | 01-04+ | started | User began building |
15
- | 01-07+ | shipped | User shipped the project |
16
11
  | 01-08+ | completed | Full cycle including post-ship |
12
+ | 01-07+ | shipped | User shipped the project |
13
+ | 01-04 to 01-06 | started | User began building but didn't ship |
14
+ | 01-03 | planned | User planned but didn't build |
15
+ | 01-02 | brainstormed | User refined an idea but didn't plan/build |
16
+ | 01 only | browsed | User looked at ideas but didn't pick one |
17
17
 
18
18
  ## Step 2: Update Idea Status
19
19
 
@@ -165,7 +165,7 @@ Present to the user:
165
165
  - Exploration rate: {old_rate}% -> {new_rate}%
166
166
  - Total ideas seen: {total_interactions}
167
167
 
168
- Run `/ideas` again for your next project!
168
+ Run `/ideabox` again for your next project!
169
169
  ```
170
170
 
171
171
  ## Step 8: Log Session
@@ -6,7 +6,7 @@ description: Source catalog for research subagents. 6 parallel subagents launche
6
6
 
7
7
  # Research Sources
8
8
 
9
- This catalog defines all available research categories. During execution, **6 parallel subagents** are launched (categories 1-4 + 5 + 6). Categories 5, 7, 8, and 10 are consolidated into other subagents or used as filter steps, not standalone subagents.
9
+ This catalog defines all available research categories. During execution, **6 parallel subagents** are launched mapping to categories 1 (Agentic AI), 2 (Pain Points), 3 (Trending), 4 (Indie Hacker), 6 (Packages), and 9 (GitHub Profile). Categories 5, 7, 8 are consolidated into other subagents. Category 10 (Dismissed filter) is applied as a post-processing step, not a subagent.
10
10
 
11
11
  ---
12
12
 
@@ -21,11 +21,15 @@ Append after each session:
21
21
  For each source, compute a quality score:
22
22
 
23
23
  ```
24
- contribution_rate = ideas_contributed_to_chosen / total_sessions_with_source
25
- outcome_weight = completed: 1.0, started: 0.6, planned: 0.3, dismissed: 0.0
26
- weighted_score = sum(contribution_rate * outcome_weight) / sessions_count
24
+ For each session where this source was used:
25
+ per_session_score = (1 if contributed_to_chosen else 0) * outcome_weight
26
+ where outcome_weight = completed: 1.0, started: 0.6, planned: 0.3, dismissed: 0.0
27
27
 
28
- Final source_score = 0.3 * contribution_rate + 0.4 * weighted_score + 0.3 * avg_signals_per_session
28
+ contribution_rate = sessions_contributed_to_chosen / total_sessions_with_source
29
+ weighted_score = mean(per_session_score across all sessions for this source)
30
+ avg_signals = mean(signals_found across all sessions for this source) / 10 # normalize to 0-1
31
+
32
+ Final source_score = 0.3 * contribution_rate + 0.4 * weighted_score + 0.3 * avg_signals
29
33
  Clamp to [0.1, 1.0]
30
34
  ```
31
35
 
@@ -81,13 +85,20 @@ For each dimension:
81
85
  abandoned_avg = average score for ideas with outcome=abandoned/dismissed
82
86
  predictive_power = completed_avg - abandoned_avg
83
87
 
84
- Normalize predictive_power across dimensions so they sum to 6.0 (preserving max 60 total).
88
+ Step 1: Scale predictive_power to initial weights so they sum to 6.0
89
+ Step 2: Clamp each weight to [0.5, 1.5] to prevent over-fitting
90
+ Step 3: Re-normalize the clamped weights so they sum to 6.0
91
+
92
+ Final rule: total_score is always normalized to the 0-60 scale by computing
93
+ raw_weighted_sum = sum(dimension_score * weight) across 6 dimensions
94
+ normalized_total = raw_weighted_sum * 6 / sum(weights)
95
+ This guarantees max score = 60 regardless of weight distribution.
85
96
  ```
86
97
 
87
98
  **Example adaptation:**
88
99
  - If `feasibility` strongly predicts completion (high for completed, low for abandoned): increase its weight
89
100
  - If `stack_fit` doesn't predict outcomes (similar scores for both): decrease its weight
90
- - Never let any dimension drop below 0.5 or exceed 1.5 (prevent over-fitting)
101
+ - Weights clamped to [0.5, 1.5] after clamping, re-normalized to sum to 6.0
91
102
 
92
103
  ### How Weights Apply
93
104
 
@@ -213,5 +224,5 @@ All three fall back to defaults when insufficient data exists. No degradation fo
213
224
  1. **Score clamping**: source scores [0.1, 1.0], dimension weights [0.5, 1.5]
214
225
  2. **Never eliminate**: low-scoring sources get reduced queries, not removed
215
226
  3. **Archive, don't delete**: retired queries kept in log for trend analysis
216
- 4. **Periodic reset option**: user can run `/ideas profile` and choose "reset learning" to clear all feedback data and start fresh
227
+ 4. **Periodic reset option**: user can run `/ideabox profile` and choose "reset learning" to clear all feedback data and start fresh
217
228
  5. **Transparency**: every adapted weight and source score is shown to the user — no hidden adjustments
@@ -4,7 +4,7 @@ description: >
4
4
  Manage your IdeaBox profile — interests, tech stacks, goals, and GitHub username.
5
5
  Use when asked to "set up ideabox", "edit ideabox profile", "change interests",
6
6
  "update my stack", or "ideabox profile".
7
- This skill is also invoked automatically on first /ideas run if no profile exists.
7
+ This skill is also invoked automatically on first /ideabox run if no profile exists.
8
8
  ---
9
9
 
10
10
  # IdeaBox Profile Manager
@@ -94,4 +94,4 @@ The `stacks` array will be populated by the research phase when it scans the use
94
94
 
95
95
  The `category_scores`, `complexity_preference`, `monetization_preference`, `exploration_rate`, and `total_interactions` fields are used by the self-improving recommendation system (Phase 09 — Learn).
96
96
 
97
- After saving, confirm: "Profile saved! Run `/ideas` to get your first batch of project ideas."
97
+ After saving, confirm: "Profile saved! Run `/ideabox` to get your first batch of project ideas."
@@ -44,11 +44,11 @@ Append to `~/.ideabox/sessions.jsonl`:
44
44
  "session_id": "sess_YYYYMMDD_HHMMSS",
45
45
  "timestamp": "{ISO}",
46
46
  "mode": "research",
47
- "sources_searched": "{actual count of subagents that returned results}",
48
- "ideas_generated": "{count}",
49
- "ideas_presented": "{count}",
50
- "ideas_saved": "{count}",
51
- "ideas_dismissed": "{count}"
47
+ "sources_searched": N,
48
+ "ideas_generated": N,
49
+ "ideas_presented": N,
50
+ "ideas_saved": N,
51
+ "ideas_dismissed": N
52
52
  }
53
53
  ```
54
54