omegon 0.6.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.
Files changed (160) hide show
  1. package/.gitattributes +3 -0
  2. package/AGENTS.md +16 -0
  3. package/LICENSE +15 -0
  4. package/README.md +289 -0
  5. package/bin/pi.mjs +30 -0
  6. package/extensions/00-secrets/index.ts +1126 -0
  7. package/extensions/01-auth/auth.ts +401 -0
  8. package/extensions/01-auth/index.ts +289 -0
  9. package/extensions/auto-compact.ts +42 -0
  10. package/extensions/bootstrap/deps.ts +291 -0
  11. package/extensions/bootstrap/index.ts +811 -0
  12. package/extensions/chronos/chronos.sh +487 -0
  13. package/extensions/chronos/index.ts +148 -0
  14. package/extensions/cleave/assessment.ts +754 -0
  15. package/extensions/cleave/bridge.ts +31 -0
  16. package/extensions/cleave/conflicts.ts +250 -0
  17. package/extensions/cleave/dispatcher.ts +808 -0
  18. package/extensions/cleave/guardrails.ts +426 -0
  19. package/extensions/cleave/index.ts +3121 -0
  20. package/extensions/cleave/lifecycle-emitter.ts +20 -0
  21. package/extensions/cleave/openspec.ts +811 -0
  22. package/extensions/cleave/planner.ts +260 -0
  23. package/extensions/cleave/review.ts +579 -0
  24. package/extensions/cleave/skills.ts +355 -0
  25. package/extensions/cleave/types.ts +261 -0
  26. package/extensions/cleave/workspace.ts +861 -0
  27. package/extensions/cleave/worktree.ts +243 -0
  28. package/extensions/core-renderers.ts +253 -0
  29. package/extensions/dashboard/context-gauge.ts +58 -0
  30. package/extensions/dashboard/file-watch.ts +14 -0
  31. package/extensions/dashboard/footer.ts +1145 -0
  32. package/extensions/dashboard/git.ts +185 -0
  33. package/extensions/dashboard/index.ts +478 -0
  34. package/extensions/dashboard/memory-audit.ts +34 -0
  35. package/extensions/dashboard/overlay-data.ts +705 -0
  36. package/extensions/dashboard/overlay.ts +365 -0
  37. package/extensions/dashboard/render-utils.ts +54 -0
  38. package/extensions/dashboard/types.ts +191 -0
  39. package/extensions/dashboard/uri-helper.ts +45 -0
  40. package/extensions/debug.ts +69 -0
  41. package/extensions/defaults.ts +282 -0
  42. package/extensions/design-tree/dashboard-state.ts +161 -0
  43. package/extensions/design-tree/design-card.ts +362 -0
  44. package/extensions/design-tree/index.ts +2130 -0
  45. package/extensions/design-tree/lifecycle-emitter.ts +41 -0
  46. package/extensions/design-tree/tree.ts +1607 -0
  47. package/extensions/design-tree/types.ts +163 -0
  48. package/extensions/distill.ts +127 -0
  49. package/extensions/effort/index.ts +395 -0
  50. package/extensions/effort/tiers.ts +146 -0
  51. package/extensions/effort/types.ts +105 -0
  52. package/extensions/lib/git-state.ts +227 -0
  53. package/extensions/lib/local-models.ts +157 -0
  54. package/extensions/lib/model-preferences.ts +51 -0
  55. package/extensions/lib/model-routing.ts +720 -0
  56. package/extensions/lib/operator-fallback.ts +205 -0
  57. package/extensions/lib/operator-profile.ts +360 -0
  58. package/extensions/lib/slash-command-bridge.ts +253 -0
  59. package/extensions/lib/typebox-helpers.ts +16 -0
  60. package/extensions/local-inference/index.ts +727 -0
  61. package/extensions/mcp-bridge/README.md +220 -0
  62. package/extensions/mcp-bridge/index.ts +951 -0
  63. package/extensions/mcp-bridge/lib.ts +365 -0
  64. package/extensions/mcp-bridge/mcp.json +3 -0
  65. package/extensions/mcp-bridge/package.json +11 -0
  66. package/extensions/model-budget.ts +752 -0
  67. package/extensions/offline-driver.ts +403 -0
  68. package/extensions/openspec/archive-gate.ts +164 -0
  69. package/extensions/openspec/branch-cleanup.ts +64 -0
  70. package/extensions/openspec/dashboard-state.ts +50 -0
  71. package/extensions/openspec/index.ts +1917 -0
  72. package/extensions/openspec/lifecycle-emitter.ts +65 -0
  73. package/extensions/openspec/lifecycle-files.ts +70 -0
  74. package/extensions/openspec/lifecycle.ts +50 -0
  75. package/extensions/openspec/reconcile.ts +187 -0
  76. package/extensions/openspec/spec.ts +1385 -0
  77. package/extensions/openspec/types.ts +98 -0
  78. package/extensions/project-memory/DESIGN-global-mind.md +198 -0
  79. package/extensions/project-memory/README.md +202 -0
  80. package/extensions/project-memory/api-types.ts +382 -0
  81. package/extensions/project-memory/compaction-policy.ts +29 -0
  82. package/extensions/project-memory/core.ts +164 -0
  83. package/extensions/project-memory/embeddings.ts +230 -0
  84. package/extensions/project-memory/extraction-v2.ts +861 -0
  85. package/extensions/project-memory/factstore.ts +2177 -0
  86. package/extensions/project-memory/index.ts +3459 -0
  87. package/extensions/project-memory/injection-metrics.ts +91 -0
  88. package/extensions/project-memory/jsonl-io.ts +12 -0
  89. package/extensions/project-memory/lifecycle.ts +331 -0
  90. package/extensions/project-memory/migration.ts +293 -0
  91. package/extensions/project-memory/package.json +9 -0
  92. package/extensions/project-memory/sci-renderers.ts +7 -0
  93. package/extensions/project-memory/template.ts +103 -0
  94. package/extensions/project-memory/triggers.ts +52 -0
  95. package/extensions/project-memory/types.ts +102 -0
  96. package/extensions/render/composition/fonts/Inter-Bold.ttf +0 -0
  97. package/extensions/render/composition/fonts/Inter-Regular.ttf +0 -0
  98. package/extensions/render/composition/fonts/Tomorrow-Bold.ttf +0 -0
  99. package/extensions/render/composition/fonts/Tomorrow-Regular.ttf +0 -0
  100. package/extensions/render/composition/package-lock.json +534 -0
  101. package/extensions/render/composition/package.json +22 -0
  102. package/extensions/render/composition/render.mjs +246 -0
  103. package/extensions/render/composition/test-comp.tsx +87 -0
  104. package/extensions/render/composition/types.ts +24 -0
  105. package/extensions/render/excalidraw/UPSTREAM.md +81 -0
  106. package/extensions/render/excalidraw/elements.ts +764 -0
  107. package/extensions/render/excalidraw/index.ts +66 -0
  108. package/extensions/render/excalidraw/types.ts +223 -0
  109. package/extensions/render/excalidraw-renderer/pyproject.toml +8 -0
  110. package/extensions/render/excalidraw-renderer/render_excalidraw.py +182 -0
  111. package/extensions/render/excalidraw-renderer/render_template.html +59 -0
  112. package/extensions/render/index.ts +830 -0
  113. package/extensions/render/native-diagrams/index.ts +57 -0
  114. package/extensions/render/native-diagrams/motifs.ts +542 -0
  115. package/extensions/render/native-diagrams/raster.ts +8 -0
  116. package/extensions/render/native-diagrams/scene.ts +75 -0
  117. package/extensions/render/native-diagrams/spec.ts +204 -0
  118. package/extensions/render/native-diagrams/svg.ts +116 -0
  119. package/extensions/sci-ui.ts +304 -0
  120. package/extensions/session-log.ts +174 -0
  121. package/extensions/shared-state.ts +146 -0
  122. package/extensions/spinner-verbs.ts +91 -0
  123. package/extensions/style.ts +281 -0
  124. package/extensions/terminal-title.ts +191 -0
  125. package/extensions/tool-profile/index.ts +291 -0
  126. package/extensions/tool-profile/profiles.ts +290 -0
  127. package/extensions/types.d.ts +9 -0
  128. package/extensions/vault/index.ts +185 -0
  129. package/extensions/version-check.ts +90 -0
  130. package/extensions/view/index.ts +859 -0
  131. package/extensions/view/uri-resolver.ts +148 -0
  132. package/extensions/web-search/index.ts +182 -0
  133. package/extensions/web-search/providers.ts +121 -0
  134. package/extensions/web-ui/index.ts +110 -0
  135. package/extensions/web-ui/server.ts +265 -0
  136. package/extensions/web-ui/state.ts +462 -0
  137. package/extensions/web-ui/static/index.html +145 -0
  138. package/extensions/web-ui/types.ts +284 -0
  139. package/package.json +76 -0
  140. package/prompts/init.md +75 -0
  141. package/prompts/new-repo.md +54 -0
  142. package/prompts/oci-login.md +56 -0
  143. package/prompts/status.md +50 -0
  144. package/settings.json +4 -0
  145. package/skills/cleave/SKILL.md +218 -0
  146. package/skills/git/SKILL.md +209 -0
  147. package/skills/git/_reference/ci-validation.md +204 -0
  148. package/skills/oci/SKILL.md +338 -0
  149. package/skills/openspec/SKILL.md +346 -0
  150. package/skills/pi-extensions/SKILL.md +191 -0
  151. package/skills/pi-tui/SKILL.md +517 -0
  152. package/skills/python/SKILL.md +189 -0
  153. package/skills/rust/SKILL.md +268 -0
  154. package/skills/security/SKILL.md +206 -0
  155. package/skills/style/SKILL.md +264 -0
  156. package/skills/typescript/SKILL.md +225 -0
  157. package/skills/vault/SKILL.md +102 -0
  158. package/themes/alpharius-legacy.json +85 -0
  159. package/themes/alpharius.conf +59 -0
  160. package/themes/alpharius.json +88 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * auto-compact — Proactive context compaction extension
