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.
- package/.claude-plugin/plugin.json +20 -0
- package/README.md +103 -103
- package/bin/cli.mjs +118 -29
- package/package.json +4 -3
- package/skills/backlog/SKILL.md +12 -12
- package/skills/ideabox/SKILL.md +14 -11
- package/skills/ideabox/phases/01-research.md +9 -9
- package/skills/ideabox/phases/05-qa.md +19 -0
- package/skills/ideabox/phases/07-ship.md +4 -2
- package/skills/ideabox/phases/09-learn.md +7 -7
- package/skills/ideabox/references/research-sources.md +1 -1
- package/skills/ideabox/references/self-improvement.md +18 -7
- package/skills/profile/SKILL.md +2 -2
- package/skills/research/SKILL.md +5 -5
|
@@ -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
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
+
[](https://www.npmjs.com/package/ideabox)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](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
|
-
- [
|
|
19
|
-
- [
|
|
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
|
-
|
|
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
|
|
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
|
|
273
|
-
│ │ │ ├── 02-brainstorm.md
|
|
274
|
-
│ │ │ ├── 03-plan.md
|
|
275
|
-
│ │ │ ├── 04-build.md
|
|
276
|
-
│ │ │ ├── 05-qa.md
|
|
277
|
-
│ │ │ ├── 06-polish.md
|
|
278
|
-
│ │ │ ├── 07-ship.md
|
|
279
|
-
│ │ │ ├── 08-post-ship.md
|
|
280
|
-
│ │ │ └── 09-learn.md
|
|
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
|
-
|
|
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
|
|
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(`
|
|
265
|
+
console.log(` ${OK} Node.js ${process.version}`);
|
|
195
266
|
} else {
|
|
196
|
-
console.log(`
|
|
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(`
|
|
273
|
+
console.log(` ${OK} Data directory exists (${DATA_DIR})`);
|
|
203
274
|
} else {
|
|
204
|
-
console.log(`
|
|
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(`
|
|
282
|
+
console.log(` ${OK} Profile configured`);
|
|
212
283
|
} else {
|
|
213
|
-
console.log(`
|
|
284
|
+
console.log(` ${INFO} No profile yet (will be created on first /ideabox run)`);
|
|
214
285
|
}
|
|
215
286
|
|
|
216
|
-
// Check 4: Skills installed (check
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
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(`
|
|
310
|
+
console.log(` ${OK} Claude Code CLI detected`);
|
|
235
311
|
} else if (hasCommand("codex")) {
|
|
236
|
-
console.log(`
|
|
312
|
+
console.log(` ${OK} Codex CLI detected`);
|
|
237
313
|
} else {
|
|
238
|
-
console.log(`
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
}
|
package/skills/backlog/SKILL.md
CHANGED
|
@@ -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
|
-
- `/
|
|
23
|
-
- `/
|
|
24
|
-
- `/
|
|
25
|
-
- `/
|
|
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 `/
|
|
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 `/
|
|
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 `/
|
|
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.
|
|
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 `/
|
|
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
|
package/skills/ideabox/SKILL.md
CHANGED
|
@@ -10,14 +10,14 @@ argument-hint: "[research|backlog|profile]"
|
|
|
10
10
|
|
|
11
11
|
# IdeaBox — Full Pipeline
|
|
12
12
|
|
|
13
|
-
Research ->
|
|
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`
|
|
19
|
-
- `/ideabox backlog` -> invoke `ideabox:backlog`
|
|
20
|
-
- `/ideabox profile` -> invoke `ideabox:profile`
|
|
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
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
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 `/
|
|
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 `/
|
|
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 `/
|
|
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`
|
|
15
|
-
2. **Scoring weights** — read `~/.ideabox/scoring-feedback.jsonl`
|
|
16
|
-
3. **Query evolution** — read `~/.ideabox/query-performance.jsonl`
|
|
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}.
|
|
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** —
|
|
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 (
|
|
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.
|
|
141
|
-
2.
|
|
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
|
-
|
|
13
|
+
Detect the base branch dynamically (don't assume `main`):
|
|
14
14
|
```bash
|
|
15
|
-
git
|
|
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 `/
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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 `/
|
|
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
|
package/skills/profile/SKILL.md
CHANGED
|
@@ -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 /
|
|
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 `/
|
|
97
|
+
After saving, confirm: "Profile saved! Run `/ideabox` to get your first batch of project ideas."
|
package/skills/research/SKILL.md
CHANGED
|
@@ -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":
|
|
48
|
-
"ideas_generated":
|
|
49
|
-
"ideas_presented":
|
|
50
|
-
"ideas_saved":
|
|
51
|
-
"ideas_dismissed":
|
|
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
|
|