@tommy-ca/lazypi 0.8.0 → 0.9.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 +15 -6
- package/bin/lazypi.mjs +33 -29
- package/package.json +1 -1
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, FFF search, a workflow engine for sub-agent fan-out, and ponytail discipline review.
|
|
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. A four-package optional tier (targeted LSP diagnostics, interactive shell overlays, autonomous research loops, structured todo tracking) installs on request with `--only optional`. Other extras (skill arguments, memory, MCP, 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
|
|
|
@@ -54,11 +54,20 @@ There is nothing to "uninstall" for LazyPi itself — `npx` doesn't leave it aro
|
|
|
54
54
|
|
|
55
55
|
Run the built-in health check with `npx @tommy-ca/lazypi doctor`.
|
|
56
56
|
|
|
57
|
-
**Stale
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
**Stale cached run after a release?** Both runners cache resolved versions: `bunx`
|
|
58
|
+
serves from its package cache and `npx` reuses the extracted copy in
|
|
59
|
+
`~/.npm/_npx`, so a bare `npx @tommy-ca/lazypi` / `bunx @tommy-ca/lazypi` can
|
|
60
|
+
keep serving the previous release until the cache is cleared. Run
|
|
61
|
+
`bun pm cache rm` (and/or delete the stale `~/.npm/_npx` entry), pin
|
|
62
|
+
`@tommy-ca/lazypi@latest`, and check `npx @tommy-ca/lazypi --version` to see
|
|
63
|
+
which release is actually running.
|
|
64
|
+
|
|
65
|
+
**`lazypi: not found` when running npx inside the LazyPi repo?** npm exec
|
|
66
|
+
matches the spec against the local tree, and the checkout itself is
|
|
67
|
+
`@tommy-ca/lazypi@<version>` — so it skips the npx install and tries to run
|
|
68
|
+
`lazypi` from `./node_modules/.bin`, which never exists for the project's own
|
|
69
|
+
name. Run npx from any other directory (e.g. `~`); bunx and pinned-version
|
|
70
|
+
specs behave the same way, so `cd` out of the checkout first.
|
|
62
71
|
|
|
63
72
|
## Site / docs
|
|
64
73
|
|
package/bin/lazypi.mjs
CHANGED
|
@@ -20,32 +20,36 @@ import {
|
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
// Catalog
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
23
|
-
// Categories. LazyPi installs
|
|
24
|
-
// the
|
|
25
|
-
//
|
|
26
|
-
|
|
23
|
+
// Categories. LazyPi installs the core catalog by default — "lazy" means you
|
|
24
|
+
// get the harness without thinking. The optional category holds evaluated
|
|
25
|
+
// packages worth managing but not part of the default; include them via the
|
|
26
|
+
// interactive picker or --only / --except.
|
|
27
|
+
const CATEGORIES = ["core", "optional"];
|
|
27
28
|
|
|
28
29
|
export const PACKAGES = [
|
|
29
|
-
{ id: "subagents", category: "core", source: "npm:pi-subagents",
|
|
30
|
-
{ id: "pi-ask-user", category: "core", source: "npm:pi-ask-user",
|
|
31
|
-
{ id: "pi-skillful", category: "core", source: "npm:pi-skillful",
|
|
32
|
-
{ id: "mention-skill", category: "core", source: "npm:@zigai/pi-mention-skill",
|
|
33
|
-
{ id: "goal", category: "core", source: "npm:@narumitw/pi-goal",
|
|
30
|
+
{ id: "subagents", category: "core", source: "npm:pi-subagents", description: "Sub-agent execution", hint: "Run isolated sub-agents for parallel work." },
|
|
31
|
+
{ id: "pi-ask-user", category: "core", source: "npm:pi-ask-user", description: "Ask-user prompts", hint: "Interactive user questions for agent workflows." },
|
|
32
|
+
{ id: "pi-skillful", category: "core", source: "npm:pi-skillful", description: "Skill visibility", hint: "Discover skills above the git root, hide unused skills, and expand /skill:name inline." },
|
|
33
|
+
{ id: "mention-skill", category: "core", source: "npm:@zigai/pi-mention-skill", description: "$ skill mention", hint: "Fuzzy-search skills with $ and expand them into the prompt; hidden skills stay reachable." },
|
|
34
|
+
{ id: "goal", category: "core", source: "npm:@narumitw/pi-goal", description: "Long-objective gate", hint: "Stop on done, blocked, or external wait for long tasks." },
|
|
34
35
|
{
|
|
35
36
|
id: "btw",
|
|
36
37
|
category: "core",
|
|
37
38
|
source: "npm:@narumitw/pi-btw",
|
|
38
39
|
legacySources: ["npm:pi-btw"],
|
|
39
|
-
essential: true,
|
|
40
40
|
description: "Side-chat popover",
|
|
41
41
|
hint: "Ask quick questions without polluting your conversation history.",
|
|
42
42
|
},
|
|
43
|
-
{ id: "context-usage", category: "core", source: "npm:pi-context-usage",
|
|
44
|
-
{ id: "simplify", category: "core", source: "npm:pi-simplify",
|
|
45
|
-
{ id: "web-access", category: "core", source: "npm:pi-web-access",
|
|
46
|
-
{ id: "fff", category: "core", source: "npm:@ff-labs/pi-fff",
|
|
47
|
-
{ id: "dynamic-workflows", category: "core", source: "npm:@quintinshaw/pi-dynamic-workflows",
|
|
48
|
-
{ id: "ponytail", category: "core", source: "npm:@dietrichgebert/ponytail",
|
|
43
|
+
{ id: "context-usage", category: "core", source: "npm:pi-context-usage", description: "Context budget", hint: "See what is burning the context window before it fills." },
|
|
44
|
+
{ id: "simplify", category: "core", source: "npm:pi-simplify", description: "Code simplify review", hint: "Reviews recently changed code for clarity, consistency, and maintainability." },
|
|
45
|
+
{ id: "web-access", category: "core", source: "npm:pi-web-access", description: "Web search and page fetch", hint: "Built-in web search and URL fetching." },
|
|
46
|
+
{ id: "fff", category: "core", source: "npm:@ff-labs/pi-fff", 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", 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", description: "Lazy senior dev mode", hint: "Enforces minimal, stdlib-first code; /ponytail review, audit, and a debt ledger." },
|
|
49
|
+
{ id: "lsp", category: "optional", source: "npm:@narumitw/pi-lsp", description: "Targeted LSP diagnostics and fixes", hint: "lsp_diagnostics / lsp_fix with configurable language servers, started per call." },
|
|
50
|
+
{ id: "interactive-shell", category: "optional", source: "npm:pi-interactive-shell", description: "Interactive shell overlays", hint: "Run CLIs and agents in TUI overlays: interactive, hands-free, dispatch supervision." },
|
|
51
|
+
{ id: "autoresearch", category: "optional", source: "npm:pi-autoresearch", legacySources: ["git:github.com/davebcn87/pi-autoresearch"], description: "Autonomous experiment loops", hint: "Iterative optimization runs with hooks, finalize, and convergence tracking." },
|
|
52
|
+
{ id: "todos", category: "optional", source: "npm:pi-manage-todo-list", legacySources: ["git:github.com/tintinweb/pi-manage-todo-list"], description: "Structured todo tracking", hint: "Track multi-step work with live progress widgets and session persistence." },
|
|
49
53
|
];
|
|
50
54
|
|
|
51
55
|
// ---------------------------------------------------------------------------
|
|
@@ -164,7 +168,7 @@ function resolveSelection(flags) {
|
|
|
164
168
|
validateSelectors(flags.except, "--except");
|
|
165
169
|
return new Set(PACKAGES.filter((p) => !matchesSelector(p, flags.except)).map((p) => p.id));
|
|
166
170
|
}
|
|
167
|
-
return new Set(PACKAGES.map((p) => p.id));
|
|
171
|
+
return new Set(PACKAGES.filter((p) => p.category === "core").map((p) => p.id));
|
|
168
172
|
}
|
|
169
173
|
|
|
170
174
|
// ---------------------------------------------------------------------------
|
|
@@ -192,20 +196,23 @@ ${bold("Install options:")}
|
|
|
192
196
|
-V, --version Show the installed version
|
|
193
197
|
|
|
194
198
|
${bold("Default behaviour:")}
|
|
195
|
-
- Every catalog package is installed (lazy on purpose)
|
|
196
|
-
|
|
199
|
+
- Every core catalog package is installed (lazy on purpose); optional
|
|
200
|
+
category packages are installed only when selected.
|
|
201
|
+
- On a TTY, an interactive picker appears with core pre-ticked;
|
|
197
202
|
untick categories or packages before confirming.
|
|
198
203
|
- With --yes, --only, or --except the picker is skipped.
|
|
199
204
|
|
|
200
205
|
${bold("Categories:")}
|
|
201
206
|
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
|
|
207
|
+
optional only when selected (--only optional, picker, or the everything flow): lsp diagnostics, interactive-shell overlays, autoresearch loops, todo tracking
|
|
202
208
|
Non-catalog extras (pi install npm:<source>): skill-args, memory, mcp,
|
|
203
|
-
|
|
209
|
+
ralph-wiggum, curated-themes (65 dark themes)
|
|
204
210
|
|
|
205
211
|
${bold("Examples:")}
|
|
206
|
-
npx @tommy-ca/lazypi #
|
|
207
|
-
npx @tommy-ca/lazypi --yes #
|
|
208
|
-
npx @tommy-ca/lazypi --only core
|
|
212
|
+
npx @tommy-ca/lazypi # core catalog (interactive picker on a TTY)
|
|
213
|
+
npx @tommy-ca/lazypi --yes # core catalog, no prompt
|
|
214
|
+
npx @tommy-ca/lazypi --only core,optional # install optional tier too
|
|
215
|
+
npx @tommy-ca/lazypi --only optional # just the optional tier
|
|
209
216
|
npx @tommy-ca/lazypi --only subagents,fff # individual package ids also work
|
|
210
217
|
npx @tommy-ca/lazypi --only core --local # core into the current project
|
|
211
218
|
npx @tommy-ca/lazypi status
|
|
@@ -315,11 +322,6 @@ function readInstalledSources(local) {
|
|
|
315
322
|
return { sources, path: current.path, exists: true };
|
|
316
323
|
}
|
|
317
324
|
|
|
318
|
-
function runPi(args) {
|
|
319
|
-
const result = spawnCommand("pi", args, { stdio: "inherit" });
|
|
320
|
-
return result.status ?? 1;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
325
|
function commandPath(name) {
|
|
324
326
|
const command = platform() === "win32" ? "where" : "which";
|
|
325
327
|
const probe = spawnCommand(command, [name], { encoding: "utf8" });
|
|
@@ -535,6 +537,8 @@ async function cmdInstall(flags) {
|
|
|
535
537
|
const choice = await askLazyOrPick(PACKAGES.length);
|
|
536
538
|
if (choice === "pick") {
|
|
537
539
|
selectedIds = await runPicker(selectedIds);
|
|
540
|
+
} else {
|
|
541
|
+
selectedIds = new Set(PACKAGES.map((p) => p.id));
|
|
538
542
|
}
|
|
539
543
|
}
|
|
540
544
|
|
|
@@ -751,7 +755,7 @@ async function cmdUpdate(flags) {
|
|
|
751
755
|
|
|
752
756
|
console.log(bold("pi update"));
|
|
753
757
|
|
|
754
|
-
return
|
|
758
|
+
return spawnCommand("pi", flags.local ? ["update", "--extensions"] : ["update"], { stdio: "inherit" }).status ?? 1;
|
|
755
759
|
}
|
|
756
760
|
|
|
757
761
|
// ---------------------------------------------------------------------------
|