3
+ *
4
+ * Monitors context usage after each turn and triggers compaction
5
+ * before the context window fills up. The built-in auto-compaction
6
+ * only fires at the hard limit (contextWindow - reserveTokens);
7
+ * this extension fires earlier at a configurable percentage threshold,
8
+ * so the agent can clean up its own context without user intervention.
9
+ *
10
+ * Configuration (environment variables):
11
+ * AUTO_COMPACT_PERCENT — trigger threshold (default: 70)
12
+ * AUTO_COMPACT_COOLDOWN — minimum seconds between compactions (default: 60)
13
+ */
14
+
15
+ import type { ExtensionAPI, ExtensionContext } from "@cwilson613/pi-coding-agent";
16
+
17
+ const COMPACT_PERCENT = Number(process.env.AUTO_COMPACT_PERCENT) || 70;
18
+ const COOLDOWN_MS = (Number(process.env.AUTO_COMPACT_COOLDOWN) || 60) * 1000;
19
+
20
+ export default function autoCompactExtension(pi: ExtensionAPI) {
21
+ let lastCompactTime = 0;
22
+ let compacting = false;
23
+
24
+ pi.on("turn_end", (_event, ctx) => {
25
+ if (compacting) return;
26
+
27
+ const usage = ctx.getContextUsage();
28
+ if (!usage || usage.percent === null) return;
29
+ if (usage.percent < COMPACT_PERCENT) return;
30
+
31
+ const now = Date.now();
32
+ if (now - lastCompactTime < COOLDOWN_MS) return;
33
+
34
+ compacting = true;
35
+ lastCompactTime = now;
36
+
37
+ ctx.compact({
38
+ onComplete: () => { compacting = false; },
39
+ onError: () => { compacting = false; },
40
+ });
41
+ });
42
+ }
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Dependency registry — declarative external dependency catalog.
3
+ *
4
+ * Each dep has a check function (is it available?), install hint,
5
+ * tier (core vs optional), and the extensions that need it.
6
+ */
7
+
8
+ import { execSync } from "node:child_process";
9
+
10
+ export type DepTier = "core" | "recommended" | "optional";
11
+
12
+ export interface Dep {
13
+ /** Short identifier */
14
+ id: string;
15
+ /** Human-readable name */
16
+ name: string;
17
+ /** What it does in Omegon context */
18
+ purpose: string;
19
+ /** Which extensions use it */
20
+ usedBy: string[];
21
+ /** core = most users need it, recommended = common workflows, optional = niche */
22
+ tier: DepTier;
23
+ /** Check if the dep is available */
24
+ check: () => boolean;
25
+ /** Shell command(s) to install, in preference order per platform */
26
+ install: InstallOption[];
27
+ /** URL for manual install instructions */
28
+ url?: string;
29
+ /** Dep IDs that must be installed first */
30
+ requires?: string[];
31
+ }
32
+
33
+ export interface InstallOption {
34
+ /** Platform: "darwin", "linux", or "any" */
35
+ platform: "darwin" | "linux" | "any";
36
+ /** Shell command */
37
+ cmd: string;
38
+ }
39
+
40
+ function hasCmd(cmd: string): boolean {
41
+ try {
42
+ execSync(`which ${cmd}`, { stdio: "ignore" });
43
+ return true;
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+
49
+ /** Get the best install command for the current platform */
50
+ export function bestInstallCmd(dep: Dep): string | undefined {
51
+ const plat = process.platform === "darwin" ? "darwin" : "linux";
52
+ return (
53
+ dep.install.find((o) => o.platform === plat)?.cmd ??
54
+ dep.install.find((o) => o.platform === "any")?.cmd ??
55
+ dep.install[0]?.cmd
56
+ );
57
+ }
58
+
59
+ /** Get all install options formatted for display */
60
+ export function installHints(dep: Dep): string[] {
61
+ return dep.install.map((o) =>
62
+ o.platform === "any" ? o.cmd : `${o.cmd} (${o.platform})`,
63
+ );
64
+ }
65
+
66
+ /**
67
+ * The canonical dependency registry.
68
+ *
69
+ * Extensions should NOT duplicate these checks — import from here.
70
+ * Order matters: displayed in this order during bootstrap.
71
+ */
72
+ export const DEPS: Dep[] = [
73
+ // --- Core: most users want these ---
74
+ {
75
+ id: "ollama",
76
+ name: "Ollama",
77
+ purpose: "Local model inference, embeddings for semantic memory search",
78
+ usedBy: ["local-inference", "project-memory", "cleave", "offline-driver"],
79
+ tier: "core",
80
+ check: () => hasCmd("ollama"),
81
+ install: [
82
+ { platform: "darwin", cmd: "brew install ollama" },
83
+ { platform: "linux", cmd: "curl -fsSL https://ollama.com/install.sh | sh" },
84
+ ],
85
+ url: "https://ollama.com",
86
+ },
87
+ {
88
+ id: "d2",
89
+ name: "D2",
90
+ purpose: "Diagram rendering (architecture, flowcharts, ER diagrams)",
91
+ usedBy: ["render", "view"],
92
+ tier: "core",
93
+ check: () => hasCmd("d2"),
94
+ install: [
95
+ { platform: "darwin", cmd: "brew install d2" },
96
+ { platform: "linux", cmd: "curl -fsSL https://d2lang.com/install.sh | sh" },
97
+ ],
98
+ url: "https://d2lang.com",
99
+ },
100
+
101
+ // --- Recommended: common workflows ---
102
+ {
103
+ id: "gh",
104
+ name: "GitHub CLI",
105
+ purpose: "GitHub authentication, PR creation, issue management",
106
+ usedBy: ["01-auth"],
107
+ tier: "recommended",
108
+ check: () => hasCmd("gh"),
109
+ install: [
110
+ { platform: "darwin", cmd: "brew install gh" },
111
+ { platform: "linux", cmd: "sudo apt install gh || sudo dnf install gh" },
112
+ ],
113
+ url: "https://cli.github.com",
114
+ },
115
+ {
116
+ id: "pandoc",
117
+ name: "Pandoc",
118
+ purpose: "Document conversion (DOCX, PPTX, EPUB → Markdown)",
119
+ usedBy: ["view"],
120
+ tier: "recommended",
121
+ check: () => hasCmd("pandoc"),
122
+ install: [
123
+ { platform: "darwin", cmd: "brew install pandoc" },
124
+ { platform: "linux", cmd: "sudo apt install pandoc || sudo dnf install pandoc" },
125
+ ],
126
+ url: "https://pandoc.org",
127
+ },
128
+ {
129
+ id: "cargo",
130
+ name: "Rust toolchain",
131
+ purpose: "Required to build mdserve from source",
132
+ usedBy: ["vault (build dep)"],
133
+ tier: "recommended",
134
+ check: () => hasCmd("cargo"),
135
+ install: [
136
+ // -s -- -y passes -y to rustup-init, suppressing the interactive
137
+ // "1) Proceed / 2) Customise / 3) Cancel" prompt that otherwise hangs.
138
+ { platform: "any", cmd: "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y" },
139
+ ],
140
+ url: "https://rustup.rs",
141
+ },
142
+ {
143
+ id: "mdserve",
144
+ name: "mdserve",
145
+ purpose: "Markdown viewport with wikilinks and graph view (/vault)",
146
+ usedBy: ["vault"],
147
+ tier: "recommended",
148
+ check: () => hasCmd("mdserve"),
149
+ requires: ["cargo"],
150
+ install: [
151
+ { platform: "any", cmd: "cargo install --git https://github.com/cwilson613/mdserve --branch feature/wikilinks-graph" },
152
+ ],
153
+ url: "https://github.com/cwilson613/mdserve",
154
+ },
155
+
156
+ // --- Optional: niche or platform-specific ---
157
+ {
158
+ id: "rsvg-convert",
159
+ name: "librsvg",
160
+ purpose: "SVG rendering in terminal",
161
+ usedBy: ["view"],
162
+ tier: "optional",
163
+ check: () => hasCmd("rsvg-convert"),
164
+ install: [
165
+ { platform: "darwin", cmd: "brew install librsvg" },
166
+ { platform: "linux", cmd: "sudo apt install librsvg2-bin" },
167
+ ],
168
+ },
169
+ {
170
+ id: "pdftoppm",
171
+ name: "Poppler",
172
+ purpose: "PDF rendering in terminal",
173
+ usedBy: ["view"],
174
+ tier: "optional",
175
+ check: () => hasCmd("pdftoppm"),
176
+ install: [
177
+ { platform: "darwin", cmd: "brew install poppler" },
178
+ { platform: "linux", cmd: "sudo apt install poppler-utils" },
179
+ ],
180
+ },
181
+ {
182
+ id: "uv",
183
+ name: "uv",
184
+ purpose: "Python package manager for mflux (local image generation)",
185
+ usedBy: ["render"],
186
+ tier: "optional",
187
+ check: () => hasCmd("uv"),
188
+ install: [
189
+ { platform: "darwin", cmd: "brew install uv" },
190
+ { platform: "any", cmd: "curl -LsSf https://astral.sh/uv/install.sh | sh" },
191
+ ],
192
+ url: "https://docs.astral.sh/uv/",
193
+ },
194
+ {
195
+ id: "aws",
196
+ name: "AWS CLI",
197
+ purpose: "AWS authentication and ECR access",
198
+ usedBy: ["01-auth"],
199
+ tier: "optional",
200
+ check: () => hasCmd("aws"),
201
+ install: [
202
+ { platform: "darwin", cmd: "brew install awscli" },
203
+ { platform: "linux", cmd: "sudo apt install awscli" },
204
+ ],
205
+ },
206
+ {
207
+ id: "kubectl",
208
+ name: "kubectl",
209
+ purpose: "Kubernetes cluster access",
210
+ usedBy: ["01-auth"],
211
+ tier: "optional",
212
+ check: () => hasCmd("kubectl"),
213
+ install: [
214
+ { platform: "darwin", cmd: "brew install kubectl" },
215
+ { platform: "linux", cmd: "sudo apt install kubectl" },
216
+ ],
217
+ },
218
+ ];
219
+
220
+ export type DepStatus = { dep: Dep; available: boolean };
221
+
222
+ /** Check all deps and return their status */
223
+ export function checkAll(): DepStatus[] {
224
+ return DEPS.map((dep) => ({
225
+ dep,
226
+ available: dep.check(),
227
+ }));
228
+ }
229
+
230
+ /** Format a single dep status as a line, with install hint if missing */
231
+ function formatStatus(s: DepStatus): string {
232
+ const icon = s.available ? "✅" : "❌";
233
+ let line = `${icon} ${s.dep.name} — ${s.dep.purpose}`;
234
+ if (!s.available) {
235
+ const cmd = bestInstallCmd(s.dep);
236
+ if (cmd) line += `\n → \`${cmd}\``;
237
+ }
238
+ return line;
239
+ }
240
+
241
+ /** Format full report grouped by tier */
242
+ export function formatReport(statuses: DepStatus[]): string {
243
+ const tiers: DepTier[] = ["core", "recommended", "optional"];
244
+ const tierLabels: Record<DepTier, string> = {
245
+ core: "Core (most users need these)",
246
+ recommended: "Recommended (common workflows)",
247
+ optional: "Optional (niche / platform-specific)",
248
+ };
249
+
250
+ const lines: string[] = ["# Omegon Dependencies\n"];
251
+
252
+ for (const tier of tiers) {
253
+ const group = statuses.filter((s) => s.dep.tier === tier);
254
+ if (group.length === 0) continue;
255
+
256
+ lines.push(`## ${tierLabels[tier]}\n`);
257
+ for (const s of group) {
258
+ lines.push(formatStatus(s));
259
+ }
260
+ lines.push("");
261
+ }
262
+
263
+ const missing = statuses.filter((s) => !s.available);
264
+ if (missing.length === 0) {
265
+ lines.push("🎉 All dependencies are available!");
266
+ } else {
267
+ lines.push(`**${missing.length} missing** — run \`/bootstrap\` to install interactively.`);
268
+ }
269
+
270
+ return lines.join("\n");
271
+ }
272
+
273
+ /** Topological sort: deps with `requires` come after their prerequisites */
274
+ export function sortByRequires(deps: DepStatus[]): DepStatus[] {
275
+ const byId = new Map(deps.map((s) => [s.dep.id, s]));
276
+ const sorted: DepStatus[] = [];
277
+ const visited = new Set<string>();
278
+
279
+ function visit(s: DepStatus) {
280
+ if (visited.has(s.dep.id)) return;
281
+ visited.add(s.dep.id);
282
+ for (const reqId of s.dep.requires ?? []) {
283
+ const req = byId.get(reqId);
284
+ if (req && !req.available) visit(req);
285
+ }
286
+ sorted.push(s);
287
+ }
288
+
289
+ for (const s of deps) visit(s);
290
+ return sorted;
291
+ }