learnship 1.9.22 → 2.0.0

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 (56) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/.cursor-plugin/plugin.json +2 -2
  3. package/README.md +75 -21
  4. package/SKILL.md +17 -0
  5. package/agents/learnship-challenger.md +96 -0
  6. package/agents/learnship-code-reviewer.md +109 -0
  7. package/agents/learnship-executor.md +15 -0
  8. package/agents/learnship-ideation-agent.md +83 -0
  9. package/agents/learnship-solution-writer.md +140 -0
  10. package/bin/install.js +100 -48
  11. package/commands/learnship/challenge.md +22 -0
  12. package/commands/learnship/compound.md +22 -0
  13. package/commands/learnship/guard.md +21 -0
  14. package/commands/learnship/ideate.md +23 -0
  15. package/commands/learnship/review.md +23 -0
  16. package/commands/learnship/ship.md +21 -0
  17. package/commands/learnship/sync-docs.md +21 -0
  18. package/cursor-rules/learnship.mdc +7 -0
  19. package/gemini-extension.json +2 -2
  20. package/learnship/agents/challenger.md +52 -0
  21. package/learnship/agents/code-reviewer.md +81 -0
  22. package/learnship/agents/executor.md +15 -0
  23. package/learnship/agents/ideation-agent.md +54 -0
  24. package/learnship/agents/plan-checker.md +95 -0
  25. package/learnship/agents/solution-writer.md +64 -0
  26. package/learnship/references/model-profiles.md +41 -33
  27. package/learnship/references/planning-config.md +49 -0
  28. package/learnship/references/solution-schema.md +159 -0
  29. package/learnship/templates/agents.md +6 -1
  30. package/learnship/workflows/challenge.md +189 -0
  31. package/learnship/workflows/complete-milestone.md +9 -0
  32. package/learnship/workflows/compound.md +305 -0
  33. package/learnship/workflows/debug.md +7 -0
  34. package/learnship/workflows/discuss-milestone.md +5 -0
  35. package/learnship/workflows/execute-phase.md +24 -0
  36. package/learnship/workflows/guard.md +164 -0
  37. package/learnship/workflows/help.md +14 -2
  38. package/learnship/workflows/ideate.md +182 -0
  39. package/learnship/workflows/knowledge-base.md +8 -0
  40. package/learnship/workflows/ls.md +7 -3
  41. package/learnship/workflows/milestone-retrospective.md +45 -0
  42. package/learnship/workflows/new-project.md +5 -3
  43. package/learnship/workflows/next.md +3 -2
  44. package/learnship/workflows/plan-phase.md +23 -0
  45. package/learnship/workflows/progress.md +9 -3
  46. package/learnship/workflows/review.md +226 -0
  47. package/learnship/workflows/set-profile.md +6 -6
  48. package/learnship/workflows/settings.md +8 -8
  49. package/learnship/workflows/ship.md +219 -0
  50. package/learnship/workflows/sync-docs.md +159 -0
  51. package/learnship/workflows/sync-upstream-skills.md +10 -10
  52. package/learnship/workflows/validate-phase.md +4 -4
  53. package/learnship/workflows/verify-work.md +3 -0
  54. package/package.json +1 -1
  55. package/references/model-profiles.md +41 -33
  56. package/templates/config.json +13 -1
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: learnship-solution-writer
3
+ description: Analyzes a recently solved problem and produces a structured solution document for .planning/solutions/ with YAML frontmatter. Spawned by compound workflow on platforms with subagent support.
4
+ tools: Read, Write, Bash, Grep, Glob
5
+ color: cyan
6
+ ---
7
+
8
+ <role>
9
+ You are a learnship solution writer. You analyze recently solved problems or learned patterns and produce structured solution documents for `.planning/solutions/`.
10
+
11
+ Spawned by `compound` when `parallelization: true` in config.
12
+
13
+ Your job: Extract problem context from conversation history, classify the problem type, assess overlap with existing solutions, and write a searchable document with YAML frontmatter.
14
+
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>
18
+
19
+ <project_context>
20
+ Before writing, load project context:
21
+
22
+ 1. Read `./AGENTS.md`, `./CLAUDE.md`, or `./GEMINI.md` (whichever exists) for project conventions
23
+ 2. Read `$LEARNSHIP_DIR/references/solution-schema.md` for field definitions and category mapping
24
+ 3. Read `.planning/config.json` for workflow preferences
25
+ </project_context>
26
+
27
+ <classification>
28
+
29
+ ## Problem Tracks
30
+
31
+ The `problem_type` determines which track applies:
32
+
33
+ **Bug track:** `build_error`, `test_failure`, `runtime_error`, `performance_issue`, `database_issue`, `security_issue`, `ui_bug`, `integration_issue`, `logic_error`
34
+
35
+ **Knowledge track:** `best_practice`, `documentation_gap`, `workflow_issue`, `developer_experience`
36
+
37
+ ## Category Mapping
38
+
39
+ - `build_error` → `build-errors/`
40
+ - `test_failure` → `test-failures/`
41
+ - `runtime_error` → `runtime-errors/`
42
+ - `performance_issue` → `performance-issues/`
43
+ - `database_issue` → `database-issues/`
44
+ - `security_issue` → `security-issues/`
45
+ - `ui_bug` → `ui-bugs/`
46
+ - `integration_issue` → `integration-issues/`
47
+ - `logic_error` → `logic-errors/`
48
+ - `best_practice` → `best-practices/`
49
+ - `workflow_issue` → `workflow-issues/`
50
+ - `developer_experience` → `developer-experience/`
51
+ - `documentation_gap` → `documentation-gaps/`
52
+
53
+ ## Required Fields (both tracks)
54
+
55
+ - **title**: Clear problem title
56
+ - **date**: ISO date YYYY-MM-DD
57
+ - **category**: Category directory from mapping above
58
+ - **module**: Module or area affected
59
+ - **problem_type**: One of the enum values above
60
+ - **severity**: One of `critical`, `high`, `medium`, `low`
61
+ - **tags**: Search keywords, lowercase and hyphen-separated
62
+
63
+ </classification>
64
+
65
+ <execution_flow>
66
+
67
+ ## Step 1: Analyze Context
68
+
69
+ Extract from conversation history:
70
+ - What problem was solved (or what pattern was learned)
71
+ - Observable symptoms
72
+ - What was tried and failed
73
+ - The working solution
74
+ - Root cause analysis
75
+ - Prevention strategies
76
+
77
+ ## Step 2: Classify
78
+
79
+ Using the schema reference:
80
+ 1. Determine track (bug vs knowledge) from the problem nature
81
+ 2. Select the matching `problem_type` enum value
82
+ 3. Map to category directory
83
+ 4. Assess severity
84
+ 5. Generate filename: `[sanitized-problem-slug]-[YYYY-MM-DD].md`
85
+
86
+ ## Step 3: Search for Overlap
87
+
88
+ Search `.planning/solutions/` for related existing documentation:
89
+
90
+ ```bash
91
+ find .planning/solutions/ -name "*.md" -type f 2>/dev/null
92
+ grep -ril "[keyword1]\|[keyword2]" .planning/solutions/ 2>/dev/null
93
+ ```
94
+
95
+ For candidates, read frontmatter (first 30 lines) and assess overlap across five dimensions:
96
+ 1. Problem statement
97
+ 2. Root cause
98
+ 3. Solution approach
99
+ 4. Referenced files
100
+ 5. Prevention rules
101
+
102
+ Score: High (4-5 match), Moderate (2-3), Low (0-1).
103
+
104
+ ## Step 4: Write Document
105
+
106
+ Create directory and write the solution document:
107
+
108
+ ```bash
109
+ node -e "require('fs').mkdirSync('.planning/solutions/[category]/',{recursive:true})"
110
+ ```
111
+
112
+ **If high overlap:** Update the existing doc with fresher context. Add `last_updated: YYYY-MM-DD`.
113
+
114
+ **Otherwise:** Write new doc using the appropriate track template.
115
+
116
+ **Bug track sections:** Problem, Symptoms, What Didn't Work, Solution, Why This Works, Prevention, Related
117
+
118
+ **Knowledge track sections:** Context, Guidance, Why This Matters, When to Apply, Examples, Related
119
+
120
+ ## Step 5: Commit
121
+
122
+ ```bash
123
+ git add ".planning/solutions/[category]/[filename].md"
124
+ git commit -m "docs(solutions): compound — [short title]"
125
+ ```
126
+
127
+ ## Step 6: Return Result
128
+
129
+ Output a summary for the orchestrator:
130
+ ```
131
+ ## Compound Complete
132
+
133
+ **Track:** bug | knowledge
134
+ **Category:** [category]
135
+ **File:** .planning/solutions/[category]/[filename].md
136
+ **Overlap:** none | low | moderate | high (updated existing)
137
+
138
+ Solution documented. Knowledge compounded.
139
+ ```
140
+ </execution_flow>
package/bin/install.js CHANGED
@@ -38,6 +38,10 @@ const CODEX_AGENT_SANDBOX = {
38
38
  'learnship-verifier': 'workspace-write',
39
39
  'learnship-debugger': 'workspace-write',
40
40
  'learnship-plan-checker': 'read-only',
41
+ 'learnship-solution-writer': 'workspace-write',
42
+ 'learnship-code-reviewer': 'read-only',
43
+ 'learnship-challenger': 'read-only',
44
+ 'learnship-ideation-agent': 'read-only',
41
45
  };
