@workit-dev/core 0.0.1 → 1.0.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/LICENSE +21 -0
- package/README.md +22 -43
- package/package.json +56 -6
- package/schemas/config.json +74 -0
- package/schemas/vcs.json +79 -0
- package/schemas/workspaces.json +1029 -0
- package/schemas/youtrack.json +84 -0
- package/scripts/analyze-release-scope.ts +215 -0
- package/scripts/bundled-deps.json +131 -0
- package/scripts/fixtures/sample-plan.md +15 -0
- package/scripts/fixtures/sample-sdd/progress.md +2 -0
- package/scripts/install-codex-plugin.sh +28 -0
- package/scripts/install-cursor-plugin.sh +146 -0
- package/scripts/install-opencode-plugin.sh +79 -0
- package/scripts/install-pi-package.sh +56 -0
- package/scripts/lib/config-dir.sh +28 -0
- package/scripts/publish-changed-packages.ts +395 -0
- package/scripts/rewrite-workspace-deps.ts +53 -0
- package/scripts/run-cursor-mcp.sh +6 -0
- package/scripts/sync-release-manifests.ts +82 -0
- package/scripts/sync-runtime.sh +142 -0
- package/scripts/validate-cursor-marketplace.ts +171 -0
- package/scripts/verify-bundle-sources.ts +134 -0
- package/scripts/write-schemas.ts +16 -0
- package/skills/workit-architecture/SKILL.md +72 -0
- package/skills/workit-architecture/agents/openai.yaml +3 -0
- package/skills/workit-architecture/references/instruction-files.md +52 -0
- package/skills/workit-architecture/references/vocabulary.md +53 -0
- package/skills/workit-bdd/SKILL.md +53 -0
- package/skills/workit-continue/SKILL.md +54 -0
- package/skills/workit-debug/SKILL.md +45 -0
- package/skills/workit-deslop/SKILL.md +58 -0
- package/skills/workit-fanout/SKILL.md +71 -0
- package/skills/workit-fanout/references/brief.md +141 -0
- package/skills/workit-fanout/references/orchestration.md +169 -0
- package/skills/workit-implement/SKILL.md +71 -0
- package/skills/workit-retro/SKILL.md +72 -0
- package/skills/workit-retro/agents/openai.yaml +3 -0
- package/skills/workit-retro/references/sources.md +35 -0
- package/skills/workit-retro/references/steering.md +39 -0
- package/skills/workit-review/SKILL.md +66 -0
- package/skills/workit-review/references/impact.md +24 -0
- package/skills/workit-shape/SKILL.md +71 -0
- package/skills/workit-shape/references/diagrams.md +17 -0
- package/skills/workit-shape/references/knowledge.md +61 -0
- package/skills/workit-shape/references/mockups.md +15 -0
- package/skills/workit-shape/references/slicing.md +44 -0
- package/skills/workit-ship/SKILL.md +71 -0
- package/skills/workit-ship/references/changelog.md +44 -0
- package/skills/workit-ship/references/pr-body.md +32 -0
- package/skills/workit-ship/references/release.md +39 -0
- package/skills/workit-test-audit/SKILL.md +54 -0
- package/skills/workit-verify-app/SKILL.md +68 -0
- package/skills/workit-verify-app/references/template.md +51 -0
- package/src/autonomy.ts +910 -0
- package/src/check-config.ts +613 -0
- package/src/checks.ts +534 -0
- package/src/ci-waiter.ts +159 -0
- package/src/core/boundary.ts +55 -0
- package/src/core/branch-policy.ts +112 -0
- package/src/core/branch.ts +1192 -0
- package/src/core/changelog-gate.ts +349 -0
- package/src/core/changelog-merge.ts +214 -0
- package/src/core/changelog.ts +392 -0
- package/src/core/cleanup.ts +638 -0
- package/src/core/cli-locate.ts +173 -0
- package/src/core/commit-flavors.ts +65 -0
- package/src/core/config-schemas.ts +653 -0
- package/src/core/config.ts +351 -0
- package/src/core/context-read.ts +144 -0
- package/src/core/docs-gate.ts +69 -0
- package/src/core/finding-evidence.ts +89 -0
- package/src/core/finding-queue.ts +36 -0
- package/src/core/git.ts +73 -0
- package/src/core/gitignore.ts +52 -0
- package/src/core/heavy-eta.ts +170 -0
- package/src/core/heavy-lease.ts +290 -0
- package/src/core/heavy-rules.ts +373 -0
- package/src/core/heavy-scope.ts +131 -0
- package/src/core/heavy-words.ts +83 -0
- package/src/core/heavy.ts +535 -0
- package/src/core/hygiene.ts +149 -0
- package/src/core/init.ts +218 -0
- package/src/core/live-session.ts +333 -0
- package/src/core/logger.ts +310 -0
- package/src/core/methods.ts +185 -0
- package/src/core/model-fallback.ts +208 -0
- package/src/core/node-resolve.mjs +249 -0
- package/src/core/operation-input.ts +632 -0
- package/src/core/package-root.ts +28 -0
- package/src/core/policy/attributes.ts +97 -0
- package/src/core/policy/bookkeeping.ts +119 -0
- package/src/core/policy/carry.ts +122 -0
- package/src/core/policy/check-evidence.ts +115 -0
- package/src/core/policy/current-judgment.ts +20 -0
- package/src/core/policy/derive.ts +387 -0
- package/src/core/policy/judgment.ts +246 -0
- package/src/core/policy/lane.ts +562 -0
- package/src/core/policy/pr-lane.ts +32 -0
- package/src/core/policy/substance.ts +365 -0
- package/src/core/policy-resolver.ts +94 -0
- package/src/core/pr-create.ts +448 -0
- package/src/core/pr-template.ts +162 -0
- package/src/core/release-notes.ts +197 -0
- package/src/core/release-tracks.ts +779 -0
- package/src/core/remotes.ts +436 -0
- package/src/core/repo-context.ts +542 -0
- package/src/core/repo-paths.ts +29 -0
- package/src/core/resources.ts +1299 -0
- package/src/core/role-models.ts +603 -0
- package/src/core/route-intent.ts +305 -0
- package/src/core/rules.ts +65 -0
- package/src/core/runtime-identity.ts +63 -0
- package/src/core/safe-write.ts +87 -0
- package/src/core/scope-glob.ts +56 -0
- package/src/core/scripts.ts +6 -0
- package/src/core/skill-manifests.ts +173 -0
- package/src/core/store-lock.ts +374 -0
- package/src/core/support-matrix.ts +24 -0
- package/src/core/task-context.ts +247 -0
- package/src/core/task-contract.ts +1279 -0
- package/src/core/task-delivery.ts +109 -0
- package/src/core/task-engine.ts +2248 -0
- package/src/core/task-evaluation.ts +1147 -0
- package/src/core/task-store.ts +2649 -0
- package/src/core/task-view.ts +180 -0
- package/src/core/templates.ts +22 -0
- package/src/core/tracker-issues.ts +174 -0
- package/src/core/vcs-config.ts +540 -0
- package/src/core/workers.ts +62 -0
- package/src/core/workit-paths.mjs +242 -0
- package/src/core/workspace-branch-policy.ts +123 -0
- package/src/core/workspaces.ts +1745 -0
- package/src/core/youtrack-backend.ts +288 -0
- package/src/core/youtrack-tools.ts +260 -0
- package/src/core/youtrack-writes.ts +73 -0
- package/src/core/youtrack-ytrack.ts +217 -0
- package/src/core/youtrack.ts +454 -0
- package/src/core/ytrack-skill.ts +297 -0
- package/src/core.ts +171 -0
- package/src/deslop/lex.ts +271 -0
- package/src/deslop/scan.ts +232 -0
- package/src/duration.ts +27 -0
- package/src/fanout-brief.ts +486 -0
- package/src/fanout-check.ts +455 -0
- package/src/fanout-landed.ts +370 -0
- package/src/fanout-stack.ts +108 -0
- package/src/fanout-status.ts +362 -0
- package/src/fanout-worktree.ts +893 -0
- package/src/fanout.ts +1473 -0
- package/src/forge/exec.ts +385 -0
- package/src/forge/github.ts +831 -0
- package/src/forge/gitlab.ts +906 -0
- package/src/forge/issue-forge.ts +209 -0
- package/src/forge/issue-link.ts +468 -0
- package/src/forge/issue-ops.ts +314 -0
- package/src/forge/merge-gate-base-red.ts +72 -0
- package/src/forge/pr-body.ts +100 -0
- package/src/forge/pr-edit.ts +292 -0
- package/src/forge/pr-ops.ts +1109 -0
- package/src/forge/pr-status.ts +10 -0
- package/src/forge/redact.ts +195 -0
- package/src/forge/report.ts +994 -0
- package/src/forge/reruns.ts +132 -0
- package/src/forge/resolve.ts +509 -0
- package/src/forge/types.ts +242 -0
- package/src/forge/verify.ts +398 -0
- package/src/git/default-base.ts +130 -0
- package/src/git/env-redirect.ts +28 -0
- package/src/git/facts.ts +122 -0
- package/src/git/ops.ts +1823 -0
- package/src/git/refs-read.ts +332 -0
- package/src/git/release.ts +1020 -0
- package/src/git/rev.ts +1175 -0
- package/src/git/session-hook.ts +597 -0
- package/src/git/stage.ts +63 -0
- package/src/hooks/agent-model.ts +149 -0
- package/src/hooks/budget-signal.ts +284 -0
- package/src/hooks/context.ts +461 -0
- package/src/hooks/cwd-normalize.ts +79 -0
- package/src/hooks/deadline.ts +228 -0
- package/src/hooks/delivery-verbs.ts +182 -0
- package/src/hooks/descriptor.ts +124 -0
- package/src/hooks/handle.ts +433 -0
- package/src/hooks/heavy-gate.ts +99 -0
- package/src/hooks/hook-runs.ts +130 -0
- package/src/hooks/hosts/claude-code.ts +380 -0
- package/src/hooks/hosts/codex.ts +372 -0
- package/src/hooks/hosts/cursor.ts +419 -0
- package/src/hooks/hosts/fields.ts +98 -0
- package/src/hooks/hosts/opencode.ts +79 -0
- package/src/hooks/hosts/pi.ts +78 -0
- package/src/hooks/index.ts +60 -0
- package/src/hooks/model-limit.ts +378 -0
- package/src/hooks/model-switch.ts +35 -0
- package/src/hooks/policy.ts +29 -0
- package/src/hooks/process.ts +48 -0
- package/src/hooks/protocol.ts +135 -0
- package/src/hooks/raw-git.ts +2289 -0
- package/src/hooks/repeat-failure.ts +115 -0
- package/src/hooks/run.ts +54 -0
- package/src/hooks/session-marker.ts +151 -0
- package/src/hooks/shell-words.ts +532 -0
- package/src/hooks/skill-nudge.ts +295 -0
- package/src/hooks/spawn-gate.ts +72 -0
- package/src/hooks/standing-signal.ts +99 -0
- package/src/hooks/standing.ts +225 -0
- package/src/hooks/steering.ts +74 -0
- package/src/hooks/stop.ts +408 -0
- package/src/hooks/worktree-confine.ts +415 -0
- package/src/hooks/write-gate.ts +1174 -0
- package/src/host-session.ts +459 -0
- package/src/knowledge.ts +368 -0
- package/src/ledger.ts +2913 -0
- package/src/stack.ts +2570 -0
- package/src/store/event-log.ts +217 -0
- package/src/store/notes.ts +29 -0
- package/src/store/patch.ts +135 -0
- package/src/store/paths.ts +368 -0
- package/src/store/reduce.ts +203 -0
- package/src/test-audit-mocks.ts +309 -0
- package/src/verdict-cover.ts +151 -0
- package/src/worktree-deps.ts +142 -0
- package/templates/headers.md +3 -0
- package/templates/hygiene/.editorconfig +8 -0
- package/templates/hygiene/.gitattributes +3 -0
- package/templates/hygiene/CHANGELOG.md +14 -0
- package/templates/hygiene/CONTRIBUTING.md +3 -0
- package/templates/hygiene/LICENSE +21 -0
- package/templates/hygiene/README.md +3 -0
- package/templates/issue-update.md +5 -0
- package/templates/plan-template.md +26 -0
- package/templates/spec-template.md +64 -0
- package/templates/workit-contract.md +13 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { ledgerPath, readLedger } from "../ledger";
|
|
3
|
+
import { fileSignature, racySignature, type TaskStore } from "./task-store";
|
|
4
|
+
import { success, type Utc } from "./task-contract";
|
|
5
|
+
import { workerBlocksTransition } from "./workers";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Close every open task whose branch the ledger shows merged (`pr.merged`) and
|
|
9
|
+
* delivered (`delivery.verified`, expect merged) after the task began, so a
|
|
10
|
+
* delivered task stops showing as active (#322). A merge without a verified
|
|
11
|
+
* delivery leaves the task open and names `workit verify-delivery merged` as its
|
|
12
|
+
* next action. Tasks without a PR, or with a worker that blocks closing, are
|
|
13
|
+
* left alone. Best effort: a failed read or write skips the task.
|
|
14
|
+
*/
|
|
15
|
+
export function closeDeliveredTasks(
|
|
16
|
+
store: TaskStore,
|
|
17
|
+
now: Utc,
|
|
18
|
+
options: { cached?: boolean } = {},
|
|
19
|
+
): number {
|
|
20
|
+
let closedCount = 0;
|
|
21
|
+
const index = store.listStoreIndex();
|
|
22
|
+
if (!index.ok) return 0;
|
|
23
|
+
const open = index.data.filter((entry) => entry.status !== "closed" && entry.branch !== null);
|
|
24
|
+
if (open.length === 0) return 0;
|
|
25
|
+
// Hot paths sweep only when the ledger or the open-task set changed.
|
|
26
|
+
const file = options.cached ? ledgerPath(store.root) : null;
|
|
27
|
+
const signature = file?.ok
|
|
28
|
+
? `${fileSignature(file.value) ?? "-"}|${open.map((entry) => entry.id).join(",")}`
|
|
29
|
+
: null;
|
|
30
|
+
const marker = file?.ok ? `${file.value}.delivery-sweep` : null;
|
|
31
|
+
if (signature && marker) {
|
|
32
|
+
try {
|
|
33
|
+
if (readFileSync(marker, "utf8") === signature) return 0;
|
|
34
|
+
} catch {
|
|
35
|
+
// no marker yet
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const ledger = readLedger(store.root);
|
|
39
|
+
if (!ledger.ok) return 0;
|
|
40
|
+
const rows = ledger.value.rows as {
|
|
41
|
+
type: string;
|
|
42
|
+
branch?: unknown;
|
|
43
|
+
pr?: unknown;
|
|
44
|
+
id: string;
|
|
45
|
+
at: string;
|
|
46
|
+
expect?: unknown;
|
|
47
|
+
}[];
|
|
48
|
+
const after = (row: { at: string }, since: string) => Date.parse(row.at) >= Date.parse(since);
|
|
49
|
+
for (const entry of open) {
|
|
50
|
+
const merged = rows.findLast(
|
|
51
|
+
(row) =>
|
|
52
|
+
row.type === "pr.merged" &&
|
|
53
|
+
row.branch === entry.branch &&
|
|
54
|
+
typeof row.pr === "number" &&
|
|
55
|
+
after(row, entry.createdAt),
|
|
56
|
+
);
|
|
57
|
+
if (!merged) continue;
|
|
58
|
+
const pr = merged.pr as number;
|
|
59
|
+
const verified = rows.findLast(
|
|
60
|
+
(row) =>
|
|
61
|
+
row.type === "delivery.verified" &&
|
|
62
|
+
row.expect === "merged" &&
|
|
63
|
+
row.branch === entry.branch &&
|
|
64
|
+
(row.pr === undefined || row.pr === pr),
|
|
65
|
+
);
|
|
66
|
+
if (!verified) {
|
|
67
|
+
const next = `PR #${pr} is merged but delivery is not verified: run \`workit verify-delivery merged\``;
|
|
68
|
+
if (entry.progress.nextAction !== next) {
|
|
69
|
+
store.mutateTask(entry.id, entry.revision, (task, context) =>
|
|
70
|
+
success(context.revision, null, {
|
|
71
|
+
...task,
|
|
72
|
+
progress: { ...task.progress, nextAction: next },
|
|
73
|
+
}),
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const task = store.readTask(entry.id);
|
|
79
|
+
if (!task.ok || task.data.status === "closed") continue;
|
|
80
|
+
if (task.data.workers.some((worker) => workerBlocksTransition("close", worker.data.state)))
|
|
81
|
+
continue;
|
|
82
|
+
const closed = store.mutateTask(
|
|
83
|
+
entry.id,
|
|
84
|
+
task.data.revision,
|
|
85
|
+
(value, context) =>
|
|
86
|
+
success(context.revision, null, {
|
|
87
|
+
...value,
|
|
88
|
+
status: "closed",
|
|
89
|
+
closure: {
|
|
90
|
+
outcome: "verified",
|
|
91
|
+
at: context.now,
|
|
92
|
+
summary: `delivered: PR #${pr} merged (pr.merged ${String(merged.id)}) and delivery verified (delivery.verified ${String(verified.id)})`,
|
|
93
|
+
decisionIds: [],
|
|
94
|
+
evidenceIds: [],
|
|
95
|
+
},
|
|
96
|
+
}),
|
|
97
|
+
now,
|
|
98
|
+
);
|
|
99
|
+
if (closed.ok) closedCount++;
|
|
100
|
+
}
|
|
101
|
+
if (signature && marker && closedCount === 0 && !racySignature(signature.split("|")[0] ?? "")) {
|
|
102
|
+
try {
|
|
103
|
+
writeFileSync(marker, signature);
|
|
104
|
+
} catch {
|
|
105
|
+
// the next call sweeps again
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return closedCount;
|
|
109
|
+
}
|