pi-harness-runtime 1.1.329 → 1.1.331

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 (114) hide show
  1. package/harness/wiki-integration.ts +216 -25
  2. package/index.ts +8 -2
  3. package/package.json +1 -1
  4. package/packages/a2a-adapter/package.json +1 -1
  5. package/packages/agent-policy/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/codex-watcher/package.json +1 -1
  20. package/packages/config-capture/package.json +1 -1
  21. package/packages/context-compiler/package.json +1 -1
  22. package/packages/context-discovery/package.json +1 -1
  23. package/packages/context-manager/package.json +1 -1
  24. package/packages/cookie-sanitizer/package.json +1 -1
  25. package/packages/cost-optimizer/package.json +1 -1
  26. package/packages/dependency-analyzer/package.json +1 -1
  27. package/packages/django-plugin/package.json +1 -1
  28. package/packages/doc-generator/package.json +1 -1
  29. package/packages/durable-review/package.json +1 -1
  30. package/packages/e2e-tester/package.json +1 -1
  31. package/packages/evaluation-engine/package.json +1 -1
  32. package/packages/evaluation-runner/package.json +1 -1
  33. package/packages/event-bus/package.json +1 -1
  34. package/packages/event-store/package.json +1 -1
  35. package/packages/experience-replay/package.json +1 -1
  36. package/packages/feedback-collector/package.json +1 -1
  37. package/packages/file-copy-helper/package.json +1 -1
  38. package/packages/framework-detector/package.json +1 -1
  39. package/packages/framework-plugin-sdk/package.json +1 -1
  40. package/packages/frappe-plugin/package.json +1 -1
  41. package/packages/generic-web-plugin/package.json +1 -1
  42. package/packages/health-monitor/package.json +1 -1
  43. package/packages/intent-analyzer/package.json +1 -1
  44. package/packages/jev-judge/package.json +1 -1
  45. package/packages/knowledge-graph/package.json +1 -1
  46. package/packages/knowledge-retrieval/package.json +1 -1
  47. package/packages/laravel-plugin/package.json +1 -1
  48. package/packages/learning-engine/package.json +1 -1
  49. package/packages/mcp-adapter/package.json +1 -1
  50. package/packages/memory-engine/package.json +1 -1
  51. package/packages/milestone-manager/package.json +1 -1
  52. package/packages/model-registry/package.json +1 -1
  53. package/packages/nextjs-plugin/package.json +1 -1
  54. package/packages/notification/package.json +1 -1
  55. package/packages/observability/package.json +1 -1
  56. package/packages/okf-indexer/package.json +1 -1
  57. package/packages/paperclip-integration/package.json +1 -1
  58. package/packages/performance-optimizer/package.json +1 -1
  59. package/packages/privilege-broker/package.json +1 -1
  60. package/packages/project-analyzer/package.json +1 -1
  61. package/packages/project-bootstrap/package.json +1 -1
  62. package/packages/projection-engine/package.json +1 -1
  63. package/packages/prompt-compiler/package.json +1 -1
  64. package/packages/prompt-versioning/package.json +1 -1
  65. package/packages/provider-adapter-sdk/package.json +1 -1
  66. package/packages/provider-router/package.json +1 -1
  67. package/packages/provider-selector/package.json +1 -1
  68. package/packages/providers/package.json +1 -1
  69. package/packages/qdrant-skills/package.json +1 -1
  70. package/packages/quota-manager/package.json +1 -1
  71. package/packages/rate-limiter/package.json +1 -1
  72. package/packages/react-vite-plugin/package.json +1 -1
  73. package/packages/release-manager/package.json +1 -1
  74. package/packages/requirement-compiler/package.json +1 -1
  75. package/packages/runtime/package.json +1 -1
  76. package/packages/scheduler/package.json +1 -1
  77. package/packages/scheduler-adapter/package.json +1 -1
  78. package/packages/session/package.json +1 -1
  79. package/packages/session-api/package.json +1 -1
  80. package/packages/session-export/package.json +1 -1
  81. package/packages/shared-context/package.json +1 -1
  82. package/packages/skill-mcp-client/package.json +1 -1
  83. package/packages/skill-registry/package.json +1 -1
  84. package/packages/skills/package.json +1 -1
  85. package/packages/sprint-planner/package.json +1 -1
  86. package/packages/subscription-engine/package.json +1 -1
  87. package/packages/task-compiler/package.json +1 -1
  88. package/packages/telegram/package.json +1 -1
  89. package/packages/tencentdb-memory/package.json +1 -1
  90. package/packages/tencentdb-sync/package.json +1 -1
  91. package/packages/test-data-generator/package.json +1 -1
  92. package/packages/test-generator/package.json +1 -1
  93. package/packages/todo-bd-sync/package.json +1 -1
  94. package/packages/token-estimation/package.json +1 -1
  95. package/packages/token-optimizer/package.json +1 -1
  96. package/packages/trajectory/package.json +1 -1
  97. package/packages/tui/package.json +1 -1
  98. package/packages/types/package.json +1 -1
  99. package/packages/webmcp-tester/package.json +1 -1
  100. package/packages/wiki/dist/index.d.ts +14 -0
  101. package/packages/wiki/dist/index.d.ts.map +1 -1
  102. package/packages/wiki/dist/index.js +55 -0
  103. package/packages/wiki/dist/index.js.map +1 -1
  104. package/packages/wiki/dist/storage.d.ts +5 -1
  105. package/packages/wiki/dist/storage.d.ts.map +1 -1
  106. package/packages/wiki/dist/storage.js +50 -15
  107. package/packages/wiki/dist/storage.js.map +1 -1
  108. package/packages/wiki/package.json +1 -1
  109. package/packages/wiki/src/index.ts +68 -0
  110. package/packages/wiki/src/storage.ts +49 -16
  111. package/packages/workflow-events/package.json +1 -1
  112. package/packages/workspace-scanner/package.json +1 -1
  113. package/packages/worktree/package.json +1 -1
  114. package/packages/write-review/package.json +1 -1
