claude-launchpad 0.12.0 → 0.12.2

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.
@@ -14,7 +14,7 @@ var RELATION_TYPES = [
14
14
  ];
15
15
  var StoreInputSchema = z.object({
16
16
  type: z.enum(MEMORY_TYPES),
17
- content: z.string().min(1).max(2e3),
17
+ content: z.string().min(1),
18
18
  title: z.string().max(200).optional(),
19
19
  tags: z.array(z.string()).max(20).default([]),
20
20
  importance: z.number().min(0).max(1).default(0.5),
@@ -74,4 +74,4 @@ export {
74
74
  RELATION_TYPES,
75
75
  SyncPayloadSchema
76
76
  };
77
- //# sourceMappingURL=chunk-VDXWW5H5.js.map
77
+ //# sourceMappingURL=chunk-GRL3DOCP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/types.ts"],"sourcesContent":["import { z } from 'zod';\n\n// ── Memory Types ──────────────────────────────────────────────\n\nexport const MEMORY_TYPES = ['working', 'episodic', 'semantic', 'procedural', 'pattern'] as const;\nexport type MemoryType = typeof MEMORY_TYPES[number];\n\nexport const MEMORY_SOURCES = ['manual', 'session_end', 'consolidation', 'hook', 'import'] as const;\nexport type MemorySource = typeof MEMORY_SOURCES[number];\n\nexport const RELATION_TYPES = [\n 'relates_to', 'depends_on', 'contradicts', 'extends', 'implements', 'derived_from',\n] as const;\nexport type RelationType = typeof RELATION_TYPES[number];\n\n// ── Core Entities ─────────────────────────────────────────────\n\nexport interface Memory {\n readonly id: string;\n readonly type: MemoryType;\n readonly title: string | null;\n readonly content: string;\n readonly context: string | null;\n readonly source: MemorySource | null;\n readonly project: string | null;\n readonly tags: readonly string[];\n readonly importance: number;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly accessCount: number;\n readonly lastAccessed: string | null;\n readonly injectionCount: number;\n}\n\nexport interface Relation {\n readonly sourceId: string;\n readonly targetId: string;\n readonly relationType: RelationType;\n readonly createdAt: string;\n}\n\n// ── Search Types ──────────────────────────────────────────────\n\nexport interface SearchResult {\n readonly memory: Memory;\n readonly score: number;\n readonly explanation: string;\n}\n\nexport interface FtsMatch {\n readonly rowid: number;\n readonly memoryId: string;\n readonly rank: number;\n}\n\nexport interface ScoredCandidate {\n readonly memoryId: string;\n readonly textScore: number;\n readonly importanceScore: number;\n readonly recencyScore: number;\n readonly accessScore: number;\n readonly contextScore: number;\n readonly composite: number;\n}\n\n// ── Decay Parameters ──────────────────────────────────────────\n\nexport interface DecayParams {\n readonly tauByType: Record<MemoryType, number>;\n readonly accessModifiers: readonly { readonly maxCount: number; readonly multiplier: number }[];\n readonly relationModifier: {\n readonly connectedThreshold: number;\n readonly connectedMultiplier: number;\n readonly isolatedMultiplier: number;\n readonly highlyConnectedThreshold: number;\n readonly highlyConnectedMultiplier: number;\n };\n readonly importanceFloor: number;\n readonly pruneThreshold: number;\n readonly pruneMinAgeDays: number;\n}\n\n// ── Input Schemas (for MCP tools) ─────────────────────────────\n\nexport const StoreInputSchema = z.object({\n type: z.enum(MEMORY_TYPES),\n content: z.string().min(1),\n title: z.string().max(200).optional(),\n tags: z.array(z.string()).max(20).default([]),\n importance: z.number().min(0).max(1).default(0.5),\n context: z.string().optional(),\n source: z.enum(MEMORY_SOURCES).default('manual'),\n project: z.string().max(200).optional(),\n});\nexport type StoreInput = z.infer<typeof StoreInputSchema>;\n\nexport const SearchInputSchema = z.object({\n query: z.string().min(1).max(500),\n id: z.string().optional(),\n type: z.enum(MEMORY_TYPES).optional(),\n tags: z.array(z.string()).max(10).optional(),\n limit: z.number().int().min(1).max(50).default(10),\n min_importance: z.number().min(0).max(1).default(0),\n project: z.string().max(200).optional(),\n});\nexport type SearchInput = z.infer<typeof SearchInputSchema>;\n\nexport const ForgetInputSchema = z.object({\n id: z.string(),\n hard_delete: z.boolean().default(false),\n});\nexport type ForgetInput = z.infer<typeof ForgetInputSchema>;\n\nexport const RelateInputSchema = z.object({\n source_id: z.string(),\n target_id: z.string(),\n relation_type: z.enum(RELATION_TYPES),\n});\nexport type RelateInput = z.infer<typeof RelateInputSchema>;\n\n// ── Sync Types ───────────────────────────────────────────────\n\nexport interface SyncPayload {\n readonly version: number;\n readonly machine_id: string;\n readonly pushed_at: string;\n readonly memories: readonly SyncMemoryRow[];\n readonly relations: readonly SyncRelationRow[];\n}\n\nexport interface SyncMemoryRow {\n readonly id: string;\n readonly type: MemoryType;\n readonly title: string | null;\n readonly content: string;\n readonly context: string | null;\n readonly source: MemorySource | null;\n readonly project: string | null;\n readonly tags: readonly string[];\n readonly importance: number;\n readonly access_count: number;\n readonly injection_count: number;\n readonly created_at: string;\n readonly updated_at: string;\n readonly last_accessed: string | null;\n}\n\nexport interface SyncRelationRow {\n readonly source_id: string;\n readonly target_id: string;\n readonly relation_type: RelationType;\n readonly created_at: string;\n}\n\nexport const SyncPayloadSchema = z.object({\n version: z.number(),\n machine_id: z.string(),\n pushed_at: z.string(),\n memories: z.array(z.object({\n id: z.string(),\n type: z.enum(MEMORY_TYPES),\n title: z.string().nullable(),\n content: z.string(),\n context: z.string().nullable(),\n source: z.enum(MEMORY_SOURCES).nullable(),\n project: z.string().nullable(),\n tags: z.array(z.string()),\n importance: z.number(),\n access_count: z.number(),\n injection_count: z.number(),\n created_at: z.string(),\n updated_at: z.string(),\n last_accessed: z.string().nullable(),\n })),\n relations: z.array(z.object({\n source_id: z.string(),\n target_id: z.string(),\n relation_type: z.enum(RELATION_TYPES),\n created_at: z.string(),\n })),\n});\n\nexport interface SyncConfig {\n readonly gistId: string;\n}\n\nexport interface MergeResult {\n readonly inserted: number;\n readonly updated: number;\n readonly relationsAdded: number;\n}\n\n// ── Stats ─────────────────────────────────────────────────────\n\nexport interface MemoryStats {\n readonly totalMemories: number;\n readonly byType: Record<MemoryType, number>;\n readonly totalRelations: number;\n readonly dbSizeBytes: number;\n readonly oldestMemory: string | null;\n readonly newestMemory: string | null;\n readonly topInjected: readonly { readonly id: string; readonly title: string | null; readonly injectionCount: number }[];\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SyncPayloadSchema
4
- } from "./chunk-VDXWW5H5.js";
4
+ } from "./chunk-GRL3DOCP.js";
5
5
 
