@nudata/nu-claude-pm 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/nu-claude-pm.js +98 -0
- package/commands/nu-pm-continue.md +64 -0
- package/commands/nu-pm-elevator-pitch.md +55 -0
- package/commands/nu-pm-halt.md +108 -0
- package/commands/nu-pm-one-pager.md +81 -0
- package/commands/nu-pm-research.md +151 -0
- package/commands/nu-pm-roadmap.md +180 -0
- package/commands/nu-pm-scaffold.md +604 -0
- package/commands/nu-pm-spike.md +140 -0
- package/commands/nu-pm-status.md +52 -0
- package/commands/nu-pm-update.md +49 -0
- package/commands/nu-pm-user-guide.md +211 -0
- package/commands/nu-pm-vision.md +153 -0
- package/package.json +21 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import os from "os";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const COMMANDS_SRC = path.join(__dirname, "..", "commands");
|
|
10
|
+
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0];
|
|
13
|
+
const isLocal = args.includes("--local");
|
|
14
|
+
const isGlobal = args.includes("--global") || !isLocal;
|
|
15
|
+
|
|
16
|
+
function getTargetDir() {
|
|
17
|
+
if (isLocal) {
|
|
18
|
+
return path.join(process.cwd(), ".claude", "commands");
|
|
19
|
+
}
|
|
20
|
+
return path.join(os.homedir(), ".claude", "commands");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function listCommands() {
|
|
24
|
+
return fs.readdirSync(COMMANDS_SRC).filter((f) => f.endsWith(".md"));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function install() {
|
|
28
|
+
const targetDir = getTargetDir();
|
|
29
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
30
|
+
|
|
31
|
+
const files = listCommands();
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const src = path.join(COMMANDS_SRC, file);
|
|
34
|
+
const dest = path.join(targetDir, file);
|
|
35
|
+
fs.copyFileSync(src, dest);
|
|
36
|
+
console.log(` installed: ${file}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const scope = isLocal ? "project (.claude/commands/)" : "global (~/.claude/commands/)";
|
|
40
|
+
console.log(`\n✓ ${files.length} commands installed ${scope}`);
|
|
41
|
+
console.log(" Reload Claude Code to pick up new commands.");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function uninstall() {
|
|
45
|
+
const targetDir = getTargetDir();
|
|
46
|
+
const files = listCommands();
|
|
47
|
+
let removed = 0;
|
|
48
|
+
|
|
49
|
+
for (const file of files) {
|
|
50
|
+
const dest = path.join(targetDir, file);
|
|
51
|
+
if (fs.existsSync(dest)) {
|
|
52
|
+
fs.unlinkSync(dest);
|
|
53
|
+
console.log(` removed: ${file}`);
|
|
54
|
+
removed++;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (removed === 0) {
|
|
59
|
+
console.log("No nu-pm commands found to remove.");
|
|
60
|
+
} else {
|
|
61
|
+
console.log(`\n✓ ${removed} commands removed.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function printHelp() {
|
|
66
|
+
console.log(`
|
|
67
|
+
nu-claude-pm — install Claude Code PM commands
|
|
68
|
+
|
|
69
|
+
Usage:
|
|
70
|
+
nu-claude-pm install [--global|--local]
|
|
71
|
+
nu-claude-pm uninstall [--global|--local]
|
|
72
|
+
nu-claude-pm list
|
|
73
|
+
|
|
74
|
+
Options:
|
|
75
|
+
--global Install to ~/.claude/commands/ (default)
|
|
76
|
+
--local Install to .claude/commands/ in the current project
|
|
77
|
+
|
|
78
|
+
Commands:
|
|
79
|
+
install Copy nu-pm-* commands into your Claude Code commands directory
|
|
80
|
+
uninstall Remove nu-pm-* commands from your Claude Code commands directory
|
|
81
|
+
list List available commands
|
|
82
|
+
`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
switch (command) {
|
|
86
|
+
case "install":
|
|
87
|
+
install();
|
|
88
|
+
break;
|
|
89
|
+
case "uninstall":
|
|
90
|
+
uninstall();
|
|
91
|
+
break;
|
|
92
|
+
case "list":
|
|
93
|
+
listCommands().forEach((f) => console.log(` /` + f.replace(".md", "")));
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
printHelp();
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nu-pm-continue
|
|
3
|
+
description: Resume work on a project by reading now.md, milestones.md, and roadmap.md. Default directory is product/. Pass a different path as argument if needed.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are helping the user resume work on a software project after a break or context reset. Work through the following steps in order.
|
|
7
|
+
|
|
8
|
+
## 1. Locate the product docs
|
|
9
|
+
|
|
10
|
+
The target directory is: `$ARGUMENTS` (use `product/` if empty or not provided).
|
|
11
|
+
|
|
12
|
+
Look for these files in the target directory:
|
|
13
|
+
- `now.md` — current focus, next action, what was recently completed
|
|
14
|
+
- `milestones.md` — task checklist across all milestones
|
|
15
|
+
- `roadmap.md` — architecture and design decisions (skim only, don't summarise at length)
|
|
16
|
+
|
|
17
|
+
If none of these files exist in the given directory, search the repo for files with these names and ask the user to confirm which project they want to resume.
|
|
18
|
+
|
|
19
|
+
## 2. Gather supporting context
|
|
20
|
+
|
|
21
|
+
- If `<dir>/how-to/nu-pm-continue.md` exists, read it now and follow any project-specific context-gathering steps listed there (e.g. reading a cluster state file, checking additional infra docs) before proceeding.
|
|
22
|
+
- Run `git log --oneline -8` to see recent commits
|
|
23
|
+
- Run `git status` to surface any uncommitted or untracked changes
|
|
24
|
+
|
|
25
|
+
## 3. Find the active task
|
|
26
|
+
|
|
27
|
+
In `milestones.md`:
|
|
28
|
+
- Find the first milestone marked `🔄 in progress`
|
|
29
|
+
- Within that milestone, find the first task marked `[~]` (in progress) or `[ ]` (not yet done)
|
|
30
|
+
- That is the task to resume
|
|
31
|
+
|
|
32
|
+
## 4. Load design context if present
|
|
33
|
+
|
|
34
|
+
If `now.md` contains a `Design doc:` field referencing a PRD, and a `Current story:` field:
|
|
35
|
+
- Read the referenced PRD
|
|
36
|
+
- Locate the current story's section
|
|
37
|
+
- Extract its scope, files touched, decisions, and validation criteria — this is the working context for the session
|
|
38
|
+
|
|
39
|
+
## 5. Present the resume brief
|
|
40
|
+
|
|
41
|
+
Output a short, scannable summary — aim for something the user can read in 30 seconds:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
## Resume Brief
|
|
45
|
+
|
|
46
|
+
**Milestone**: <milestone name and status>
|
|
47
|
+
**Active story**: <story title (from PRD if present, otherwise task from milestones.md)>
|
|
48
|
+
**Story scope**: <1–2 sentence summary of what the story does and its exit criteria>
|
|
49
|
+
|
|
50
|
+
**Recently completed**:
|
|
51
|
+
- <2–3 bullet points from now.md "What Was Just Done">
|
|
52
|
+
|
|
53
|
+
**Infrastructure state**: <up / hibernated / unknown — from how-to/nu-pm-continue.md context if available>
|
|
54
|
+
**Uncommitted changes**: <none / list files if any>
|
|
55
|
+
**Recent commits**: <last 3–4 one-liners from git log>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 6. Propose the next action
|
|
59
|
+
|
|
60
|
+
State clearly what to do next — the exact command to run, the file to edit, or the decision to make. Ask the user if they want to proceed with that, or if something has changed since the docs were last updated.
|
|
61
|
+
|
|
62
|
+
## 7. Offer to update now.md
|
|
63
|
+
|
|
64
|
+
If the user confirms the current state is accurate, offer to update `now.md` with today's date and any corrections. If the state has changed (e.g. a task was completed offline), update `milestones.md` checkboxes and `now.md` before proceeding.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nu-pm-elevator-pitch
|
|
3
|
+
description: Generate a short elevator pitch for the project. Produces 3 variants at different lengths, then iterates with the user until it's sharp.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are helping the user craft a tight elevator pitch for their project. This is a collaborative, iterative process — generate options, get feedback, refine.
|
|
7
|
+
|
|
8
|
+
The target directory is: `$ARGUMENTS` (use `product/` if empty or not provided).
|
|
9
|
+
|
|
10
|
+
## 1. Gather source material
|
|
11
|
+
|
|
12
|
+
Read all of these in parallel:
|
|
13
|
+
- `<dir>/vision.md` — problem, customer, north star (primary source)
|
|
14
|
+
- `<dir>/one-pager.md` — if it exists, use it as a condensed starting point
|
|
15
|
+
- `<dir>/now.md` — current milestone state (for credibility signals: "we've already proven X")
|
|
16
|
+
|
|
17
|
+
If neither `vision.md` nor `one-pager.md` exist, read `roadmap.md` as a fallback.
|
|
18
|
+
|
|
19
|
+
## 2. Generate 3 pitch variants
|
|
20
|
+
|
|
21
|
+
Produce three pitches targeting different contexts. Label them clearly.
|
|
22
|
+
|
|
23
|
+
**Tweet (≤ 280 chars)**
|
|
24
|
+
One sentence that captures the problem and the product. No jargon. Must make a skeptic want to know more.
|
|
25
|
+
|
|
26
|
+
**30-second verbal (≤ 75 words)**
|
|
27
|
+
The version you'd say out loud to someone you just met. Covers: who has the problem, what the pain costs them, what you've built, and one proof point. Conversational tone, no bullet points.
|
|
28
|
+
|
|
29
|
+
**60-second investor / stakeholder (≤ 150 words)**
|
|
30
|
+
Adds: market context, what makes this defensible or timely, and current traction (what's been proven, not just planned). Still a single paragraph — no headers, no lists.
|
|
31
|
+
|
|
32
|
+
## 3. Present and prompt
|
|
33
|
+
|
|
34
|
+
Show all three variants. Then ask:
|
|
35
|
+
|
|
36
|
+
**"Which of these is closest to what you need? I can adjust the tone, sharpen the hook, add a specific number, make it more technical or less, or write a version targeting a specific audience (investor, customer, recruiter, partner)."**
|
|
37
|
+
|
|
38
|
+
## 4. Iterate
|
|
39
|
+
|
|
40
|
+
Work through changes one at a time. After each round, show the updated variant only (not all three again) unless the user asks for a full reset.
|
|
41
|
+
|
|
42
|
+
Common refinement passes:
|
|
43
|
+
- **Sharpen the hook** — lead with the pain or the surprise, not the product name
|
|
44
|
+
- **Add a number** — a concrete metric beats any adjective ("93% cache hit rate" > "fast prefix caching")
|
|
45
|
+
- **Audience swap** — rewrite for a specific reader (a CTO, a VC, a potential customer)
|
|
46
|
+
- **Cut jargon** — flag any term that requires insider knowledge; offer a plain-language swap
|
|
47
|
+
- **Strengthen the "why us / why now"** — add one sentence about what makes this timely or defensible
|
|
48
|
+
|
|
49
|
+
Keep iterating until the user is satisfied or asks to save.
|
|
50
|
+
|
|
51
|
+
## 5. Save when ready
|
|
52
|
+
|
|
53
|
+
When the user confirms a variant is ready, write it to `<dir>/elevator-pitch.md` with all three final variants (or just the one they chose — ask if unclear). Tell them the file was written.
|
|
54
|
+
|
|
55
|
+
Do not write the file until the user explicitly says to save or approves it.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nu-pm-halt
|
|
3
|
+
description: Wrap up the current work session cleanly. Updates docs, writes a session report, commits and pushes. Reads product/how-to/nu-pm-halt.md for project-specific shutdown steps (infrastructure hibernation, etc.).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Wrap up the current work session cleanly.
|
|
7
|
+
|
|
8
|
+
The target directory is: `$ARGUMENTS` (use `product/` if empty or not provided).
|
|
9
|
+
|
|
10
|
+
Work through these steps in order:
|
|
11
|
+
|
|
12
|
+
## 1. Gather current state
|
|
13
|
+
|
|
14
|
+
Read all of:
|
|
15
|
+
- `<dir>/now.md` — what was just done, what's next
|
|
16
|
+
- `<dir>/milestones.md` — task checklist
|
|
17
|
+
- `git log --oneline -10` — recent commits
|
|
18
|
+
- `git status` — uncommitted changes
|
|
19
|
+
|
|
20
|
+
## 2. Assess checkpoint readiness
|
|
21
|
+
|
|
22
|
+
A good checkpoint is one where:
|
|
23
|
+
- No task is mid-execution (no benchmark half-run, no deploy half-applied)
|
|
24
|
+
- All completed work is reflected in docs and committed, OR you are about to do that now
|
|
25
|
+
- The next person (or future session) can resume cleanly from now.md
|
|
26
|
+
|
|
27
|
+
If NOT at a good checkpoint, warn the user: explain what's in-flight, and ask if they want to wait, skip, or force-halt anyway.
|
|
28
|
+
|
|
29
|
+
## 3. Update milestones.md
|
|
30
|
+
|
|
31
|
+
Go through the active milestone task list. For each task completed this session, change `[ ]` to `[x]`. For any task in progress but not done, use `[~]`. Be conservative — only check off tasks that are verifiably complete.
|
|
32
|
+
|
|
33
|
+
If the milestone has a `Design:` reference, note the current story for now.md but do not modify the PRD.
|
|
34
|
+
|
|
35
|
+
## 4. Update now.md
|
|
36
|
+
|
|
37
|
+
- Rewrite "What Was Just Done" with 3–5 bullets from this session
|
|
38
|
+
- Update "Next action" to the first unchecked task in milestones.md
|
|
39
|
+
- If the milestone has a PRD: update "Current story" to the next incomplete story
|
|
40
|
+
- Update any infra state section if infrastructure changed
|
|
41
|
+
- Update the "Recent Commits" block
|
|
42
|
+
|
|
43
|
+
## 5. Write session report
|
|
44
|
+
|
|
45
|
+
Create or append to `<dir>/reports/YYYY-MM-DD.md` (today's date).
|
|
46
|
+
|
|
47
|
+
If the file already exists, append a new section:
|
|
48
|
+
```
|
|
49
|
+
## Session End — HH:MM UTC
|
|
50
|
+
|
|
51
|
+
**Duration**: <start to now if known, otherwise omit>
|
|
52
|
+
**Git commits this session**: <list new commits>
|
|
53
|
+
|
|
54
|
+
### Completed
|
|
55
|
+
- <bullet list of what was accomplished>
|
|
56
|
+
|
|
57
|
+
### Key numbers (if any benchmarks or significant runs happened)
|
|
58
|
+
| Metric | Value |
|
|
59
|
+
|--------|-------|
|
|
60
|
+
|
|
61
|
+
### Bugs / Surprises
|
|
62
|
+
- <anything unexpected>
|
|
63
|
+
|
|
64
|
+
### Left in progress
|
|
65
|
+
- <anything started but not finished>
|
|
66
|
+
|
|
67
|
+
### Next session starts at
|
|
68
|
+
<first unchecked task from milestones.md>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
If the file does not exist, create it with a header first:
|
|
72
|
+
```markdown
|
|
73
|
+
# Session Report — YYYY-MM-DD
|
|
74
|
+
```
|
|
75
|
+
Then append the Session End section.
|
|
76
|
+
|
|
77
|
+
## 6. Commit and push
|
|
78
|
+
|
|
79
|
+
Stage all modified files:
|
|
80
|
+
- `<dir>/now.md`
|
|
81
|
+
- `<dir>/milestones.md`
|
|
82
|
+
- `<dir>/reports/YYYY-MM-DD.md`
|
|
83
|
+
- Any other modified tracked files surfaced by git status
|
|
84
|
+
- New untracked files that are clearly intentional (reports, design docs, config files)
|
|
85
|
+
|
|
86
|
+
Write a commit message summarising what was accomplished:
|
|
87
|
+
```
|
|
88
|
+
session: <one-line summary of what was done>
|
|
89
|
+
|
|
90
|
+
- <bullet 1>
|
|
91
|
+
- <bullet 2>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Push to origin main.
|
|
95
|
+
|
|
96
|
+
## 7. Project-specific shutdown
|
|
97
|
+
|
|
98
|
+
Check if `<dir>/how-to/nu-pm-halt.md` exists. If it does, read it and execute all steps described there. These are project-specific teardown steps such as infrastructure hibernation, scaling down services, or other environment cleanup.
|
|
99
|
+
|
|
100
|
+
If the file does not exist, skip this step silently.
|
|
101
|
+
|
|
102
|
+
## 8. Report back
|
|
103
|
+
|
|
104
|
+
Confirm:
|
|
105
|
+
- ✅ Docs updated (milestones.md, now.md)
|
|
106
|
+
- ✅ Session report written to `<dir>/reports/YYYY-MM-DD.md`
|
|
107
|
+
- ✅ Committed and pushed (show `git log --oneline -3`)
|
|
108
|
+
- Any project-specific shutdown steps completed (from how-to file, if present)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nu-pm-one-pager
|
|
3
|
+
description: Create or update a one-pager.md for the project. Synthesises vision, roadmap, and milestone state into a crisp single-page summary, then iterates with the user.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are helping the user create or refine a one-pager for their project. This is an interactive, iterative process — generate a draft, present it, then work through changes together.
|
|
7
|
+
|
|
8
|
+
The target directory is: `$ARGUMENTS` (use `product/` if empty or not provided).
|
|
9
|
+
|
|
10
|
+
## 1. Gather source material
|
|
11
|
+
|
|
12
|
+
Read all of these in parallel:
|
|
13
|
+
- `<dir>/vision.md` — problem, customer, north star (primary source)
|
|
14
|
+
- `<dir>/roadmap.md` — architecture, delivery phases, key decisions (skim)
|
|
15
|
+
- `<dir>/milestones.md` — what's done vs in-progress vs pending (current state)
|
|
16
|
+
- `<dir>/now.md` — most recent completed work (for "where we are" section)
|
|
17
|
+
|
|
18
|
+
If `<dir>/one-pager.md` already exists, read it too — you'll be updating it, not replacing it from scratch.
|
|
19
|
+
|
|
20
|
+
## 2. Check for an existing one-pager
|
|
21
|
+
|
|
22
|
+
- If `<dir>/one-pager.md` exists: load it, note what's stale or missing, and propose targeted updates rather than a full rewrite.
|
|
23
|
+
- If it doesn't exist: generate a fresh draft using the structure below.
|
|
24
|
+
|
|
25
|
+
## 3. Draft structure
|
|
26
|
+
|
|
27
|
+
Write a one-pager that fits on a single printed page (~400–600 words). Use this structure:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
# <Project Name> — One-Pager
|
|
31
|
+
|
|
32
|
+
## The Problem
|
|
33
|
+
<2–3 sentences. What pain exists, for whom, and why it matters now.>
|
|
34
|
+
|
|
35
|
+
## What We're Building
|
|
36
|
+
<2–3 sentences. The product in plain language — what it does, who uses it, how it's different.>
|
|
37
|
+
|
|
38
|
+
## How It Works
|
|
39
|
+
<3–5 bullets. Key technical or product mechanisms — enough to be credible, not a deep dive.>
|
|
40
|
+
|
|
41
|
+
## Where We Are
|
|
42
|
+
<Current milestone + 1–2 sentences on what's proven so far.>
|
|
43
|
+
|
|
44
|
+
## What's Next
|
|
45
|
+
<Next 1–2 milestones in plain language — what they unlock.>
|
|
46
|
+
|
|
47
|
+
## Why Now
|
|
48
|
+
<1–2 sentences. The timing argument — market window, infrastructure readiness, or strategic moment.>
|
|
49
|
+
|
|
50
|
+
## Key Numbers
|
|
51
|
+
<3–5 concrete metrics — benchmark results, cost figures, customer counts, or performance numbers pulled from source docs.>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Adapt section names if the project's vocabulary suggests better ones. Keep every section tight — cut anything that doesn't help a reader decide whether to care.
|
|
55
|
+
|
|
56
|
+
## 4. Present the draft
|
|
57
|
+
|
|
58
|
+
Show the full draft. Then immediately below it, list:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
### Suggested improvements
|
|
62
|
+
- <specific thing that could be sharper, more concrete, or better evidenced>
|
|
63
|
+
- <section that is weak or missing a number>
|
|
64
|
+
- <anything that sounds vague or that a skeptical reader would question>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Limit suggestions to 3–5 — don't overwhelm. Focus on the highest-leverage improvements.
|
|
68
|
+
|
|
69
|
+
## 5. Iterate
|
|
70
|
+
|
|
71
|
+
Ask the user: **"What would you like to change? I can also expand any section, add a section, sharpen the language, or update numbers."**
|
|
72
|
+
|
|
73
|
+
Make changes as requested. After each round, show only the updated section(s) unless the user asks to see the full doc again.
|
|
74
|
+
|
|
75
|
+
Keep iterating until the user says they're happy with it or asks to save.
|
|
76
|
+
|
|
77
|
+
## 6. Save when ready
|
|
78
|
+
|
|
79
|
+
When the user confirms the draft is ready, write it to `<dir>/one-pager.md`. Tell them the file was written and that it can be regenerated any time by running `/nu-pm-one-pager`.
|
|
80
|
+
|
|
81
|
+
Do not write the file until the user explicitly says to save or approves it.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nu-pm-research
|
|
3
|
+
description: Create a structured research document for market research, competitive analysis, or technology deep-dives. Guides the investigation interactively and writes findings to product/research/ or product/market-research/.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are helping the user conduct and document a structured research investigation. This produces a permanent artifact in the project — not a one-time answer, but a document that informs a decision.
|
|
7
|
+
|
|
8
|
+
The target directory is: `$ARGUMENTS` (use `product/` if empty or not provided).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Step 1 — Check for existing research
|
|
13
|
+
|
|
14
|
+
List any files in `<dir>/research/` and `<dir>/market-research/` so the user knows what's already been done. If either directory doesn't exist, note it but continue.
|
|
15
|
+
|
|
16
|
+
Ask: **"What are you researching?"** Wait for the answer before proceeding.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 2 — Classify the research type
|
|
21
|
+
|
|
22
|
+
Based on the user's answer, determine the type (or ask if unclear):
|
|
23
|
+
|
|
24
|
+
| Type | Description | Output directory |
|
|
25
|
+
|------|-------------|-----------------|
|
|
26
|
+
| `market` | Market size, customer segments, buying behavior, pricing | `<dir>/market-research/` |
|
|
27
|
+
| `competitive` | Specific competitors, their positioning, features, pricing, weaknesses | `<dir>/market-research/` |
|
|
28
|
+
| `technology` | Evaluating a technology, framework, protocol, or approach for use in the project | `<dir>/research/` |
|
|
29
|
+
| `user` | User interviews, surveys, behavioral patterns, workflow analysis | `<dir>/market-research/` |
|
|
30
|
+
| `domain` | Understanding a domain, industry, or regulatory context relevant to the product | `<dir>/research/` |
|
|
31
|
+
|
|
32
|
+
Confirm with the user: **"I'll file this as [type] research in [directory] — does that sound right?"**
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Step 3 — Frame the research
|
|
37
|
+
|
|
38
|
+
Ask these questions one at a time. Don't ask all at once.
|
|
39
|
+
|
|
40
|
+
1. **"What specific question does this research need to answer?"**
|
|
41
|
+
Help them sharpen it if it's too broad. "How big is the market?" is weak. "Is there a segment of platform engineering teams managing >10 GPU workloads who are currently unserved by managed options?" is strong.
|
|
42
|
+
|
|
43
|
+
2. **"What decision does this inform — and by when?"**
|
|
44
|
+
This prevents research from becoming an end in itself. Acceptable answers: "whether to price by seat or by GPU-hour (before M5)", "whether to build our own routing layer or use LiteLLM (this week)".
|
|
45
|
+
|
|
46
|
+
3. **"What do we already know or believe?"**
|
|
47
|
+
Capture existing assumptions so the research can confirm or challenge them, not just collect neutral facts.
|
|
48
|
+
|
|
49
|
+
4. **"What would change if the answer is X vs Y?"**
|
|
50
|
+
Forces the research to be decision-relevant. If both answers lead to the same action, the research isn't needed.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Step 4 — Draft the research document
|
|
55
|
+
|
|
56
|
+
Generate a filename: `YYYY-MM-DD-<slug>.md` where slug is a 3-5 word kebab-case title derived from the question. Use today's date.
|
|
57
|
+
|
|
58
|
+
Write the document to the appropriate directory with this structure:
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
# <Research Title>
|
|
62
|
+
|
|
63
|
+
**Type**: <market / competitive / technology / user / domain>
|
|
64
|
+
**Status**: 🔄 in progress
|
|
65
|
+
**Question**: <the sharpened question from Step 3>
|
|
66
|
+
**Decision it informs**: <what changes based on the answer, and by when>
|
|
67
|
+
**Started**: YYYY-MM-DD
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## What We Already Know
|
|
72
|
+
|
|
73
|
+
<Assumptions and prior knowledge going into this research. These are the things this research will confirm, challenge, or add nuance to.>
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Approach
|
|
78
|
+
|
|
79
|
+
<How this will be investigated — sources, methods, scope limits. Be honest about what won't be covered.>
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Findings
|
|
84
|
+
|
|
85
|
+
> Fill this in as research progresses. Structure by sub-question or theme, not by source.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Recommendation
|
|
90
|
+
|
|
91
|
+
> Complete this last. State the answer to the research question directly, then explain.
|
|
92
|
+
|
|
93
|
+
**Answer**: <direct answer to the research question>
|
|
94
|
+
|
|
95
|
+
**Rationale**: <2–3 sentences — what the findings show and why they support this answer>
|
|
96
|
+
|
|
97
|
+
**Confidence**: <high / medium / low — and why>
|
|
98
|
+
|
|
99
|
+
**What this changes**: <specific impact on vision, roadmap, or a milestone decision>
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Sources
|
|
104
|
+
|
|
105
|
+
| Source | Type | Key takeaway |
|
|
106
|
+
|--------|------|-------------|
|
|
107
|
+
| | | |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Open Questions
|
|
112
|
+
|
|
113
|
+
<Things this research raised but didn't answer. These may become their own research docs or spike investigations.>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Show the user the created document path and tell them the structure is ready to fill in.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Step 5 — Begin the investigation collaboratively
|
|
121
|
+
|
|
122
|
+
Ask: **"Do you want to work through this together now, or do you have findings to add?"**
|
|
123
|
+
|
|
124
|
+
**If working together now**: help the user think through the research systematically. For competitive research, work through competitors one by one. For technology research, evaluate against the project's specific requirements. For market research, help estimate from first principles rather than citing vague statistics. Push back on weak evidence. Fill in Findings and Recommendation collaboratively.
|
|
125
|
+
|
|
126
|
+
**If they have findings to add**: take what they give you and help structure it into the document. Ask clarifying questions to get to the Recommendation section — don't let the document end with findings but no answer.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Step 6 — Complete the document
|
|
131
|
+
|
|
132
|
+
When findings are sufficient to answer the research question:
|
|
133
|
+
|
|
134
|
+
1. Fill in the **Recommendation** section — answer the question directly
|
|
135
|
+
2. Change **Status** from `🔄 in progress` to `✅ concluded`
|
|
136
|
+
3. Fill in **What this changes** — this is the most important field: what specifically in the project should change as a result?
|
|
137
|
+
|
|
138
|
+
If the research reveals something significant that affects `vision.md` or `roadmap.md`, flag it:
|
|
139
|
+
> "This finding suggests [X] should change in your roadmap/vision. Want to run `/nu-pm-roadmap` or `/nu-pm-vision` to review?"
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Step 7 — If research can't be concluded today
|
|
144
|
+
|
|
145
|
+
If the user needs to stop before the research is complete, leave **Status** as `🔄 in progress` and add a note under Findings:
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
> **Paused YYYY-MM-DD**: <what was found so far, what remains to investigate>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Tell the user: "This research doc is in `<path>`. Resume it any time by running `/nu-pm-research` — it will show you open research at the start."
|