learnship 1.9.21 → 1.9.24

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.
Files changed (47) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.cursor-plugin/plugin.json +1 -1
  3. package/README.md +2 -2
  4. package/agents/learnship-debugger.md +1 -0
  5. package/agents/learnship-verifier.md +1 -0
  6. package/bin/install.js +96 -48
  7. package/gemini-extension.json +1 -1
  8. package/learnship/agents/debugger.md +81 -25
  9. package/learnship/agents/verifier.md +80 -24
  10. package/learnship/references/planning-config.md +2 -2
  11. package/learnship/workflows/add-phase.md +5 -2
  12. package/learnship/workflows/add-tests.md +2 -0
  13. package/learnship/workflows/add-todo.md +1 -1
  14. package/learnship/workflows/audit-milestone.md +1 -0
  15. package/learnship/workflows/cleanup.md +1 -1
  16. package/learnship/workflows/complete-milestone.md +2 -1
  17. package/learnship/workflows/debug.md +2 -2
  18. package/learnship/workflows/diagnose-issues.md +1 -0
  19. package/learnship/workflows/discovery-phase.md +6 -0
  20. package/learnship/workflows/discuss-milestone.md +2 -1
  21. package/learnship/workflows/discuss-phase.md +2 -1
  22. package/learnship/workflows/execute-plan.md +1 -0
  23. package/learnship/workflows/health.md +40 -34
  24. package/learnship/workflows/insert-phase.md +2 -2
  25. package/learnship/workflows/ls.md +2 -2
  26. package/learnship/workflows/map-codebase.md +1 -1
  27. package/learnship/workflows/milestone-retrospective.md +2 -0
  28. package/learnship/workflows/new-milestone.md +1 -0
  29. package/learnship/workflows/new-project.md +14 -8
  30. package/learnship/workflows/next.md +1 -1
  31. package/learnship/workflows/pause-work.md +1 -1
  32. package/learnship/workflows/plan-milestone-gaps.md +3 -1
  33. package/learnship/workflows/plan-phase.md +1 -1
  34. package/learnship/workflows/progress.md +2 -2
  35. package/learnship/workflows/quick.md +5 -3
  36. package/learnship/workflows/release.md +3 -2
  37. package/learnship/workflows/remove-phase.md +1 -1
  38. package/learnship/workflows/research-phase.md +1 -1
  39. package/learnship/workflows/resume-work.md +3 -3
  40. package/learnship/workflows/set-profile.md +6 -6
  41. package/learnship/workflows/settings.md +1 -1
  42. package/learnship/workflows/sync-upstream-skills.md +11 -11
  43. package/learnship/workflows/transition.md +1 -1
  44. package/learnship/workflows/update.md +2 -1
  45. package/learnship/workflows/validate-phase.md +2 -1
  46. package/package.json +1 -1
  47. package/references/planning-config.md +2 -2
@@ -22,7 +22,7 @@ Example: remove-phase 7
22
22
 
23
23
  Check roadmap exists:
24
24
  ```bash
25
- python3 -c "import os; print('OK' if os.path.exists('.planning/ROADMAP.md') else 'MISSING')"
25
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/ROADMAP.md') ? 'OK' : 'MISSING')"
26
26
  ```
27
27
 
28
28
  ## Step 2: Verify the Phase is Future
@@ -13,7 +13,7 @@ Run standalone domain research for a phase. Useful when the domain is unfamiliar
13
13
  ## Step 1: Validate Phase
14
14
 
15
15
  ```bash
16
- python3 -c "import os; print('OK' if os.path.exists('.planning/ROADMAP.md') else 'MISSING')"
16
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/ROADMAP.md') ? 'OK' : 'MISSING')"
17
17
  ```
18
18
 
19
19
  Find phase `[N]` in ROADMAP.md:
@@ -9,9 +9,9 @@ Instantly restore full project context. Use when starting a new session, returni
9
9
  ## Step 1: Check Planning Structure