6
6
  // src/commands/memory/utils/gist-transport.ts
7
7
  import { execSync } from "child_process";
@@ -216,4 +216,4 @@ export {
216
216
  parsePayload,
217
217
  mergeFromRemote
218
218
  };
219
- //# sourceMappingURL=chunk-6IXA2NQN.js.map
219
+ //# sourceMappingURL=chunk-IPVN6SO4.js.map
package/dist/cli.js CHANGED
@@ -535,58 +535,117 @@ DerivedData/
535
535
 
536
536
  // src/commands/init/generators/skill-enhance.ts
537
537
  function generateEnhanceSkill() {
538
- return `---
539
- name: lp-enhance
540
- description: AI-improve your CLAUDE.md based on codebase analysis. Fills in architecture, conventions, guardrails, and suggests hooks and MCP servers.
541
- disable-model-invocation: true
542
- ---
543
-
544
- # lp-enhance - AI-powered CLAUDE.md improver
545
-
546
- Read CLAUDE.md and the project's codebase, then update CLAUDE.md to fill in missing or incomplete sections.
547
-
548
- ## Budget Rule
549
-
550
- CLAUDE.md must stay UNDER 200 lines of actionable content (not counting headings, blank lines, or comments). Claude Code starts ignoring rules past ~250 instructions. If you need more detail, create .claude/rules/ files instead:
551
- - Create .claude/rules/conventions.md for detailed coding patterns
552
- - Create .claude/rules/architecture.md for detailed structure docs
553
- - Keep CLAUDE.md to HIGH-LEVEL summaries only (3-5 bullets per section max)
554
-
555
- ## Sections to fill or preserve (DO NOT remove existing sections)
556
-
557
- 1. **## Stack** - if missing or incomplete, detect and add language, framework, package manager
558
- 2. **## Architecture** - 3-5 bullet points describing the codebase shape (not a full directory tree)
559
- 3. **## Conventions** - max 8 key patterns. Move detailed rules to .claude/rules/conventions.md
560
- 4. **## Off-Limits** - max 8 guardrails specific to this project
561
- 5. **## Memory & Learnings** - ONLY if the project already has a ## Memory section or agentic-memory is configured in .claude/settings.json. If present, keep to max 6 bullets. If the project does NOT use memory, do NOT add this section
562
- 6. **## Key Decisions** - only decisions that affect how Claude should work in this codebase
563
- 7. **MCP server suggestions** - look at what external services the project uses (databases, APIs, storage). If you spot Postgres, Redis, Stripe, GitHub API, or similar, suggest relevant MCP servers. Print as suggestions at the end, not in CLAUDE.md.
564
-
565
- ## Hook review
566
-
567
- Also review .claude/settings.json hooks:
568
- - Read the existing hooks in .claude/settings.json
569
- - If you see project-specific patterns that deserve hooks (e.g., protected directories, test file patterns, migration files), suggest adding them
570
- - If no PostCompact hook exists, suggest adding one that re-injects TASKS.md after context compaction
571
- - If no SessionStart hook exists, suggest adding one that injects TASKS.md at session startup
572
- - DO NOT overwrite existing hooks - only add new ones specific to this project
573
- - Print hook suggestions at the end with the exact JSON to add, don't modify settings.json directly
574
-
575
- ## Advanced configuration opportunities
576
-
577
- - If the project has both app code and tests, suggest creating path-scoped .claude/rules/ files with paths: frontmatter
578
- - If the project uses external APIs, suggest sandbox.network.allowedDomains to restrict outbound traffic
579
- - If you detect a monorepo, suggest claudeMdExcludes in settings.json
580
-
581
- ## Rules
582
-
583
- - Don't remove existing content - only add or improve
584
- - Be specific to THIS project, not generic advice
585
- - Use bullet points, not paragraphs
586
- - If a section would exceed 8 bullets, split into a .claude/rules/ file and reference it
587
- - After editing, count the actionable lines. If over 120, move content to rules files until under
588
- - Run \`claude-launchpad doctor\` after to verify score improved
589
- `;
538
+ return [
539
+ "---",
540
+ "name: lp-enhance",
541
+ "description: |",
542
+ " AI-improve your CLAUDE.md based on codebase analysis. Fills in architecture, conventions, guardrails, and suggests hooks and MCP servers.",
543
+ ' TRIGGER when: user runs /lp-enhance, asks to "improve CLAUDE.md", "fill in architecture", or after major refactors.',
544
+ " DO NOT TRIGGER when: user is editing CLAUDE.md manually, doing normal coding, or running doctor/eval.",
545
+ "allowed-tools: Read, Glob, Grep, Edit, Write",
546
+ "argument-hint: (no arguments needed)",
547
+ "---",
548
+ "",
549
+ "# lp-enhance - AI-powered CLAUDE.md improver",
550
+ "",
551
+ "Read CLAUDE.md and the project's codebase, then update CLAUDE.md to fill in missing or incomplete sections.",
552
+ "",
553
+ "## Phase 1: Research",
554
+ "",
555
+ "1. Read CLAUDE.md (if it exists)",
556
+ "2. Read .claude/settings.json (hooks, permissions, MCP)",
557
+ "3. Read .claude/rules/*.md (existing rules)",
558
+ "4. Scan src/ directory structure (top-level dirs, key files)",
559
+ "5. Read package.json / go.mod / pyproject.toml for stack detection",
560
+ "6. Check for monorepo indicators (workspaces, nx.json, lerna.json)",
561
+ "",
562
+ "**Done when:** you have a mental model of the stack, architecture, and existing config.",
563
+ "",
564
+ "## Phase 2: Plan",
565
+ "",
566
+ "Count current CLAUDE.md actionable lines. Budget is 200 lines max. Plan which sections to add or improve:",
567
+ "",
568
+ "1. **## Stack** - detect language, framework, package manager",
569
+ "2. **## Architecture** - 3-5 bullets describing codebase shape",
570
+ "3. **## Conventions** - max 8 key patterns. Overflow to .claude/rules/conventions.md",
571
+ "4. **## Off-Limits** - max 8 guardrails specific to this project",
572
+ "5. **## Memory** - ONLY if agentic-memory is configured in settings.json. Max 6 bullets.",
573
+ "6. **## Key Decisions** - only decisions that affect how Claude works in this codebase",
574
+ "",
575
+ "If any section would exceed 8 bullets, plan a .claude/rules/ file for the overflow.",
576
+ "",
577
+ "**Done when:** you know exactly what to add/change and the line count stays under 200.",
578
+ "",
579
+ "## Phase 3: Execute",
580
+ "",
581
+ "Edit CLAUDE.md with the planned changes. Then:",
582
+ "",
583
+ "1. Create or update .claude/rules/ files for overflow content",
584
+ "2. Generate path-scoped rules if the project has distinct areas (see below)",
585
+ "3. Verify line count is under 200",
586
+ "",
587
+ "**Rules:**",
588
+ "- Don't remove existing content, only add or improve",
589
+ "- Be specific to THIS project, not generic advice",
590
+ "- Use bullet points, not paragraphs",
591
+ "",
592
+ "## Phase 4: Verify",
593
+ "",
594
+ "1. Run `claude-launchpad doctor` to check the score improved",
595
+ "2. Print suggested hooks (exact JSON) for .claude/settings.json but don't modify it",
596
+ "3. Print suggested MCP servers if external services detected (Postgres, Redis, Stripe, etc.)",
597
+ "",
598
+ "**Done when:** doctor score is equal or higher, suggestions printed.",
599
+ "",
600
+ "## Path-scoped rules generation",
601
+ "",
602
+ "Scan the project structure and generate focused .claude/rules/ files with paths: frontmatter. These load ONLY when Claude works on matching files, saving context tokens.",
603
+ "",
604
+ "**How to detect areas:**",
605
+ "1. List top-level directories under src/ (or equivalent). Each distinct area (api, components, lib, tests) is a candidate.",
606
+ "2. Check for monorepo indicators: workspaces in package.json, pnpm-workspace.yaml, nx.json, lerna.json. Each workspace is a candidate.",
607
+ "3. Check for docs/, tests/, scripts/ as separate scopes.",
608
+ "",
609
+ "**For each detected area, create a rules file with this format:**",
610
+ "",
611
+ "---",
612
+ 'paths: ["src/api/**"]',
613
+ "---",
614
+ "# API Rules",
615
+ "- Validate all request input with zod schemas",
616
+ "- Return typed error responses, never throw raw errors",
617
+ "- Keep route handlers under 30 lines",
618
+ "",
619
+ "**Stack-specific patterns to include:**",
620
+ `- Next.js app/: "Use Server Components by default, add 'use client' only when needed"`,
621
+ '- API routes / src/api/: "Validate input at boundaries, typed error responses"',
622
+ '- React components: "Colocate components near usage, props interface above component"',
623
+ '- Tests: "One assertion per test when possible, descriptive test names"',
624
+ '- Database / prisma/ / drizzle/: "Never write raw SQL, use the ORM, migrations required"',
625
+ '- Docs: "No em dashes, max 3 sentences per paragraph, code examples required"',
626
+ "",
627
+ "**When NOT to generate:**",
628
+ "- Small projects with < 5 source files (one conventions.md is enough)",
629
+ "- Projects where all code is in one flat directory",
630
+ "- If path-scoped rules already exist, don't overwrite them",
631
+ "",
632
+ "**Monorepo handling:**",
633
+ "- Each package gets its own rules file: .claude/rules/packages-<name>.md",
634
+ "- Suggest claudeMdExcludes in settings.json to skip irrelevant package CLAUDE.md files",
635
+ "",
636
+ "## Hook review",
637
+ "",
638
+ "Review .claude/settings.json hooks:",
639
+ "- If you see project-specific patterns that deserve hooks, suggest them",
640
+ "- If no PostCompact hook exists, suggest one that re-injects TASKS.md",
641
+ "- If no SessionStart hook exists, suggest one that injects TASKS.md",
642
+ "- DO NOT modify settings.json directly. Print exact JSON to add.",
643
+ "",
644
+ "## Other advanced configuration",
645
+ "",
646
+ "- If the project uses external APIs, suggest sandbox.network.allowedDomains",
647
+ "- If you detect a monorepo, suggest claudeMdExcludes in settings.json"
648
+ ].join("\n");
590
649
  }
