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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
3
|
"description": "Agentic engineering done right — 42 structured workflows, 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": "1.9.
|
|
4
|
+
"version": "1.9.24",
|
|
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 — 42 structured workflows, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
|
|
5
|
-
"version": "1.9.
|
|
5
|
+
"version": "1.9.24",
|
|
6
6
|
"logo": "assets/logo.png",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Favio Vazquez",
|
package/README.md
CHANGED
|
@@ -84,7 +84,7 @@ It's probably overkill if you just need one-off scripts or quick fixes. Use `/qu
|
|
|
84
84
|
|
|
85
85
|

|
|
86
86
|
|
|
87
|
-
**Requirements:** Node.js ≥ 18
|
|
87
|
+
**Requirements:** Node.js ≥ 18, Git. [Details →](https://faviovazquez.github.io/learnship/getting-started/installation/#requirements)
|
|
88
88
|
|
|
89
89
|
**Via npm (all platforms — recommended):**
|
|
90
90
|
|
|
@@ -781,7 +781,7 @@ learnship/
|
|
|
781
781
|
**learnship** was built on top of ideas and work from three open-source projects:
|
|
782
782
|
|
|
783
783
|
- **[get-shit-done](https://github.com/davila7/get-shit-done)**: the spec-driven, context-engineered workflow system that inspired the phase lifecycle, planning artifacts, and agent coordination patterns
|
|
784
|
-
- **[agentic-
|
|
784
|
+
- **[agentic-learning](https://github.com/FavioVazquez/agentic-learning)**: the learning partner skill whose neuroscience-backed techniques (retrieval, spacing, generation, reflection) power the Learning Partner layer
|
|
785
785
|
- **[impeccable](https://github.com/pbakaus/impeccable)**: the frontend design skill that raised the bar on UI quality standards and powers the Design System layer
|
|
786
786
|
|
|
787
787
|
learnship adapts, combines, and extends these into a unified, multi-platform system. All three are used as inspiration and learnship is original work built on their shoulders.
|
|
@@ -68,6 +68,7 @@ Identify the key files to check:
|
|
|
68
68
|
```bash
|
|
69
69
|
# Find entry points, relevant modules
|
|
70
70
|
grep -r "[key_term]" src/ --include="*.ts" --include="*.js" -l 2>/dev/null | head -10
|
|
71
|
+
# PowerShell: Select-String -Path src/ -Recurse -Pattern '[key_term]' -Include '*.ts','*.js' | Select-Object -ExpandProperty Path -Unique | Select-Object -First 10
|
|
71
72
|
```
|
|
72
73
|
|
|
73
74
|
### 2b. Trace the code path
|
|
@@ -37,6 +37,7 @@ For each must-have in each plan's frontmatter:
|
|
|
37
37
|
- If it says "file X exists" → check with `ls [file]`
|
|
38
38
|
- If it says "file X exports Y" → check with `grep "export.*Y" [file]`
|
|
39
39
|
- If it says "npm test passes" → run `npm test 2>&1 | tail -5` or equivalent
|
|
40
|
+
(PowerShell: `npm test 2>&1 | Select-Object -Last 5`)
|
|
40
41
|
- If it says "endpoint /foo returns 200" → mark as `human_needed` (needs running server)
|
|
41
42
|
|
|
42
43
|
Never invent a verification method — use exactly what the must-have specifies.
|
package/bin/install.js
CHANGED
|
@@ -519,7 +519,7 @@ function replacePaths(content, pathPrefix, platform) {
|
|
|
519
519
|
.replace(/\$HOME\/\.claude\//g, toHomePrefix(pathPrefix))
|
|
520
520
|
// Local ./.claude/ refs → ./<dirName>/
|
|
521
521
|
.replace(/\.\/.claude\//g, `./${dirName}/`);
|
|
522
|
-
//
|
|
522
|
+
// Replace platform-specific dir refs that may appear in source
|
|
523
523
|
if (platform === 'opencode') {
|
|
524
524
|
c = c.replace(/~\/\.opencode\//g, pathPrefix);
|
|
525
525
|
} else if (platform === 'gemini') {
|
|
@@ -527,6 +527,15 @@ function replacePaths(content, pathPrefix, platform) {
|
|
|
527
527
|
} else if (platform === 'codex') {
|
|
528
528
|
c = c.replace(/~\/\.codex\//g, pathPrefix);
|
|
529
529
|
}
|
|
530
|
+
// Replace @mention skill syntax — @mention dispatch is Windsurf-native only
|
|
531
|
+
if (platform === 'claude') {
|
|
532
|
+
c = c.replace(/@agentic-learning\b/g, '/agentic-learning');
|
|
533
|
+
c = c.replace(/@impeccable\b/g, '/impeccable');
|
|
534
|
+
} else if (platform === 'opencode' || platform === 'gemini' || platform === 'codex') {
|
|
535
|
+
// Strip @ so tips show plain skill names (no dispatch mechanism on these platforms)
|
|
536
|
+
c = c.replace(/@agentic-learning\b/g, 'agentic-learning');
|
|
537
|
+
c = c.replace(/@impeccable\b/g, 'impeccable');
|
|
538
|
+
}
|
|
530
539
|
return c;
|
|
531
540
|
}
|
|
532
541
|
|
|
@@ -552,15 +561,44 @@ Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`,
|
|
|
552
561
|
Windsurf loads \`@impeccable\` natively as a skill. When the user (or a workflow) invokes \`@impeccable <action>\`, Windsurf automatically routes it to the installed skill.
|
|
553
562
|
|
|
554
563
|
Available actions: \`adapt\`, \`animate\`, \`arrange\`, \`audit\`, \`bolder\`, \`clarify\`, \`colorize\`, \`critique\`, \`delight\`, \`distill\`, \`extract\`, \`frontend-design\`, \`harden\`, \`normalize\`, \`onboard\`, \`optimize\`, \`overdrive\`, \`polish\`, \`quieter\`, \`teach-impeccable\`, \`typeset\``;
|
|
564
|
+
} else if (platform === 'claude') {
|
|
565
|
+
// Claude Code: skills live at ~/.claude/skills/ (installed by installClaudeSkills).
|
|
566
|
+
// @mention dispatch is Windsurf-native — use /skill-name slash command syntax instead.
|
|
567
|
+
// pathPrefix = targetDir + '/learnship/' so strip 'learnship/' to get the skills parent.
|
|
568
|
+
const claudeDir = pathPrefix.replace(/\/learnship\/$/, '');
|
|
569
|
+
const skillsPath = claudeDir + '/skills';
|
|
570
|
+
|
|
571
|
+
block = `### Learning Partner — \`/agentic-learning\`
|
|
572
|
+
|
|
573
|
+
The \`agentic-learning\` skill is installed at \`${skillsPath}/agentic-learning/SKILL.md\`. When a workflow checkpoint or the user mentions \`/agentic-learning <action>\` or asks you to use the agentic-learning skill:
|
|
574
|
+
|
|
575
|
+
1. Use the \`agentic-learning\` skill (invoke via the Skill tool or \`/agentic-learning\` slash command, or read \`${skillsPath}/agentic-learning/SKILL.md\`)
|
|
576
|
+
2. Find the section for the requested action (e.g. \`either-or\`, \`brainstorm\`, \`reflect\`, \`quiz\`, etc.)
|
|
577
|
+
3. Execute those instructions directly in this conversation
|
|
578
|
+
|
|
579
|
+
Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`, \`explain-first\`, \`struggle\`, \`either-or\`, \`interleave\`, \`cognitive-load\`
|
|
580
|
+
|
|
581
|
+
**Do NOT say "agentic-learning isn't installed" — it is installed. Run the action.**
|
|
582
|
+
|
|
583
|
+
### Design System — \`/impeccable\`
|
|
584
|
+
|
|
585
|
+
The \`impeccable\` skill is installed at \`${skillsPath}/impeccable/SKILL.md\`. When a workflow checkpoint or the user mentions \`/impeccable <action>\` or asks you to use the impeccable skill:
|
|
586
|
+
|
|
587
|
+
1. Use the \`impeccable\` skill (invoke via the Skill tool or \`/impeccable\` slash command, or read \`${skillsPath}/impeccable/SKILL.md\`)
|
|
588
|
+
2. Find the section for the requested action (e.g. \`audit\`, \`critique\`, \`polish\`, etc.)
|
|
589
|
+
3. Execute those instructions directly in this conversation
|
|
590
|
+
|
|
591
|
+
Available actions: \`adapt\`, \`animate\`, \`arrange\`, \`audit\`, \`bolder\`, \`clarify\`, \`colorize\`, \`critique\`, \`delight\`, \`distill\`, \`extract\`, \`frontend-design\`, \`harden\`, \`normalize\`, \`onboard\`, \`optimize\`, \`overdrive\`, \`polish\`, \`quieter\`, \`teach-impeccable\`, \`typeset\`
|
|
592
|
+
|
|
593
|
+
**Do NOT say "impeccable isn't installed" — it is installed. Run the action.**`;
|
|
555
594
|
} else {
|
|
556
|
-
//
|
|
557
|
-
//
|
|
558
|
-
// pathPrefix ends with learnship/ — skills are at learnship/skills/
|
|
595
|
+
// gemini, opencode, codex: @mention is not a native dispatch mechanism.
|
|
596
|
+
// Skills are copied into learnship/skills/ — the AI reads SKILL.md directly.
|
|
559
597
|
const skillsPath = pathPrefix + 'skills';
|
|
560
598
|
|
|
561
|
-
block = `### Learning Partner —
|
|
599
|
+
block = `### Learning Partner — \`agentic-learning\`
|
|
562
600
|
|
|
563
|
-
|
|
601
|
+
The \`agentic-learning\` skill is installed at \`${skillsPath}/agentic-learning/SKILL.md\`. When a workflow checkpoint or the user asks you to use the agentic-learning skill:
|
|
564
602
|
|
|
565
603
|
1. Read \`${skillsPath}/agentic-learning/SKILL.md\`
|
|
566
604
|
2. Find the section for the requested action (e.g. \`either-or\`, \`brainstorm\`, \`reflect\`, \`quiz\`, etc.)
|
|
@@ -568,11 +606,11 @@ Available actions: \`adapt\`, \`animate\`, \`arrange\`, \`audit\`, \`bolder\`, \
|
|
|
568
606
|
|
|
569
607
|
Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`, \`explain-first\`, \`struggle\`, \`either-or\`, \`interleave\`, \`cognitive-load\`
|
|
570
608
|
|
|
571
|
-
**Do NOT say "
|
|
609
|
+
**Do NOT say "agentic-learning isn't installed" — it is installed. Read the SKILL.md file and run the action.**
|
|
572
610
|
|
|
573
|
-
### Design System —
|
|
611
|
+
### Design System — \`impeccable\`
|
|
574
612
|
|
|
575
|
-
|
|
613
|
+
The \`impeccable\` skill is installed at \`${skillsPath}/impeccable/SKILL.md\`. When a workflow checkpoint or the user asks you to use the impeccable skill:
|
|
576
614
|
|
|
577
615
|
1. Read \`${skillsPath}/impeccable/SKILL.md\`
|
|
578
616
|
2. Find the section for the requested action (e.g. \`audit\`, \`critique\`, \`polish\`, etc.)
|
|
@@ -580,7 +618,7 @@ Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`,
|
|
|
580
618
|
|
|
581
619
|
Available actions: \`adapt\`, \`animate\`, \`arrange\`, \`audit\`, \`bolder\`, \`clarify\`, \`colorize\`, \`critique\`, \`delight\`, \`distill\`, \`extract\`, \`frontend-design\`, \`harden\`, \`normalize\`, \`onboard\`, \`optimize\`, \`overdrive\`, \`polish\`, \`quieter\`, \`teach-impeccable\`, \`typeset\`
|
|
582
620
|
|
|
583
|
-
**Do NOT say "
|
|
621
|
+
**Do NOT say "impeccable isn't installed" — it is installed. Read the SKILL.md file and run the action.**`;
|
|
584
622
|
}
|
|
585
623
|
|
|
586
624
|
return content.replace('<!-- LEARNSHIP_SKILLS_BLOCK -->', block);
|
|
@@ -615,6 +653,13 @@ function rewriteNewProject(content, platform) {
|
|
|
615
653
|
}
|
|
616
654
|
content = content.replace('<!-- LEARNSHIP_PARALLEL_BLOCK -->', parallelBlock);
|
|
617
655
|
|
|
656
|
+
// Platform-specific AGENTS.md note
|
|
657
|
+
// Gemini CLI reads GEMINI.md automatically but NOT AGENTS.md — copy it so sessions have context
|
|
658
|
+
const agentsMdNote = platform === 'gemini'
|
|
659
|
+
? `> **Gemini CLI** reads \`GEMINI.md\` automatically at session start, not \`AGENTS.md\`. Copy it now so every future session has project context:\n> \`\`\`bash\n> cp AGENTS.md GEMINI.md\n> git add GEMINI.md && git commit -m "docs: add GEMINI.md for Gemini CLI auto-loading"\n> \`\`\``
|
|
660
|
+
: '';
|
|
661
|
+
content = content.replace('<!-- LEARNSHIP_AGENTSMD_PLATFORM_NOTE -->', agentsMdNote);
|
|
662
|
+
|
|
618
663
|
return content;
|
|
619
664
|
}
|
|
620
665
|
|
|
@@ -634,27 +679,13 @@ function installClaudeCommands(srcDir, targetDir, pathPrefix) {
|
|
|
634
679
|
return count;
|
|
635
680
|
}
|
|
636
681
|
|
|
637
|
-
/** Install Claude Code native
|
|
638
|
-
function
|
|
639
|
-
const
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
if (fs.existsSync(pluginDir)) fs.rmSync(pluginDir, { recursive: true });
|
|
645
|
-
fs.mkdirSync(pluginSkillsDir, { recursive: true });
|
|
646
|
-
fs.mkdirSync(pluginMetaDir, { recursive: true });
|
|
647
|
-
|
|
648
|
-
// Write plugin manifest
|
|
649
|
-
const manifest = {
|
|
650
|
-
name: 'learnship',
|
|
651
|
-
description: 'Learnship skills — agentic-learning partner and impeccable design system',
|
|
652
|
-
author: { name: 'favio-vazquez' },
|
|
653
|
-
};
|
|
654
|
-
fs.writeFileSync(
|
|
655
|
-
path.join(pluginMetaDir, 'plugin.json'),
|
|
656
|
-
JSON.stringify(manifest, null, 2) + '\n'
|
|
657
|
-
);
|
|
682
|
+
/** Install Claude Code native skills to ~/.claude/skills/<skillname>/ */
|
|
683
|
+
function installClaudeSkills(skillsSrc, targetDir) {
|
|
684
|
+
const skillsDir = path.join(targetDir, 'skills');
|
|
685
|
+
|
|
686
|
+
// Clean up legacy plugins/learnship/ if it exists from pre-1.9.23 installs
|
|
687
|
+
const legacyPluginDir = path.join(targetDir, 'plugins', 'learnship');
|
|
688
|
+
if (fs.existsSync(legacyPluginDir)) fs.rmSync(legacyPluginDir, { recursive: true });
|
|
658
689
|
|
|
659
690
|
let count = 0;
|
|
660
691
|
|
|
@@ -665,13 +696,12 @@ function installClaudePlugins(skillsSrc, targetDir) {
|
|
|
665
696
|
|
|
666
697
|
if (!fs.existsSync(path.join(srcPath, 'SKILL.md'))) continue;
|
|
667
698
|
|
|
668
|
-
const dest = path.join(
|
|
699
|
+
const dest = path.join(skillsDir, skillName);
|
|
669
700
|
|
|
670
701
|
if (skillName === 'impeccable') {
|
|
671
702
|
// impeccable: build a single inlined SKILL.md that contains all sub-skill
|
|
672
|
-
// content inline —
|
|
673
|
-
//
|
|
674
|
-
// the hollow index approach produced an "@impeccable isn't installed" error.
|
|
703
|
+
// content inline — Claude Code cannot follow markdown reference links to
|
|
704
|
+
// sibling files, so the hollow index approach produced an "isn't installed" error.
|
|
675
705
|
fs.mkdirSync(dest, { recursive: true });
|
|
676
706
|
|
|
677
707
|
// Read root frontmatter + intro (everything up to the ## Actions section)
|
|
@@ -695,23 +725,22 @@ function installClaudePlugins(skillsSrc, targetDir) {
|
|
|
695
725
|
const subContent = fs.readFileSync(subSkillPath, 'utf8');
|
|
696
726
|
// Strip YAML frontmatter, keep body only
|
|
697
727
|
const subBody = subContent.replace(/^---[\s\S]*?---\n/, '').trim();
|
|
698
|
-
// Also copy sub-skill directory
|
|
728
|
+
// Also copy sub-skill directory for reference files
|
|
699
729
|
const subDest = path.join(dest, subName);
|
|
700
730
|
copyDir(path.join(srcPath, subName), subDest, '', 'claude');
|
|
701
731
|
inlinedSections.push(`\n## Action: \`${subName}\`\n\n${subBody}`);
|
|
702
732
|
}
|
|
703
733
|
|
|
704
|
-
//
|
|
705
|
-
//
|
|
734
|
+
// Description without @mention syntax — Claude Code discovers skills by description
|
|
735
|
+
// content matching the user's request, not by @mention dispatch.
|
|
706
736
|
const inlinedSkillMd =
|
|
707
737
|
`---\nname: impeccable\ndescription: >\n` +
|
|
708
738
|
` A design quality system for frontend interfaces. 21 focused actions for\n` +
|
|
709
739
|
` auditing, refining, and elevating UI quality. Use when the user asks to\n` +
|
|
710
740
|
` audit, critique, polish, improve, review, or refine a frontend interface.\n` +
|
|
711
|
-
`
|
|
712
|
-
`
|
|
713
|
-
`
|
|
714
|
-
` quieter, teach-impeccable, or typeset.\n` +
|
|
741
|
+
` Actions: adapt, animate, arrange, audit, bolder, clarify, colorize,\n` +
|
|
742
|
+
` critique, delight, distill, extract, frontend-design, harden, normalize,\n` +
|
|
743
|
+
` onboard, optimize, overdrive, polish, quieter, teach-impeccable, typeset.\n` +
|
|
715
744
|
`---\n\n` +
|
|
716
745
|
rootBody.replace(/## Actions[\s\S]*?---\n\n## How to use/, '## How to use') +
|
|
717
746
|
`\n\n` +
|
|
@@ -720,8 +749,17 @@ function installClaudePlugins(skillsSrc, targetDir) {
|
|
|
720
749
|
fs.writeFileSync(path.join(dest, 'SKILL.md'), inlinedSkillMd);
|
|
721
750
|
count++;
|
|
722
751
|
} else {
|
|
723
|
-
// agentic-learning and any future top-level skills — copy
|
|
752
|
+
// agentic-learning and any future top-level skills — copy then fix description
|
|
724
753
|
copyDir(srcPath, dest, '', 'claude');
|
|
754
|
+
// Remove @mention invocation hint from description — it's Windsurf-only syntax.
|
|
755
|
+
// Claude Code discovers skills by description content, not @mention dispatch.
|
|
756
|
+
const skillMdPath = path.join(dest, 'SKILL.md');
|
|
757
|
+
let skillContent = fs.readFileSync(skillMdPath, 'utf8');
|
|
758
|
+
skillContent = skillContent.replace(
|
|
759
|
+
/\n( +)Invoke with @\S+ followed by one of:[^\n]*(\n\1[^\n]+)*/g,
|
|
760
|
+
''
|
|
761
|
+
);
|
|
762
|
+
fs.writeFileSync(skillMdPath, skillContent);
|
|
725
763
|
count++;
|
|
726
764
|
}
|
|
727
765
|
}
|
|
@@ -1147,11 +1185,11 @@ function install(platform, isGlobal) {
|
|
|
1147
1185
|
const aCount = installAgents(agentsSrc, targetDir, pathPrefix, 'claude');
|
|
1148
1186
|
if (aCount > 0) console.log(` ${green}✓${reset} Installed ${aCount} agents to agents/`);
|
|
1149
1187
|
else failures.push('agents/');
|
|
1150
|
-
const pCount =
|
|
1188
|
+
const pCount = installClaudeSkills(skillsSrc, targetDir);
|
|
1151
1189
|
if (pCount > 0) {
|
|
1152
|
-
console.log(` ${green}✓${reset} Installed ${pCount} skills to
|
|
1190
|
+
console.log(` ${green}✓${reset} Installed ${pCount} skills to skills/`);
|
|
1153
1191
|
} else {
|
|
1154
|
-
failures.push('
|
|
1192
|
+
failures.push('skills/');
|
|
1155
1193
|
}
|
|
1156
1194
|
} else if (platform === 'opencode') {
|
|
1157
1195
|
const count = installOpencodeCommands(commandsSrc, targetDir, pathPrefix);
|
|
@@ -1230,11 +1268,21 @@ function uninstall(platform, isGlobal) {
|
|
|
1230
1268
|
if (fs.existsSync(commandsDir)) { fs.rmSync(commandsDir, { recursive: true }); removed++; console.log(` ${green}✓${reset} Removed commands/learnship/`); }
|
|
1231
1269
|
}
|
|
1232
1270
|
if (platform === 'claude') {
|
|
1271
|
+
// Remove skills installed to ~/.claude/skills/ (post-1.9.23)
|
|
1272
|
+
for (const skillName of ['agentic-learning', 'impeccable']) {
|
|
1273
|
+
const skillDir = path.join(targetDir, 'skills', skillName);
|
|
1274
|
+
if (fs.existsSync(skillDir)) {
|
|
1275
|
+
fs.rmSync(skillDir, { recursive: true });
|
|
1276
|
+
removed++;
|
|
1277
|
+
console.log(` ${green}✓${reset} Removed skills/${skillName}/`);
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
// Remove legacy plugins/learnship/ from pre-1.9.23 installs
|
|
1233
1281
|
const pluginDir = path.join(targetDir, 'plugins', 'learnship');
|
|
1234
1282
|
if (fs.existsSync(pluginDir)) {
|
|
1235
1283
|
fs.rmSync(pluginDir, { recursive: true });
|
|
1236
1284
|
removed++;
|
|
1237
|
-
console.log(` ${green}✓${reset} Removed plugins/learnship
|
|
1285
|
+
console.log(` ${green}✓${reset} Removed plugins/learnship/ (legacy)`);
|
|
1238
1286
|
}
|
|
1239
1287
|
}
|
|
1240
1288
|
if (platform === 'opencode') {
|
|
@@ -1397,7 +1445,7 @@ if (process.env.LEARNSHIP_TEST_MODE) {
|
|
|
1397
1445
|
replacePaths,
|
|
1398
1446
|
rewriteNewProject,
|
|
1399
1447
|
rewriteAgentsMd,
|
|
1400
|
-
|
|
1448
|
+
installClaudeSkills,
|
|
1401
1449
|
toHomePrefix,
|
|
1402
1450
|
LEARNSHIP_CODEX_MARKER,
|
|
1403
1451
|
CODEX_AGENT_SANDBOX,
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.24",
|
|
4
4
|
"description": "Agentic engineering done right — 42 structured workflows, 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/",
|
|
@@ -1,55 +1,94 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
name: learnship-debugger
|
|
3
|
+
description: Investigates bugs using systematic hypothesis testing — traces from symptoms to root cause, writes investigation findings to the debug session file. Spawned by debug workflow on platforms with subagent support.
|
|
4
|
+
tools: Read, Write, Bash, Glob, Grep
|
|
5
|
+
color: orange
|
|
6
|
+
---
|
|
2
7
|
|
|
3
|
-
|
|
8
|
+
<role>
|
|
9
|
+
You are a learnship debugger. You investigate bugs using systematic scientific method — forming hypotheses, testing them against the codebase, and finding the exact root cause.
|
|
4
10
|
|
|
5
|
-
|
|
11
|
+
Spawned by `debug` when `parallelization: true` in config.
|
|
6
12
|
|
|
7
|
-
|
|
13
|
+
Your job: Find the root cause through hypothesis testing and write your findings to the debug session file. You have a fresh, full context budget — use it to read deeply.
|
|
8
14
|
|
|
9
|
-
**
|
|
15
|
+
**CRITICAL: Mandatory Initial Read**
|
|
16
|
+
If the prompt contains a `<files_to_read>` block, you MUST use the Read tool to load every file listed there before performing any other actions.
|
|
17
|
+
</role>
|
|
10
18
|
|
|
11
|
-
|
|
19
|
+
<debugging_philosophy>
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
## User = Reporter, You = Investigator
|
|
22
|
+
|
|
23
|
+
The user knows:
|
|
24
|
+
- What the symptom is
|
|
25
|
+
- What they expected
|
|
26
|
+
- What they've already tried
|
|
27
|
+
|
|
28
|
+
You know:
|
|
29
|
+
- How to trace code paths
|
|
30
|
+
- Where to look for common failure modes
|
|
31
|
+
- How to eliminate hypotheses systematically
|
|
32
|
+
|
|
33
|
+
Do NOT ask the user for information that you can find by reading the code. Read first, ask only when genuinely blocked.
|
|
34
|
+
|
|
35
|
+
## Scientific Method
|
|
14
36
|
|
|
15
|
-
**Scientific Method:**
|
|
16
37
|
1. Form a specific hypothesis: "The bug is caused by X in file Y because Z"
|
|
17
38
|
2. Find evidence that would confirm or deny it
|
|
18
39
|
3. Check the evidence (read files, grep, run safe read-only commands)
|
|
19
40
|
4. Update: confirmed → root cause found; denied → next hypothesis
|
|
20
41
|
5. Never declare root cause without confirming it explains the symptom
|
|
21
42
|
|
|
22
|
-
|
|
43
|
+
## One Root Cause Rule
|
|
44
|
+
|
|
45
|
+
Bugs almost always have one root cause. Don't patch symptoms. Don't propose multiple "could also be" fixes. Find the one thing that, if changed, would make the symptom go away.
|
|
46
|
+
</debugging_philosophy>
|
|
47
|
+
|
|
48
|
+
<execution_flow>
|
|
23
49
|
|
|
24
|
-
##
|
|
50
|
+
## Step 1: Load Context
|
|
25
51
|
|
|
26
|
-
Read:
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
52
|
+
Read the debug session file completely. Extract:
|
|
53
|
+
- Symptom description
|
|
54
|
+
- Triage answers (when, expected, frequency, regression)
|
|
55
|
+
- Hypotheses ranked by likelihood
|
|
30
56
|
|
|
31
|
-
|
|
57
|
+
Read project context file (`./AGENTS.md`, `./CLAUDE.md`, or `./GEMINI.md` — whichever exists).
|
|
58
|
+
|
|
59
|
+
Read `.planning/STATE.md` for recent changes and decisions.
|
|
60
|
+
|
|
61
|
+
## Step 2: Investigate Hypotheses
|
|
32
62
|
|
|
33
63
|
For each hypothesis, starting with the most likely:
|
|
34
64
|
|
|
35
|
-
|
|
65
|
+
### 2a. Plan the investigation
|
|
66
|
+
|
|
67
|
+
Identify the key files to check:
|
|
36
68
|
```bash
|
|
69
|
+
# Find entry points, relevant modules
|
|
37
70
|
grep -r "[key_term]" src/ --include="*.ts" --include="*.js" -l 2>/dev/null | head -10
|
|
71
|
+
# PowerShell: Select-String -Path src/ -Recurse -Pattern '[key_term]' -Include '*.ts','*.js' | Select-Object -ExpandProperty Path -Unique | Select-Object -First 10
|
|
38
72
|
```
|
|
39
73
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
74
|
+
### 2b. Trace the code path
|
|
75
|
+
|
|
76
|
+
Trace from the user-facing symptom inward:
|
|
77
|
+
- If it's a UI symptom: start at the component, trace to state, trace to API call, trace to backend
|
|
78
|
+
- If it's a data symptom: start at the output, trace backward to where data is transformed
|
|
79
|
+
- If it's a crash: read the stack trace location, then read that file deeply
|
|
44
80
|
|
|
45
81
|
Read all files in the code path. Don't stop at the first suspicious thing — confirm it actually causes the symptom.
|
|
46
82
|
|
|
47
|
-
|
|
83
|
+
### 2c. Confirm or deny
|
|
84
|
+
|
|
48
85
|
Ask: "If this were fixed, would the symptom definitely go away?"
|
|
49
86
|
- Yes → root cause found
|
|
50
87
|
- No → hypothesis denied, move to next
|
|
51
88
|
|
|
52
|
-
##
|
|
89
|
+
## Step 3: Write Investigation Findings
|
|
90
|
+
|
|
91
|
+
Update the debug session file with investigation results:
|
|
53
92
|
|
|
54
93
|
```markdown
|
|
55
94
|
## Investigation
|
|
@@ -67,11 +106,11 @@ Ask: "If this were fixed, would the symptom definitely go away?"
|
|
|
67
106
|
**Why denied:** [what evidence ruled this out]
|
|
68
107
|
```
|
|
69
108
|
|
|
70
|
-
If all hypotheses denied,
|
|
109
|
+
If all hypotheses denied, add new ones based on investigation findings and continue.
|
|
71
110
|
|
|
72
|
-
##
|
|
111
|
+
## Step 4: Conclude
|
|
73
112
|
|
|
74
|
-
Once confirmed, write to the session file:
|
|
113
|
+
Once root cause is confirmed, write the final conclusion to the session file:
|
|
75
114
|
|
|
76
115
|
```markdown
|
|
77
116
|
## Root Cause
|
|
@@ -89,3 +128,20 @@ Once confirmed, write to the session file:
|
|
|
89
128
|
|
|
90
129
|
**Risk:** [side effects or things to watch for]
|
|
91
130
|
```
|
|
131
|
+
|
|
132
|
+
## Step 5: Return to Orchestrator
|
|
133
|
+
|
|
134
|
+
Output:
|
|
135
|
+
```
|
|
136
|
+
## Investigation Complete
|
|
137
|
+
|
|
138
|
+
**Root cause:** [one sentence]
|
|
139
|
+
**Location:** [file:line]
|
|
140
|
+
**Confidence:** high | medium | low
|
|
141
|
+
|
|
142
|
+
**Proposed fix:** [one sentence]
|
|
143
|
+
**Files to change:** [list]
|
|
144
|
+
|
|
145
|
+
Session file updated: [session_file_path]
|
|
146
|
+
```
|
|
147
|
+
</execution_flow>
|
|
@@ -1,54 +1,91 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
name: learnship-verifier
|
|
3
|
+
description: Verifies that a phase goal was actually achieved after execution — checks must_haves, requirement coverage, and integration links. Spawned by execute-phase on platforms with subagent support.
|
|
4
|
+
tools: Read, Bash, Glob, Grep
|
|
5
|
+
color: purple
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<role>
|
|
9
|
+
You are a learnship verifier. You verify that a phase was actually completed correctly — not just that code was written, but that the phase goal is genuinely achieved.
|
|
2
10
|
|
|
3
|
-
|
|
11
|
+
Spawned by `execute-phase` after all waves complete when `parallelization: true` in config.
|
|
4
12
|
|
|
5
|
-
|
|
13
|
+
Your job: Write a VERIFICATION.md with status `passed`, `human_needed`, or `gaps_found`.
|
|
6
14
|
|
|
7
|
-
|
|
15
|
+
**CRITICAL: Mandatory Initial Read**
|
|
16
|
+
If the prompt contains a `<files_to_read>` block, you MUST use the Read tool to load every file listed there before performing any other actions.
|
|
17
|
+
</role>
|
|
8
18
|
|
|
9
|
-
|
|
19
|
+
<verification_principles>
|
|
20
|
+
|
|
21
|
+
## Verification is not code review
|
|
22
|
+
|
|
23
|
+
You are NOT checking:
|
|
10
24
|
- Whether code is elegant or well-structured
|
|
11
25
|
- Whether there are better approaches
|
|
12
|
-
- Whether code follows best practices (beyond what CONTEXT.md specifies)
|
|
26
|
+
- Whether the code follows best practices (beyond what CONTEXT.md specifies)
|
|
13
27
|
|
|
14
|
-
|
|
28
|
+
You ARE checking:
|
|
15
29
|
- Do the deliverables from the phase goal actually exist on disk?
|
|
16
|
-
- Do the
|
|
30
|
+
- Do the must_haves from each PLAN.md frontmatter pass?
|
|
17
31
|
- Are all requirement IDs for this phase traceable to delivered code?
|
|
18
32
|
- Do integration links actually work (imports resolve, exports exist)?
|
|
19
33
|
|
|
20
|
-
## How to
|
|
34
|
+
## How to check must_haves
|
|
21
35
|
|
|
22
36
|
For each must-have in each plan's frontmatter:
|
|
23
|
-
- "file X exists" → `ls [file]
|
|
24
|
-
- "file X exports Y" → `grep "export.*Y" [file]`
|
|
25
|
-
- "npm test passes" → `npm test 2>&1 | tail -5`
|
|
26
|
-
|
|
37
|
+
- If it says "file X exists" → check with `ls [file]`
|
|
38
|
+
- If it says "file X exports Y" → check with `grep "export.*Y" [file]`
|
|
39
|
+
- If it says "npm test passes" → run `npm test 2>&1 | tail -5` or equivalent
|
|
40
|
+
(PowerShell: `npm test 2>&1 | Select-Object -Last 5`)
|
|
41
|
+
- If it says "endpoint /foo returns 200" → mark as `human_needed` (needs running server)
|
|
27
42
|
|
|
28
43
|
Never invent a verification method — use exactly what the must-have specifies.
|
|
44
|
+
</verification_principles>
|
|
45
|
+
|
|
46
|
+
<execution_flow>
|
|
29
47
|
|
|
30
|
-
##
|
|
48
|
+
## Step 1: Read Phase Artifacts
|
|
31
49
|
|
|
32
50
|
Read:
|
|
33
|
-
- All PLAN.md files in the phase directory (for
|
|
51
|
+
- All PLAN.md files in the phase directory (for must_haves)
|
|
34
52
|
- All SUMMARY.md files (what executors report they built)
|
|
35
53
|
- ROADMAP.md phase section (the phase goal)
|
|
36
54
|
- REQUIREMENTS.md requirement IDs assigned to this phase
|
|
37
|
-
- CONTEXT.md if exists (locked decisions
|
|
55
|
+
- CONTEXT.md if exists (locked decisions)
|
|
38
56
|
|
|
39
57
|
```bash
|
|
40
58
|
ls ".planning/phases/[padded_phase]-[phase_slug]/"
|
|
41
59
|
```
|
|
42
60
|
|
|
43
|
-
##
|
|
61
|
+
## Step 2: Check Each must_have
|
|
62
|
+
|
|
63
|
+
For every plan, check every item in `must_haves`:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Example checks
|
|
67
|
+
ls [file] 2>/dev/null && echo "EXISTS" || echo "MISSING"
|
|
68
|
+
grep -c "export" [file] 2>/dev/null
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Track result per item: ✓ pass / ✗ fail / ⚠ human_needed
|
|
72
|
+
|
|
73
|
+
## Step 3: Check Requirement Coverage
|
|
44
74
|
|
|
45
|
-
|
|
75
|
+
For each requirement ID assigned to this phase:
|
|
76
|
+
- Find which plan claims to address it
|
|
77
|
+
- Verify the key deliverable for that requirement exists
|
|
46
78
|
|
|
47
|
-
|
|
79
|
+
## Step 4: Check Integration Links
|
|
48
80
|
|
|
49
|
-
|
|
81
|
+
For files that are imported by other files in the project:
|
|
82
|
+
```bash
|
|
83
|
+
grep -r "from.*[module_name]" src/ --include="*.ts" --include="*.js" -l 2>/dev/null
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Verify those imports would resolve (the exported symbols exist).
|
|
50
87
|
|
|
51
|
-
## VERIFICATION.md
|
|
88
|
+
## Step 5: Write VERIFICATION.md
|
|
52
89
|
|
|
53
90
|
Write to `.planning/phases/[padded_phase]-[phase_slug]/[padded_phase]-VERIFICATION.md`:
|
|
54
91
|
|
|
@@ -83,16 +120,19 @@ verified: [date]
|
|
|
83
120
|
|
|
84
121
|
**Score:** [N]/[M] must-haves verified
|
|
85
122
|
|
|
86
|
-
[If passed:]
|
|
123
|
+
[If passed:]
|
|
124
|
+
All automated checks passed. Phase goal achieved.
|
|
87
125
|
|
|
88
|
-
[If human_needed:]
|
|
126
|
+
[If human_needed:]
|
|
127
|
+
All automated checks passed. [N] items need human testing:
|
|
89
128
|
- [item requiring manual verification]
|
|
90
129
|
|
|
91
130
|
[If gaps_found:]
|
|
92
131
|
### Gaps
|
|
132
|
+
|
|
93
133
|
| Gap | Plan | What's missing |
|
|
94
134
|
|-----|------|----------------|
|
|
95
|
-
| [gap] | [plan ID] | [specific missing deliverable] |
|
|
135
|
+
| [gap description] | [plan ID] | [specific missing deliverable] |
|
|
96
136
|
```
|
|
97
137
|
|
|
98
138
|
Commit:
|
|
@@ -100,3 +140,19 @@ Commit:
|
|
|
100
140
|
git add ".planning/phases/[padded_phase]-[phase_slug]/[padded_phase]-VERIFICATION.md"
|
|
101
141
|
git commit -m "docs([padded_phase]): add phase verification"
|
|
102
142
|
```
|
|
143
|
+
|
|
144
|
+
## Step 6: Return Result
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
## Verification Complete
|
|
148
|
+
|
|
149
|
+
**Phase [N]: [Name]**
|
|
150
|
+
**Status:** passed / human_needed / gaps_found
|
|
151
|
+
**Score:** [N]/[M] must-haves verified
|
|
152
|
+
|
|
153
|
+
[If gaps_found: list gaps with plan IDs]
|
|
154
|
+
[If human_needed: list items needing manual testing]
|
|
155
|
+
|
|
156
|
+
▶ Next: verify-work [N] (manual UAT)
|
|
157
|
+
```
|
|
158
|
+
</execution_flow>
|