Harness spec 1.1.0: one plan, prototypes and the library shared; the CLI implements it
The spec: plan_write and plan_update (new, shared, offered in every mode) and plan_submit (now shared) keep one structured plan — findings, objectives, phases of tasks — in place of the todo list, which lives on as a former name of plan_write. The shared system text is one text for both projects, with variables for what differs; the mode texts, a prototypes block and a library block are shared. acp.md: the client hands the device what only it knows (context, library, prototypes), the plan travels as a structure (plan_state), library calls carry the chat's scope, and a client may rewind a session. loop.json says its numbers as numbers. Four conformance areas: plan, prototype, library_scope, toolcall_index. The CLI: the plan is kept per session in the store and drawn above the prompt and on the approval card; the prompt is assembled from the spec's texts with their variables filled; the link reads the instance's instructions, personalization, knowledge scope and prototype offer, sends the plan as a structure and answers rewind; library calls to the instance carry the session as scope; a prototype written in the terminal is saved as a file and named in the transcript; a tool-call fragment without an index continues the last call; the default theme is Moria; dead exports and Hermes leftovers removed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
96 files changed
+3259
-527
No files matched your search
+4
-3
@@ -12,7 +12,7 @@ import { PermissionPrompt } from "./components/permission.tsx"
|
||||
import { copiedMessage, copyText } from "./clipboard.ts"
|
||||
import { QuestionCard } from "./components/question.tsx"
|
||||
import { PlanCard } from "./components/plancard.tsx"
|
||||
import { Todos } from "./components/todos.tsx"
|
||||
import { PlanPanel } from "./components/plan.tsx"
|
||||
import { Prompt, type PaletteEntry } from "./components/prompt.tsx"
|
||||
import { FileIndex } from "../project/files.ts"
|
||||
import { attachmentsFor } from "../project/attach.ts"
|
||||
@@ -316,6 +316,7 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
|
||||
},
|
||||
notice: (text, level) => view.info(text, level),
|
||||
changed: () => refresh(),
|
||||
rewound: () => view.load(app.engine.messages),
|
||||
})
|
||||
cmd.share = share
|
||||
view.setCardHooks({
|
||||
@@ -356,7 +357,7 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
|
||||
// Not mid-task: what changes the session under it, and what sends a prompt of its own
|
||||
// (that would start a second turn on top of the running one).
|
||||
const midTask = ["new", "delete", "compact", "sessions", "model", "undo", "redo", "commit", "diff", "release", "changelog", "init", "checkpoint", "checkpoints", "branch", "reload", "review", "skill"]
|
||||
if ((busy() || app.turns.current) && (midTask.includes(c.name) || (c.name === "plan" && arg))) return (view.info("wait for the reply to finish (esc stops it)", "warn"), false)
|
||||
if ((busy() || app.turns.current) && (midTask.includes(c.name) || (c.name === "plan" && arg && arg !== "show"))) return (view.info("wait for the reply to finish (esc stops it)", "warn"), false)
|
||||
return void c.run(cmd, arg)
|
||||
}
|
||||
const cc = custom().find((x) => x.name === name)
|
||||
@@ -538,7 +539,7 @@ export function Root(p: { app: Runtime; view: View; theme: Theme; onQuit: () =>
|
||||
<Messages />
|
||||
</scrollbox>
|
||||
<box flexShrink={0} flexDirection="column">
|
||||
<Todos />
|
||||
<PlanPanel />
|
||||
<Show when={view.state.pending}>
|
||||
<PermissionPrompt pending={view.state.pending!} />
|
||||
</Show>
|
||||
|
||||
Reference in new issue
Block a user