@tommy-ca/lazypi 0.7.0 → 0.8.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/README.md CHANGED
@@ -13,7 +13,7 @@ LazyPi will:
13
13
  1. Install `pi` for you if it isn't installed yet.
14
14
  2. Ask if you want to install all the packages or choose which to install.
15
15
 
16
- That setup is the harness core — isolated sub-agents, a structured ask gate, skill visibility, $ skill mention, a long-objective gate, side chat, context budgeting, code simplification review, web research, and FFF search. Optional extras (skill arguments, memory, MCP, interactive shell overlays, research loops, themes) install on demand with `pi install`.
16
+ That setup is the harness core — isolated sub-agents, a structured ask gate, skill visibility, $ skill mention, a long-objective gate, side chat, context budgeting, code simplification review, web research, FFF search, a workflow engine for sub-agent fan-out, and ponytail discipline review. Optional extras (skill arguments, memory, MCP, interactive shell overlays, research loops, themes) install on demand with `pi install`.
17
17
 
18
18
  That's it. Once done - run `pi` and experience a feature rich coding agent experience.
19
19
 
package/bin/lazypi.mjs CHANGED
@@ -44,6 +44,8 @@ export const PACKAGES = [
44
44
  { id: "simplify", category: "core", source: "npm:pi-simplify", essential: true, description: "Code simplify review", hint: "Reviews recently changed code for clarity, consistency, and maintainability." },
45
45
  { id: "web-access", category: "core", source: "npm:pi-web-access", essential: true, description: "Web search and page fetch", hint: "Built-in web search and URL fetching." },
46
46
  { id: "fff", category: "core", source: "npm:@ff-labs/pi-fff", essential: true, description: "FFF fuzzy search", hint: "Additive fffind / ffgrep / fff-multi-grep beside the built-in tools; /fff-health checks the index." },
47
+ { id: "dynamic-workflows", category: "core", source: "npm:@quintinshaw/pi-dynamic-workflows", essential: true, description: "Workflow engine", hint: "Fan work out across subagents: /workflows TUI, deep-research, resume, token accounting." },
48
+ { id: "ponytail", category: "core", source: "npm:@dietrichgebert/ponytail", essential: true, description: "Lazy senior dev mode", hint: "Enforces minimal, stdlib-first code; /ponytail review, audit, and a debt ledger." },
47
49
  ];
48
50
 
49
51
  // ---------------------------------------------------------------------------
@@ -196,7 +198,7 @@ ${bold("Default behaviour:")}
196
198
  - With --yes, --only, or --except the picker is skipped.
197
199
 
198
200
  ${bold("Categories:")}
199
- core the harness control plane: sub-agents, ask gate, skill visibility, $ mention, goal, side chat, context budget, simplify, web research, fff search
201
+ core the harness control plane: sub-agents, workflows, ask gate, skill visibility, $ mention, goal, side chat, context budget, simplify, web research, fff search, ponytail discipline
200
202
  Non-catalog extras (pi install npm:<source>): skill-args, memory, mcp,
201
203
  interactive-shell, ralph-wiggum, curated-themes (65 dark themes)
202
204
 
@@ -330,8 +332,15 @@ function legacySourcesForPackage(pkg) {
330
332
  return Array.isArray(pkg.legacySources) ? pkg.legacySources : [];
331
333
  }
332
334
 
335
+ // An installed source matches a catalog source when equal or when it is the
336
+ // same source with a version/pin suffix (npm:pkg vs npm:pkg@x.y.z,
337
+ // git:... vs git:...@sha).
338
+ export function sourcesMatch(catalogSource, installedSource) {
339
+ return catalogSource === installedSource || installedSource.startsWith(`${catalogSource}@`);
340
+ }
341
+
333
342
  function isLegacySourceForPackage(pkg, source) {
334
- return legacySourcesForPackage(pkg).includes(source);
343
+ return legacySourcesForPackage(pkg).some((legacy) => sourcesMatch(legacy, source));
335
344
  }
336
345
 
337
346
  function findLegacyInstalledSources(pkg, installedPiSources) {
@@ -352,10 +361,11 @@ function removeLegacy(pkg, installedPiSources, local, interactive) {
352
361
 
353
362
  function packageInstallStatus(pkg, installedPiSources) {
354
363
  const legacySources = findLegacyInstalledSources(pkg, installedPiSources);
364
+ const installed = [...installedPiSources].some((src) => sourcesMatch(pkg.source, src));
355
365
  return {
356
- installed: installedPiSources.has(pkg.source),
366
+ installed,
357
367
  legacy: legacySources.length > 0,
358
- present: installedPiSources.has(pkg.source) || legacySources.length > 0,
368
+ present: installed || legacySources.length > 0,
359
369
  };
360
370
  }
361
371
 
@@ -694,11 +704,12 @@ function cmdStatus(flags) {
694
704
  return 1;
695
705
  }
696
706
 
697
- const piCatalogSources = new Set(PACKAGES.flatMap((p) => [p.source, ...legacySourcesForPackage(p)]));
698
707
  const installed = PACKAGES.filter((pkg) => packageInstallStatus(pkg, sources).installed);
699
708
  const legacy = PACKAGES.filter((pkg) => packageInstallStatus(pkg, sources).legacy);
700
709
  const missing = PACKAGES.filter((pkg) => !packageInstallStatus(pkg, sources).present);
701
- const others = [...sources].filter((src) => !piCatalogSources.has(src));
710
+ const others = [...sources].filter(
711
+ (src) => !PACKAGES.some((pkg) => sourcesMatch(pkg.source, src) || isLegacySourceForPackage(pkg, src)),
712
+ );
702
713
 
703
714
  printHeader(`Installed from LazyPi catalog (${installed.length}/${PACKAGES.length}):`);
704
715
  if (installed.length === 0) console.log(dim(" none"));
@@ -853,7 +864,7 @@ async function cmdRemove(flags, targets) {
853
864
 
854
865
  const sourcesToRemove = pkg
855
866
  ? [
856
- ...(installedSources.has(pkg.source) ? [pkg.source] : []),
867
+ ...[...installedSources].filter((src) => sourcesMatch(pkg.source, src)),
857
868
  ...findLegacyInstalledSources(pkg, installedSources),
858
869
  ]
859
870
  : [source];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tommy-ca/lazypi",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Opinionated one-shot installer for a full-featured Pi coding agent setup.",
5
5
  "license": "MIT",
6
6
  "repository": {