learnship 2.3.0 → 2.3.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 +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/README.md +5 -5
- package/bin/install.js +8 -0
- package/cursor-rules/learnship.mdc +44 -13
- package/gemini-extension.json +1 -1
- package/learnship/references/planning-config.md +1 -1
- package/learnship/workflows/challenge.md +2 -0
- package/learnship/workflows/debug.md +2 -0
- package/learnship/workflows/diagnose-issues.md +2 -0
- package/learnship/workflows/discuss-milestone.md +2 -0
- package/learnship/workflows/discuss-phase.md +10 -0
- package/learnship/workflows/help.md +1 -1
- package/learnship/workflows/ideate.md +2 -0
- package/learnship/workflows/list-phase-assumptions.md +2 -0
- package/learnship/workflows/map-codebase.md +1 -1
- package/learnship/workflows/new-milestone.md +58 -0
- package/learnship/workflows/new-project.md +118 -11
- package/learnship/workflows/quick.md +2 -0
- package/learnship/workflows/secure-phase.md +4 -0
- package/learnship/workflows/settings.md +8 -2
- package/learnship/workflows/sync-upstream-skills.md +2 -2
- package/learnship/workflows/validate-phase.md +2 -0
- package/package.json +2 -2
- package/references/planning-config.md +1 -1
- package/templates/config.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"description": "Agentic engineering done right — 57 structured workflows, 17 specialist agent personas, persistent memory across sessions, integrated learning partner, and impeccable UI design system. Works with Claude Code, Windsurf, Cursor, Gemini CLI, OpenCode, and Codex.",
|
|
4
|
-
"version": "2.3.
|
|
4
|
+
"version": "2.3.2",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Favio Vazquez",
|
|
7
7
|
"email": "favio.vazquezp@gmail.com"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"displayName": "learnship",
|
|
4
4
|
"description": "Agentic engineering done right — 57 structured workflows, 17 specialist agent personas, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
|
-
"version": "2.3.
|
|
5
|
+
"version": "2.3.2",
|
|
6
6
|
"logo": "assets/logo.png",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Favio Vazquez",
|
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
npx learnship
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
**Works on Mac, Windows, and Linux.** Requires Node.js ≥
|
|
41
|
+
**Works on Mac, Windows, and Linux.** Requires Node.js ≥ 22 and Git. The installer auto-detects your platform.
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
44
|
npx learnship --global # all projects
|
|
@@ -521,7 +521,7 @@ Project settings live in `.planning/config.json`. Set during `/new-project` or e
|
|
|
521
521
|
|
|
522
522
|
| Setting | Options | Default | What it controls |
|
|
523
523
|
|---------|---------|---------|-----------------|
|
|
524
|
-
| `mode` | `
|
|
524
|
+
| `mode` | `auto`, `interactive` | `auto` | `auto` auto-approves steps; `interactive` confirms at each decision |
|
|
525
525
|
| `granularity` | `coarse`, `standard`, `fine` | `standard` | Phase size: 3-5 / 5-8 / 8-12 phases |
|
|
526
526
|
| `model_profile` | `quality`, `balanced`, `budget` | `balanced` | Agent model tier (see table below) |
|
|
527
527
|
| `learning_mode` | `auto`, `manual` | `auto` | `auto` offers learning at checkpoints; `manual` requires explicit invocation |
|
|
@@ -579,8 +579,8 @@ Project settings live in `.planning/config.json`. Set during `/new-project` or e
|
|
|
579
579
|
|
|
580
580
|
| Scenario | `mode` | `granularity` | `model_profile` | Research | Plan Check | Verifier |
|
|
581
581
|
|----------|--------|--------------|----------------|----------|------------|---------|
|
|
582
|
-
| Prototyping | `
|
|
583
|
-
| Normal dev | `
|
|
582
|
+
| Prototyping | `auto` | `coarse` | `budget` | off | off | off |
|
|
583
|
+
| Normal dev | `auto` | `standard` | `balanced` | on | on | on |
|
|
584
584
|
| Production | `interactive` | `fine` | `quality` | on | on | on |
|
|
585
585
|
|
|
586
586
|
---
|
|
@@ -896,7 +896,7 @@ learnship/
|
|
|
896
896
|
├── bin/
|
|
897
897
|
│ └── install.js # Multi-platform installer (Claude Code, OpenCode, Gemini CLI, Codex CLI, Windsurf)
|
|
898
898
|
├── tests/
|
|
899
|
-
│ └──
|
|
899
|
+
│ └── run_all.sh # 15 test suites, 1200+ checks across 6 platforms
|
|
900
900
|
├── SKILL.md # Meta-skill: platform context loaded by Cascade / AI agents
|
|
901
901
|
├── install.sh # Shell installer wrapper
|
|
902
902
|
├── package.json # npm package (npx learnship)
|
package/bin/install.js
CHANGED
|
@@ -503,11 +503,18 @@ function verifyInstalled(dirPath, description) {
|
|
|
503
503
|
return true;
|
|
504
504
|
}
|
|
505
505
|
|
|
506
|
+
// Internal-only workflows that should never be installed to user projects.
|
|
507
|
+
// These are used to maintain the learnship repo itself.
|
|
508
|
+
const INTERNAL_ONLY_WORKFLOWS = new Set([
|
|
509
|
+
'sync-upstream-skills.md',
|
|
510
|
+
]);
|
|
511
|
+
|
|
506
512
|
/** Recursively copy dir, replacing path references in .md files */
|
|
507
513
|
function copyDir(srcDir, destDir, pathPrefix, platform) {
|
|
508
514
|
if (fs.existsSync(destDir)) fs.rmSync(destDir, { recursive: true });
|
|
509
515
|
fs.mkdirSync(destDir, { recursive: true });
|
|
510
516
|
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
517
|
+
if (INTERNAL_ONLY_WORKFLOWS.has(entry.name)) continue;
|
|
511
518
|
const src = path.join(srcDir, entry.name);
|
|
512
519
|
const dest = path.join(destDir, entry.name);
|
|
513
520
|
if (entry.isDirectory()) {
|
|
@@ -1503,6 +1510,7 @@ function install(platform, isGlobal) {
|
|
|
1503
1510
|
let count = 0;
|
|
1504
1511
|
for (const f of fs.readdirSync(path.join(learnshipSrc, 'workflows'))) {
|
|
1505
1512
|
if (!f.endsWith('.md')) continue;
|
|
1513
|
+
if (INTERNAL_ONLY_WORKFLOWS.has(f)) continue;
|
|
1506
1514
|
let c = fs.readFileSync(path.join(learnshipSrc, 'workflows', f), 'utf8');
|
|
1507
1515
|
c = replacePaths(c, pathPrefix, platform);
|
|
1508
1516
|
if (f === 'new-project.md') c = rewriteNewProject(c, platform);
|
|
@@ -64,32 +64,42 @@ Suggest the appropriate workflow slash command when relevant:
|
|
|
64
64
|
| Workflow | When to suggest |
|
|
65
65
|
|----------|----------------|
|
|
66
66
|
| `/new-project` | User wants to start a new project from scratch |
|
|
67
|
+
| `/new-milestone` | Start a new milestone cycle on an existing project |
|
|
67
68
|
| `/discuss-phase [N]` | Before planning a phase — capture user's implementation vision |
|
|
69
|
+
| `/discuss-milestone` | Capture milestone-level goals before `/new-milestone` |
|
|
68
70
|
| `/plan-phase [N]` | After discussing a phase — create executable plans |
|
|
69
71
|
| `/execute-phase [N]` | Plans exist and are ready to run |
|
|
70
72
|
| `/verify-work [N]` | Phase execution complete — user acceptance testing |
|
|
73
|
+
| `/review` | Code ready for review — multi-persona quality check |
|
|
74
|
+
| `/ship` | Tests pass, code reviewed — ship it (test → lint → commit → push → PR) |
|
|
75
|
+
| `/complete-milestone` | All phases in the current milestone are done |
|
|
71
76
|
| `/ls` | User asks "where are we?", "what's next?", or starts a new session |
|
|
72
77
|
| `/next` | User wants to keep moving without deciding what to do |
|
|
73
|
-
| `/quick [task]` | Small ad-hoc task that doesn't need full phase ceremony |
|
|
74
78
|
| `/progress` | Status overview and routing |
|
|
79
|
+
| `/quick [task]` | Small ad-hoc task that doesn't need full phase ceremony |
|
|
80
|
+
| `/debug [symptom]` | Bug report — systematic hypothesis-driven debugging |
|
|
81
|
+
| `/map-codebase` | Analyze existing codebase structure before planning (brownfield projects) |
|
|
82
|
+
| `/ideate` | Codebase-grounded idea generation (`--explore` for Socratic mode) |
|
|
83
|
+
| `/challenge` | Stress-test a proposal with product + engineering forcing questions |
|
|
84
|
+
| `/settings` | Change project configuration after setup |
|
|
85
|
+
| `/health` | Project health check — stale files, uncommitted changes, config drift |
|
|
86
|
+
| `/compound` | Just solved a problem or learned a pattern — capture it while fresh |
|
|
75
87
|
| `/pause-work` | User is stopping mid-phase |
|
|
76
88
|
| `/resume-work` | User is returning to an in-progress project |
|
|
77
|
-
| `/
|
|
78
|
-
| `/compound` | Just solved a problem or learned a pattern — capture it while fresh |
|
|
79
|
-
| `/review` | Code ready for review — multi-persona quality check |
|
|
80
|
-
| `/challenge` | About to commit to a milestone or big feature — stress-test the scope |
|
|
81
|
-
| `/ship` | Tests pass, code reviewed — ship it (test → lint → commit → push → PR) |
|
|
82
|
-
| `/ideate` | Looking for what to build next — codebase-grounded idea generation (add `--explore` for Socratic mode) |
|
|
83
|
-
| `/guard` | Working on sensitive files — enable safety mode with destructive command warnings |
|
|
84
|
-
| `/sync-docs` | After code changes — detect stale documentation |
|
|
85
|
-
| `/forensics` | Something went wrong — post-mortem investigation (read-only) |
|
|
86
|
-
| `/undo` | Need to revert commits safely — preserves git history |
|
|
89
|
+
| `/guard` | Working on sensitive files — enable safety mode |
|
|
87
90
|
| `/note [text]` | Quick idea capture — zero friction, no questions |
|
|
88
91
|
| `/session-report` | End of session — generate summary for stakeholders |
|
|
89
92
|
| `/secure-phase [N]` | After execution — per-phase STRIDE security verification |
|
|
93
|
+
| `/validate-phase [N]` | Retroactive test coverage audit for a completed phase |
|
|
94
|
+
| `/diagnose-issues` | Batch-diagnose multiple UAT issues after `/verify-work` |
|
|
90
95
|
| `/docs-update` | Generate or update project documentation |
|
|
96
|
+
| `/sync-docs` | After code changes — detect stale documentation |
|
|
91
97
|
| `/extract-learnings [N]` | After phase completion — structured learning extraction |
|
|
92
98
|
| `/milestone-summary` | Generate comprehensive milestone summary for team onboarding |
|
|
99
|
+
| `/forensics` | Something went wrong — post-mortem investigation (read-only) |
|
|
100
|
+
| `/undo` | Need to revert commits safely — preserves git history |
|
|
101
|
+
| `/knowledge-base` | Aggregate learnings across sessions into searchable KNOWLEDGE.md |
|
|
102
|
+
| `/transition` | Hand off project context to a new session or collaborator |
|
|
93
103
|
|
|
94
104
|
## Planning Artifacts
|
|
95
105
|
|
|
@@ -150,15 +160,36 @@ Set `"parallelization": { "enabled": true|false }` in `.planning/config.json` ba
|
|
|
150
160
|
|
|
151
161
|
## Structured Questions
|
|
152
162
|
|
|
153
|
-
When workflows include `AskUserQuestion()` blocks, **Cursor has no native structured question tool**. Present each question as a numbered text list with descriptions and ask the user to reply with their choice number or label.
|
|
163
|
+
When workflows include `AskUserQuestion()` blocks, **Cursor has no native structured question tool**. Present each question as a numbered text list with descriptions and ask the user to reply with their choice number or label. Present questions in rounds (Round 1: core settings, Round 2: workflow agents, Round 3: pipeline & git, Round 4: parallelization). **Wait for the user's reply after EACH round before showing the next.** Do NOT present all questions at once.
|
|
154
164
|
|
|
165
|
+
Example:
|
|
155
166
|
```
|
|
156
167
|
**Working Style**
|
|
157
168
|
How do you want to work?
|
|
158
|
-
1.
|
|
169
|
+
1. Auto (Recommended) — Auto-approve steps, just execute
|
|
159
170
|
2. Interactive — Confirm at each step
|
|
160
171
|
```
|
|
161
172
|
|
|
173
|
+
## Config Schema
|
|
174
|
+
|
|
175
|
+
After all configuration rounds are answered, write `.planning/config.json` with this EXACT schema. Map user answers to these keys — do NOT invent keys like `working_style`, `model_tier`, `platform`, `milestone`, or `phases`:
|
|
176
|
+
|
|
177
|
+
- Working Style → `"mode"`: `"auto"` or `"interactive"`
|
|
178
|
+
- Granularity → `"granularity"`: `"coarse"`, `"standard"`, or `"fine"`
|
|
179
|
+
- Learning Partner → `"learning_mode"`: `"auto"` or `"manual"`
|
|
180
|
+
- AI Models → `"model_profile"`: `"balanced"`, `"quality"`, or `"budget"`
|
|
181
|
+
- Research → `"workflow.research"`: `true` or `false`
|
|
182
|
+
- Plan Check → `"workflow.plan_check"`: `true` or `false`
|
|
183
|
+
- Verifier → `"workflow.verifier"`: `true` or `false`
|
|
184
|
+
- Review → `"workflow.review"`: `true` or `false`
|
|
185
|
+
- TDD → `"test_first"`: `true` or `false`
|
|
186
|
+
- Ship Pipeline → `"ship.auto_test"`, `"ship.conventional_commits"`, `"ship.pr_template"`
|
|
187
|
+
- Git Tracking → `"planning.commit_docs"`: `true` or `false`
|
|
188
|
+
- Commit Mode → `"planning.commit_mode"`: `"auto"` or `"manual"`
|
|
189
|
+
- Parallel Execution → `"parallelization.enabled"`: `true` or `false`
|
|
190
|
+
|
|
191
|
+
Run the config verification gate after writing — it must print `CONFIG_VALID`.
|
|
192
|
+
|
|
162
193
|
## Learning Mode
|
|
163
194
|
|
|
164
195
|
Read `learning_mode` from `.planning/config.json` (default: "auto"):
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "Agentic engineering done right — 57 structured workflows, 17 specialist agent personas, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
5
|
"author": "Favio Vazquez",
|
|
6
6
|
"homepage": "https://faviovazquez.github.io/learnship/",
|
|
@@ -229,7 +229,7 @@ The `parallelization` field is now an object. Legacy flat `"parallelization": tr
|
|
|
229
229
|
|
|
230
230
|
### Gates Section
|
|
231
231
|
|
|
232
|
-
Controls which confirmation prompts are shown during workflows. Set to `false` to skip specific confirmations (useful for experienced users in
|
|
232
|
+
Controls which confirmation prompts are shown during workflows. Set to `false` to skip specific confirmations (useful for experienced users in auto mode).
|
|
233
233
|
|
|
234
234
|
| Option | Default | Description |
|
|
235
235
|
|--------|---------|-------------|
|
|
@@ -73,6 +73,8 @@ AskUserQuestion([
|
|
|
73
73
|
])
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
77
|
+
|
|
76
78
|
If "Skip" → exit workflow.
|
|
77
79
|
|
|
78
80
|
If no CONTEXT.md exists but plans already exist for this phase:
|
|
@@ -91,6 +93,8 @@ AskUserQuestion([
|
|
|
91
93
|
])
|
|
92
94
|
```
|
|
93
95
|
|
|
96
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
97
|
+
|
|
94
98
|
## Step 3: Scout Codebase
|
|
95
99
|
|
|
96
100
|
Do a lightweight scan to inform the discussion. Look for:
|
|
@@ -164,6 +168,8 @@ AskUserQuestion([
|
|
|
164
168
|
])
|
|
165
169
|
```
|
|
166
170
|
|
|
171
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
172
|
+
|
|
167
173
|
If "All clear" → skip to Step 6.
|
|
168
174
|
|
|
169
175
|
**For each selected area, discuss:**
|
|
@@ -186,6 +192,8 @@ AskUserQuestion([
|
|
|
186
192
|
])
|
|
187
193
|
```
|
|
188
194
|
|
|
195
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
196
|
+
|
|
189
197
|
3. After 4 questions, ask: "More questions about [area], or move to next?"
|
|
190
198
|
4. If more → ask 4 more, then check again
|
|
191
199
|
|
|
@@ -207,6 +215,8 @@ AskUserQuestion([
|
|
|
207
215
|
])
|
|
208
216
|
```
|
|
209
217
|
|
|
218
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
219
|
+
|
|
210
220
|
<scope_guardrail>
|
|
211
221
|
**No scope creep.** The phase boundary comes from ROADMAP.md and is FIXED. Discussion clarifies HOW to implement what's scoped, never WHETHER to add new capabilities.
|
|
212
222
|
|
|
@@ -178,6 +178,6 @@ Edit project settings with `/settings` or directly:
|
|
|
178
178
|
cat .planning/config.json
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
Key settings: `mode` (
|
|
181
|
+
Key settings: `mode` (auto/interactive), `model_profile` (quality/balanced/budget), `learning_mode` (auto/manual).
|
|
182
182
|
|
|
183
183
|
See `README.md` for the full configuration reference.
|
|
@@ -119,6 +119,8 @@ AskUserQuestion([
|
|
|
119
119
|
])
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
123
|
+
|
|
122
124
|
Note: Any corrections discussed here are not automatically captured. Run `discuss-phase [N]` to write them to a CONTEXT.md that planners will read.
|
|
123
125
|
|
|
124
126
|
---
|
|
@@ -6,7 +6,7 @@ description: Analyze an existing codebase and produce structured reference docs
|
|
|
6
6
|
|
|
7
7
|
Analyze an existing codebase through structured focused exploration. Produces 7 structured documents in `.planning/codebase/` that feed into `new-project` when adding features to existing code.
|
|
8
8
|
|
|
9
|
-
**Use before:** `/new-project` on a brownfield (existing) codebase.
|
|
9
|
+
**Use before:** `/new-project` on a brownfield (existing) codebase, or before `/new-milestone` when the codebase has changed significantly.
|
|
10
10
|
|
|
11
11
|
**Philosophy:** Each agent gets fresh context, explores a specific domain, and writes documents directly. The orchestrator only confirms what was created — it never receives document contents.
|
|
12
12
|
|
|
@@ -100,6 +100,64 @@ If a MILESTONE-CONTEXT.md was consumed, delete it:
|
|
|
100
100
|
git rm .planning/MILESTONE-CONTEXT.md 2>/dev/null || true
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
+
## Step 6a: Codebase Map Check
|
|
104
|
+
|
|
105
|
+
Check if the codebase has changed significantly since the last map:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
node -e "
|
|
109
|
+
const fs=require('fs');
|
|
110
|
+
const hasCbMap=fs.existsSync('.planning/codebase');
|
|
111
|
+
if(!hasCbMap){console.log('NO_MAP');}
|
|
112
|
+
else{
|
|
113
|
+
const mapFiles=fs.readdirSync('.planning/codebase').filter(f=>f.endsWith('.md'));
|
|
114
|
+
const mapAge=mapFiles.length>0?Math.max(...mapFiles.map(f=>fs.statSync('.planning/codebase/'+f).mtimeMs)):0;
|
|
115
|
+
const daysSinceMap=Math.floor((Date.now()-mapAge)/(1000*60*60*24));
|
|
116
|
+
console.log('HAS_MAP');console.log('map_files: '+mapFiles.length);console.log('days_since_update: '+daysSinceMap);
|
|
117
|
+
}
|
|
118
|
+
"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**If `NO_MAP`:** Offer codebase mapping:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
AskUserQuestion([
|
|
125
|
+
{
|
|
126
|
+
header: "Codebase Map",
|
|
127
|
+
question: "No codebase map found. The codebase may have evolved since the last milestone. Want to map it before planning new features?",
|
|
128
|
+
multiSelect: false,
|
|
129
|
+
options: [
|
|
130
|
+
{ label: "Map codebase (Recommended)", description: "Run /map-codebase to analyze current architecture, then return here" },
|
|
131
|
+
{ label: "Skip", description: "Continue without mapping — I know the current state" }
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
])
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
- **Map codebase:** Tell the user: "Run `/map-codebase` first, then come back to `/new-milestone`." Then **STOP. Exit this workflow.**
|
|
138
|
+
- **Skip:** Continue to Step 6b.
|
|
139
|
+
|
|
140
|
+
**If `HAS_MAP` and `days_since_update` > 30:** Offer to refresh:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
AskUserQuestion([
|
|
144
|
+
{
|
|
145
|
+
header: "Stale Codebase Map",
|
|
146
|
+
question: "Your codebase map is [N] days old. Want to refresh it before planning new features?",
|
|
147
|
+
multiSelect: false,
|
|
148
|
+
options: [
|
|
149
|
+
{ label: "Refresh map", description: "Run /map-codebase to update, then return here" },
|
|
150
|
+
{ label: "Use existing map", description: "Current map is close enough" }
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
])
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- **Refresh map:** Tell the user: "Run `/map-codebase` first, then come back to `/new-milestone`." Then **STOP. Exit this workflow.**
|
|
157
|
+
- **Use existing map:** Continue to Step 6b.
|
|
158
|
+
|
|
159
|
+
**If `HAS_MAP` and `days_since_update` <= 30:** Continue silently to Step 6b.
|
|
160
|
+
|
|
103
161
|
## Step 6b: Config Review
|
|
104
162
|
|
|
105
163
|
Check if the project config has all v2 keys:
|
|
@@ -40,13 +40,18 @@ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/PROJECT.md
|
|
|
40
40
|
```bash
|
|
41
41
|
node -e "
|
|
42
42
|
const fs=require('fs'),path=require('path');
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
43
|
+
const skip=new Set(['.git','node_modules','.planning','__pycache__','.venv','.windsurf','.claude','.cursor','.codex','.gemini','.opencode','.config']);
|
|
44
|
+
const codeExt=new Set(['.ts','.js','.py','.go','.rs','.swift','.java','.kt','.c','.cpp','.h','.cs','.rb','.php','.dart','.scala','.lua','.r','.R','.zig','.ex','.exs','.clj']);
|
|
45
|
+
const pkgFiles=['package.json','requirements.txt','Cargo.toml','go.mod','Package.swift','build.gradle','pom.xml','Gemfile','composer.json','pubspec.yaml','CMakeLists.txt','Makefile','mix.exs'];
|
|
46
|
+
function hasCode(dir,depth){if(depth>3)return false;try{for(const e of fs.readdirSync(dir,{withFileTypes:true})){if(e.isFile()&&codeExt.has(path.extname(e.name)))return true;if(e.isDirectory()&&!skip.has(e.name)&&hasCode(path.join(dir,e.name),depth+1))return true;}}catch{}return false;}
|
|
47
|
+
const hasPkg=pkgFiles.some(f=>fs.existsSync(f));
|
|
48
|
+
const hasCodeFiles=hasCode('.',0);
|
|
49
|
+
const hasCbMap=fs.existsSync('.planning/codebase');
|
|
50
|
+
if(hasCodeFiles||hasPkg){console.log('HAS_CODE');console.log('has_package: '+(hasPkg?'yes':'no'));console.log('has_codebase_map: '+(hasCbMap?'yes':'no'));console.log('needs_map: '+(!hasCbMap?'yes':'no'));}else{console.log('BLANK');}
|
|
46
51
|
"
|
|
47
52
|
```
|
|
48
53
|
|
|
49
|
-
**If HAS_CODE:** Note this internally as `EXISTING_CODEBASE = true`. You will
|
|
54
|
+
**If HAS_CODE:** Note this internally as `EXISTING_CODEBASE = true`. Also record `needs_map` (true if `.planning/codebase/` doesn't exist yet). You will offer codebase mapping in Step 1b before questioning. Do NOT use existing code as an excuse to skip or shorten the questioning ceremony — the ceremony exists precisely because you need the user's intent, not just their code.
|
|
50
55
|
|
|
51
56
|
Check if git is initialized:
|
|
52
57
|
|
|
@@ -69,23 +74,61 @@ Create the planning directory:
|
|
|
69
74
|
node -e "require('fs').mkdirSync('.planning/research',{recursive:true})"
|
|
70
75
|
```
|
|
71
76
|
|
|
72
|
-
## Step 1b: Existing Codebase
|
|
77
|
+
## Step 1b: Existing Codebase Handling (only if EXISTING_CODEBASE = true)
|
|
73
78
|
|
|
74
|
-
If `EXISTING_CODEBASE = true`,
|
|
79
|
+
If `EXISTING_CODEBASE = true`, first check whether a codebase map is needed.
|
|
75
80
|
|
|
81
|
+
**If `needs_map` is true** (existing code detected but no `.planning/codebase/`):
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
AskUserQuestion([
|
|
85
|
+
{
|
|
86
|
+
header: "Existing Codebase Detected",
|
|
87
|
+
question: "I detected existing code in this directory. Would you like to map the codebase first? This produces structured reference docs that make the questioning phase sharper.",
|
|
88
|
+
multiSelect: false,
|
|
89
|
+
options: [
|
|
90
|
+
{ label: "Map codebase first (Recommended)", description: "Run /map-codebase to analyze architecture, stack, conventions, and concerns — then return here" },
|
|
91
|
+
{ label: "Quick scan only", description: "Do a fast structural scan and continue without full mapping" },
|
|
92
|
+
{ label: "Skip — I know this codebase", description: "Proceed directly to configuration questions" }
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
])
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
99
|
+
|
|
100
|
+
- **Map codebase first:** Tell the user: "Run `/map-codebase` first, then come back to `/new-project` — the codebase map will be available for the questioning phase." Then **STOP. Exit this workflow.** The user will return to `/new-project` after mapping completes.
|
|
101
|
+
- **Quick scan only:** Continue with the quick scan below.
|
|
102
|
+
- **Skip:** Continue directly to Step 2 (configuration).
|
|
103
|
+
|
|
104
|
+
**If `needs_map` is false** (codebase map already exists): Read the existing map for context and continue with the quick scan below.
|
|
105
|
+
|
|
106
|
+
**Quick structural scan** (for "Quick scan only" or when map already exists):
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
find . -maxdepth 3 -not -path './.git/*' -not -path './node_modules/*' -not -path './.planning/*' -not -path './__pycache__/*' -not -path './.venv/*' -not -path './.windsurf/*' -not -path './.claude/*' -not -path './.cursor/*' -not -path './.codex/*' -not -path './.gemini/*' -not -path './.opencode/*' | sort | head -40
|
|
110
|
+
# PowerShell: Get-ChildItem -Recurse -Depth 3 | Where-Object { $_.FullName -notmatch '\.git|node_modules|\.planning|__pycache__|\.venv|\.windsurf|\.claude|\.cursor|\.codex|\.gemini|\.opencode' } | Select-Object -First 40
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
If `.planning/codebase/` exists, also read the summary docs:
|
|
76
114
|
```bash
|
|
77
|
-
|
|
78
|
-
|
|
115
|
+
cat .planning/codebase/ARCHITECTURE.md 2>/dev/null | head -40
|
|
116
|
+
cat .planning/codebase/STACK.md 2>/dev/null | head -40
|
|
117
|
+
cat .planning/codebase/CONCERNS.md 2>/dev/null | head -20
|
|
79
118
|
```
|
|
80
119
|
|
|
81
120
|
Note the tech stack, key directories, and any README content internally. Use this ONLY to ask sharper follow-up questions — never to infer the user's intent or skip ceremony steps.
|
|
82
121
|
|
|
83
122
|
## Step 2: Configuration
|
|
84
123
|
|
|
85
|
-
|
|
124
|
+
> **🔴 MANDATORY INTERACTIVE QUESTIONS — You MUST present each round as a blocking question using `AskUserQuestion` (or your platform's equivalent: `ask_user_question` on Windsurf, `ask_user` on Gemini, `request_user_input` on Codex). Each round is a SEPARATE blocking call. Do NOT combine all rounds into one. Do NOT render questions as plain text or markdown lists — you MUST use the interactive question tool so the user clicks options. Wait for the user's reply after EACH round before showing the next round.**
|
|
125
|
+
>
|
|
126
|
+
> **🛑 FORBIDDEN:** Do NOT present all questions at once as a text wall. Do NOT skip any question. Do NOT invent answers. Do NOT proceed to the config.json write step until ALL 4 rounds have been answered by the user.
|
|
86
127
|
|
|
87
128
|
**Round 1 — Core settings (4 questions):**
|
|
88
129
|
|
|
130
|
+
> Present these 4 questions as a SINGLE blocking `AskUserQuestion` call. STOP and wait for the user's reply before proceeding to Round 2.
|
|
131
|
+
|
|
89
132
|
```
|
|
90
133
|
AskUserQuestion([
|
|
91
134
|
{
|
|
@@ -93,7 +136,7 @@ AskUserQuestion([
|
|
|
93
136
|
question: "How do you want to work?",
|
|
94
137
|
multiSelect: false,
|
|
95
138
|
options: [
|
|
96
|
-
{ label: "
|
|
139
|
+
{ label: "Auto (Recommended)", description: "Auto-approve steps, just execute" },
|
|
97
140
|
{ label: "Interactive", description: "Confirm at each step" }
|
|
98
141
|
]
|
|
99
142
|
},
|
|
@@ -129,8 +172,12 @@ AskUserQuestion([
|
|
|
129
172
|
])
|
|
130
173
|
```
|
|
131
174
|
|
|
175
|
+
> 🛑 STOP. Wait for the user's Round 1 reply before continuing.
|
|
176
|
+
|
|
132
177
|
**Round 2 — Workflow agents (5 questions):**
|
|
133
178
|
|
|
179
|
+
> Present these 5 questions as a SINGLE blocking `AskUserQuestion` call. STOP and wait for the user's reply before proceeding to Round 3.
|
|
180
|
+
|
|
134
181
|
```
|
|
135
182
|
AskUserQuestion([
|
|
136
183
|
{
|
|
@@ -181,8 +228,12 @@ AskUserQuestion([
|
|
|
181
228
|
])
|
|
182
229
|
```
|
|
183
230
|
|
|
231
|
+
> 🛑 STOP. Wait for the user's Round 2 reply before continuing.
|
|
232
|
+
|
|
184
233
|
**Round 3 — Pipeline & git (4 questions):**
|
|
185
234
|
|
|
235
|
+
> Present these 4 questions as a SINGLE blocking `AskUserQuestion` call. STOP and wait for the user's reply before proceeding to Round 4.
|
|
236
|
+
|
|
186
237
|
```
|
|
187
238
|
AskUserQuestion([
|
|
188
239
|
{
|
|
@@ -225,13 +276,35 @@ AskUserQuestion([
|
|
|
225
276
|
])
|
|
226
277
|
```
|
|
227
278
|
|
|
279
|
+
> 🛑 STOP. Wait for the user's Round 3 reply before continuing.
|
|
280
|
+
|
|
228
281
|
<!-- LEARNSHIP_PARALLEL_BLOCK -->
|
|
229
282
|
|
|
283
|
+
> 🛑 STOP. Wait for the user's Round 4 reply (parallelization) before continuing.
|
|
284
|
+
|
|
285
|
+
**Now create `.planning/config.json`** — use EXACTLY this schema. Map the user's answers to these keys. Do NOT invent keys. Do NOT use flat keys like `working_style`, `model_tier`, `platform`, `milestone`, or `phases` — those are WRONG.
|
|
286
|
+
|
|
287
|
+
**Key mapping from questions to config:**
|
|
288
|
+
- Working Style → `"mode"`: `"auto"` or `"interactive"`
|
|
289
|
+
- Granularity → `"granularity"`: `"coarse"`, `"standard"`, or `"fine"`
|
|
290
|
+
- Learning Partner → `"learning_mode"`: `"auto"` or `"manual"`
|
|
291
|
+
- AI Models → `"model_profile"`: `"balanced"`, `"quality"`, or `"budget"`
|
|
292
|
+
- Research → `"workflow.research"`: `true` or `false`
|
|
293
|
+
- Plan Check → `"workflow.plan_check"`: `true` or `false`
|
|
294
|
+
- Verifier → `"workflow.verifier"`: `true` or `false`
|
|
295
|
+
- Review → `"workflow.review"`: `true` or `false`
|
|
296
|
+
- Solutions Search → `"workflow.solutions_search"`: `true` or `false`
|
|
297
|
+
- TDD → `"test_first"`: `true` or `false`
|
|
298
|
+
- Ship Pipeline → `"ship.auto_test"`, `"ship.conventional_commits"`, `"ship.pr_template"`: each `true` or `false`
|
|
299
|
+
- Git Tracking → `"planning.commit_docs"`: `true` or `false`
|
|
300
|
+
- Commit Mode → `"planning.commit_mode"`: `"auto"` or `"manual"`
|
|
301
|
+
- Parallel Execution → `"parallelization.enabled"`: `true` or `false`
|
|
302
|
+
|
|
230
303
|
Create `.planning/config.json` with all settings:
|
|
231
304
|
|
|
232
305
|
```json
|
|
233
306
|
{
|
|
234
|
-
"mode": "
|
|
307
|
+
"mode": "auto|interactive",
|
|
235
308
|
"granularity": "coarse|standard|fine",
|
|
236
309
|
"model_profile": "quality|balanced|budget",
|
|
237
310
|
"learning_mode": "auto|manual",
|
|
@@ -293,6 +366,38 @@ Create `.planning/config.json` with all settings:
|
|
|
293
366
|
|
|
294
367
|
**Note:** The `parallelization` field is now an object (not a flat boolean). Legacy flat `"parallelization": true` is still honored for backward compatibility. The `gates` and `safety` sections use sensible defaults — only ask users about them if they specifically want to customize.
|
|
295
368
|
|
|
369
|
+
**Verify config.json was written correctly:**
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
node -e "
|
|
373
|
+
const fs=require('fs');
|
|
374
|
+
try{
|
|
375
|
+
const c=JSON.parse(fs.readFileSync('.planning/config.json','utf8'));
|
|
376
|
+
const errs=[];
|
|
377
|
+
if(!['auto','interactive'].includes(c.mode)) errs.push('mode must be auto|interactive, got: '+c.mode);
|
|
378
|
+
if(!['coarse','standard','fine'].includes(c.granularity)) errs.push('granularity must be coarse|standard|fine');
|
|
379
|
+
if(!['quality','balanced','budget'].includes(c.model_profile)) errs.push('model_profile must be quality|balanced|budget');
|
|
380
|
+
if(!['auto','manual'].includes(c.learning_mode)) errs.push('learning_mode must be auto|manual');
|
|
381
|
+
if(typeof c.test_first!=='boolean') errs.push('test_first must be boolean');
|
|
382
|
+
if(!c.planning||!['auto','manual'].includes(c.planning.commit_mode)) errs.push('planning.commit_mode must be auto|manual');
|
|
383
|
+
if(!c.workflow||typeof c.workflow.research!=='boolean') errs.push('workflow.research must be boolean');
|
|
384
|
+
if(!c.workflow||typeof c.workflow.plan_check!=='boolean') errs.push('workflow.plan_check must be boolean');
|
|
385
|
+
if(!c.workflow||typeof c.workflow.verifier!=='boolean') errs.push('workflow.verifier must be boolean');
|
|
386
|
+
if(!c.workflow||typeof c.workflow.review!=='boolean') errs.push('workflow.review must be boolean');
|
|
387
|
+
if(!c.parallelization||typeof c.parallelization.enabled!=='boolean') errs.push('parallelization.enabled must be boolean');
|
|
388
|
+
if(!c.ship||typeof c.ship.auto_test!=='boolean') errs.push('ship.auto_test must be boolean');
|
|
389
|
+
const bad=['working_style','model_tier','platform','milestone','phases','commit_mode'];
|
|
390
|
+
for(const k of bad){if(k in c)errs.push('FORBIDDEN top-level key: '+k+' — use the nested schema');}
|
|
391
|
+
if(errs.length){console.log('CONFIG_INVALID');errs.forEach(e=>console.log(' - '+e));}
|
|
392
|
+
else console.log('CONFIG_VALID');
|
|
393
|
+
}catch(e){console.log('CONFIG_MISSING_OR_CORRUPT: '+e.message);}
|
|
394
|
+
"
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**If `CONFIG_INVALID` or `CONFIG_MISSING_OR_CORRUPT`:** The config file is wrong. Fix it to match the schema above exactly, then re-run the verification. Do NOT proceed until it passes.
|
|
398
|
+
|
|
399
|
+
**If `CONFIG_VALID`:** Continue.
|
|
400
|
+
|
|
296
401
|
If `planning.commit_docs` is false, add `.planning/` to `.gitignore`:
|
|
297
402
|
```bash
|
|
298
403
|
echo ".planning/" >> .gitignore
|
|
@@ -1039,6 +1144,8 @@ After verify-work passes: `/review` for multi-persona code review, `/ship` to te
|
|
|
1039
1144
|
|
|
1040
1145
|
💡 For ambitious projects, consider running `/challenge` to stress-test the scope through product and engineering lenses before starting Phase 1.
|
|
1041
1146
|
|
|
1147
|
+
💡 Building on an existing codebase? Run `/ideate` for codebase-grounded idea generation — it scans your code for hotspots and improvement opportunities.
|
|
1148
|
+
|
|
1042
1149
|
💡 Working near sensitive areas (auth, payments, migrations)? Run `/guard [scope]` to activate safety mode.
|
|
1043
1150
|
|
|
1044
1151
|
> **Platform detected:** `[PLATFORM]` — parallelization is `[true/false]`
|
|
@@ -91,6 +91,8 @@ AskUserQuestion([
|
|
|
91
91
|
])
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
95
|
+
|
|
94
96
|
If "All clear" → skip to Step 4.
|
|
95
97
|
|
|
96
98
|
For each selected area, ask 1-2 focused questions with concrete options using structured questions. Max 2 questions per area — keep it lightweight.
|
|
@@ -94,6 +94,8 @@ AskUserQuestion([
|
|
|
94
94
|
])
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
98
|
+
|
|
97
99
|
## Step 5: Resolve Open Threats
|
|
98
100
|
|
|
99
101
|
Read `parallelization` from `.planning/config.json` (defaults to `false`).
|
|
@@ -152,6 +154,8 @@ AskUserQuestion([
|
|
|
152
154
|
])
|
|
153
155
|
```
|
|
154
156
|
|
|
157
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
158
|
+
|
|
155
159
|
## Step 6: Write SECURITY.md
|
|
156
160
|
|
|
157
161
|
Write `.planning/phases/[padded_phase]-[phase_slug]/[padded_phase]-SECURITY.md` using `@./templates/security.md`:
|
|
@@ -18,7 +18,7 @@ If missing, create from template:
|
|
|
18
18
|
```bash
|
|
19
19
|
cp templates/config.json .planning/config.json 2>/dev/null || cat > .planning/config.json << 'EOF'
|
|
20
20
|
{
|
|
21
|
-
"mode": "
|
|
21
|
+
"mode": "auto",
|
|
22
22
|
"granularity": "standard",
|
|
23
23
|
"model_profile": "balanced",
|
|
24
24
|
"learning_mode": "auto",
|
|
@@ -117,7 +117,7 @@ AskUserQuestion([
|
|
|
117
117
|
question: "Working style?",
|
|
118
118
|
multiSelect: false,
|
|
119
119
|
options: [
|
|
120
|
-
{ label: "
|
|
120
|
+
{ label: "Auto", description: "Auto-approve steps, just execute" },
|
|
121
121
|
{ label: "Interactive", description: "Confirm at each step, more control" }
|
|
122
122
|
]
|
|
123
123
|
},
|
|
@@ -143,6 +143,8 @@ AskUserQuestion([
|
|
|
143
143
|
])
|
|
144
144
|
```
|
|
145
145
|
|
|
146
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
147
|
+
|
|
146
148
|
**Round 2 — Workflow agents (6 questions):**
|
|
147
149
|
|
|
148
150
|
```
|
|
@@ -204,6 +206,8 @@ AskUserQuestion([
|
|
|
204
206
|
])
|
|
205
207
|
```
|
|
206
208
|
|
|
209
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
210
|
+
|
|
207
211
|
**Round 3 — Pipeline & git (4 questions):**
|
|
208
212
|
|
|
209
213
|
```
|
|
@@ -249,6 +253,8 @@ AskUserQuestion([
|
|
|
249
253
|
])
|
|
250
254
|
```
|
|
251
255
|
|
|
256
|
+
> 🛑 STOP. Wait for the user's reply before continuing.
|
|
257
|
+
|
|
252
258
|
## Step 5: Save Config
|
|
253
259
|
|
|
254
260
|
After user types "done", read the current config, apply all changes, and write the complete updated JSON. Preserve any fields not shown in the menu (gates, hooks, etc.) — never drop fields the user didn't modify.
|
|
@@ -223,7 +223,7 @@ node bin/install.js --all
|
|
|
223
223
|
|
|
224
224
|
This ensures:
|
|
225
225
|
- **Windsurf** — skills already live in `.windsurf/skills/` (updated in place above)
|
|
226
|
-
- **Claude Code** —
|
|
226
|
+
- **Claude Code** — Claude skills directory rebuilt with updated skill content + rewritten `references/` paths
|
|
227
227
|
- **OpenCode / Gemini CLI / Codex** — `learnship/skills/` context files updated
|
|
228
228
|
|
|
229
229
|
---
|
|
@@ -256,7 +256,7 @@ impeccable:
|
|
|
256
256
|
|
|
257
257
|
All platforms updated (installer re-run):
|
|
258
258
|
Windsurf ✓ skills updated in place
|
|
259
|
-
Claude Code ✓
|
|
259
|
+
Claude Code ✓ skills directory rebuilt
|
|
260
260
|
Other platforms ✓ learnship/skills/ context files updated
|
|
261
261
|
|
|
262
262
|
Backup saved at: .windsurf/skills/.upstream-backup-<timestamp>/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "Learn as you build. Build with intent. — A multi-platform agentic engineering system for Windsurf, Claude Code, Cursor, OpenCode, Gemini CLI, and Codex: 57 spec-driven workflows, 17 specialist agent personas, integrated learning, and production-grade design.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentic",
|
|
@@ -56,6 +56,6 @@
|
|
|
56
56
|
"test": "bash tests/run_all.sh"
|
|
57
57
|
},
|
|
58
58
|
"engines": {
|
|
59
|
-
"node": ">=
|
|
59
|
+
"node": ">=22.0.0"
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -229,7 +229,7 @@ The `parallelization` field is now an object. Legacy flat `"parallelization": tr
|
|
|
229
229
|
|
|
230
230
|
### Gates Section
|
|
231
231
|
|
|
232
|
-
Controls which confirmation prompts are shown during workflows. Set to `false` to skip specific confirmations (useful for experienced users in
|
|
232
|
+
Controls which confirmation prompts are shown during workflows. Set to `false` to skip specific confirmations (useful for experienced users in auto mode).
|
|
233
233
|
|
|
234
234
|
| Option | Default | Description |
|
|
235
235
|
|--------|---------|-------------|
|
package/templates/config.json
CHANGED