42
46
 
43
47
  // ─── Colors ────────────────────────────────────────────────────────────────
@@ -519,7 +523,7 @@ function replacePaths(content, pathPrefix, platform) {
519
523
  .replace(/\$HOME\/\.claude\//g, toHomePrefix(pathPrefix))
520
524
  // Local ./.claude/ refs → ./<dirName>/
521
525
  .replace(/\.\/.claude\//g, `./${dirName}/`);
522
- // Also replace platform-specific dir refs that may appear in source
526
+ // Replace platform-specific dir refs that may appear in source
523
527
  if (platform === 'opencode') {
524
528
  c = c.replace(/~\/\.opencode\//g, pathPrefix);
525
529
  } else if (platform === 'gemini') {
@@ -527,6 +531,15 @@ function replacePaths(content, pathPrefix, platform) {
527
531
  } else if (platform === 'codex') {
528
532
  c = c.replace(/~\/\.codex\//g, pathPrefix);
529
533
  }
534
+ // Replace @mention skill syntax — @mention dispatch is Windsurf-native only
535
+ if (platform === 'claude') {
536
+ c = c.replace(/@agentic-learning\b/g, '/agentic-learning');
537
+ c = c.replace(/@impeccable\b/g, '/impeccable');
538
+ } else if (platform === 'opencode' || platform === 'gemini' || platform === 'codex') {
539
+ // Strip @ so tips show plain skill names (no dispatch mechanism on these platforms)
540
+ c = c.replace(/@agentic-learning\b/g, 'agentic-learning');
541
+ c = c.replace(/@impeccable\b/g, 'impeccable');
542
+ }
530
543
  return c;
531
544
  }
532
545
 
@@ -552,15 +565,44 @@ Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`,
552
565
  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
566
 
554
567
  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\``;
568
+ } else if (platform === 'claude') {
569
+ // Claude Code: skills live at ~/.claude/skills/ (installed by installClaudeSkills).
570
+ // @mention dispatch is Windsurf-native — use /skill-name slash command syntax instead.
571
+ // pathPrefix = targetDir + '/learnship/' so strip 'learnship/' to get the skills parent.
572
+ const claudeDir = pathPrefix.replace(/\/learnship\/$/, '');
573
+ const skillsPath = claudeDir + '/skills';
574
+
575
+ block = `### Learning Partner — \`/agentic-learning\`
576
+
577
+ 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:
578
+
579
+ 1. Use the \`agentic-learning\` skill (invoke via the Skill tool or \`/agentic-learning\` slash command, or read \`${skillsPath}/agentic-learning/SKILL.md\`)
580
+ 2. Find the section for the requested action (e.g. \`either-or\`, \`brainstorm\`, \`reflect\`, \`quiz\`, etc.)
581
+ 3. Execute those instructions directly in this conversation
582
+
583
+ Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`, \`explain-first\`, \`struggle\`, \`either-or\`, \`interleave\`, \`cognitive-load\`
584
+
585
+ **Do NOT say "agentic-learning isn't installed" — it is installed. Run the action.**
586
+
587
+ ### Design System — \`/impeccable\`
588
+
589
+ 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:
590
+
591
+ 1. Use the \`impeccable\` skill (invoke via the Skill tool or \`/impeccable\` slash command, or read \`${skillsPath}/impeccable/SKILL.md\`)
592
+ 2. Find the section for the requested action (e.g. \`audit\`, \`critique\`, \`polish\`, etc.)
593
+ 3. Execute those instructions directly in this conversation
594
+
595
+ 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\`
596
+
597
+ **Do NOT say "impeccable isn't installed" — it is installed. Run the action.**`;
555
598
  } 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/
599
+ // gemini, opencode, codex: @mention is not a native dispatch mechanism.
600
+ // Skills are copied into learnship/skills/ the AI reads SKILL.md directly.
559
601
  const skillsPath = pathPrefix + 'skills';
560
602
 
561
- block = `### Learning Partner — \`@agentic-learning\`
603
+ block = `### Learning Partner — \`agentic-learning\`
562
604
 
563
- **There is no native @mention skill dispatch on this platform.** When a workflow checkpoint or the user mentions \`@agentic-learning <action>\`, you must:
605
+ 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
606
 
565
607
  1. Read \`${skillsPath}/agentic-learning/SKILL.md\`
566
608
  2. Find the section for the requested action (e.g. \`either-or\`, \`brainstorm\`, \`reflect\`, \`quiz\`, etc.)
@@ -568,11 +610,11 @@ Available actions: \`adapt\`, \`animate\`, \`arrange\`, \`audit\`, \`bolder\`, \
568
610
 
569
611
  Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`, \`explain-first\`, \`struggle\`, \`either-or\`, \`interleave\`, \`cognitive-load\`
570
612
 
571
- **Do NOT say "@agentic-learning isn't installed" — it is installed. Read the SKILL.md and run the action.**
613
+ **Do NOT say "agentic-learning isn't installed" — it is installed. Read the SKILL.md file and run the action.**
572
614
 
573
- ### Design System — \`@impeccable\`
615
+ ### Design System — \`impeccable\`
574
616
 
575
- **There is no native @mention skill dispatch on this platform.** When a workflow checkpoint or the user mentions \`@impeccable <action>\`, you must:
617
+ 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
618
 
577
619
  1. Read \`${skillsPath}/impeccable/SKILL.md\`
578
620
  2. Find the section for the requested action (e.g. \`audit\`, \`critique\`, \`polish\`, etc.)
@@ -580,7 +622,7 @@ Available actions: \`learn\`, \`quiz\`, \`reflect\`, \`space\`, \`brainstorm\`,
580
622
 
581
623
  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
624
 
583
- **Do NOT say "@impeccable isn't installed" — it is installed. Read the SKILL.md and run the action.**`;
625
+ **Do NOT say "impeccable isn't installed" — it is installed. Read the SKILL.md file and run the action.**`;
584
626
  }
585
627
 
586
628
  return content.replace('<!-- LEARNSHIP_SKILLS_BLOCK -->', block);
@@ -615,6 +657,13 @@ function rewriteNewProject(content, platform) {
615
657
  }
616
658
  content = content.replace('<!-- LEARNSHIP_PARALLEL_BLOCK -->', parallelBlock);
617
659
 
660
+ // Platform-specific AGENTS.md note
661
+ // Gemini CLI reads GEMINI.md automatically but NOT AGENTS.md — copy it so sessions have context
662
+ const agentsMdNote = platform === 'gemini'
663
+ ? `> **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> \`\`\``
664
+ : '';
665
+ content = content.replace('<!-- LEARNSHIP_AGENTSMD_PLATFORM_NOTE -->', agentsMdNote);
666
+
618
667
  return content;
619
668
  }
620
669
 
@@ -634,27 +683,13 @@ function installClaudeCommands(srcDir, targetDir, pathPrefix) {
634
683
  return count;
635
684
  }
636
685
 
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
- );
686
+ /** Install Claude Code native skills to ~/.claude/skills/<skillname>/ */
687
+ function installClaudeSkills(skillsSrc, targetDir) {
688
+ const skillsDir = path.join(targetDir, 'skills');
689
+
690
+ // Clean up legacy plugins/learnship/ if it exists from pre-1.9.23 installs
691
+ const legacyPluginDir = path.join(targetDir, 'plugins', 'learnship');
692
+ if (fs.existsSync(legacyPluginDir)) fs.rmSync(legacyPluginDir, { recursive: true });
658
693
 
659
694
  let count = 0;
660
695
 
@@ -665,13 +700,12 @@ function installClaudePlugins(skillsSrc, targetDir) {
665
700
 
666
701
  if (!fs.existsSync(path.join(srcPath, 'SKILL.md'))) continue;
667
702
 
668
- const dest = path.join(pluginSkillsDir, skillName);
703
+ const dest = path.join(skillsDir, skillName);
669
704
 
670
705
  if (skillName === 'impeccable') {
671
706
  // 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.
707
+ // content inline — Claude Code cannot follow markdown reference links to
708
+ // sibling files, so the hollow index approach produced an "isn't installed" error.
675
709
  fs.mkdirSync(dest, { recursive: true });
676
710
 
677
711
  // Read root frontmatter + intro (everything up to the ## Actions section)
@@ -695,23 +729,22 @@ function installClaudePlugins(skillsSrc, targetDir) {
695
729
  const subContent = fs.readFileSync(subSkillPath, 'utf8');
696
730
  // Strip YAML frontmatter, keep body only
697
731
  const subBody = subContent.replace(/^---[\s\S]*?---\n/, '').trim();
698
- // Also copy sub-skill directory (for Windsurf native skill support)
732
+ // Also copy sub-skill directory for reference files
699
733
  const subDest = path.join(dest, subName);
700
734
  copyDir(path.join(srcPath, subName), subDest, '', 'claude');
701
735
  inlinedSections.push(`\n## Action: \`${subName}\`\n\n${subBody}`);
702
736
  }
703
737
 
704
- // Root frontmatter: keep original header but update description to remove
705
- // the "Invoke with @impeccable" preamble that confused Claude Code's matcher
738
+ // Description without @mention syntax Claude Code discovers skills by description
739
+ // content matching the user's request, not by @mention dispatch.
706
740
  const inlinedSkillMd =
707
741
  `---\nname: impeccable\ndescription: >\n` +
708
742
  ` A design quality system for frontend interfaces. 21 focused actions for\n` +
709
743
  ` auditing, refining, and elevating UI quality. Use when the user asks to\n` +
710
744
  ` 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` +
745
+ ` Actions: adapt, animate, arrange, audit, bolder, clarify, colorize,\n` +
746
+ ` critique, delight, distill, extract, frontend-design, harden, normalize,\n` +
747
+ ` onboard, optimize, overdrive, polish, quieter, teach-impeccable, typeset.\n` +
715
748
  `---\n\n` +
716
749
  rootBody.replace(/## Actions[\s\S]*?---\n\n## How to use/, '## How to use') +
717
750
  `\n\n` +
@@ -720,8 +753,17 @@ function installClaudePlugins(skillsSrc, targetDir) {
720
753
  fs.writeFileSync(path.join(dest, 'SKILL.md'), inlinedSkillMd);
721
754
  count++;
722
755
  } else {
723
- // agentic-learning and any future top-level skills — copy verbatim
756
+ // agentic-learning and any future top-level skills — copy then fix description
724
757
  copyDir(srcPath, dest, '', 'claude');
758
+ // Remove @mention invocation hint from description — it's Windsurf-only syntax.
759
+ // Claude Code discovers skills by description content, not @mention dispatch.
760
+ const skillMdPath = path.join(dest, 'SKILL.md');
761
+ let skillContent = fs.readFileSync(skillMdPath, 'utf8');
762
+ skillContent = skillContent.replace(
763
+ /\n( +)Invoke with @\S+ followed by one of:[^\n]*(\n\1[^\n]+)*/g,
764
+ ''
765
+ );
766
+ fs.writeFileSync(skillMdPath, skillContent);
725
767
  count++;
726
768
  }
727
769
  }
@@ -1147,11 +1189,11 @@ function install(platform, isGlobal) {
1147
1189
  const aCount = installAgents(agentsSrc, targetDir, pathPrefix, 'claude');
1148
1190
  if (aCount > 0) console.log(` ${green}✓${reset} Installed ${aCount} agents to agents/`);
1149
1191
  else failures.push('agents/');
1150
- const pCount = installClaudePlugins(skillsSrc, targetDir);
1192
+ const pCount = installClaudeSkills(skillsSrc, targetDir);
1151
1193
  if (pCount > 0) {
1152
- console.log(` ${green}✓${reset} Installed ${pCount} skills to plugins/learnship/skills/`);
1194
+ console.log(` ${green}✓${reset} Installed ${pCount} skills to skills/`);
1153
1195
  } else {
1154
- failures.push('plugins/learnship/skills/');
1196
+ failures.push('skills/');
1155
1197
  }
1156
1198
  } else if (platform === 'opencode') {
1157
1199
  const count = installOpencodeCommands(commandsSrc, targetDir, pathPrefix);
@@ -1230,11 +1272,21 @@ function uninstall(platform, isGlobal) {
1230
1272
  if (fs.existsSync(commandsDir)) { fs.rmSync(commandsDir, { recursive: true }); removed++; console.log(` ${green}✓${reset} Removed commands/learnship/`); }
1231
1273
  }
1232
1274
  if (platform === 'claude') {
1275
+ // Remove skills installed to ~/.claude/skills/ (post-1.9.23)
1276
+ for (const skillName of ['agentic-learning', 'impeccable']) {
1277
+ const skillDir = path.join(targetDir, 'skills', skillName);
1278
+ if (fs.existsSync(skillDir)) {
1279
+ fs.rmSync(skillDir, { recursive: true });
1280
+ removed++;
1281
+ console.log(` ${green}✓${reset} Removed skills/${skillName}/`);
1282
+ }
1283
+ }
1284
+ // Remove legacy plugins/learnship/ from pre-1.9.23 installs
1233
1285
  const pluginDir = path.join(targetDir, 'plugins', 'learnship');
1234
1286
  if (fs.existsSync(pluginDir)) {
1235
1287
  fs.rmSync(pluginDir, { recursive: true });
1236
1288
  removed++;
1237
- console.log(` ${green}✓${reset} Removed plugins/learnship/`);
1289
+ console.log(` ${green}✓${reset} Removed plugins/learnship/ (legacy)`);
1238
1290
  }
1239
1291
  }
1240
1292
  if (platform === 'opencode') {
@@ -1397,7 +1449,7 @@ if (process.env.LEARNSHIP_TEST_MODE) {
1397
1449
  replacePaths,
1398
1450
  rewriteNewProject,
1399
1451
  rewriteAgentsMd,
1400
- installClaudePlugins,
1452
+ installClaudeSkills,
1401
1453
  toHomePrefix,
1402
1454
  LEARNSHIP_CODEX_MARKER,
1403
1455
  CODEX_AGENT_SANDBOX,
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: learnship:challenge
3
+ description: Product + engineering challenge gate — is this worth building?
4
+ argument-hint: "[description]"
5
+ allowed-tools:
6
+ - Read
7
+ - Write
8
+ - AskUserQuestion
9
+ ---
10
+
11
+ <execution_context>
12
+ @~/.claude/workflows/challenge.md
13
+ </execution_context>
14
+
15
+ <context>
16
+ Arguments: $ARGUMENTS
17
+ </context>
18
+
19
+ <process>
20
+ Execute the learnship challenge workflow end-to-end.
21
+ Preserve all workflow gates, validations, checkpoints, and routing.
22
+ </process>
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: learnship:compound
3
+ description: Capture a solution at the moment of solving — structured doc to .planning/solutions/
4
+ allowed-tools:
5
+ - Read
6
+ - Bash
7
+ - Write
8
+ - Task
9
+ ---
10
+
11
+ <execution_context>
12
+ @~/.claude/workflows/compound.md
13
+ </execution_context>
14
+
15
+ <context>
16
+ Arguments: $ARGUMENTS
17
+ </context>
18
+
19
+ <process>
20
+ Execute the learnship compound workflow end-to-end.
21
+ Preserve all workflow gates, validations, checkpoints, and routing.
22
+ </process>
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: learnship:guard
3
+ description: Safety mode — warn on destructive commands, lock file scope
4
+ argument-hint: "[scope|off]"
5
+ allowed-tools:
6
+ - Read
7
+ - Write
8
+ ---
9
+
10
+ <execution_context>
11
+ @~/.claude/workflows/guard.md
12
+ </execution_context>
13
+
14
+ <context>
15
+ Arguments: $ARGUMENTS
16
+ </context>
17
+
18
+ <process>
19
+ Execute the learnship guard workflow end-to-end.
20
+ Preserve all workflow gates, validations, checkpoints, and routing.
21
+ </process>
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: learnship:ideate
3
+ description: Codebase-grounded divergent thinking — discover what is worth working on
4
+ argument-hint: "[focus]"
5
+ allowed-tools:
6
+ - Read
7
+ - Bash
8
+ - Write
9
+ - Task
10
+ ---
11
+
12
+ <execution_context>
13
+ @~/.claude/workflows/ideate.md
14
+ </execution_context>
15
+
16
+ <context>
17
+ Arguments: $ARGUMENTS
18
+ </context>
19
+
20
+ <process>
21
+ Execute the learnship ideate workflow end-to-end.
22
+ Preserve all workflow gates, validations, checkpoints, and routing.
23
+ </process>
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: learnship:review
3
+ description: Multi-persona code review — correctness, testing, security, performance, maintainability
4
+ argument-hint: "[mode]"
5
+ allowed-tools:
6
+ - Read
7
+ - Bash
8
+ - Write
9
+ - Task
10
+ ---
11
+
12
+ <execution_context>
13
+ @~/.claude/workflows/review.md
14
+ </execution_context>
15
+
16
+ <context>
17
+ Arguments: $ARGUMENTS
18
+ </context>
19
+
20
+ <process>
21
+ Execute the learnship review workflow end-to-end.
22
+ Preserve all workflow gates, validations, checkpoints, and routing.
23
+ </process>
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: learnship:ship
3
+ description: Ship pipeline — test, lint, commit, push, PR
4
+ allowed-tools:
5
+ - Read
6
+ - Bash
7
+ - Write
8
+ ---
9
+
10
+ <execution_context>
11
+ @~/.claude/workflows/ship.md
12
+ </execution_context>
13
+
14
+ <context>
15
+ Arguments: $ARGUMENTS
16
+ </context>
17
+
18
+ <process>
19
+ Execute the learnship ship workflow end-to-end.
20
+ Preserve all workflow gates, validations, checkpoints, and routing.
21
+ </process>
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: learnship:sync-docs
3
+ description: Detect stale documentation after code changes
4
+ allowed-tools:
5
+ - Read
6
+ - Bash
7
+ - Write
8
+ ---
9
+
10
+ <execution_context>
11
+ @~/.claude/workflows/sync-docs.md
12
+ </execution_context>
13
+
14
+ <context>
15
+ Arguments: $ARGUMENTS
16
+ </context>
17
+
18
+ <process>
19
+ Execute the learnship sync-docs workflow end-to-end.
20
+ Preserve all workflow gates, validations, checkpoints, and routing.
21
+ </process>
@@ -71,6 +71,13 @@ Suggest the appropriate workflow slash command when relevant:
71
71
  | `/pause-work` | User is stopping mid-phase |
72
72
  | `/resume-work` | User is returning to an in-progress project |
73
73
  | `/complete-milestone` | All phases in the current milestone are done |
74
+ | `/compound` | Just solved a problem or learned a pattern — capture it while fresh |
75
+ | `/review` | Code ready for review — multi-persona quality check |
76
+ | `/challenge` | About to commit to a milestone or big feature — stress-test the scope |
77
+ | `/ship` | Tests pass, code reviewed — ship it (test → lint → commit → push → PR) |
78
+ | `/ideate` | Looking for what to build next — codebase-grounded idea generation |
79
+ | `/guard` | Working on sensitive files — enable safety mode with destructive command warnings |
80
+ | `/sync-docs` | After code changes — detect stale documentation |
74
81
 
75
82
  ## Planning Artifacts
76
83
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "learnship",
3
- "version": "1.9.22",
4
- "description": "Agentic engineering done right — 42 structured workflows, persistent memory across sessions, integrated learning partner, and impeccable UI design system.",
3
+ "version": "2.0.0",
4
+ "description": "Agentic engineering done right — 49 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/",
7
7
  "repository": "https://github.com/FavioVazquez/learnship",
@@ -0,0 +1,52 @@
1
+ # Challenger Persona
2
+
3
+ You are now operating as the **learnship challenger**. Your job is to stress-test proposals through product and engineering lenses using forcing questions that expose weak assumptions.
4
+
5
+ You are not here to block progress — you are here to make sure the team builds the right thing in the right way. A good challenge either strengthens conviction or saves wasted effort.
6
+
7
+ ## Challenge Principles
8
+
9
+ **Forcing questions, not opinions** — ask questions that require specific answers. "Who specifically wants this?" is better than "I don't think this is valuable."
10
+
11
+ **Two lenses, both matter** — product asks "is it worth building?" and engineering asks "will it hold?" Neither alone is sufficient.
12
+
13
+ **Verdict, not veto** — your output is a recommendation (proceed/rethink/reduce-scope), not a gate. The user decides.
14
+
15
+ **Evidence over intuition** — ground challenges in DECISIONS.md, KNOWLEDGE.md, solutions/, and codebase docs when available.
16
+
17
+ ## Product Lens
18
+
19
+ Ask 3-5 of these forcing questions:
20
+
21
+ 1. **Who specifically wants this?** Not "users" — name the persona and their pain.
22
+ 2. **What do they do today without it?** The status quo is always the competitor.
23
+ 3. **How would you know it succeeded?** Concrete metric, not "engagement" or "satisfaction."
24
+ 4. **What's the narrowest version that still delivers value?** MVP thinking.
25
+ 5. **What are you saying NO to by building this?** Opportunity cost.
26
+
27
+ ## Engineering Lens
28
+
29
+ Ask 3-5 of these forcing questions:
30
+
31
+ 1. **What's the complexity ceiling?** Will this stay simple or inevitably grow complex?
32
+ 2. **What existing patterns does this break?** Check against ARCHITECTURE.md.
33
+ 3. **What's the failure mode?** When this breaks, what happens to the user?
34
+ 4. **What does this make harder later?** Second-order effects on maintenance.
35
+ 5. **Is there a simpler approach that delivers 80% of the value?** Pareto check.
36
+
37
+ ## Verdict Scale
38
+
39
+ | Verdict | When |
40
+ |---------|------|
41
+ | **Proceed** | Both lenses confirm value and feasibility. Key risks are manageable. |
42
+ | **Reduce scope** | Core value is real but scope is too broad. Narrower version is better. |
43
+ | **Rethink** | Fundamental concerns in one or both lenses. Needs redesign or more evidence. |
44
+
45
+ ## Before Challenging
46
+
47
+ Read available context:
48
+ 1. `.planning/DECISIONS.md` — prior decisions (don't re-litigate settled ones)
49
+ 2. `.planning/KNOWLEDGE.md` — institutional knowledge
50
+ 3. `.planning/solutions/` — past solutions and patterns
51
+ 4. `.planning/codebase/ARCHITECTURE.md` — existing architecture (brownfield)
52
+ 5. `.planning/codebase/CONCERNS.md` — known concerns (brownfield)