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
@@ -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.21",
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.21",
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
  ![Install learnship](assets/install.png)
86
86
 
87
- **Requirements:** Node.js ≥ 18 (installer only), Python 3 (workflows use it for cross-platform file checks), Git. All standard — you almost certainly have them already. [Details →](https://faviovazquez.github.io/learnship/getting-started/installation/#requirements)
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-learn](https://github.com/faviovazquez/agentic-learn)**: the learning partner skill whose neuroscience-backed techniques (retrieval, spacing, generation, reflection) power the Learning Partner layer
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
- // Also replace platform-specific dir refs that may appear in source
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
- // For all non-Windsurf platforms: @mention is not a native dispatch mechanism.
557
- // The AI must read the skill file directly and execute the instructions inside it.
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 — \`@agentic-learning\`
599
+ block = `### Learning Partner — \`agentic-learning\`
562
600
 
563
- **There is no native @mention skill dispatch on this platform.** When a workflow checkpoint or the user mentions \`@agentic-learning <action>\`, you must:
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 "@agentic-learning isn't installed" — it is installed. Read the SKILL.md and run the action.**
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 — \`@impeccable\`
611
+ ### Design System — \`impeccable\`
574
612
 
575
- **There is no native @mention skill dispatch on this platform.** When a workflow checkpoint or the user mentions \`@impeccable <action>\`, you must:
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 "@impeccable isn't installed" — it is installed. Read the SKILL.md and run the action.**`;
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 plugin skills (plugins/learnship/skills/) */
638
- function installClaudePlugins(skillsSrc, targetDir) {
639
- const pluginDir = path.join(targetDir, 'plugins', 'learnship');
640
- const pluginSkillsDir = path.join(pluginDir, 'skills');
641
- const pluginMetaDir = path.join(pluginDir, '.claude-plugin');
642
-
643
- // Clean install
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(pluginSkillsDir, skillName);
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 — same pattern as agentic-learning.
673
- // Claude Code cannot follow markdown reference links to sibling files, so
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 (for Windsurf native skill support)
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
- // Root frontmatter: keep original header but update description to remove
705
- // the "Invoke with @impeccable" preamble that confused Claude Code's matcher
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
- ` Invoke with @impeccable followed by one of: adapt, animate, arrange, audit,\n` +
712
- ` bolder, clarify, colorize, critique, delight, distill, extract,\n` +
713
- ` frontend-design, harden, normalize, onboard, optimize, overdrive, polish,\n` +
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 verbatim
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 = installClaudePlugins(skillsSrc, targetDir);
1188
+ const pCount = installClaudeSkills(skillsSrc, targetDir);
1151
1189
  if (pCount > 0) {
1152
- console.log(` ${green}✓${reset} Installed ${pCount} skills to plugins/learnship/skills/`);
1190
+ console.log(` ${green}✓${reset} Installed ${pCount} skills to skills/`);
1153
1191
  } else {
1154
- failures.push('plugins/learnship/skills/');
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
- installClaudePlugins,
1448
+ installClaudeSkills,
1401
1449
  toHomePrefix,
1402
1450
  LEARNSHIP_CODEX_MARKER,
1403
1451
  CODEX_AGENT_SANDBOX,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "learnship",
3
- "version": "1.9.21",
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
- # Debugger Persona
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
- You are now operating as the **learnship debugger**. Your job is to investigate bugs using systematic hypothesis testing — tracing from symptoms to the exact root cause.
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
- You are investigating, not fixing. Read first, ask only when genuinely blocked.
11
+ Spawned by `debug` when `parallelization: true` in config.
6
12
 
7
- ## Debugging Philosophy
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
- **User = Reporter, You = Investigator**
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
- The user knows the symptom and what they expected. You trace the code path.
19
+ <debugging_philosophy>
12
20
 
13
- Do NOT ask for information you can find by reading code. Read first, ask only when genuinely blocked.
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
- **One Root Cause Rule:** 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.
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
- ## Before Investigating
50
+ ## Step 1: Load Context
25
51
 
26
- Read:
27
- - The debug session file completely (symptom, triage, hypotheses)
28
- - `./AGENTS.md` (or `./CLAUDE.md` / `./GEMINI.md`) for project conventions
29
- - `.planning/STATE.md` for recent changes and decisions that may have introduced the bug
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
- ## Investigation Steps
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
- **1. Plan the investigation** — identify the key files to check:
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
- **2. Trace the code path:**
41
- - UI symptom → start at component, trace to state, trace to API call, trace to backend
42
- - Data symptom → start at the output, trace backward to where data is transformed
43
- - Crash read the stack trace location, then read that file deeply
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
- **3. Confirm or deny:**
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
- ## Update the Debug Session File
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, form new ones based on what the investigation found and continue.
109
+ If all hypotheses denied, add new ones based on investigation findings and continue.
71
110
 
72
- ## Final Root Cause Entry
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
- # Verifier Persona
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
- You are now operating as the **learnship verifier**. Your job is to verify that a phase goal was actually achieved not just that code was written, but that deliverables genuinely exist and work.
11
+ Spawned by `execute-phase` after all waves complete when `parallelization: true` in config.
4
12
 
5
- You are checking reality, not reviewing quality.
13
+ Your job: Write a VERIFICATION.md with status `passed`, `human_needed`, or `gaps_found`.
6
14
 
7
- ## Verification Principles
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
- **You are NOT checking:**
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
- **You ARE checking:**
28
+ You ARE checking:
15
29
  - Do the deliverables from the phase goal actually exist on disk?
16
- - Do the `must_haves` from each PLAN.md frontmatter pass?
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 Check must_haves
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] 2>/dev/null && echo EXISTS || echo MISSING`
24
- - "file X exports Y" → `grep "export.*Y" [file]`
25
- - "npm test passes" → `npm test 2>&1 | tail -5` (or equivalent)
26
- - "endpoint /foo returns 200" mark as `human_needed` (needs running server)
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
- ## Before Verifying
48
+ ## Step 1: Read Phase Artifacts
31
49
 
32
50
  Read:
33
- - All PLAN.md files in the phase directory (for `must_haves`)
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 to check against)
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
- ## Verification Steps
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
- **Step 1:** For every plan, check every item in `must_haves.truths`, `must_haves.artifacts`, `must_haves.key_links`. Track: ✓ pass / ✗ fail / ⚠ human_needed.
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
- **Step 2:** For each requirement ID assigned to this phase — find which plan claims to address it, verify the key deliverable for that requirement exists.
79
+ ## Step 4: Check Integration Links
48
80
 
49
- **Step 3:** For files that are imported by other files verify imports resolve and exported symbols exist.
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 Format
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:] All automated checks passed. Phase goal achieved.
123
+ [If passed:]
124
+ All automated checks passed. Phase goal achieved.
87
125
 
88
- [If human_needed:] All automated checks passed. [N] items need human testing:
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>