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.
- package/.claude-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +2 -2
- package/README.md +75 -21
- package/SKILL.md +17 -0
- package/agents/learnship-challenger.md +96 -0
- package/agents/learnship-code-reviewer.md +109 -0
- package/agents/learnship-executor.md +15 -0
- package/agents/learnship-ideation-agent.md +83 -0
- package/agents/learnship-solution-writer.md +140 -0
- package/bin/install.js +100 -48
- package/commands/learnship/challenge.md +22 -0
- package/commands/learnship/compound.md +22 -0
- package/commands/learnship/guard.md +21 -0
- package/commands/learnship/ideate.md +23 -0
- package/commands/learnship/review.md +23 -0
- package/commands/learnship/ship.md +21 -0
- package/commands/learnship/sync-docs.md +21 -0
- package/cursor-rules/learnship.mdc +7 -0
- package/gemini-extension.json +2 -2
- package/learnship/agents/challenger.md +52 -0
- package/learnship/agents/code-reviewer.md +81 -0
- package/learnship/agents/executor.md +15 -0
- package/learnship/agents/ideation-agent.md +54 -0
- package/learnship/agents/plan-checker.md +95 -0
- package/learnship/agents/solution-writer.md +64 -0
- package/learnship/references/model-profiles.md +41 -33
- package/learnship/references/planning-config.md +49 -0
- package/learnship/references/solution-schema.md +159 -0
- package/learnship/templates/agents.md +6 -1
- package/learnship/workflows/challenge.md +189 -0
- package/learnship/workflows/complete-milestone.md +9 -0
- package/learnship/workflows/compound.md +305 -0
- package/learnship/workflows/debug.md +7 -0
- package/learnship/workflows/discuss-milestone.md +5 -0
- package/learnship/workflows/execute-phase.md +24 -0
- package/learnship/workflows/guard.md +164 -0
- package/learnship/workflows/help.md +14 -2
- package/learnship/workflows/ideate.md +182 -0
- package/learnship/workflows/knowledge-base.md +8 -0
- package/learnship/workflows/ls.md +7 -3
- package/learnship/workflows/milestone-retrospective.md +45 -0
- package/learnship/workflows/new-project.md +5 -3
- package/learnship/workflows/next.md +3 -2
- package/learnship/workflows/plan-phase.md +23 -0
- package/learnship/workflows/progress.md +9 -3
- package/learnship/workflows/review.md +226 -0
- package/learnship/workflows/set-profile.md +6 -6
- package/learnship/workflows/settings.md +8 -8
- package/learnship/workflows/ship.md +219 -0
- package/learnship/workflows/sync-docs.md +159 -0
- package/learnship/workflows/sync-upstream-skills.md +10 -10
- package/learnship/workflows/validate-phase.md +4 -4
- package/learnship/workflows/verify-work.md +3 -0
- package/package.json +1 -1
- package/references/model-profiles.md +41 -33
- 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
|
-
//
|
|
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
|
-
//
|
|
557
|
-
//
|
|
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 —
|
|
603
|
+
block = `### Learning Partner — \`agentic-learning\`
|
|
562
604
|
|
|
563
|
-
|
|
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 "
|
|
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 —
|
|
615
|
+
### Design System — \`impeccable\`
|
|
574
616
|
|
|
575
|
-
|
|
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 "
|
|
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
|
|
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
|
-
);
|
|
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(
|
|
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 —
|
|
673
|
-
//
|
|
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
|
|
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
|
-
//
|
|
705
|
-
//
|
|
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
|
-
`
|
|
712
|
-
`
|
|
713
|
-
`
|
|
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
|
|
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 =
|
|
1192
|
+
const pCount = installClaudeSkills(skillsSrc, targetDir);
|
|
1151
1193
|
if (pCount > 0) {
|
|
1152
|
-
console.log(` ${green}✓${reset} Installed ${pCount} skills to
|
|
1194
|
+
console.log(` ${green}✓${reset} Installed ${pCount} skills to skills/`);
|
|
1153
1195
|
} else {
|
|
1154
|
-
failures.push('
|
|
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
|
-
|
|
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
|
|
package/gemini-extension.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learnship",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Agentic engineering done right —
|
|
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)
|