omni-pi 0.9.0 → 0.11.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/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.0 - 2026-04-24
4
+
5
+ ### Removed
6
+
7
+ - Removed `/model-setup`, `/manage-providers`, the `omni-providers` extension, and the bundled provider catalog. Pi now handles provider and model management natively.
8
+ - Removed `PROVIDERS.md` and the provider docs spec.
9
+
10
+ ## 0.10.1 - 2026-04-24
11
+
12
+ ### Release follow-up
13
+
14
+ - republished the previous 0.10.0 release work under a new patch version because npm will not republish a previously published version number
15
+ - kept the bundled `pi-diff-review` and `pi-prompt-template-model` integration changes intact
16
+
17
+ ## 0.10.0 - 2026-04-24
18
+
19
+ ### Removed
20
+
21
+ - Removed `/model-setup`, `/manage-providers`, and the `omni-providers` extension. Pi now handles provider and model management natively.
22
+
23
+ ### Runtime and integrations
24
+
25
+ - upgraded `@mariozechner/pi-coding-agent` to `0.70.0`
26
+ - bundled `pi-diff-review` as a packaged Omni-Pi dependency so `/diff-review` is available out of the box
27
+ - vendored `pi-diff-review` locally so global installs no longer fail on the extension's git prepare hook
28
+ - bundled `pi-prompt-template-model` so packaged prompt templates can register smarter slash commands
29
+
30
+ ### Commands
31
+
32
+ - added `/commit` to review local changes and create a descriptive conventional commit
33
+ - added `/push` with a deterministic first `git push` attempt that only hands off to the model when the push fails
34
+
3
35
  ## 0.8.3 - 2026-04-17
4
36
 
5
37
  ### Model refresh flow
package/README.md CHANGED
@@ -15,7 +15,7 @@ Requires Node.js 22 or newer.
15
15
  - Keeps durable standards and project context in `.omni/`, even when Omni mode is off.
16
16
  - Writes specs, tasks, and progress into `.omni/` once Omni mode is enabled.
17
17
  - Adds a repo map that indexes supported source files, ranks them by structure plus recent activity, and injects a compact codebase-awareness block into Omni prompts.
18
- - Bundles web search, guided interviews, themed UI, native micro-UI via Glimpse, a task viewer, a powerbar, custom provider/model management, and automatic updates out of the box.
18
+ - Bundles web search, guided interviews, themed UI, native micro-UI via Glimpse, native git diff review, prompt-template-powered workflow commands, a task viewer, a powerbar, and automatic updates out of the box.
19
19
 
20
20
  ## Install
21
21
 
@@ -30,8 +30,6 @@ cd your-project
30
30
  omni
