@mrciphersmith/keryx 0.2.144 → 0.2.147
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/README.md +11 -3
- package/dist/cli.js +42 -8
- package/package.json +1 -1
- package/src/gdskills/bundled/rules/core/session-plan-bridge.mdc +96 -0
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -255,9 +255,17 @@ What is in it today:
|
|
|
255
255
|
completed, blocked, and skipped steps in the sidebar, and restored sessions
|
|
256
256
|
continue from the same plan instead of rebuilding it from transcript text.
|
|
257
257
|
Clicking the sidebar's Plan section (its header or any row) opens the whole
|
|
258
|
-
plan in a modal: a
|
|
259
|
-
revision, per-status counts, the active item, the
|
|
260
|
-
file it lives in.
|
|
258
|
+
plan in a modal: a Plan tab that spells each item's status out and colours it
|
|
259
|
+
by state, a Meta tab with the revision, per-status counts, the active item, the
|
|
260
|
+
blocked ids, and the plan file it lives in. A plan can also be published FOR
|
|
261
|
+
APPROVAL — items marked `proposed` await a human, never force the agent to
|
|
262
|
+
continue, and are shown as `◇ awaiting approval` in both the sidebar and the
|
|
263
|
+
modal. Orchestrators publish into this same view — `job-orchestrator`,
|
|
264
|
+
`flow-orchestrator`, `review-orchestrator`, `issue-analyzer`,
|
|
265
|
+
`feature-analyzer`, `autodoc-orchestrator`, `docpack-orchestrator`,
|
|
266
|
+
`feature-dev` and `review-pr-feedback` project their own steps here under the
|
|
267
|
+
`session-plan-bridge` rule, so a run driven by one of them is watchable while
|
|
268
|
+
it runs instead of only after it reports.
|
|
261
269
|
- **Theme-aware rich transcripts.** Assistant prose, headings, emphasis,
|
|
262
270
|
inline code, fenced code, diffs, and GFM pipe tables use semantic colors
|
|
263
271
|
derived from the selected `/theme`. Use a language fence such as
|
package/dist/cli.js
CHANGED
|
@@ -24214,6 +24214,9 @@ async function updateExecutionPlan(dir, input) {
|
|
|
24214
24214
|
function hasActionableExecutionPlanItems(plan) {
|
|
24215
24215
|
return plan?.items.some((item) => item.status === "pending" || item.status === "in_progress") ?? false;
|
|
24216
24216
|
}
|
|
24217
|
+
function executionPlanApprovalItems(plan) {
|
|
24218
|
+
return plan?.items.filter((item) => item.status === "proposed") ?? [];
|
|
24219
|
+
}
|
|
24217
24220
|
function renderExecutionPlanSnapshot(plan, maxItems = 7) {
|
|
24218
24221
|
if (plan === undefined || plan.items.length === 0)
|
|
24219
24222
|
return;
|
|
@@ -24231,7 +24234,7 @@ var EXECUTION_PLAN_STATUSES, listeners, ExecutionPlanConflictError, ExecutionPla
|
|
|
24231
24234
|
var init_execution_plan = __esm(() => {
|
|
24232
24235
|
init_fs();
|
|
24233
24236
|
init_slate();
|
|
24234
|
-
EXECUTION_PLAN_STATUSES = ["pending", "in_progress", "completed", "blocked", "skipped"];
|
|
24237
|
+
EXECUTION_PLAN_STATUSES = ["proposed", "pending", "in_progress", "completed", "blocked", "skipped"];
|
|
24235
24238
|
listeners = new Set;
|
|
24236
24239
|
ExecutionPlanConflictError = class ExecutionPlanConflictError extends Error {
|
|
24237
24240
|
constructor(expected, actual) {
|
|
@@ -29527,7 +29530,7 @@ function buildAgentSystemInstruction(orient, ctx = {}) {
|
|
|
29527
29530
|
` + locateRule + "- read_file returns a bounded window starting at `start_line` (default 1). A large file " + "is read by paging: its truncation notice names the start_line to continue from, and a " + `line number from ${hasGraph ? "search_code or graph_symbol" : "search_code"} can be read directly \u2014 do not re-read the ` + `same head hoping for more.
|
|
29528
29531
|
` + "- Prefer ONE correct shell_exec over many exploratory tool calls when the user asks " + `to run a known keryx workflow.
|
|
29529
29532
|
` + "- Tool-call budget: shell_exec, file-mutating shell, workspace_create/workspace_propose, and spawn_subagent " + "all share ONE small per-turn pool (distinct non-read actions), separate from the much larger read-tool pool. " + (hasGraph ? "search_code/graph_*/memory_search/read_wiki/wiki_*/test_related/health_status/flow_status/repomap/read_file/" : "search_code/read_file/") + "list_dir do NOT touch it. Conserve the small pool: batch multiple shell steps into ONE call with `&&` instead " + "of issuing them one at a time, get a command's arguments right the first time instead of trying variants, and " + "for any check covered by a read tool above, use that tool instead of shelling out to the equivalent `keryx \u2026` " + `CLI command.
|
|
29530
|
-
` + "- For multi-step work, use **plan_set** to publish a structured plan, **plan_update** after each real status " + "change, and **plan_get** before resolving a revision conflict. Keep stable item ids, at most one " + "`in_progress` item, and do not mark work complete before verification. These tools update session metadata " + "only; `/plan` remains the operator's separate read-only permission mode.\n" + "- This session has its own Slate (working-set scratch, not project knowledge): " + "**slate_read** shows the Course (if a Flow is bound) and Seeds recorded so far \u2014 nothing " + "here is auto-injected, so call it if you want to see it. **slate_write_seed** with " + "`{ text, kind? }` records a draft hypothesis/decision/follow-up worth a later human " + "review. WRITE A SEED when you: found a root cause or a bug worth remembering; changed or " + "added code (summarize WHAT changed and WHY); took a design/architecture decision; " + "identified a risk; or discovered a constraint/lesson. Use the `kind` that fits: " + "`decision` (a choice made), `wiki-update` (something a wiki page should say), " + "`memory-entry` (a lesson/constraint), `follow-up` (a TODO for a later session), " + "`risk`, or `contract-change`. Keep each Seed to 2-3 sentences, concrete and specific. " + "Do NOT write Seeds for routine progress notes, one-shot operational requests (e.g. " + '"run git pull", "count files"), or trivia \u2014 those need no workspace and no proposal. ' + "Seeds are the ONLY input wrap-up proposes from: a session whose Slate has zero Seeds " + `produces zero proposals. A Seed is never accepted knowledge by itself.
|
|
29533
|
+
` + "- For multi-step work, use **plan_set** to publish a structured plan, **plan_update** after each real status " + "change, and **plan_get** before resolving a revision conflict. Keep stable item ids, at most one " + "`in_progress` item, and do not mark work complete before verification. These tools update session metadata " + "only; `/plan` remains the operator's separate read-only permission mode.\n" + "- **Publishing a plan FOR APPROVAL is a real, supported stopping point.** Mark the items `proposed`, " + "state the plan in your reply, and END THE TURN: `proposed` is not work in progress, so it never forces " + "another round on its own. When the operator approves, move those items to `pending`/`in_progress` and " + "continue. Use `pending` (not `proposed`) only when you are going to execute the plan in this same turn.\n" + "- This session has its own Slate (working-set scratch, not project knowledge): " + "**slate_read** shows the Course (if a Flow is bound) and Seeds recorded so far \u2014 nothing " + "here is auto-injected, so call it if you want to see it. **slate_write_seed** with " + "`{ text, kind? }` records a draft hypothesis/decision/follow-up worth a later human " + "review. WRITE A SEED when you: found a root cause or a bug worth remembering; changed or " + "added code (summarize WHAT changed and WHY); took a design/architecture decision; " + "identified a risk; or discovered a constraint/lesson. Use the `kind` that fits: " + "`decision` (a choice made), `wiki-update` (something a wiki page should say), " + "`memory-entry` (a lesson/constraint), `follow-up` (a TODO for a later session), " + "`risk`, or `contract-change`. Keep each Seed to 2-3 sentences, concrete and specific. " + "Do NOT write Seeds for routine progress notes, one-shot operational requests (e.g. " + '"run git pull", "count files"), or trivia \u2014 those need no workspace and no proposal. ' + "Seeds are the ONLY input wrap-up proposes from: a session whose Slate has zero Seeds " + `produces zero proposals. A Seed is never accepted knowledge by itself.
|
|
29531
29534
|
` + "- Shared Agent Context (SAC) workspaces hold accepted, evidence-backed project context " + "beyond this codebase. **workspace_list** with `{ includeArchived? }` shows every workspace " + "visible to you \u2014 call it first when the user references a shared team workspace or accepted " + "project context, or before creating a new workspace, to judge whether an existing one " + "already fits the current topic. **workspace_show** with `{ workspaceId }` shows one " + "workspace's manifest. **workspace_overview** with `{ workspaceId }`, then **workspace_read** " + "with `{ workspaceId, itemId }` for one specific item, reads its accepted Facts/Work/Know-how. " + "**workspace_create** with `{ title, component? }` creates a new workspace AND binds it to " + "this session's slate (wrap-up then proposes into it) \u2014 only when workspace_list found no " + "fitting one and the session has real, durable results worth persisting; a workspace is " + "meant to persist across sessions, so prefer an existing one over creating another for the " + "same topic, and do NOT create one for one-shot operational requests. **workspace_propose** with " + "`{ workspaceId, kind, sessionId?, note? }` (sessionId defaults to this session) proposes a decision/wiki-update/memory-entry/" + "follow-up/contract-change/risk from this session for later human review \u2014 it never accepts " + "anything by itself; accepting always requires a human running `keryx workspace review` at a " + `real terminal, never this tool.
|
|
29532
29535
|
` + "- When you need a decision, interview step, or clarification: use **ask_user** with " + "2\u20136 options `{ id, label, description, recommended? }` (mark one recommended). " + `Do not dump long prose questions without options.
|
|
29533
29536
|
` + "- For a focused independent subtask (investigate X, review Y, research Z): use " + "**spawn_subagent** with `{ task, mode?: 'read_only'|'general', label? }`. " + "Default mode is read_only (no shell). Prefer spawn for work that can finish " + `without your intermediate turns; do not spawn for trivial one-line answers.
|
|
@@ -30093,6 +30096,19 @@ ${planSnapshot}`;
|
|
|
30093
30096
|
}
|
|
30094
30097
|
continue;
|
|
30095
30098
|
}
|
|
30099
|
+
const approvalItems = executionPlanApprovalItems(currentPlan);
|
|
30100
|
+
if (approvalItems.length > 0 && !hasActionableExecutionPlanItems(currentPlan)) {
|
|
30101
|
+
const shown = approvalItems.slice(0, 7).map((item) => `- ${item.id}: ${item.title.length > 120 ? `${item.title.slice(0, 119)}\u2026` : item.title}`);
|
|
30102
|
+
if (approvalItems.length > shown.length) {
|
|
30103
|
+
shown.push(`- \u2026 ${approvalItems.length - shown.length} more`);
|
|
30104
|
+
}
|
|
30105
|
+
system(`
|
|
30106
|
+
[plan] Published for your approval \u2014 nothing is in progress, so this turn ends here:
|
|
30107
|
+
${shown.join(`
|
|
30108
|
+
`)}
|
|
30109
|
+
` + `Approve by continuing (the agent moves them to pending/in_progress), or ask for changes.
|
|
30110
|
+
`);
|
|
30111
|
+
}
|
|
30096
30112
|
if (!planFollowThroughUsed && hasActionableExecutionPlanItems(currentPlan)) {
|
|
30097
30113
|
planFollowThroughUsed = true;
|
|
30098
30114
|
history.push({
|
|
@@ -51447,7 +51463,7 @@ import path47 from "path";
|
|
|
51447
51463
|
// package.json
|
|
51448
51464
|
var package_default = {
|
|
51449
51465
|
name: "@mrciphersmith/keryx",
|
|
51450
|
-
version: "0.2.
|
|
51466
|
+
version: "0.2.147",
|
|
51451
51467
|
description: "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
|
|
51452
51468
|
private: false,
|
|
51453
51469
|
publishConfig: {
|
|
@@ -102987,6 +103003,7 @@ init_execution_plan();
|
|
|
102987
103003
|
// src/tui/execution-plan-panel.ts
|
|
102988
103004
|
init_execution_plan();
|
|
102989
103005
|
var GLYPHS = {
|
|
103006
|
+
proposed: "\u25C7",
|
|
102990
103007
|
completed: "\u2713",
|
|
102991
103008
|
in_progress: "\u25B6",
|
|
102992
103009
|
pending: "\u25CB",
|
|
@@ -103013,8 +103030,12 @@ function projectExecutionPlanPanel(plan, options) {
|
|
|
103013
103030
|
return { visible: false, rows: [], revision: undefined };
|
|
103014
103031
|
}
|
|
103015
103032
|
const size = Math.max(1, Math.min(options.maxRows ?? 7, 7, plan.items.length));
|
|
103016
|
-
const
|
|
103017
|
-
const
|
|
103033
|
+
const firstOf = (status) => plan.items.findIndex((i) => i.status === status);
|
|
103034
|
+
const anchorIndex = firstOf("in_progress");
|
|
103035
|
+
const pendingIndex = firstOf("pending");
|
|
103036
|
+
const proposedIndex = firstOf("proposed");
|
|
103037
|
+
const anchor = anchorIndex >= 0 ? anchorIndex : pendingIndex >= 0 ? pendingIndex : Math.max(0, proposedIndex);
|
|
103038
|
+
const start = Math.max(0, Math.min(anchor - Math.floor(size / 2), plan.items.length - size));
|
|
103018
103039
|
const rows = plan.items.slice(start, start + size).map((item) => {
|
|
103019
103040
|
const glyph = GLYPHS[item.status];
|
|
103020
103041
|
return { id: item.id, status: item.status, glyph, text: truncate7(`${glyph} ${item.title}`, options.width) };
|
|
@@ -103085,6 +103106,7 @@ var PLAN_INSPECTOR_FOOTER = [
|
|
|
103085
103106
|
{ key: "esc", label: "close" }
|
|
103086
103107
|
];
|
|
103087
103108
|
var PLAN_STATUS_GLYPH = {
|
|
103109
|
+
proposed: "\u25C7",
|
|
103088
103110
|
completed: "\u2713",
|
|
103089
103111
|
in_progress: "\u25B6",
|
|
103090
103112
|
pending: "\u25CB",
|
|
@@ -103092,6 +103114,7 @@ var PLAN_STATUS_GLYPH = {
|
|
|
103092
103114
|
skipped: "\u2212"
|
|
103093
103115
|
};
|
|
103094
103116
|
var PLAN_STATUS_LABEL = {
|
|
103117
|
+
proposed: "awaiting approval",
|
|
103095
103118
|
completed: "completed",
|
|
103096
103119
|
in_progress: "in progress",
|
|
103097
103120
|
pending: "pending",
|
|
@@ -103099,6 +103122,7 @@ var PLAN_STATUS_LABEL = {
|
|
|
103099
103122
|
skipped: "skipped"
|
|
103100
103123
|
};
|
|
103101
103124
|
var PLAN_STATUS_ORDER = [
|
|
103125
|
+
"proposed",
|
|
103102
103126
|
"in_progress",
|
|
103103
103127
|
"pending",
|
|
103104
103128
|
"blocked",
|
|
@@ -103108,6 +103132,7 @@ var PLAN_STATUS_ORDER = [
|
|
|
103108
103132
|
var PLAN_EMPTY_TEXT = "No execution plan in this session. The agent publishes one with `plan_set` before multi-step work.";
|
|
103109
103133
|
function planCounts(plan) {
|
|
103110
103134
|
const counts = {
|
|
103135
|
+
proposed: 0,
|
|
103111
103136
|
completed: 0,
|
|
103112
103137
|
in_progress: 0,
|
|
103113
103138
|
pending: 0,
|
|
@@ -103136,6 +103161,7 @@ function formatPlanSummary(plan) {
|
|
|
103136
103161
|
const parts = [
|
|
103137
103162
|
`revision ${plan.revision}`,
|
|
103138
103163
|
`${counts.completed}/${plan.items.length} done`,
|
|
103164
|
+
...counts.proposed > 0 ? [`${counts.proposed} awaiting approval`] : [],
|
|
103139
103165
|
...counts.in_progress > 0 ? [`${counts.in_progress} in progress`] : [],
|
|
103140
103166
|
...counts.blocked > 0 ? [`${counts.blocked} blocked`] : [],
|
|
103141
103167
|
...counts.pending > 0 ? [`${counts.pending} pending`] : [],
|
|
@@ -103143,8 +103169,9 @@ function formatPlanSummary(plan) {
|
|
|
103143
103169
|
];
|
|
103144
103170
|
return `Plan \xB7 ${parts.join(" \xB7 ")}`;
|
|
103145
103171
|
}
|
|
103172
|
+
var PLAN_LABEL_WIDTH = Math.max(...Object.values(PLAN_STATUS_LABEL).map((label) => label.length));
|
|
103146
103173
|
function formatPlanRow(item) {
|
|
103147
|
-
return `${PLAN_STATUS_GLYPH[item.status]} ${PLAN_STATUS_LABEL[item.status].padEnd(
|
|
103174
|
+
return `${PLAN_STATUS_GLYPH[item.status]} ${PLAN_STATUS_LABEL[item.status].padEnd(PLAN_LABEL_WIDTH)} ${item.title}`;
|
|
103148
103175
|
}
|
|
103149
103176
|
function formatPlanLegend() {
|
|
103150
103177
|
return PLAN_STATUS_ORDER.map((status) => `${PLAN_STATUS_GLYPH[status]} ${PLAN_STATUS_LABEL[status]}`).join(" ");
|
|
@@ -103164,18 +103191,25 @@ function formatPlanMeta(plan, dir) {
|
|
|
103164
103191
|
const blocked = plan.items.filter((item) => item.status === "blocked").map((item) => item.id);
|
|
103165
103192
|
return [
|
|
103166
103193
|
`Revision ${plan.revision}`,
|
|
103167
|
-
`Items ${plan.items.length} \u2014 ${counts.completed} completed, ${counts.in_progress} in progress, ${counts.pending} pending, ${counts.blocked} blocked, ${counts.skipped} skipped`,
|
|
103194
|
+
`Items ${plan.items.length} \u2014 ${counts.completed} completed, ${counts.in_progress} in progress, ${counts.pending} pending, ${counts.blocked} blocked, ${counts.skipped} skipped, ${counts.proposed} awaiting approval`,
|
|
103168
103195
|
`Active ${active === undefined ? "(none \u2014 no item is in_progress)" : `${active.id} \u2014 ${active.title}`}`,
|
|
103169
103196
|
...blocked.length > 0 ? [`Blocked ${blocked.join(", ")}`] : [],
|
|
103197
|
+
...counts.proposed > 0 ? [`Approval ${counts.proposed} item(s) published for your approval \u2014 nothing is running; they start once you approve`] : [],
|
|
103170
103198
|
"",
|
|
103171
103199
|
"Storage <session>/plan.json \u2014 a sibling of slate.json, so a completed",
|
|
103172
103200
|
" Flow closing its slate can no longer take the plan with it.",
|
|
103201
|
+
"",
|
|
103202
|
+
"Note This is the agent's own plan for this session. The `/plan on|off`",
|
|
103203
|
+
" COMMAND is a different thing \u2014 the session's read-only mode, which",
|
|
103204
|
+
" this view neither shows nor changes.",
|
|
103173
103205
|
...dir === undefined ? [] : [`Session ${dir}`]
|
|
103174
103206
|
].join(`
|
|
103175
103207
|
`);
|
|
103176
103208
|
}
|
|
103177
103209
|
function toneFor(status) {
|
|
103178
103210
|
switch (status) {
|
|
103211
|
+
case "proposed":
|
|
103212
|
+
return "yellow";
|
|
103179
103213
|
case "in_progress":
|
|
103180
103214
|
return "cyan";
|
|
103181
103215
|
case "blocked":
|
|
@@ -103235,7 +103269,7 @@ function presentExecutionPlanInspector(openModalFn, otui, chrome, options) {
|
|
|
103235
103269
|
};
|
|
103236
103270
|
let unsubscribe;
|
|
103237
103271
|
const handle = openModalFn(otui, chrome, {
|
|
103238
|
-
title: "
|
|
103272
|
+
title: "Session plan",
|
|
103239
103273
|
tabs: [
|
|
103240
103274
|
{ id: "plan", label: "Plan" },
|
|
103241
103275
|
{ id: "meta", label: "Meta" }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrciphersmith/keryx",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.147",
|
|
4
4
|
"description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Bridge between an orchestrator's own CLI-owned plan and the session execution plan the operator watches in the sidebar and the /plan modal: publish the orchestrator's steps as plan items under the SAME ids, mirror every status change at the moment the orchestrator updates its own state, and use `proposed` for a plan awaiting a human. Use when a skill orchestrates multi-step work (job-orchestrator, flow-orchestrator, review-orchestrator)."
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Session Plan Bridge
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
An orchestrator already has a plan. `job-orchestrator` has fifteen steps in a job
|
|
11
|
+
package that `keryx job status` prints; `flow-orchestrator` has tasks `T1..Tn`
|
|
12
|
+
with dependencies in the Flow package; `review-orchestrator` has a fifteen-step
|
|
13
|
+
checklist. Until this rule existed, every one of those plans was invisible while
|
|
14
|
+
it ran: the operator saw phases announced in prose, and had to ask.
|
|
15
|
+
|
|
16
|
+
The session execution plan is the surface that fixes that. It is not a second
|
|
17
|
+
plan — it is a PROJECTION of the orchestrator's own plan into the one place the
|
|
18
|
+
operator is already looking (the sidebar's Plan section, and `/plan` for the
|
|
19
|
+
whole list). The orchestrator's own state stays the only source of truth for
|
|
20
|
+
what the work is.
|
|
21
|
+
|
|
22
|
+
## The mechanism, in one paragraph
|
|
23
|
+
|
|
24
|
+
`plan_set` publishes the whole plan (replace-all, optimistic `expectedRevision`);
|
|
25
|
+
`plan_update` moves one item (`{expectedRevision, itemId, status}`); `plan_get`
|
|
26
|
+
reads it back before a write when a conflict is possible. Statuses are
|
|
27
|
+
`proposed | pending | in_progress | completed | blocked | skipped`, item ids are
|
|
28
|
+
stable strings, and at most one item may be `in_progress` — the mechanism refuses
|
|
29
|
+
a second one. `proposed` means "published for a human to approve": it is NOT work
|
|
30
|
+
in progress, so it never makes the agent continue on its own, which is what makes
|
|
31
|
+
"publish the plan, then stop and wait for the operator" a real stopping point.
|
|
32
|
+
|
|
33
|
+
## Item ids are the orchestrator's own ids — never invented
|
|
34
|
+
|
|
35
|
+
| Orchestrator | Item ids | Where they come from |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `job-orchestrator` | the step ids `keryx job status <name> --json` reports — `analyze`, `context`, `prepare`, `tests-creator`, `implement`, `sanity-check`, `verify`, `review`, `security`, `fix`, `verify-post-fix`, `perf-check`, `report`, `pr`, `deploy` | `keryx job status <name>` (read it, never retype it) |
|
|
38
|
+
| `flow-orchestrator` | the Flow's task ids `T1..Tn` | `keryx flow status <id>` / the Flow's `tasks.md` |
|
|
39
|
+
| `review-orchestrator` | `step-0` … `step-14`, from its own numbered checklist | its Workflow section |
|
|
40
|
+
|
|
41
|
+
An id that exists only in the session plan is drift by construction: the operator
|
|
42
|
+
cannot reconcile it with the CLI, and a resumed run cannot match it. If a
|
|
43
|
+
conditional step never runs, it is `skipped` — never absent.
|
|
44
|
+
|
|
45
|
+
## Status mapping — the vocabularies disagree, this is the translation
|
|
46
|
+
|
|
47
|
+
| Orchestrator's own status | Session plan status |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `pending` (job) | `pending` |
|
|
50
|
+
| `in-progress` (job, hyphenated) | `in_progress` |
|
|
51
|
+
| `completed` | `completed` |
|
|
52
|
+
| `skipped` | `skipped` |
|
|
53
|
+
| `failed` (job / flow task) | `blocked` — it needs a human, and the failure reason goes in the item's title |
|
|
54
|
+
| `blocked` (flow task) | `blocked` |
|
|
55
|
+
|
|
56
|
+
## When to publish, and when to update
|
|
57
|
+
|
|
58
|
+
1. **Publish once, as soon as the plan exists** — after `job-orchestrator`'s 1.1
|
|
59
|
+
plan build, after the Flow's task list exists in Phase 1, after
|
|
60
|
+
`review-orchestrator` fixes its scope and dispatch in Step 6. Not at the end.
|
|
61
|
+
2. **`proposed` for a plan that is awaiting the operator.** Where an orchestrator
|
|
62
|
+
stops to ask — `job-orchestrator` 1.3's "Proceed? (yes / adjust …)" and
|
|
63
|
+
`flow-orchestrator` Phase 4's completion choice — the items are `proposed`
|
|
64
|
+
until the answer arrives, then become `pending`/`in_progress`. This is the
|
|
65
|
+
whole point of the status: the sidebar says `◇ awaiting approval` at exactly
|
|
66
|
+
the moment the orchestrator is waiting for the human.
|
|
67
|
+
3. **Mirror every status change in the same breath as your own.** The call that
|
|
68
|
+
marks a step in `keryx job step …` / `keryx flow task done …` is the call that
|
|
69
|
+
updates the session plan. A batch of `plan_update`s after the work is done is
|
|
70
|
+
not progress reporting, it is a summary.
|
|
71
|
+
4. **One `in_progress`** — the step being executed right now. Progress the
|
|
72
|
+
operator can see is a moving marker, not a growing list of ticks.
|
|
73
|
+
5. **`blocked` when the run needs the operator** — an approval, a credential, a
|
|
74
|
+
failure that needs a decision.
|
|
75
|
+
6. **`plan_get` before a write when a conflict is possible** (a resumed session, a
|
|
76
|
+
second shell on the same checkout) and re-apply against the revision you read.
|
|
77
|
+
|
|
78
|
+
## What the bridge is NOT
|
|
79
|
+
|
|
80
|
+
- Not a journal. Dispatch details, subagent names, token budgets and reasoning
|
|
81
|
+
belong in `journal.md` / the job's `man/` documents, not in plan items.
|
|
82
|
+
- Not authoritative. If the session plan and `keryx job status` / `keryx flow
|
|
83
|
+
status` disagree, the CLI state wins and the session plan is corrected on the
|
|
84
|
+
next update — the projection follows the plan, never the other way round.
|
|
85
|
+
- Not a completion signal. A plan whose items are all `completed` does not mean
|
|
86
|
+
the job is done: verification, review and the completion report are the
|
|
87
|
+
orchestrator's own gates.
|
|
88
|
+
|
|
89
|
+
## Red Flags — stop and re-read this rule if you are thinking:
|
|
90
|
+
|
|
91
|
+
| Rationalization | Why it's wrong |
|
|
92
|
+
|---|---|
|
|
93
|
+
| "I'll publish the plan when the work is finished and I know all the statuses" | That is a report, not a plan. The sidebar exists so the operator can watch WHILE it runs — a plan published at the end has nothing to show. |
|
|
94
|
+
| "The ids are mine to choose, as long as the titles match" | Then the session plan and `keryx job status` cannot be reconciled by a human or by a resumed run, and the projection has become a second plan. |
|
|
95
|
+
| "`proposed` is the same as `pending`, I'll just use `pending`" | `pending` is actionable work, so the agent continues on its own and the "wait for approval" gate disappears. |
|
|
96
|
+
| "Skipping the plan is fine when the job is short" | Then the operator's single progress surface is empty for exactly the runs where watching matters most. |
|
|
@@ -32,7 +32,7 @@ Proceed directly with your assigned task.
|
|
|
32
32
|
|
|
33
33
|
## Purpose
|
|
34
34
|
|
|
35
|
-
Performs deep cross-repository analysis to understand business logic, architecture, API contracts, and implementation requirements. Generates structured documentation for both human developers and AI agents.
|
|
35
|
+
Performs deep cross-repository analysis to understand business logic, architecture, API contracts, and implementation requirements. Generates structured documentation for both human developers and AI agents. Plan bridge: publish each `Step N` this run will take with `plan_set`, and update it with `plan_update` as it finishes — see the `session-plan-bridge` rule.
|
|
36
36
|
|
|
37
37
|
**Two Analysis Modes:**
|
|
38
38
|
|
|
@@ -28,7 +28,7 @@ End-to-end feature development workflow from idea to merge-ready PR.
|
|
|
28
28
|
|
|
29
29
|
## Arguments
|
|
30
30
|
|
|
31
|
-
- `/feature-dev <description>` — start from a text description
|
|
31
|
+
- `/feature-dev <description>` — start from a text description. Plan bridge: publish `phase-1`…`phase-8` with `plan_set`/`plan_update`; while a confirmation question is open the items are `proposed` — see the `session-plan-bridge` rule.
|
|
32
32
|
- `/feature-dev #<issue>` — start from a GitHub issue
|
|
33
33
|
- `/feature-dev --resume` — resume interrupted feature-dev (checks for existing worktree/branch)
|
|
34
34
|
|
|
@@ -23,7 +23,7 @@ license: "MIT"
|
|
|
23
23
|
|
|
24
24
|
## Purpose
|
|
25
25
|
|
|
26
|
-
Flow Orchestrator is the Task Manager-aware implementation orchestrator.
|
|
26
|
+
Flow Orchestrator is the Task Manager-aware implementation orchestrator. Plan bridge: publish the tasks with `plan_set` under the ids `T1`…`Tn`, mirror each `keryx flow task done` with `plan_update`, and publish Phase 4's completion choice as `proposed` — see the `session-plan-bridge` rule.
|
|
27
27
|
It wraps the existing gdskills pipeline with `keryx flow` state.
|
|
28
28
|
|
|
29
29
|
Use this skill instead of `job-orchestrator` when the user wants a managed
|
|
@@ -20,7 +20,7 @@ license: "MIT"
|
|
|
20
20
|
|
|
21
21
|
## Purpose
|
|
22
22
|
|
|
23
|
-
Analyzes a GitHub issue and decomposes it into atomic implementation tasks that can be dispatched to `task-implementer` sub-agents. Designed to run autonomously as a sub-agent — no user interaction required.
|
|
23
|
+
Analyzes a GitHub issue and decomposes it into atomic implementation tasks that can be dispatched to `task-implementer` sub-agents. Designed to run autonomously as a sub-agent — no user interaction required. Plan bridge: publish these four phases with `plan_set` under the ids `phase-1`…`phase-4` and move each with `plan_update` — see the `session-plan-bridge` rule.
|
|
24
24
|
|
|
25
25
|
**Input:** GitHub issue URL (or repo + number) + codebase path(s)
|
|
26
26
|
**Output:** JSON analysis object with one task entry per atomic task, each containing full context for implementation
|
|
@@ -32,7 +32,7 @@ Proceed directly with your assigned task.
|
|
|
32
32
|
|
|
33
33
|
## Purpose
|
|
34
34
|
|
|
35
|
-
Dynamic orchestrator that builds execution plans based on user intent. Unlike a fixed pipeline, the orchestrator adapts its workflow to what the user actually needs — from "just analyze this issue" to "implement, review, and create a PR". It dispatches sub-agents (`issue-analyzer`, `context-collector`, `tests-creator`, `task-implementer`, `code-verifier`, `review-orchestrator`) and persists every step, document and retry through `keryx job`, which writes `.metaproject/jobs/<job-name>/`.
|
|
35
|
+
Dynamic orchestrator that builds execution plans based on user intent. Unlike a fixed pipeline, the orchestrator adapts its workflow to what the user actually needs — from "just analyze this issue" to "implement, review, and create a PR". It dispatches sub-agents (`issue-analyzer`, `context-collector`, `tests-creator`, `task-implementer`, `code-verifier`, `review-orchestrator`) and persists every step, document and retry through `keryx job`, which writes `.metaproject/jobs/<job-name>/`. Plan bridge: publish these steps with `plan_set` under the ids `keryx job status` reports, mirror each `keryx job step` with `plan_update`, and mark them `proposed` while the approval above is open — see the `session-plan-bridge` rule.
|
|
36
36
|
|
|
37
37
|
**The package is the state.** `keryx job` is the only writer of `state.json`; it validates every write against the registered contract `job-orchestrator-state` and refuses one that does not conform. Never hand-write `state.json`, and never hold a step's outcome only in this session — a step recorded nowhere is a step that did not happen as far as the next session is concerned.
|
|
38
38
|
|
|
@@ -27,7 +27,7 @@ metadata:
|
|
|
27
27
|
|
|
28
28
|
## Purpose
|
|
29
29
|
|
|
30
|
-
Thin orchestrator that drives a 5-phase autonomous documentation pipeline.
|
|
30
|
+
Thin orchestrator that drives a 5-phase autonomous documentation pipeline. Plan bridge: publish `phase-0`…`phase-5` with `plan_set` and `plan_update`; `state.json` stays the source of truth — see the `session-plan-bridge` rule.
|
|
31
31
|
Takes an existing codebase as input, dispatches specialized subagents to scan,
|
|
32
32
|
analyze, and write documentation, and produces a complete documentation package
|
|
33
33
|
with no human gates.
|
|
@@ -34,7 +34,7 @@ When a USER runs this orchestrator directly (not as a dispatched subagent), at
|
|
|
34
34
|
the start ask "Collect execution statistics for this run? (yes/no)" per
|
|
35
35
|
`.metaproject/rules/core/execution-metrics.md`. If yes, append the
|
|
36
36
|
`## Execution Metrics` section at the end and save it under the docpack output
|
|
37
|
-
dir. Never ask or emit it when dispatched as a subagent.
|
|
37
|
+
dir. Never ask or emit it when dispatched as a subagent. Plan bridge: publish `phase-0`…`phase-5` with `plan_set`/`plan_update`, and hold them `proposed` while Phase 0's location question is open — see the `session-plan-bridge` rule.
|
|
38
38
|
|
|
39
39
|
## Iron Laws
|
|
40
40
|
|
|
@@ -61,7 +61,7 @@ already hold (`--scope`, `--findings`, `--diff-lines`, `--fix-attempt`,
|
|
|
61
61
|
`--verifier`, `--security`, `--forced-strategy-change`) and paste the `model`
|
|
62
62
|
block it prints into that dispatch.
|
|
63
63
|
|
|
64
|
-
Do NOT assign the tier by reading the table in `rules/core/model-selection.mdc`.
|
|
64
|
+
Do NOT assign the tier by reading the table in `rules/core/model-selection.mdc`. Plan bridge: publish this checklist with `plan_set` under the ids `step-0`…`step-14` and move each item with `plan_update` as its step completes — see the `session-plan-bridge` rule.
|
|
65
65
|
Working it out in your head is exactly the mechanical step that rule moves into
|
|
66
66
|
code — and it is the step that was documented as running for a whole release
|
|
67
67
|
while nothing called it.
|
|
@@ -56,7 +56,7 @@ a plan is the deliverable of analyze mode, not a preamble to one.
|
|
|
56
56
|
|
|
57
57
|
```
|
|
58
58
|
review-pr-feedback Progress:
|
|
59
|
-
- [ ] Step 1: Read job context (if CONTEXT_PATH provided)
|
|
59
|
+
- [ ] Step 1: Read job context (if CONTEXT_PATH provided). Plan bridge: publish each `Step N` with `plan_set`, and move it with `plan_update` as the step completes — see the `session-plan-bridge` rule.
|
|
60
60
|
- [ ] Step 2: Resolve the PR — owner, repo, number, head branch, base branch, head SHA
|
|
61
61
|
- [ ] Step 3: Collect comments — `keryx review comments collect`, never by hand
|
|
62
62
|
- [ ] Step 4: Group by author
|