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.
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/README.md +2 -2
- package/agents/learnship-debugger.md +1 -0
- package/agents/learnship-verifier.md +1 -0
- package/bin/install.js +96 -48
- package/gemini-extension.json +1 -1
- package/learnship/agents/debugger.md +81 -25
- package/learnship/agents/verifier.md +80 -24
- package/learnship/references/planning-config.md +2 -2
- package/learnship/workflows/add-phase.md +5 -2
- package/learnship/workflows/add-tests.md +2 -0
- package/learnship/workflows/add-todo.md +1 -1
- package/learnship/workflows/audit-milestone.md +1 -0
- package/learnship/workflows/cleanup.md +1 -1
- package/learnship/workflows/complete-milestone.md +2 -1
- package/learnship/workflows/debug.md +2 -2
- package/learnship/workflows/diagnose-issues.md +1 -0
- package/learnship/workflows/discovery-phase.md +6 -0
- package/learnship/workflows/discuss-milestone.md +2 -1
- package/learnship/workflows/discuss-phase.md +2 -1
- package/learnship/workflows/execute-plan.md +1 -0
- package/learnship/workflows/health.md +40 -34
- package/learnship/workflows/insert-phase.md +2 -2
- package/learnship/workflows/ls.md +2 -2
- package/learnship/workflows/map-codebase.md +1 -1
- package/learnship/workflows/milestone-retrospective.md +2 -0
- package/learnship/workflows/new-milestone.md +1 -0
- package/learnship/workflows/new-project.md +14 -8
- package/learnship/workflows/next.md +1 -1
- package/learnship/workflows/pause-work.md +1 -1
- package/learnship/workflows/plan-milestone-gaps.md +3 -1
- package/learnship/workflows/plan-phase.md +1 -1
- package/learnship/workflows/progress.md +2 -2
- package/learnship/workflows/quick.md +5 -3
- package/learnship/workflows/release.md +3 -2
- package/learnship/workflows/remove-phase.md +1 -1
- package/learnship/workflows/research-phase.md +1 -1
- package/learnship/workflows/resume-work.md +3 -3
- package/learnship/workflows/set-profile.md +6 -6
- package/learnship/workflows/settings.md +1 -1
- package/learnship/workflows/sync-upstream-skills.md +11 -11
- package/learnship/workflows/transition.md +1 -1
- package/learnship/workflows/update.md +2 -1
- package/learnship/workflows/validate-phase.md +2 -1
- package/package.json +1 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
cfg
|
|
57
|
-
cfg
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
37
|
-
git ls-remote https://github.com/FavioVazquez/agentic-
|
|
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-
|
|
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-
|
|
78
|
+
AGENTIC_LEARN_TMP="$TMPDIR/agentic-learning"
|
|
79
79
|
IMPECCABLE_TMP="$TMPDIR/impeccable"
|
|
80
80
|
|
|
81
|
-
echo "Cloning agentic-
|
|
82
|
-
git clone --depth 1 https://github.com/FavioVazquez/agentic-
|
|
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
|
-
|
|
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/
|
|
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-
|
|
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 ✓
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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=$(
|
|
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
|
-
|
|
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:**
|