@@ -1,10 +1,50 @@
1
1
  /**
2
2
  * Wiki Integration for Pi
3
3
  *
4
- * Implements wiki commands per wiki/llm-wiki-integration-minimax-plan.md
4
+ * Implements wiki commands and tools per wiki/llm-wiki-integration-minimax-plan.md
5
5
  */
6
6
 
7
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
7
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
8
+ import { Type } from "typebox";
9
+ import { realpathSync } from "node:fs";
10
+ import path from "node:path";
11
+
12
+ // Cache managers by workspace root to avoid recreating
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ const wikiManagers = new Map<string, any>();
15
+
16
+ /**
17
+ * Get or create wiki manager for a workspace
18
+ */
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ function getWiki(workspaceRoot: string): any {
21
+ let manager = wikiManagers.get(workspaceRoot);
22
+ if (!manager) {
23
+ const { createWikiManager } = require("../packages/wiki/dist/index.js");
24
+ const projectId = path.basename(workspaceRoot) || "unknown";
25
+ manager = createWikiManager(workspaceRoot, projectId);
26
+ wikiManagers.set(workspaceRoot, manager);
27
+ }
28
+ return manager;
29
+ }
30
+
31
+ /**
32
+ * Get current workspace from Pi context
33
+ */
34
+ function getCurrentWorkspace(ctx?: ExtensionContext): string {
35
+ if (ctx?.cwd) {
36
+ try {
37
+ return realpathSync(ctx.cwd);
38
+ } catch {
39
+ return ctx.cwd;
40
+ }
41
+ }
42
+ try {
43
+ return realpathSync(process.cwd());
44
+ } catch {
45
+ return process.cwd();
46
+ }
47
+ }
8
48
 