591
650
 
592
651
  // src/commands/init/generators/backlog.ts
@@ -2587,7 +2646,7 @@ function createMemoryCommand() {
2587
2646
  }
2588
2647
  const { requireMemoryDeps } = await import("./require-deps-NKRCPVAO.js");
2589
2648
  await requireMemoryDeps();
2590
- const { startTui } = await import("./tui-YMBDAVTI.js");
2649
+ const { startTui } = await import("./tui-IWUB7ZR4.js");
2591
2650
  await startTui();
2592
2651
  return;
2593
2652
  }
@@ -2641,13 +2700,13 @@ function createMemoryCommand() {
2641
2700
  );
2642
2701
  memory.addCommand(
2643
2702
  new Command4("push").description("Push current project's memories to GitHub Gist").option("--all", "Push all projects").option("-y, --yes", "Skip confirmation prompt").action(async (opts) => {
2644
- const { runPush } = await import("./push-SYSRB6OP.js");
2703
+ const { runPush } = await import("./push-7SCHMUFX.js");
2645
2704
  await runPush(opts);
2646
2705
  })
2647
2706
  );
2648
2707
  memory.addCommand(
2649
2708
  new Command4("pull").description("Pull current project's memories from GitHub Gist").option("--all", "Pull all projects").action(async (opts) => {
2650
- const { runPull } = await import("./pull-7ZF3OBPZ.js");
2709
+ const { runPull } = await import("./pull-YSA225FB.js");
2651
2710
  await runPull(opts);
2652
2711
  })
2653
2712
  );
@@ -2655,7 +2714,7 @@ function createMemoryCommand() {
2655
2714
  }
2656
2715
 
2657
2716
  // src/cli.ts
2658
- var program = new Command5().name("claude-launchpad").description("CLI toolkit that makes Claude Code setups measurably good").version("0.12.0", "-v, --version").action(async () => {
2717
+ var program = new Command5().name("claude-launchpad").description("CLI toolkit that makes Claude Code setups measurably good").version("0.12.2", "-v, --version").action(async () => {
2659
2718
  const hasConfig = await fileExists(join11(process.cwd(), "CLAUDE.md")) || await fileExists(join11(process.cwd(), ".claude", "settings.json"));
2660
2719
  if (hasConfig) {
2661
2720
  await program.commands.find((c) => c.name() === "doctor")?.parseAsync([], { from: "user" });