31
31
  ```
32
32
 
33
- Custom provider setup, refresh behavior, and bundled provider behavior are documented in [PROVIDERS.md](PROVIDERS.md).
34
-
35
33
  ## Features
36
34
 
37
35
  ### Bundled Skills
@@ -66,11 +64,12 @@ Current deferred roadmap items remain intentional and visible in docs rather tha
66
64
  | Extension | What it does |
67
65
  |-----------|-------------|
68
66
  | **omni-core** | Brain workflow, themed header, session init, system prompt injection |
69
- | **omni-providers** | Model provider wiring |
70
67
  | **omni-memory** | `.omni/` durable memory bootstrap |
71
68
  | **glimpseui** | Native micro-UI windows and the optional floating companion widget |
72
69
  | **pi-web-access** | Web search and fetch tools for the agent |
73
70
  | **pi-interview** | Guided Q&A when the agent needs clarification |
71
+ | **pi-diff-review** | Native git diff review window that inserts structured review feedback into the editor |
72
+ | **pi-prompt-template-model** | Prompt templates can set thinking/model behavior and back commands like `/commit` and `/push` |
74
73
  | **pi-powerbar** | Powerline-style status bar with segments |
75
74
  | **pi-extension-settings** | Settings persistence for extensions |
76
75
 
@@ -86,10 +85,11 @@ Omni-Pi now bundles [Glimpse](https://github.com/HazAT/glimpse) for native micro
86
85
 
87
86
  | Command | Description |
88
87
  |---------|-------------|
89
- | `/model-setup` | Add, refresh, or remove custom provider/model entries |
90
- | `/manage-providers` | Remove stored auth for bundled providers |
91
88
  | `/omni-mode` | Toggle persistent Omni mode on or off for this project |
92
89
  | `/companion` | Toggle the Glimpse floating companion widget |
90
+ | `/diff-review` | Open a native git diff review window and insert feedback into the editor |
91
+ | `/commit` | Review local changes and create a descriptive conventional commit |
92
+ | `/push` | Push the current branch, with automatic recovery flow if the first push fails |
93
93
  | `/theme` | Switch between color presets (lavender, ember, ocean, mint, rose, gold, arctic, neon, copper, slate) |
94
94
  | `/update` | Check for Omni-Pi updates |
95
95
 
@@ -103,24 +103,6 @@ Omni-Pi now bundles [Glimpse](https://github.com/HazAT/glimpse) for native micro
103
103
 
104
104
  Omni-Pi checks for new versions on startup (cached, re-checks every 4 hours). When an update is available, it prompts to install and restart. Pi's own update notification is suppressed to avoid duplication.
105
105
 
106
- ## Provider Support
107
-
108
- `/model-setup` is for custom providers and custom model entries only.
109
-
110
- Use `/model-setup` when you want to configure:
111
-
112
- - a custom provider id
113
- - an API type and base URL
114
- - an API key for that custom provider
115
- - discovered models or manual model entries
116
- - a manual refresh of already configured custom providers
117
-
118
- Use `/manage-providers` to remove stored auth for bundled Pi providers.
119
-
120
- Anthropic is intentionally API-key-only in Omni-Pi. Anthropic OAuth login is disabled.
121
-
122
- See [PROVIDERS.md](PROVIDERS.md) for the current supported-provider list and auth-management split.
123
-
124
106
  ## Omni Mode
125
107
 
126
108
  Omni-Pi keeps its current branding and shell at all times, but the specialized workflow is opt-in.
@@ -171,7 +153,7 @@ npm run chat # launch locally in dev mode
171
153
  ## CI/CD
172
154
 
173
155
  - Pull requests and pushes to `main` run `npm run verify`.
174
- - The docs are part of the test contract, including a sync check between `PROVIDERS.md` and the bundled-provider setup list in code.
156
+ - The docs are part of the test contract.
175
157
  - Pushing a `v*` tag runs the release workflow, verifies the repo again, publishes to npm through GitHub Actions trusted publishing with provenance, and then creates the GitHub release.
176
158
  - Trusted publishing still requires npm-side setup for this repository/workflow in the npm package settings.
177
159
 
@@ -1,3 +1,5 @@
1
+ import { fileURLToPath } from "node:url";
2
+
1
3
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
4
 
3
5
  import {
@@ -7,12 +9,11 @@ import {
7
9
  } from "../../src/brain.js";
8
10
  import { createOmniCommands } from "../../src/commands.js";
9
11
  import { renderHeader } from "../../src/header.js";
10
- import { registerModelCommand } from "../../src/model-command.js";
11
12
  import {
12
13
  registerOmniMessageRenderer,
13
14
  registerPiCommands,
14
15
  } from "../../src/pi.js";
15
- import { registerProviderAuthCommand } from "../../src/provider-auth-command.js";
16
+ import { ensureBundledPromptTemplates } from "../../src/prompt-template-sync.js";
16
17
  import {
17
18
  buildRepoMapPromptSuffix,
18
19
  registerRepoMapTracking,
@@ -39,8 +40,6 @@ import { buildOnboardingInterviewKickoff } from "../../src/workflow.js";
39
40
  export default function omniCoreExtension(api: ExtensionAPI): void {
40
41
  registerOmniMessageRenderer(api);
41
42
  registerPiCommands(api, createOmniCommands());
42
- registerModelCommand(api);
43
- registerProviderAuthCommand(api);
44
43
  registerThemeCommand(api);
45
44
  registerTodoShortcut(api);
46
45
  registerUpdater(api);
@@ -49,6 +48,11 @@ export default function omniCoreExtension(api: ExtensionAPI): void {
49
48
 
50
49
  api.on("session_start", async (_event, ctx) => {
51
50
  await ensurePiSettings(ctx.cwd);
51
+ ensureBundledPromptTemplates(
52
+ fileURLToPath(
53
+ new URL("../../templates/managed-prompts", import.meta.url),
54
+ ),
55
+ );
52
56
  loadSavedTheme(ctx.cwd);
53
57
  const omniMode = readOmniMode(ctx.cwd);
54
58
  ctx.ui.setTitle("Omni-Pi");
@@ -57,17 +61,19 @@ export default function omniCoreExtension(api: ExtensionAPI): void {
57
61
  ctx.ui.setStatus("omni", formatOmniModeStatus(omniMode));
58
62
  ctx.ui.setStatus("rtk", formatRtkModeStatus(readRtkMode(ctx.cwd), false));
59
63
  await refreshRtkStatusIndicator(ctx);
60
- if (omniMode) {
61
- void warmRepoMap(ctx.cwd);
62
- }
64
+ void warmRepoMap(ctx.cwd);
63
65
  });
64
66
 
65
67
  api.on("before_agent_start", async (event, ctx) => {
66
68
  const omniMode = readOmniMode(ctx.cwd);
67
69
  const passivePrompt = await buildPassiveOmniPromptSuffix(ctx.cwd);
70
+ const repoMapPrompt = await buildRepoMapPromptSuffix(ctx.cwd, {
71
+ prompt: typeof event.prompt === "string" ? event.prompt : "",
72
+ maxTokens: omniMode ? undefined : 120,
73
+ });
68
74
  if (!omniMode) {
69
75
  return {
70
- systemPrompt: [event.systemPrompt, passivePrompt]
76
+ systemPrompt: [event.systemPrompt, passivePrompt, repoMapPrompt]
71
77
  .filter(Boolean)
72
78
  .join("\n\n"),
73
79
  };
@@ -80,9 +86,6 @@ export default function omniCoreExtension(api: ExtensionAPI): void {
80
86
  const onboardingKickoff = init.initResult?.onboardingInterviewNeeded
81
87
  ? buildOnboardingInterviewKickoff(init.initResult)
82
88
  : "";
83
- const repoMapPrompt = await buildRepoMapPromptSuffix(ctx.cwd, {
84
- prompt: typeof event.prompt === "string" ? event.prompt : "",
85
- });
86
89
  const prompt = [
87
90
  event.systemPrompt,
88
91
  passivePrompt,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omni-pi",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Single-agent Pi package that interviews the user, documents the spec, and implements work in bounded slices.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -36,8 +36,8 @@
36
36
  "skills",
37
37
  "src",
38
38
  "templates",
39
+ "vendor/pi-diff-review",
39
40
  "README.md",
40
- "PROVIDERS.md",
41
41
  "CREDITS.md"
42
42
  ],
43
43
  "scripts": {
@@ -58,19 +58,21 @@
58
58
  },
59
59
  "pi": {
60
60
  "extensions": [
61
- "./extensions/omni-providers/index.ts",
62
61
  "./extensions/omni-core/index.ts",
63
62
  "./extensions/omni-memory/index.ts",
64
63
  "./node_modules/glimpseui/pi-extension/index.ts",
65
64
  "./node_modules/pi-web-access/index.ts",
66
65
  "./node_modules/pi-interview/index.ts",
66
+ "./node_modules/pi-diff-review/src/index.ts",
67
+ "./node_modules/pi-prompt-template-model/index.ts",
67
68
  "./node_modules/@juanibiapina/pi-extension-settings/dist/index.js",
68
69
  "./node_modules/@juanibiapina/pi-powerbar/dist"
69
70
  ],
70
71
  "skills": [
71
72
  "./skills",
72
73
  "./node_modules/glimpseui/skills",
73
- "./node_modules/pi-web-access/skills"
74
+ "./node_modules/pi-web-access/skills",
75
+ "./node_modules/pi-prompt-template-model/skills"
74
76
  ],
75
77
  "prompts": [
76
78
  "./prompts"
@@ -80,9 +82,11 @@
80
82
  "@anthropic-ai/claude-agent-sdk": "0.2.84",
81
83
  "@juanibiapina/pi-extension-settings": "^0.6.1",
82
84
  "@juanibiapina/pi-powerbar": "^0.8.0",
83
- "@mariozechner/pi-coding-agent": "^0.67.68",
85
+ "@mariozechner/pi-coding-agent": "^0.70.0",
84
86
  "glimpseui": "^0.7.0",
87
+ "pi-diff-review": "file:./vendor/pi-diff-review",
85
88
  "pi-interview": "^0.6.2",
89
+ "pi-prompt-template-model": "^0.8.2",
86
90
  "pi-web-access": "^0.10.6",
87
91
  "zod": "^4.3.6"
88
92
  },
@@ -0,0 +1,63 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readFileSync,
5
+ rmSync,
6
+ writeFileSync,
7
+ } from "node:fs";
8
+ import os from "node:os";
9
+ import path from "node:path";
10
+
11
+ const MANAGED_PROMPT_FILES = ["commit.md", "push.md"] as const;
12
+ const MANAGED_SUBDIR = "omni-pi";
13
+ const LEGACY_MANAGED_SUBDIRS = ["zz-omni-pi"] as const;
14
+
15
+ export function ensureBundledPromptTemplates(
16
+ sourceDir: string,
17
+ options?: {
18
+ homeDir?: string;
19
+ targetSubdir?: string;
20
+ promptFiles?: readonly string[];
21
+ legacySubdirs?: readonly string[];
22
+ },
23
+ ): string[] {
24
+ const homeDir = options?.homeDir ?? os.homedir();
25
+ const targetSubdir = options?.targetSubdir ?? MANAGED_SUBDIR;
26
+ const promptFiles = options?.promptFiles ?? MANAGED_PROMPT_FILES;
27
+ const legacySubdirs = options?.legacySubdirs ?? LEGACY_MANAGED_SUBDIRS;
28
+ const promptsRoot = path.join(homeDir, ".pi", "agent", "prompts");
29
+ const targetDir = path.join(promptsRoot, targetSubdir);
30
+
31
+ for (const legacySubdir of legacySubdirs) {
32
+ const legacyDir = path.join(promptsRoot, legacySubdir);
33
+ if (legacyDir === targetDir || !existsSync(legacyDir)) {
34
+ continue;
35
+ }
36
+ rmSync(legacyDir, { recursive: true, force: true });
37
+ }
38
+
39
+ mkdirSync(targetDir, { recursive: true });
40
+
41
+ const written: string[] = [];
42
+ for (const file of promptFiles) {
43
+ const sourcePath = path.join(sourceDir, file);
44
+ const targetPath = path.join(targetDir, file);
45
+ const nextContent = readFileSync(sourcePath, "utf8");
46
+
47
+ let currentContent: string | null = null;
48
+ try {
49
+ currentContent = readFileSync(targetPath, "utf8");
50
+ } catch {
51
+ currentContent = null;
52
+ }
53
+
54
+ if (currentContent === nextContent) {
55
+ continue;
56
+ }
57
+
58
+ writeFileSync(targetPath, nextContent, "utf8");
59
+ written.push(targetPath);
60
+ }
61
+
62
+ return written;
63
+ }