@roodriigoooo/pi-docket 0.4.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 +132 -0
- package/LICENSE +21 -0
- package/README.md +241 -0
- package/assets/docket_logo.jpeg +0 -0
- package/docs/adr/0001-bundle-first-checkpoints.md +21 -0
- package/docs/adr/0002-rename-to-docket.md +44 -0
- package/docs/architecture.md +101 -0
- package/docs/bundle-guidelines.md +39 -0
- package/docs/configuration.md +191 -0
- package/docs/releases/0.4.0.md +93 -0
- package/extensions/artifact-catalog.ts +467 -0
- package/extensions/background-work.ts +510 -0
- package/extensions/checkpoint-commands.ts +147 -0
- package/extensions/checkpoint-lifecycle.ts +195 -0
- package/extensions/checkpoint-selector.ts +162 -0
- package/extensions/checkpoint-store.ts +230 -0
- package/extensions/checkpoint-summarizer.ts +141 -0
- package/extensions/docket-command-grammar.ts +319 -0
- package/extensions/docket-command-router.ts +626 -0
- package/extensions/docket-config.ts +88 -0
- package/extensions/docket-extension-surface.ts +43 -0
- package/extensions/docket-navigator.ts +585 -0
- package/extensions/docket.README.md +46 -0
- package/extensions/docket.ts +2965 -0
- package/extensions/event-log.ts +121 -0
- package/extensions/git-context.ts +44 -0
- package/extensions/loaded-artifact-context.ts +228 -0
- package/extensions/search-index.ts +140 -0
- package/extensions/types.ts +40 -0
- package/extensions/worker-activity.ts +402 -0
- package/extensions/worker-changes.ts +180 -0
- package/extensions/worker-commands.ts +251 -0
- package/extensions/worker-dock-cache.ts +147 -0
- package/extensions/worker-events.ts +87 -0
- package/extensions/worker-eviction.ts +55 -0
- package/extensions/worker-guardrails.md +125 -0
- package/extensions/worker-kinds/patcher.md +23 -0
- package/extensions/worker-kinds/scout.md +17 -0
- package/extensions/worker-kinds.ts +280 -0
- package/extensions/worker-result.ts +193 -0
- package/extensions/worker-store.ts +621 -0
- package/extensions/worker-summary-embed.ts +98 -0
- package/package.json +53 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { WorkerStatus } from "./background-work.js";
|
|
2
|
+
|
|
3
|
+
export type ReadyEmbed = {
|
|
4
|
+
subject: string;
|
|
5
|
+
heading: string;
|
|
6
|
+
content: string;
|
|
7
|
+
title: string;
|
|
8
|
+
subtitle: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const MAX_RECOMMENDED_BULLETS = 5;
|
|
12
|
+
const MAX_BULLET_CHARS = 140;
|
|
13
|
+
const MAX_SUMMARY_CHARS = 280;
|
|
14
|
+
const BULLET_PREFIX = /^\s*(?:[-*•]|\d+[.)])\s+/;
|
|
15
|
+
|
|
16
|
+
function firstLine(text: string | undefined): string | undefined {
|
|
17
|
+
const line = text?.split(/\r?\n/).map((part) => part.trim()).find(Boolean);
|
|
18
|
+
return line || undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function truncate(text: string, max: number): string {
|
|
22
|
+
if (text.length <= max) return text;
|
|
23
|
+
return `${text.slice(0, Math.max(1, max - 1))}…`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function workerLabel(worker: WorkerStatus): string {
|
|
27
|
+
return `w${worker.index}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function kindTag(worker: WorkerStatus): string {
|
|
31
|
+
const kind = worker.kind?.trim();
|
|
32
|
+
if (!kind || kind === "default") return "";
|
|
33
|
+
return `·${kind}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function extractRecommendations(worker: WorkerStatus): string[] {
|
|
37
|
+
const fromField = Array.isArray(worker.recommended)
|
|
38
|
+
? worker.recommended.map((r) => String(r).trim()).filter(Boolean)
|
|
39
|
+
: [];
|
|
40
|
+
if (fromField.length > 0) return fromField;
|
|
41
|
+
const summary = worker.summary;
|
|
42
|
+
if (typeof summary !== "string") return [];
|
|
43
|
+
const lines: string[] = [];
|
|
44
|
+
let inRecommended = false;
|
|
45
|
+
for (const raw of summary.split(/\r?\n/)) {
|
|
46
|
+
const line = raw.trim();
|
|
47
|
+
if (!line) { if (inRecommended) break; continue; }
|
|
48
|
+
if (/^recommended:?$/i.test(line) || /^recommendations:?$/i.test(line) || /^suggested:?$/i.test(line)) {
|
|
49
|
+
inRecommended = true;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (inRecommended) {
|
|
53
|
+
lines.push(line.replace(BULLET_PREFIX, ""));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return lines;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function summaryHeadline(worker: WorkerStatus): string | undefined {
|
|
60
|
+
const summary = worker.summary;
|
|
61
|
+
if (typeof summary !== "string") return undefined;
|
|
62
|
+
const recommendedIdx = summary.search(/\brecommend(ed|ations?):?/i);
|
|
63
|
+
const prelude = recommendedIdx >= 0 ? summary.slice(0, recommendedIdx) : summary;
|
|
64
|
+
return firstLine(prelude) ?? firstLine(summary);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function formatReadyEmbedMessage(worker: WorkerStatus): ReadyEmbed | undefined {
|
|
68
|
+
const headline = summaryHeadline(worker);
|
|
69
|
+
const recommended = extractRecommendations(worker);
|
|
70
|
+
if (!headline && recommended.length === 0) return undefined;
|
|
71
|
+
|
|
72
|
+
const label = workerLabel(worker);
|
|
73
|
+
const tag = kindTag(worker);
|
|
74
|
+
const outcome = worker.outcome ? ` (${worker.outcome})` : "";
|
|
75
|
+
|
|
76
|
+
const lines: string[] = [];
|
|
77
|
+
lines.push(`**${label}${tag} ready**${outcome}`);
|
|
78
|
+
if (headline) lines.push(truncate(headline, MAX_SUMMARY_CHARS));
|
|
79
|
+
if (recommended.length > 0) {
|
|
80
|
+
lines.push("");
|
|
81
|
+
lines.push("Recommended:");
|
|
82
|
+
for (const bullet of recommended.slice(0, MAX_RECOMMENDED_BULLETS)) {
|
|
83
|
+
lines.push(`- ${truncate(bullet, MAX_BULLET_CHARS)}`);
|
|
84
|
+
}
|
|
85
|
+
if (recommended.length > MAX_RECOMMENDED_BULLETS) {
|
|
86
|
+
lines.push(`- … ${recommended.length - MAX_RECOMMENDED_BULLETS} more (open card for full list)`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const subject = headline ? `${label}${tag} ready · ${truncate(headline, 60)}` : `${label}${tag} ready`;
|
|
91
|
+
return {
|
|
92
|
+
subject,
|
|
93
|
+
heading: "docket · worker ready",
|
|
94
|
+
content: lines.join("\n"),
|
|
95
|
+
title: `${label}${tag} ready`,
|
|
96
|
+
subtitle: headline ? truncate(headline, 100) : "ready",
|
|
97
|
+
};
|
|
98
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@roodriigoooo/pi-docket",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Docket: decision queue and evidence bundles for Pi agent work",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pi-package",
|
|
7
|
+
"pi-extension",
|
|
8
|
+
"docket",
|
|
9
|
+
"evidence-bundles",
|
|
10
|
+
"context",
|
|
11
|
+
"coding-agent"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/roodriigoooo/pi-docket.git"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"extensions",
|
|
21
|
+
"docs",
|
|
22
|
+
"assets",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE",
|
|
25
|
+
"CHANGELOG.md"
|
|
26
|
+
],
|
|
27
|
+
"pi": {
|
|
28
|
+
"extensions": [
|
|
29
|
+
"./extensions/docket.ts"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@mariozechner/pi-ai": "*",
|
|
34
|
+
"@mariozechner/pi-coding-agent": "*",
|
|
35
|
+
"@mariozechner/pi-tui": "*"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@mariozechner/pi-ai": "*",
|
|
39
|
+
"@mariozechner/pi-coding-agent": "*",
|
|
40
|
+
"@mariozechner/pi-tui": "*",
|
|
41
|
+
"@types/node": "^22.0.0",
|
|
42
|
+
"typescript": "^5.9.0"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"check": "tsc --noEmit",
|
|
46
|
+
"test": "rm -rf .test-build && tsc -p tsconfig.test.json && node --test .test-build/tests/*.test.js",
|
|
47
|
+
"pack:dry": "npm pack --dry-run",
|
|
48
|
+
"smoke:help": "pi --no-extensions -e ./extensions/docket.ts --mode json --no-session \"/docket help\""
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
}
|
|
53
|
+
}
|