learnship 1.9.8 → 1.9.10

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.
@@ -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.8",
4
+ "version": "1.9.10",
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.8",
5
+ "version": "1.9.10",
6
6
  "logo": "assets/logo.png",
7
7
  "author": {
8
8
  "name": "Favio Vazquez",
package/bin/install.js CHANGED
@@ -539,12 +539,19 @@ function rewriteNewProject(content, platform) {
539
539
  const gitignoreCmd = `grep -q '${dirName}/' .gitignore 2>/dev/null || echo '${dirName}/' >> .gitignore`;
540
540
  content = content.replace('<!-- LEARNSHIP_GITIGNORE_CMD -->', gitignoreCmd);
541
541
 
542
- // Parallel execution block present question on all platforms except Windsurf
542
+ // Platforms that support real parallel subagents (verified against official docs)
543
+ // Windsurf: no subagents at all
544
+ // Gemini CLI: subagents exist but parallel execution is not yet shipped (GitHub issues #14963/#17749)
545
+ const supportsParallel = platform === 'claude' || platform === 'opencode' || platform === 'codex';
546
+
547
+ // Parallel execution block
543
548
  let parallelBlock;
544
- if (platform === 'windsurf') {
545
- parallelBlock = `**Group D — Parallel execution:**\n\nWindsurf does not support real subagents. Parallelization is automatically set to \`false\`.`;
549
+ if (supportsParallel) {
550
+ parallelBlock = `**Group D — Parallel execution:**\n\n${label} supports real parallel subagents. Ask:\n\n"Do you want to enable parallel subagent execution?"\n- **No** (recommended default) — Plans execute sequentially, one at a time. Safer, easier to follow.\n- **Yes** — Each independent plan in a wave gets its own dedicated subagent with a fresh context budget. Faster, but uses more tokens.`;
551
+ } else if (platform === 'gemini') {
552
+ parallelBlock = `**Group D — Parallel execution:**\n\nGemini CLI supports subagents but only runs them sequentially — parallel execution is not yet available. Parallelization is automatically set to \`false\`.`;
546
553
  } else {
547
- parallelBlock = `**Group D — Parallel execution:**\n\n${label} supports real subagents. Ask:\n\n"Do you want to enable parallel subagent execution?"\n- **No** (recommended default) — Plans execute sequentially, one at a time. Safer, easier to follow.\n- **Yes** — Each independent plan in a wave gets its own dedicated subagent with a fresh context budget. Faster, but uses more tokens.`;
554
+ parallelBlock = `**Group D — Parallel execution:**\n\n${label} does not support real subagents. Parallelization is automatically set to \`false\`.`;
548
555
  }
549
556
  content = content.replace('<!-- LEARNSHIP_PARALLEL_BLOCK -->', parallelBlock);
550
557
 
@@ -601,23 +608,55 @@ function installClaudePlugins(skillsSrc, targetDir) {
601
608
  const dest = path.join(pluginSkillsDir, skillName);
602
609
 
603
610
  if (skillName === 'impeccable') {
604
- // impeccable: copy root SKILL.md (rewriting sibling paths → references/ paths),
605
- // then copy each sub-skill dir into references/
611
+ // impeccable: build a single inlined SKILL.md that contains all sub-skill
612
+ // content inline same pattern as agentic-learning.
613
+ // Claude Code cannot follow markdown reference links to sibling files, so
614
+ // the hollow index approach produced an "@impeccable isn't installed" error.
606
615
  fs.mkdirSync(dest, { recursive: true });
607
- let skillMdContent = fs.readFileSync(path.join(srcPath, 'SKILL.md'), 'utf8');
608
- // Rewrite repo-relative sibling links (e.g. adapt/SKILL.md) to post-install references/ paths
609
- skillMdContent = skillMdContent.replace(/\]\((?!references\/)([^/)][^)]*\/SKILL\.md)\)/g, '](references/$1)');
610
- fs.writeFileSync(path.join(dest, 'SKILL.md'), skillMdContent);
611
- const refsDest = path.join(dest, 'references');
612
- fs.mkdirSync(refsDest, { recursive: true });
613
- for (const sub of fs.readdirSync(srcPath, { withFileTypes: true })) {
614
- if (!sub.isDirectory()) continue;
615
- const subSrc = path.join(srcPath, sub.name);
616
- const subDest = path.join(refsDest, sub.name);
617
- if (fs.existsSync(path.join(subSrc, 'SKILL.md'))) {
618
- copyDir(subSrc, subDest, '', 'claude');
619
- }
616
+
617
+ // Read root frontmatter + intro (everything up to the ## Actions section)
618
+ const rootContent = fs.readFileSync(path.join(srcPath, 'SKILL.md'), 'utf8');
619
+ // Strip frontmatter, keep the prose intro + "After running" footer
620
+ const rootBody = rootContent.replace(/^---[\s\S]*?---\n/, '');
621
+
622
+ // Ordered sub-actions (defines appearance order in the inlined file)
623
+ const SUB_ACTION_ORDER = [
624
+ 'adapt', 'animate', 'audit', 'bolder', 'clarify', 'colorize',
625
+ 'critique', 'delight', 'distill', 'extract', 'frontend-design',
626
+ 'harden', 'normalize', 'onboard', 'optimize', 'polish', 'quieter',
627
+ 'teach-impeccable',
628
+ ];
629
+
630
+ // Build inlined sections by reading each sub-skill's body
631
+ const inlinedSections = [];
632
+ for (const subName of SUB_ACTION_ORDER) {
633
+ const subSkillPath = path.join(srcPath, subName, 'SKILL.md');
634
+ if (!fs.existsSync(subSkillPath)) continue;
635
+ const subContent = fs.readFileSync(subSkillPath, 'utf8');
636
+ // Strip YAML frontmatter, keep body only
637
+ const subBody = subContent.replace(/^---[\s\S]*?---\n/, '').trim();
638
+ // Also copy sub-skill directory (for Windsurf native skill support)
639
+ const subDest = path.join(dest, subName);
640
+ copyDir(path.join(srcPath, subName), subDest, '', 'claude');
641
+ inlinedSections.push(`\n## Action: \`${subName}\`\n\n${subBody}`);
620
642
  }
643
+
644
+ // Root frontmatter: keep original header but update description to remove
645
+ // the "Invoke with @impeccable" preamble that confused Claude Code's matcher
646
+ const inlinedSkillMd =
647
+ `---\nname: impeccable\ndescription: >\n` +
648
+ ` A design quality system for frontend interfaces. 18 focused actions for\n` +
649
+ ` auditing, refining, and elevating UI quality. Use when the user asks to\n` +
650
+ ` audit, critique, polish, improve, review, or refine a frontend interface.\n` +
651
+ ` Invoke with @impeccable followed by one of: adapt, animate, audit, bolder,\n` +
652
+ ` clarify, colorize, critique, delight, distill, extract, frontend-design,\n` +
653
+ ` harden, normalize, onboard, optimize, polish, quieter, or teach-impeccable.\n` +
654
+ `---\n\n` +
655
+ rootBody.replace(/## Actions[\s\S]*?---\n\n## How to use/, '## How to use') +
656
+ `\n\n` +
657
+ inlinedSections.join('\n\n');
658
+
659
+ fs.writeFileSync(path.join(dest, 'SKILL.md'), inlinedSkillMd);
621
660
  count++;
622
661
  } else {
623
662
  // agentic-learning and any future top-level skills — copy verbatim
@@ -1262,6 +1301,7 @@ if (process.env.LEARNSHIP_TEST_MODE) {
1262
1301
  parseJsonc,
1263
1302
  replacePaths,
1264
1303
  rewriteNewProject,
1304
+ installClaudePlugins,
1265
1305
  toHomePrefix,
1266
1306
  LEARNSHIP_CODEX_MARKER,
1267
1307
  CODEX_AGENT_SANDBOX,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "learnship",
3
- "version": "1.9.8",
3
+ "version": "1.9.10",
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/",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "learnship",
3
- "version": "1.9.8",
3
+ "version": "1.9.10",
4
4
  "description": "Learn as you build. Build with intent. — A multi-platform agentic engineering system for Windsurf, Claude Code, Cursor, OpenCode, Gemini CLI, and Codex: spec-driven workflows, integrated learning, and production-grade design.",
5
5
  "keywords": [
6
6
  "agentic",