10
10
 
11
11
  ```bash
12
- python3 -c "import os; print('HAS_STATE' if os.path.exists('.planning/STATE.md') else 'NO_STATE')"
13
- python3 -c "import os; print('HAS_PROJECT' if os.path.exists('.planning/PROJECT.md') else 'NO_PROJECT')"
14
- python3 -c "import os; print('HAS_ROADMAP' if os.path.exists('.planning/ROADMAP.md') else 'NO_ROADMAP')"
12
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/STATE.md') ? 'HAS_STATE' : 'NO_STATE')"
13
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/PROJECT.md') ? 'HAS_PROJECT' : 'NO_PROJECT')"
14
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/ROADMAP.md') ? 'HAS_ROADMAP' : 'NO_ROADMAP')"
15
15
  ```
16
16
 
17
17
  If nothing exists: stop — run `new-project` to start a project.
@@ -51,12 +51,12 @@ Stop.
51
51
  Update the `model_profile` field in `.planning/config.json`:
52
52
 
53
53
  ```bash
54
- python3 -c "
55
- import json
56
- cfg = json.load(open('.planning/config.json'))
57
- cfg['model_profile'] = '[profile]'
58
- json.dump(cfg, open('.planning/config.json', 'w'), indent=2)
59
- print('Updated.')
54
+ node -e "
55
+ const fs=require('fs');
56
+ const cfg=JSON.parse(fs.readFileSync('.planning/config.json','utf8'));
57
+ cfg.model_profile='[profile]';
58
+ fs.writeFileSync('.planning/config.json',JSON.stringify(cfg,null,2));
59
+ console.log('Updated.');
60
60
  "
61
61
  ```
62
62
 
@@ -11,7 +11,7 @@ Interactive configuration editor for the current project. Updates `.planning/con
11
11
  ## Step 1: Ensure Config Exists
12
12
 
13
13
  ```bash
14
- python3 -c "import os; print('exists' if os.path.exists('.planning/config.json') else 'missing')"
14
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/config.json') ? 'exists' : 'missing')"
15
15
  ```
16
16
 
17
17
  If missing, create from template:
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Sync agentic-learning and impeccable skills from their upstream repos (FavioVazquez/agentic-learn + pbakaus/impeccable) — run this when upstream skills have been updated
2
+ description: Sync agentic-learning and impeccable skills from their upstream repos (FavioVazquez/agentic-learning + pbakaus/impeccable) — run this when upstream skills have been updated
3
3
  ---
4
4
 
5
5
  # sync-upstream-skills
@@ -33,8 +33,8 @@ If any check fails, stop and report what is missing.
33
33
  Show the user what they're about to pull so there are no surprises:
34
34
 
35
35
  ```bash
36
- # Latest commit on agentic-learn main
37
- git ls-remote https://github.com/FavioVazquez/agentic-learn.git HEAD | awk '{print "agentic-learn HEAD: " $1}'
36
+ # Latest commit on agentic-learning main
37
+ git ls-remote https://github.com/FavioVazquez/agentic-learning.git HEAD | awk '{print "agentic-learning HEAD: " $1}'
38
38
 
39
39
  # Latest commit on impeccable main
40
40
  git ls-remote https://github.com/pbakaus/impeccable.git HEAD | awk '{print "impeccable HEAD: " $1}'
@@ -53,7 +53,7 @@ Display:
53
53
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
54
54
 
55
55
  Will pull from:
56
- agentic-learn → github.com/FavioVazquez/agentic-learn (main)
56
+ agentic-learning → github.com/FavioVazquez/agentic-learning (main)
57
57
  impeccable → github.com/pbakaus/impeccable (main)
58
58
 
59
59
  Files updated:
@@ -75,11 +75,11 @@ Wait for confirmation.
75
75
 