9
49
  /**
10
50
  * Initialize wiki integration
@@ -16,33 +56,181 @@ export async function initWiki(pi: ExtensionAPI): Promise<void> {
16
56
  }
17
57
 
18
58
  try {
19
- const { createWikiManager, isWikiEnabled } = await import(
20
- "../packages/wiki/dist/index.js"
21
- );
59
+ const { isWikiEnabled } = await import("../packages/wiki/dist/index.js");
22
60
 
23
- // Get workspace from environment
24
- const workspaceRoot = process.env.PWD || process.cwd();
61
+ // ========================================================================
62
+ // Register Tools (for LLM use)
63
+ // ========================================================================
25
64
 
26
- // Create wiki manager lazily
27
- let wikiManager: ReturnType<typeof createWikiManager> | null = null;
65
+ // Tool: wiki_search - Search pages by query
66
+ pi.registerTool({
67
+ name: "wiki_search",
68
+ label: "Wiki Search",
69
+ description: "Search wiki pages by query. Returns page titles, IDs, status, and snippets.",
70
+ parameters: Type.Object({
71
+ query: Type.String({ description: "Search query" }),
72
+ limit: Type.Optional(Type.Number({ description: "Max results (default 5)", default: 5 })),
73
+ }),
74
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
75
+ if (!isWikiEnabled()) {
76
+ return { content: [{ type: "text", text: "Wiki feature is disabled." }], details: {} };
77
+ }
78
+ try {
79
+ const wiki = getWiki(getCurrentWorkspace(ctx));
80
+ const results = wiki.search(params.query, undefined, params.limit ?? 5);
81
+ if (results.length === 0) {
82
+ return { content: [{ type: "text", text: "No results found." }], details: {} };
83
+ }
84
+ const lines = results.map((r: { page: { status: string; title: string; kind: string; id: string } }) =>
85
+ `[${r.page.status}] ${r.page.title} (${r.page.kind}): ${r.page.id}`
86
+ );
87
+ return { content: [{ type: "text", text: `Found ${results.length} result(s):\n${lines.join("\n")}` }], details: {} };
88
+ } catch (err) {
89
+ return { content: [{ type: "text", text: `Search failed: ${err}` }], details: {} };
90
+ }
91
+ },
92
+ });
28
93
 
29
- function getWiki() {
30
- if (!wikiManager) {
31
- wikiManager = createWikiManager(workspaceRoot, "pi-harness-runtime");
32
- }
33
- return wikiManager;
34
- }
94
+ // Tool: wiki_read - Read a specific page
95
+ pi.registerTool({
96
+ name: "wiki_read",
97
+ label: "Wiki Read",
98
+ description: "Read a wiki page by ID. Returns frontmatter and body content.",
99
+ parameters: Type.Object({
100
+ pageId: Type.String({ description: "Page ID to read" }),
101
+ }),
102
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
103
+ if (!isWikiEnabled()) {
104
+ return { content: [{ type: "text", text: "Wiki feature is disabled." }], details: {} };
105
+ }
106
+ try {
107
+ const wiki = getWiki(getCurrentWorkspace(ctx));
108
+ const page = wiki.loadPage(params.pageId);
109
+ if (!page) {
110
+ return { content: [{ type: "text", text: `Page not found: ${params.pageId}` }], details: {} };
111
+ }
112
+ const lines = [
113
+ `# ${page.frontmatter.title}`,
114
+ `ID: ${page.frontmatter.id}`,
115
+ `Status: ${page.frontmatter.status}`,
116
+ `Kind: ${page.frontmatter.kind}`,
117
+ `Updated: ${page.frontmatter.updatedAt}`,
118
+ ``,
119
+ `---`,
120
+ page.body,
121
+ ];
122
+ return { content: [{ type: "text", text: lines.join("\n") }], details: {} };
123
+ } catch (err) {
124
+ return { content: [{ type: "text", text: `Read failed: ${err}` }], details: {} };
125
+ }
126
+ },
127
+ });
128
+
129
+ // Tool: wiki_ingest - Ingest a source file
130
+ pi.registerTool({
131
+ name: "wiki_ingest",
132
+ label: "Wiki Ingest",
133
+ description: "Ingest a source file into the wiki. Creates a snapshot and returns the snapshot ID.",
134
+ parameters: Type.Object({
135
+ sourcePath: Type.String({ description: "Path to source file to ingest" }),
136
+ }),
137
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
138
+ if (!isWikiEnabled()) {
139
+ return { content: [{ type: "text", text: "Wiki feature is disabled." }], details: {} };
140
+ }
141
+ try {
142
+ const wiki = getWiki(getCurrentWorkspace(ctx));
143
+ const { page, snapshot, existing } = wiki.ingestAndCreatePage(params.sourcePath);
144
+ if (existing) {
145
+ return { content: [{ type: "text", text: `Already ingested: ${snapshot.id}` }], details: {} };
146
+ }
147
+ return {
148
+ content: [{
149
+ type: "text",
150
+ text: `Ingested: ${snapshot.id}\nPage: ${page.frontmatter.id}\nTitle: ${page.frontmatter.title}\nPath: ${snapshot.originalPath}\nHash: ${snapshot.contentHash.slice(0, 16)}...`,
151
+ }],
152
+ details: { pageId: page.frontmatter.id },
153
+ };
154
+ } catch (err) {
155
+ return { content: [{ type: "text", text: `Ingest failed: ${err}` }], details: {} };
156
+ }
157
+ },
158
+ });
159
+
160
+ // Tool: wiki_lint - Run lint checks
161
+ pi.registerTool({
162
+ name: "wiki_lint",
163
+ label: "Wiki Lint",
164
+ description: "Run lint checks on the wiki. Returns structural and semantic issues.",
165
+ parameters: Type.Object({}),
166
+ async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
167
+ if (!isWikiEnabled()) {
168
+ return { content: [{ type: "text", text: "Wiki feature is disabled." }], details: {} };
169
+ }
170
+ try {
171
+ const wiki = getWiki(getCurrentWorkspace(ctx));
172
+ const findings = wiki.lint();
173
+ if (findings.length === 0) {
174
+ return { content: [{ type: "text", text: "No issues found." }], details: {} };
175
+ }
176
+ const lines = findings.slice(0, 20).map((f: { severity: string; category: string; message: string }) =>
177
+ `[${f.severity}] ${f.category}: ${f.message}`
178
+ );
179
+ return { content: [{ type: "text", text: `${findings.length} issue(s):\n${lines.join("\n")}` }], details: {} };
180
+ } catch (err) {
181
+ return { content: [{ type: "text", text: `Lint failed: ${err}` }], details: {} };
182
+ }
183
+ },
184
+ });
185
+
186
+ // Tool: wiki_status - Show wiki stats
187
+ pi.registerTool({
188
+ name: "wiki_status",
189
+ label: "Wiki Status",
190
+ description: "Show wiki statistics: page count, kinds, statuses.",
191
+ parameters: Type.Object({}),
192
+ async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
193
+ if (!isWikiEnabled()) {
194
+ return { content: [{ type: "text", text: "Wiki feature is disabled." }], details: {} };
195
+ }
196
+ try {
197
+ const wiki = getWiki(getCurrentWorkspace(ctx));
198
+ const pages = wiki.getAllPages();
199
+ const kinds: Record<string, number> = {};
200
+ const statuses: Record<string, number> = {};
201
+ for (const p of pages) {
202
+ kinds[p.frontmatter.kind] = (kinds[p.frontmatter.kind] || 0) + 1;
203
+ statuses[p.frontmatter.status] = (statuses[p.frontmatter.status] || 0) + 1;
204
+ }
205
+ return {
206
+ content: [{
207
+ type: "text",
208
+ text: `Wiki Status\nPages: ${pages.length}\nKinds: ${JSON.stringify(kinds)}\nStatuses: ${JSON.stringify(statuses)}`,
209
+ }],
210
+ details: {},
211
+ };
212
+ } catch (err) {
213
+ return { content: [{ type: "text", text: `Status failed: ${err}` }], details: {} };
214
+ }
215
+ },
216
+ });
217
+
218
+ // ========================================================================
219
+ // Register Command (for user use)
220
+ // ========================================================================
35
221
 
36
- // Register /harness-wiki command
37
222
  pi.registerCommand("harness-wiki", {
38
223
  description: "Manage project wiki: search, read, ingest, lint",
39
- handler: async (args: string, _ctx: unknown) => {
224
+ handler: async (args: string, ctx: unknown) => {
40
225
  if (!isWikiEnabled()) {
41
226
  console.log("Wiki feature is disabled. Set HARNESS_KNOWLEDGE_WIKI=1 to enable.");
42
227
  return;
43
228
  }
44
229
 
45
- const wiki = getWiki();
230
+ // Get workspace from context
231
+ const extCtx = ctx as ExtensionContext | undefined;
232
+ const workspace = getCurrentWorkspace(extCtx);
233
+ const wiki = getWiki(workspace);
46
234
  const parts = args.trim().split(/\s+/);
47
235
  const subcommand = parts[0] || "help";
48
236
  const subargs = parts.slice(1).join(" ");
@@ -110,11 +298,12 @@ export async function initWiki(pi: ExtensionAPI): Promise<void> {
110
298
  return;
111
299
  }
112
300
  try {
113
- const { snapshot, existing } = wiki.ingestSource(subargs);
301
+ const { page, snapshot, existing } = wiki.ingestAndCreatePage(subargs);
114
302
  if (existing) {
115
303
  console.log(`Already ingested: ${snapshot.id}`);
116
304
  } else {
117
305
  console.log(`Ingested: ${snapshot.id}`);
306
+ console.log(` Page: ${page.frontmatter.id} - ${page.frontmatter.title}`);
118
307
  console.log(` Path: ${snapshot.originalPath}`);
119
308
  console.log(` Hash: ${snapshot.contentHash.slice(0, 16)}...`);
120
309
  }
@@ -129,8 +318,8 @@ export async function initWiki(pi: ExtensionAPI): Promise<void> {
129
318
  if (findings.length === 0) {
130
319
  console.log("No issues found.");
131
320
  } else {
132
- const errors = findings.filter((f) => f.severity === "error");
133
- const warnings = findings.filter((f) => f.severity === "warning");
321
+ const errors = findings.filter((f: { severity: string }) => f.severity === "error");
322
+ const warnings = findings.filter((f: { severity: string }) => f.severity === "warning");
134
323
  console.log(`${errors.length} error(s), ${warnings.length} warning(s):`);
135
324
  for (const f of findings.slice(0, 10)) {
136
325
  console.log(` [${f.severity}] ${f.category}: ${f.message}`);
@@ -189,10 +378,12 @@ export function getWikiInstruction(): string {
189
378
  return `
190
379
  ## Project Wiki
191
380
 
192
- Project knowledge is available via the wiki. Use /harness-wiki to:
193
- - Search: /harness-wiki search <query>
194
- - Read: /harness-wiki read <page-id>
195
- - Ingest: /harness-wiki ingest <source-path>
381
+ Project knowledge is available via wiki tools:
382
+ - wiki_search: Search pages by query
383
+ - wiki_read: Read a page by ID
384
+ - wiki_ingest: Ingest a source file
385
+ - wiki_lint: Check for issues
386
+ - wiki_status: Show statistics
196
387
 
197
388
  The wiki contains:
198
389
  - Design decisions with rationale
package/index.ts CHANGED
@@ -70,7 +70,7 @@ import {
70
70
  createBlackboard,
71
71
  } from "./harness/blackboard.ts";
72
72
  import { scheduleAutoResume, cancelAutoResume, getGLMQuotaCountdown } from "./harness/index.js";
73
- import { initWiki } from "./harness/wiki-integration.js";
73
+ import { initWiki, getWikiInstruction } from "./harness/wiki-integration.js";
74
74
  import { startWatcher, classifyMessage, detectReviewMarker } from "./packages/codex-watcher/dist/src/index.js";
75
75
  import {
76
76
  getPaperclipConfig,
@@ -1770,7 +1770,13 @@ async function initMemory(pi: ExtensionAPI): Promise<void> {
1770
1770
  }
1771
1771
 
1772
1772
  // Combine all memory
1773
- const allMemory = parts.join("\n") + honchoContext;
1773
+ let allMemory = parts.join("\n") + honchoContext;
1774
+
1775
+ // Add wiki instruction if feature is enabled
1776
+ const wikiInstruction = getWikiInstruction();
1777
+ if (wikiInstruction) {
1778
+ allMemory += wikiInstruction;
1779
+ }
1774
1780
 
1775
1781
  if (!allMemory.trim()) {
1776
1782
  logToFile("[memory]", "No memory to inject");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-harness-runtime",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "[BETA] Codex-style /usage status + autonomous coding harness for pi. Not production ready — expect breaking changes.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/a2a-adapter",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "Google Agent-to-Agent (A2A) protocol adapter for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/agent-policy",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Agent policy runtime for pi-harness - enforces mandatory rule delivery and mutation gating",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/architecture-generator",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Generate ADR and Mermaid diagrams from project analysis",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/auth",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "pi-harness-runtime — auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/autonomous-refactor",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "Autonomous refactoring engine",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/autonomous-runtime",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Autonomous Operations Runtime — task inbox, lease management, and worker lifecycle (RFC-0101)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/cache-strategy",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "Smart caching with TTL and invalidation strategies (RFC-0022)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/capability-registry",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Capability Registry for pi-harness-runtime — tracks model capabilities and enables capability-based routing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/checkpoint",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Enhanced checkpoint system with incremental snapshots, diff-based storage, and recovery strategies",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/cli-plugin-sdk",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "CLI Plugin SDK for pi-harness — install, list, remove, update, invoke plugins",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/clipboard",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/clipboard-plugin",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/code-generation",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Code generation pipeline for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/code-review",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Automated code review engine for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/codex-adapter",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "OpenAI Codex provider adapter for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/codex-watcher",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Watches Codex CLI sessions and emits visible messages for PING-PONG monitoring",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/config-capture",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Auto-capture API-fetched configuration values to AGENTS.md",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-compiler",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Bounded context selection engine for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-discovery",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/context-manager",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Context Window Manager — prevents model context overflow via compaction and resume prompts (RFC-0010)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cookie-sanitizer",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "pi-harness-runtime — cookie sanitizer (provider-quota cookie file normaliser)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cost-optimizer",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Cost Optimizer for pi-harness-runtime — budget tracking, forecasting, and model selection optimization",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/dependency-analyzer",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/django-plugin",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Django framework analysis — models, management commands, settings",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/doc-generator",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Auto-Doc Generator — generate documentation from source code (RFC-0014)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/durable-review",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "SQLite-backed durable reviewer using @earendil-works/pi-durable",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/e2e-tester",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "WebMCP-powered E2E testing for pi-harness - natural language test scenarios",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/evaluation-engine",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Evaluation engine for pi-harness runtime (RFC-0057)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/evaluation-runner",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic evaluation framework for AI outputs (RFC-0020)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-bus",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/experience-replay",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Experience replay for debugging and reproducibility (RFC-0059)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/feedback-collector",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "type": "module",
5
5
  "description": "Collect and aggregate human/automated feedback (RFC-0021)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/file-copy-helper",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Injects cp/sudo cp rule when user asks to mimic/copy files",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-detector",
3
- "version": "1.1.329",
3
+ "version": "1.1.331",
4
4
  "description": "Framework detection system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",