@difflab/pi 0.2.0-rc.202609191441.52cd715 → 0.2.0-rc.202609191446.bc3a2e9

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.
@@ -15589,10 +15589,14 @@ function projectSlug(repository) {
15589
15589
  // src/review/review-state.ts
15590
15590
  var reviewPublicationStateSchema = z6.object({
15591
15591
  target: z6.string().optional(),
15592
+ bodies: z6.array(z6.string()).default([]),
15592
15593
  comments: z6.array(z6.string()).default([]),
15593
15594
  replies: z6.array(z6.string()).default([]),
15594
15595
  overlayPath: z6.string().optional()
15595
15596
  });
15597
+ function reviewBodyFingerprint(body) {
15598
+ return digest(body);
15599
+ }
15596
15600
  function reviewCommentFingerprint(comment) {
15597
15601
  return digest([comment.file, String(comment.line), comment.side ?? "RIGHT", comment.body].join("\x00"));
15598
15602
  }
@@ -15610,7 +15614,7 @@ async function loadReviewPublicationState(cwd, vcs, number, homeDir) {
15610
15614
  return { path, state: { ...parsed, target } };
15611
15615
  } catch (error) {
15612
15616
  if (error.code === "ENOENT") {
15613
- return { path, state: { target, comments: [], replies: [] } };
15617
+ return { path, state: { target, bodies: [], comments: [], replies: [] } };
15614
15618
  }
15615
15619
  if (error instanceof SyntaxError || error instanceof z6.ZodError) {
15616
15620
  throw new Error(`Cannot parse review publication state: ${path}`);
@@ -16159,6 +16163,9 @@ async function publishResolvedReview(review, params, model) {
16159
16163
  await review.forge.markReady(review.pr.number);
16160
16164
  await remote.publish(event);
16161
16165
  if (promotion) {
16166
+ promotion.publication.state.bodies = [
16167
+ ...new Set([...promotion.publication.state.bodies, ...promotion.bodyFingerprints])
16168
+ ];
16162
16169
  promotion.publication.state.comments = [
16163
16170
  ...new Set([...promotion.publication.state.comments, ...promotion.commentFingerprints])
16164
16171
  ];
@@ -16167,9 +16174,10 @@ async function publishResolvedReview(review, params, model) {
16167
16174
  if (status === "CLOSE")
16168
16175
  await review.forge.closePr(review.pr.number);
16169
16176
  const finalPr = await review.forge.viewPr(String(review.pr.number));
16177
+ const promotedBodies = promotion?.promotedBodies ?? 0;
16170
16178
  const promotedComments = promotion?.promotedComments ?? 0;
16171
16179
  const promotedReplies = promotion?.promotedReplies ?? 0;
16172
- return result(`Published #${review.pr.number} (${status}); promoted ${promotedComments} comments and ${promotedReplies} replies.`, { pr: finalPr ?? review.pr, status, promotedComments, promotedReplies });
16180
+ return result(`Published #${review.pr.number} (${status}); promoted ${promotedBodies} review bodies, ${promotedComments} comments, and ${promotedReplies} replies.`, { pr: finalPr ?? review.pr, status, promotedBodies, promotedComments, promotedReplies });
16173
16181
  }
16174
16182
  async function promoteLocalReview(review, remote, model, workingTree) {
16175
16183
  const publication = await loadReviewPublicationState(review.cwd, review.vcs, review.pr.number);
@@ -16186,16 +16194,24 @@ async function promoteLocalReview(review, remote, model, workingTree) {
16186
16194
  ...comment,
16187
16195
  body: withRemoteProvenance(comment.body, comment.author?.replace(/^Agent:\s*/, "") || model)
16188
16196
  }));
16197
+ const body = draft.body.trim() ? withRemoteProvenance(draft.body, model) : "";
16198
+ const bodyFingerprints = body ? [reviewBodyFingerprint(body)] : [];
16189
16199
  const commentFingerprints = comments.map(reviewCommentFingerprint);
16190
16200
  const remoteDraft = await remote.readDraft();
16201
+ const knownBodies = new Set(publication.state.bodies);
16202
+ if (remoteDraft.body.trim())
16203
+ knownBodies.add(reviewBodyFingerprint(remoteDraft.body));
16204
+ const unpublishedBody = body && !knownBodies.has(reviewBodyFingerprint(body)) ? body : "";
16191
16205
  const known = new Set([...publication.state.comments, ...remoteDraft.comments.map(reviewCommentFingerprint)]);
16192
16206
  const unpublished = unpublishedReviewComments(comments, known);
16193
- if (unpublished.length > 0)
16194
- await remote.stage({ comments: unpublished, body: "" });
16207
+ if (unpublished.length > 0 || unpublishedBody)
16208
+ await remote.stage({ comments: unpublished, body: unpublishedBody });
16195
16209
  const promotedReplies = await promoteLocalReplies(review, remote, publication, model, workingTree);
16196
16210
  return {
16197
16211
  publication,
16212
+ bodyFingerprints,
16198
16213
  commentFingerprints,
16214
+ promotedBodies: unpublishedBody ? 1 : 0,
16199
16215
  promotedComments: unpublished.length,
16200
16216
  promotedReplies
16201
16217
  };
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export { mcp } from './mcp';
8
8
  export { mise } from './extensions/misex';
9
9
  export { createModeController, discoverAgentModes, resolveAgentMode } from './modes';
10
10
  export { pi } from './pi';
11
- export { loadReviewPublicationState, reviewCommentFingerprint, reviewReplyFingerprint, saveReviewPublicationState, unpublishedReviewComments, } from './review';
11
+ export { loadReviewPublicationState, reviewBodyFingerprint, reviewCommentFingerprint, reviewReplyFingerprint, saveReviewPublicationState, unpublishedReviewComments, } from './review';
12
12
  export { computeProjectSlug, ensureStore, reviewsDir, sessionsDir, storeDir, storeGlobalRoot } from './store';
13
13
  export { addComment, launch, listSessions, readSession, resolvePrSession, resolveReviewSession, resolveSession, toFindings, tuicrAvailable, } from './tuicr';
14
14
  export { ensureZedReviewKeybinding, ensureZedReviewTask, zedKeymapPath, zedTasksPath, ZED_REVIEW_TASK_NAME, } from './zed';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1702,10 +1702,14 @@ function projectSlug(repository) {
1702
1702
  // src/review/review-state.ts
1703
1703
  var reviewPublicationStateSchema = z4.object({
1704
1704
  target: z4.string().optional(),
1705
+ bodies: z4.array(z4.string()).default([]),
1705
1706
  comments: z4.array(z4.string()).default([]),
1706
1707
  replies: z4.array(z4.string()).default([]),
1707
1708
  overlayPath: z4.string().optional()
1708
1709
  });
1710
+ function reviewBodyFingerprint(body) {
1711
+ return digest(body);
1712
+ }
1709
1713
  function reviewCommentFingerprint(comment) {
1710
1714
  return digest([comment.file, String(comment.line), comment.side ?? "RIGHT", comment.body].join("\x00"));
1711
1715
  }
@@ -1723,7 +1727,7 @@ async function loadReviewPublicationState(cwd, vcs, number, homeDir) {
1723
1727
  return { path, state: { ...parsed, target } };
1724
1728
  } catch (error) {
1725
1729
  if (error.code === "ENOENT") {
1726
- return { path, state: { target, comments: [], replies: [] } };
1730
+ return { path, state: { target, bodies: [], comments: [], replies: [] } };
1727
1731
  }
1728
1732
  if (error instanceof SyntaxError || error instanceof z4.ZodError) {
1729
1733
  throw new Error(`Cannot parse review publication state: ${path}`);
@@ -2573,6 +2577,7 @@ export {
2573
2577
  resolvePrSession,
2574
2578
  resolveReviewSession,
2575
2579
  resolveSession,
2580
+ reviewBodyFingerprint,
2576
2581
  reviewCommentFingerprint,
2577
2582
  reviewRecordName,
2578
2583
  reviewReplyFingerprint,
@@ -3,6 +3,6 @@ export type { Finding, LocalReviewBackendOptions, ReviewBackend, ReviewComment,
3
3
  export { parseThreadArtifact, renderReviewDoc, renderThreadArtifact, upsertThreadReply } from './review-markdown';
4
4
  export { assertReviewEventSupported, createLocalReviewBackend, createRemoteReviewBackend, githubReviewSubmissionEndpoint, hasGitlabDraftNotes, parseGitlabDiffRefs, } from './review-backend';
5
5
  export type { GitlabDiffRefs } from './review-backend';
6
- export { loadReviewPublicationState, reviewCommentFingerprint, reviewReplyFingerprint, saveReviewPublicationState, unpublishedReviewComments, } from './review-state';
6
+ export { loadReviewPublicationState, reviewBodyFingerprint, reviewCommentFingerprint, reviewReplyFingerprint, saveReviewPublicationState, unpublishedReviewComments, } from './review-state';
7
7
  export type { ReviewPublicationState } from './review-state';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,GACP,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,OAAO,EACP,yBAAyB,EACzB,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,2BAA2B,EAC3B,kBAAkB,EAClB,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,GACP,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,OAAO,EACP,yBAAyB,EACzB,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,2BAA2B,EAC3B,kBAAkB,EAClB,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -2,10 +2,12 @@ import type { VcsInfo } from '../environment';
2
2
  import type { ReviewComment } from './types';
3
3
  export interface ReviewPublicationState {
4
4
  target: string;
5
+ bodies: string[];
5
6
  comments: string[];
6
7
  replies: string[];
7
8
  overlayPath?: string;
8
9
  }
10
+ export declare function reviewBodyFingerprint(body: string): string;
9
11
  export declare function reviewCommentFingerprint(comment: ReviewComment): string;
10
12
  export declare function reviewReplyFingerprint(threadId: string, body: string): string;
11
13
  export declare function unpublishedReviewComments(comments: readonly ReviewComment[], knownFingerprints: ReadonlySet<string>): ReviewComment[];
@@ -1 +1 @@
1
- {"version":3,"file":"review-state.d.ts","sourceRoot":"","sources":["../../src/review/review-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAU7C,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEvE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,aAAa,EAAE,CAEjB;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAe1D;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3G"}
1
+ {"version":3,"file":"review-state.d.ts","sourceRoot":"","sources":["../../src/review/review-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAW7C,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEvE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,aAAa,EAAE,CAEjB;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAe1D;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3G"}
@@ -1771,10 +1771,14 @@ function projectSlug(repository) {
1771
1771
  // src/review/review-state.ts
1772
1772
  var reviewPublicationStateSchema = z5.object({
1773
1773
  target: z5.string().optional(),
1774
+ bodies: z5.array(z5.string()).default([]),
1774
1775
  comments: z5.array(z5.string()).default([]),
1775
1776
  replies: z5.array(z5.string()).default([]),
1776
1777
  overlayPath: z5.string().optional()
1777
1778
  });
1779
+ function reviewBodyFingerprint(body) {
1780
+ return digest(body);
1781
+ }
1778
1782
  function reviewCommentFingerprint(comment) {
1779
1783
  return digest([comment.file, String(comment.line), comment.side ?? "RIGHT", comment.body].join("\x00"));
1780
1784
  }
@@ -1792,7 +1796,7 @@ async function loadReviewPublicationState(cwd, vcs, number, homeDir) {
1792
1796
  return { path, state: { ...parsed, target } };
1793
1797
  } catch (error) {
1794
1798
  if (error.code === "ENOENT") {
1795
- return { path, state: { target, comments: [], replies: [] } };
1799
+ return { path, state: { target, bodies: [], comments: [], replies: [] } };
1796
1800
  }
1797
1801
  if (error instanceof SyntaxError || error instanceof z5.ZodError) {
1798
1802
  throw new Error(`Cannot parse review publication state: ${path}`);
@@ -2359,6 +2363,9 @@ async function publishResolvedReview(review, params, model) {
2359
2363
  await review.forge.markReady(review.pr.number);
2360
2364
  await remote.publish(event);
2361
2365
  if (promotion) {
2366
+ promotion.publication.state.bodies = [
2367
+ ...new Set([...promotion.publication.state.bodies, ...promotion.bodyFingerprints])
2368
+ ];
2362
2369
  promotion.publication.state.comments = [
2363
2370
  ...new Set([...promotion.publication.state.comments, ...promotion.commentFingerprints])
2364
2371
  ];
@@ -2367,9 +2374,10 @@ async function publishResolvedReview(review, params, model) {
2367
2374
  if (status === "CLOSE")
2368
2375
  await review.forge.closePr(review.pr.number);
2369
2376
  const finalPr = await review.forge.viewPr(String(review.pr.number));
2377
+ const promotedBodies = promotion?.promotedBodies ?? 0;
2370
2378
  const promotedComments = promotion?.promotedComments ?? 0;
2371
2379
  const promotedReplies = promotion?.promotedReplies ?? 0;
2372
- return result(`Published #${review.pr.number} (${status}); promoted ${promotedComments} comments and ${promotedReplies} replies.`, { pr: finalPr ?? review.pr, status, promotedComments, promotedReplies });
2380
+ return result(`Published #${review.pr.number} (${status}); promoted ${promotedBodies} review bodies, ${promotedComments} comments, and ${promotedReplies} replies.`, { pr: finalPr ?? review.pr, status, promotedBodies, promotedComments, promotedReplies });
2373
2381
  }
2374
2382
  async function promoteLocalReview(review, remote, model, workingTree) {
2375
2383
  const publication = await loadReviewPublicationState(review.cwd, review.vcs, review.pr.number);
@@ -2386,16 +2394,24 @@ async function promoteLocalReview(review, remote, model, workingTree) {
2386
2394
  ...comment,
2387
2395
  body: withRemoteProvenance(comment.body, comment.author?.replace(/^Agent:\s*/, "") || model)
2388
2396
  }));
2397
+ const body = draft.body.trim() ? withRemoteProvenance(draft.body, model) : "";
2398
+ const bodyFingerprints = body ? [reviewBodyFingerprint(body)] : [];
2389
2399
  const commentFingerprints = comments.map(reviewCommentFingerprint);
2390
2400
  const remoteDraft = await remote.readDraft();
2401
+ const knownBodies = new Set(publication.state.bodies);
2402
+ if (remoteDraft.body.trim())
2403
+ knownBodies.add(reviewBodyFingerprint(remoteDraft.body));
2404
+ const unpublishedBody = body && !knownBodies.has(reviewBodyFingerprint(body)) ? body : "";
2391
2405
  const known = new Set([...publication.state.comments, ...remoteDraft.comments.map(reviewCommentFingerprint)]);
2392
2406
  const unpublished = unpublishedReviewComments(comments, known);
2393
- if (unpublished.length > 0)
2394
- await remote.stage({ comments: unpublished, body: "" });
2407
+ if (unpublished.length > 0 || unpublishedBody)
2408
+ await remote.stage({ comments: unpublished, body: unpublishedBody });
2395
2409
  const promotedReplies = await promoteLocalReplies(review, remote, publication, model, workingTree);
2396
2410
  return {
2397
2411
  publication,
2412
+ bodyFingerprints,
2398
2413
  commentFingerprints,
2414
+ promotedBodies: unpublishedBody ? 1 : 0,
2399
2415
  promotedComments: unpublished.length,
2400
2416
  promotedReplies
2401
2417
  };
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMzG,OAAO,EAsBL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AA+EnB,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAExF;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAalE;AAID,wBAAgB,iBAAiB,IAAI,SAAS,cAAc,EAAE,CAib7D;AAyKD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwB/B"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMzG,OAAO,EAuBL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAiFnB,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAExF;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAalE;AAID,wBAAgB,iBAAiB,IAAI,SAAS,cAAc,EAAE,CAib7D;AAoLD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwB/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@difflab/pi",
3
- "version": "0.2.0-rc.202609191441.52cd715",
3
+ "version": "0.2.0-rc.202609191446.bc3a2e9",
4
4
  "description": "Tools and skills for the pi coding agent",
5
5
  "repository": {
6
6
  "type": "git",