76
76
  ```bash
77
77
  TMPDIR=$(mktemp -d)
78
- AGENTIC_LEARN_TMP="$TMPDIR/agentic-learn"
78
+ AGENTIC_LEARN_TMP="$TMPDIR/agentic-learning"
79
79
  IMPECCABLE_TMP="$TMPDIR/impeccable"
80
80
 
81
- echo "Cloning agentic-learn..."
82
- git clone --depth 1 https://github.com/FavioVazquez/agentic-learn.git "$AGENTIC_LEARN_TMP"
81
+ echo "Cloning agentic-learning..."
82
+ git clone --depth 1 https://github.com/FavioVazquez/agentic-learning.git "$AGENTIC_LEARN_TMP"
83
83
 
84
84
  echo "Cloning impeccable..."
85
85
  git clone --depth 1 https://github.com/pbakaus/impeccable.git "$IMPECCABLE_TMP"
@@ -97,7 +97,7 @@ Confirm both clones succeeded — `SKILL.md` must exist in `$AGENTIC_LEARN_TMP`
97
97
 
98
98
  ```bash
99
99
  BACKUP_DIR="$(pwd)/.windsurf/skills/.upstream-backup-$(date +%Y%m%d-%H%M%S)"
100
- mkdir -p "$BACKUP_DIR"
100
+ node -e "require('fs').mkdirSync('$BACKUP_DIR',{recursive:true})"
101
101
 
102
102
  cp -r "$(pwd)/.windsurf/skills/agentic-learning" "$BACKUP_DIR/agentic-learning"
103
103
  cp -r "$(pwd)/.windsurf/skills/impeccable" "$BACKUP_DIR/impeccable"
@@ -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** — `~/.claude/plugins/learnship/` rebuilt with updated skill content + rewritten `references/` paths
226
+ - **Claude Code** — `~/.claude/skills/` rebuilt with updated skill content + rewritten `references/` paths
227
227
  - **OpenCode / Gemini CLI / Codex** — `learnship/skills/` context files updated
228
228
 
229
229
  ---
@@ -247,7 +247,7 @@ Display summary:
247
247
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
248
248
 
249
249
  agentic-learning:
250
- SKILL.md ✓ synced from FavioVazquez/agentic-learn
250
+ SKILL.md ✓ synced from FavioVazquez/agentic-learning
251
251
  references/ ✓ synced ([N] files)
252
252
 
253
253
  impeccable:
@@ -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 ✓ plugins/learnship/ rebuilt
259
+ Claude Code ✓ ~/.claude/skills/ rebuilt
260
260
  Other platforms ✓ learnship/skills/ context files updated
261
261
 
262
262
  Backup saved at: .windsurf/skills/.upstream-backup-<timestamp>/
@@ -27,7 +27,7 @@ find .planning/ -name "*.md" | sort
27
27
 
28
28
  Read the most recent SUMMARY.md files (last 3 phases):
29
29
  ```bash
30
- ls -t .planning/phases/*/*-SUMMARY.md 2>/dev/null | head -6
30
+ node -e "const fs=require('fs'),path=require('path');function find(d){let r=[];try{for(const e of fs.readdirSync(d,{withFileTypes:true})){const f=path.join(d,e.name);r=r.concat(e.isDirectory()?find(f):e.name.endsWith('-SUMMARY.md')?[f]:[]);}}catch(e){}return r;}const files=find('.planning/phases').map(f=>({f,t:fs.statSync(f).mtimeMs})).sort((a,b)=>b.t-a.t).slice(0,6).map(x=>x.f);files.forEach(f=>console.log(f));"
31
31
  ```
32
32
 
33
33
  Check git status:
@@ -35,6 +35,7 @@ for loc in \
35
35
  "$HOME/favio/learnship" \
36
36
  "$HOME/learnship" \
37
37
  "$(find $HOME -name "install.sh" -path "*/learnship/*" 2>/dev/null | head -1 | xargs dirname 2>/dev/null)"; do
38
+ # PowerShell: (Get-ChildItem $HOME -Recurse -Filter install.sh -ErrorAction SilentlyContinue | Where-Object { $_.FullName -match 'learnship' } | Select-Object -First 1).DirectoryName
38
39
  test -d "$loc/.windsurf/workflows" && SOURCE_DIR="$loc" && break
39
40
  done
40
41
  ```
@@ -93,7 +94,7 @@ Stop.
93
94
  For any workflow file that exists in install dir AND differs from source AND differs from the current source (meaning you modified it):
94
95
 
95
96
  ```bash
96
- mkdir -p "$INSTALL_DIR/local-patches"
97
+ node -e "require('fs').mkdirSync('$INSTALL_DIR/local-patches',{recursive:true})"
97
98
  ```
98
99
 
99
100
  For each locally modified file:
@@ -22,7 +22,7 @@ If `nyquist_validation: false`: stop — "Validation is disabled. Enable it in `
22
22
  ## Step 2: Validate Phase
23
23
 
24
24
  ```bash
25
- python3 -c "import os; print('OK' if os.path.exists('.planning/ROADMAP.md') else 'MISSING')"
25
+ node -e "const fs=require('fs'); console.log(fs.existsSync('.planning/ROADMAP.md') ? 'OK' : 'MISSING')"
26
26
  ```
27
27
 
28
28
  Determine the phase directory:
@@ -61,6 +61,7 @@ Extract:
61
61
  find . \( -name "jest.config.*" -o -name "vitest.config.*" -o -name "pytest.ini" -o -name "pyproject.toml" \) -not -path "*/node_modules/*" 2>/dev/null
62
62
 
63
63
  find . \( -name "*.test.*" -o -name "*.spec.*" -o -name "test_*.py" \) -not -path "*/node_modules/*" 2>/dev/null | head -20
64
+ # PowerShell: Get-ChildItem -Recurse | Where-Object { $_.Name -match '\.test\.|spec\.|^test_.*\.py' -and $_.FullName -notmatch 'node_modules' } | Select-Object -First 20
64
65
  ```
65
66
 
66
67
  Identify: test framework, how to run tests, existing test file patterns.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "learnship",
3
- "version": "1.9.21",
3
+ "version": "1.9.24",
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: spec-driven workflows, integrated learning, and production-grade design.",
5
5
  "keywords": [
6
6
  "agentic",
@@ -40,7 +40,7 @@ Configuration options for `.planning/` directory behavior.
40
40
 
41
41
  ```bash
42
42
  # Read commit_docs from config.json
43
- COMMIT_DOCS=$(python3 -c "import json; c=json.load(open('.planning/config.json')); print(c.get('planning',{}).get('commit_docs','true'))" 2>/dev/null || echo 'true')
43
+ COMMIT_DOCS=$(node -e "try{const c=JSON.parse(require('fs').readFileSync('.planning/config.json','utf8'));process.stdout.write(String((c.planning||{}).commit_docs??'true'));}catch(e){process.stdout.write('true');}" 2>/dev/null || echo 'true')
44
44
  ```
45
45
 
46
46
  **Auto-detection:** If `.planning/` is gitignored, treat `commit_docs` as `false` regardless of config.json. This prevents git errors.
@@ -139,7 +139,7 @@ To use uncommitted mode:
139
139
 
140
140
  Read config directly:
141
141
  ```bash
142
- python3 -c "import json; c=json.load(open('.planning/config.json')); g=c.get('git',{}); print(g.get('branching_strategy','none'), g.get('phase_branch_template','phase-{phase}-{slug}'), g.get('milestone_branch_template','{milestone}-{slug}'))"
142
+ node -e "const c=JSON.parse(require('fs').readFileSync('.planning/config.json','utf8')),g=c.git||{};console.log(g.branching_strategy||'none',g.phase_branch_template||'phase-{phase}-{slug}',g.milestone_branch_template||'{milestone}-{slug}')"
143
143
  ```
144
144
 
145
145
  **Branch creation:**