wildcrane-runner 0.6.11 → 0.6.12
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 +6 -0
- package/dist/akb/dist/kanban.mjs +175 -161
- package/dist/akb/package.json +1 -1
- package/dist/launcher.mjs +2 -2
- package/dist/runner.mjs +800 -523
- package/package.json +2 -2
package/dist/akb/dist/kanban.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// ai4kanban 0.11.
|
|
2
|
+
// ai4kanban 0.11.9 — built by runner/scripts/build.mjs. Do not edit.
|
|
3
3
|
import { createRequire as __ai4kanbanRequire } from 'node:module'
|
|
4
4
|
const require = __ai4kanbanRequire(import.meta.url)
|
|
5
5
|
var __create = Object.create;
|
|
@@ -5477,7 +5477,7 @@ var init_package = __esm({
|
|
|
5477
5477
|
"../cli/package.json"() {
|
|
5478
5478
|
package_default = {
|
|
5479
5479
|
name: "wildcrane",
|
|
5480
|
-
version: "0.11.
|
|
5480
|
+
version: "0.11.9",
|
|
5481
5481
|
akbContract: 4,
|
|
5482
5482
|
description: "WildCrane's `akb` command \u2014 scaffold the Markdown board under docs/kanban/, put an agent on a card, and carry the flows the agent works by.",
|
|
5483
5483
|
keywords: [
|
|
@@ -6074,51 +6074,59 @@ var init_file_memo = __esm({
|
|
|
6074
6074
|
}
|
|
6075
6075
|
});
|
|
6076
6076
|
|
|
6077
|
-
// ../cli/src/agents/
|
|
6077
|
+
// ../cli/src/agents/builder/AGENT.md
|
|
6078
6078
|
var AGENT_default;
|
|
6079
6079
|
var init_AGENT = __esm({
|
|
6080
|
-
"../cli/src/agents/
|
|
6081
|
-
AGENT_default = "---\nname:
|
|
6080
|
+
"../cli/src/agents/builder/AGENT.md"() {
|
|
6081
|
+
AGENT_default = "---\nname: builder\ndescription: \u5B9E\u73B0\u5E76\u843D\u5730\u5DF2\u6279\u51C6\u7684\u8F6F\u4EF6\u53D8\u66F4\u3002\n---\n\n- **\u5DF2\u6279\u51C6\u7684\u754C\u9762\u9884\u89C8**\uFF1A\u5B9E\u73B0\u5361\u7247\u9884\u89C8\u4E2D\u7684\u6BCF\u4E2A\u5C4F\u5E55\uFF0C\u5728\u684C\u9762\u548C\u624B\u673A\u5BBD\u5EA6\u4E0B\u9010\u4E00\u5BF9\u7167\u5E76\u4FEE\u6B63\u5DEE\u5F02\u3002\n- **\u5DF2\u6279\u51C6\u7684 API \u9884\u89C8**\uFF1A\u6309\u5361\u7247\u9884\u89C8\u5B9E\u73B0\u6BCF\u4E2A\u63A5\u53E3\uFF0C\u5E76\u636E\u6B64\u7F16\u5199\u6587\u6863\u3002\n- **\u5DF2\u6279\u51C6\u7684\u6570\u636E\u5E93\u9884\u89C8**\uFF1A\u7F16\u5199\u8FC1\u79FB\uFF0C\u4F7F\u6700\u7EC8\u7ED3\u6784\u4E0E\u5361\u7247\u6279\u51C6\u7684\u9884\u89C8\u4E00\u81F4\u3002\n- **\u5B8C\u6210\u8FB9\u754C**\uFF1A\u9664\u975E\u5361\u7247\u7684\u76EE\u6807\u672C\u8EAB\u5C31\u662F\u90E8\u7F72\u6216\u53D1\u5E03\uFF0C\u5426\u5219\u53D8\u66F4\u843D\u5730\u4E14\u68C0\u67E5\u901A\u8FC7\u5373\u5B8C\u6210\uFF1B\u4E0D\u8981\u4E3A\u5B8C\u6210\u4EFB\u52A1\u800C\u63A8\u9001\u3001\u90E8\u7F72\u6216\u53D1\u5E03\u3002\n- **\u9700\u8981\u4E0A\u7EBF\u7684\u4E8B\u9879**\uFF1A\u628A\u5FC5\u987B\u4E0A\u7EBF\u624D\u80FD\u8FDB\u884C\u7684\u9A8C\u8BC1\u6216\u6B65\u9AA4\u4EA4\u7ED9\u7528\u6237\uFF0C\u53EA\u5728\u6700\u7EC8\u56DE\u590D\u4E2D\u8BF4\u660E\uFF0C\u4E0D\u521B\u5EFA\u8DDF\u8FDB\u4EFB\u52A1\uFF0C\u4E5F\u4E0D\u63D0\u95EE\u3002\n- **\u68C0\u67E5**\uFF1A\u6B64\u540E\u6CA1\u6709\u4EBA\u518D\u5BA1\u67E5\u5B9E\u73B0\uFF1B\u8FD0\u884C\u53D7\u5F71\u54CD\u8DEF\u5F84\u7684\u9488\u5BF9\u6027\u68C0\u67E5\uFF0C\u4EE5\u53CA\u4ED3\u5E93\u8981\u6C42\u7684\u5168\u90E8\u68C0\u67E5\u3002\n";
|
|
6082
6082
|
}
|
|
6083
6083
|
});
|
|
6084
6084
|
|
|
6085
|
-
// ../cli/src/agents/
|
|
6085
|
+
// ../cli/src/agents/api-designer/AGENT.md
|
|
6086
6086
|
var AGENT_default2;
|
|
6087
6087
|
var init_AGENT2 = __esm({
|
|
6088
|
-
"../cli/src/agents/
|
|
6089
|
-
AGENT_default2 = "---\nname:
|
|
6088
|
+
"../cli/src/agents/api-designer/AGENT.md"() {
|
|
6089
|
+
AGENT_default2 = "---\nname: api-designer\ndescription: Writes the caller's documentation for the APIs a card changes.\nakb:\n when: A card adds or changes a surface a user or third party calls directly, such as HTTP routes, WebSocket messages, MCP tools, or CLI commands and flags. Not a protocol between the project's own components.\n i18n:\n en:\n title: API docs\n zh:\n title: \u63A5\u53E3\u6587\u6863\n description: \u4E3A\u5361\u7247\u6539\u52A8\u7684\u63A5\u53E3\u5199\u51FA\u8C03\u7528\u65B9\u6587\u6863\u3002\n when: \u5361\u7247\u65B0\u589E\u6216\u4FEE\u6539\u7528\u6237\u6216\u7B2C\u4E09\u65B9\u76F4\u63A5\u8C03\u7528\u7684\u63A5\u53E3\u65F6\uFF0C\u5982 HTTP \u8DEF\u7531\u3001WebSocket \u6D88\u606F\u3001MCP \u5DE5\u5177\u3001CLI \u547D\u4EE4\u548C\u53C2\u6570\u3002\u4E0D\u542B\u9879\u76EE\u81EA\u8EAB\u7EC4\u4EF6\u4E4B\u95F4\u7684\u534F\u8BAE\u3002\n---\n\nWrite each surface this card changes as the documentation entry that will be committed, in\nthe project's existing docs style: inputs, outputs, errors and one example call. Use a\n`diff` when an entry already exists, and a `mermaid` `sequenceDiagram` for a message\nexchange. One design, no alternatives, nothing else in the section.\n\n- **Glanceable**: a junior engineer understands each entry in one read. Plain names, short\n lines, no field or error the card does not change.\n";
|
|
6090
6090
|
}
|
|
6091
6091
|
});
|
|
6092
6092
|
|
|
6093
|
-
// ../cli/src/agents/blog-
|
|
6093
|
+
// ../cli/src/agents/blog-illustrator/AGENT.md
|
|
6094
6094
|
var AGENT_default3;
|
|
6095
6095
|
var init_AGENT3 = __esm({
|
|
6096
|
-
"../cli/src/agents/blog-
|
|
6097
|
-
AGENT_default3 = "---\nname: blog-
|
|
6096
|
+
"../cli/src/agents/blog-illustrator/AGENT.md"() {
|
|
6097
|
+
AGENT_default3 = "---\nname: blog-illustrator\ndescription: Makes a blog post's cover and in-article images, each with alt text.\nakb:\n after: [blog-planner]\n memoryFiles:\n workspace: [style.md]\n i18n:\n en:\n title: Images\n zh:\n title: \u914D\u56FE\n description: \u6309\u786E\u8BA4\u7684\u5927\u7EB2\u4E3A\u535A\u5BA2\u6587\u7AE0\u65B0\u505A\u5C01\u9762\u548C\u6B63\u6587\u914D\u56FE\uFF0C\u5E76\u5199\u597D\u66FF\u4EE3\u6587\u5B57\u3002\n---\n\nMake the cover and every image the approved outline in ``## By `blog-planner` agent`` names.\nMake every image new for this post; never search for or reuse existing images. On an\nexisting card, redo only the images an outline change affects.\n\n## Methods\n\nChoose one per image:\n\n- **Screenshot**: capture the real product in the state the section describes.\n- **Drawn**: lay out a diagram or chart in HTML/CSS or SVG and render it to PNG.\n- **Generated**: `akb cloud image --aspect <ratio> --tier <tier> --out <file> \"<prompt>\"`, which\n spends the user's Pro credits; never for a product interface. Pass `--tier premium` for a\n cover, `standard` for an in-article image and `economy` for a draft or alternative, unless\n the user asks for better or cheaper, and name the tier beside the image in your section.\n- **Fallback**: when a method cannot deliver, use another and say so in your section.\n\n## Rules\n\n- **Alt text**: one sentence per image saying what it shows; draw it on each in-article image as its caption.\n- **Cover**: the aspect ratio the blog's existing covers use, 16:9 when there are none;\n legible at thumbnail size.\n- **Consistent**: one post's images share palette, fonts and treatment.\n- **Review**: view each image at full size and at the width the article shows it; fix\n defects and recheck.\n\n## Paths\n\n- **Assets**: `<board-state>/assets/<card id>/` \u2014 `cover.png` and `fig-<nn>.png`, each with\n the source that renders it beside it.\n- **Hand over**: in your section, one line per image \u2014 file, the outline section it belongs\n to, and its alt text.\n\n## Memory\n\nKeep two files in your memory folder, one line each, following \"What earns a note\" in\n`akb guide board`:\n\n- **`style.md`**: diagram treatment and distilled user corrections that hold for any blog.\n- **`brand.md`**: this product's palette and fonts.\n";
|
|
6098
6098
|
}
|
|
6099
6099
|
});
|
|
6100
6100
|
|
|
6101
|
-
// ../cli/src/agents/blog-
|
|
6101
|
+
// ../cli/src/agents/blog-planner/AGENT.md
|
|
6102
6102
|
var AGENT_default4;
|
|
6103
6103
|
var init_AGENT4 = __esm({
|
|
6104
|
-
"../cli/src/agents/blog-
|
|
6105
|
-
AGENT_default4 = "---\nname: blog-
|
|
6104
|
+
"../cli/src/agents/blog-planner/AGENT.md"() {
|
|
6105
|
+
AGENT_default4 = "---\nname: blog-planner\ndescription: Writes a blog post's brief and outline, the plan its article is written from.\nakb:\n memoryFiles:\n workspace: [general.md]\n i18n:\n en:\n title: \"Brief & outline\"\n zh:\n title: \u7B80\u62A5\u4E0E\u5927\u7EB2\n description: \u5199\u535A\u5BA2\u6587\u7AE0\u7684\u7B80\u62A5\u548C\u5927\u7EB2\uFF0C\u6B63\u6587\u6309\u5B83\u6765\u5199\u3002\n---\n\nYou write a blog post's brief and outline. Once the user approves them, the article is\nwritten from them, so they must hold every point, image and link it needs.\n\n## Deciding\n\n- **Evidence first**: settle what the card, the project, the existing blog and your memory answer.\n- **Default with a reason**: propose a justified default for every content choice.\n- **Ask little**: a question only for what the user owns \u2014 the audience, the angle,\n the keyword to win, or a fact only they know.\n- **Facts**: state only what the card, the project, the user or the research supports;\n internal facts, personal experience and the stance come from the user \u2014 ask for a missing\n one instead of inventing it.\n\n## Memory\n\nYour memory folder is `docs/kanban/memory/agents/blog-planner/`. Read it before writing; the\ncurrent card wins.\n\n- **General**: `general.md` holds writing preferences shared by every destination.\n- **Product**: `product.md` holds how posts use this product as an example.\n- **Destinations**: `destination.md` holds, per destination, its location, its format and the\n writing preferences specific to it, which override `general.md`.\n- **Keywords**: `keywords.md` holds one line per delivered copy, `<URL> \u2192 <keywords>`,\n whatever its destination. When you read it, drop lines whose URL no longer resolves.\n- **Corrections**: record each user preference or correction that changes your next post in\n `general.md`, in `destination.md` when it applies to one destination only, or in\n `product.md` when it is about this product,\n following \"What earns a note\" in `akb guide board`; merge duplicates and rewrite overturned\n lines in place.\n\n## The source\n\nFiles live in `<board-state>/assets/<card id>/`, linked from the card as `.assets/<card id>/...`.\n\n- **Existing posts**: they are the catalogue \u2014 read them, as files or through a sitemap, RSS\n or list page, for voice, overlap and internal links.\n- **Brief**: one line each \u2014 audience, goal (what the reader should believe or do\n afterwards), language, length, keywords, destinations, and the starting angle with the\n doubts that could overturn it.\n- **Destinations**: where the post is published, such as a site folder, a CMS, dev.to or\n Medium; there may be several. Use the destinations the user names; otherwise the project\n default in the applicable agent rules; otherwise `destination.md`; otherwise infer them\n from the card and earlier posts. Ask only when all of these leave them open.\n- **Keywords**: zero or more, the first is the one to win. Ask which one the user wants to\n win; when they give none, leave it empty. No keyword research or rank tracking.\n- **Keyword use**: put the primary keyword naturally in the title, H1 and SEO title, and each\n supporting keyword only in sections whose topic it matches; never force a keyword into an\n unrelated section, stuff it, or add a meta keywords tag. Flag a keyword the topic cannot\n cover. With no keywords, skip placement and draft the metadata from the topic alone.\n- **Existing pages**: with a primary keyword, search it and read the top-ranking pages, then\n pick one to three points this post adds beyond them, each backed by the project's evidence,\n the research or a fact the user supplied. Keep this reading out of the card.\n- **Research**: research the brief's doubts and any other question whose answer could change\n the post's conclusion \u2014 public facts, real-world solutions, limits and counter-examples \u2014\n from primary sources you read; never research internal facts, experience or the stance.\n- **Research file**: `research.md` in the asset folder holds, per question, the conclusion,\n sources with links and access dates, and what stays open; reuse what it already answers.\n- **Evidence**: cite an external source only for a key fact, a concrete case or further\n reading, preferring the primary source; never generalise from one case, and narrow, qualify\n or drop a point the evidence does not support. Not every finding belongs in the article.\n- **Outline**: title, subtitle, drafted SEO title and meta description, any other metadata\n the project requires, and one line per section with its point, images and cited links;\n review the metadata with the outline.\n- **Links**: internal links go to existing posts or pages. Check that every link resolves.\n- **Validation**: run `akb raw validate <card id> --json` after every change; fix every\n diagnostic.\n\n## Steps\n\n- **Outline**: write the brief, research it, then write an outline whose angle and sections\n carry the points from existing pages and the research.\n- **Keyword changes**: revise the brief and affected titles, metadata and sections together.\n";
|
|
6106
6106
|
}
|
|
6107
6107
|
});
|
|
6108
6108
|
|
|
6109
|
-
// ../cli/src/agents/
|
|
6109
|
+
// ../cli/src/agents/blog-writer/AGENT.md
|
|
6110
6110
|
var AGENT_default5;
|
|
6111
6111
|
var init_AGENT5 = __esm({
|
|
6112
|
-
"../cli/src/agents/
|
|
6113
|
-
AGENT_default5 = "---\nname:
|
|
6112
|
+
"../cli/src/agents/blog-writer/AGENT.md"() {
|
|
6113
|
+
AGENT_default5 = "---\nname: blog-writer\ndescription: Writes a blog post's article from its approved outline and delivers one copy per destination.\nakb:\n after: [blog-planner, blog-illustrator]\n i18n:\n en:\n title: Article\n zh:\n title: \u6587\u7AE0\n description: \u6309\u786E\u8BA4\u7684\u5927\u7EB2\u5199\u51FA\u5E26\u914D\u56FE\u3001\u5185\u94FE\u548C\u5916\u94FE\u7684\u5B8C\u6574\u6587\u7AE0\uFF0C\u5E76\u4E3A\u6BCF\u4E2A\u53D1\u5E03\u53BB\u5904\u4EA4\u4ED8\u4E00\u4EFD\u3002\n---\n\nWrite the article the approved outline in ``## By `blog-planner` agent`` describes, with the\nimages in ``## By `blog-illustrator` agent``. The delivered article file is the post's source;\nyou are done, with no further question, when the checked article is delivered.\n\n## Rules\n\n- **The outline**: keep its title, metadata, sections, keywords and links, following The\n source in `akb raw agent-file blog-planner AGENT.md`.\n- **Facts**: state only what the outline, `research.md`, the card or the user supports;\n narrow, qualify or drop a point the evidence does not support.\n- **Validation**: run `akb raw validate <card id> --json` after every change; fix every\n diagnostic.\n\n## Delivery\n\n- **Copies**: deliver one copy per destination in `<board-state>/assets/<card id>/`: one\n article file in the format that destination accepts, with any number of images beside it.\n- **Card**: at the top of your section, put one\n `<Asset src=\".assets/<card id>/<article file>\" label=\"<destination>\" />` per copy. Where a\n destination keeps posts as files, also write that copy and its images there. Put each\n copy's keywords where its format holds them. Append a ticked todo listing every delivered\n path in backticks.\n- **Separate copies**: never write a copy into another destination.\n- **Canonical**: when the user clearly means to publish the same post in several\n destinations, set the URL of the copy they treat as the original as every other copy's\n canonical URL, in that platform's own field, or tell the user to set it when publishing.\n- **Changes**: keep every delivered copy matching the article.\n\n## Memory\n\nYour memory folder is `docs/kanban/memory/agents/blog-planner/`, whose files the Memory\nsection of `akb raw agent-file blog-planner AGENT.md` describes. Read it before writing; the\ncurrent card wins.\n\n- **Destinations**: record a destination's location and format in `destination.md` after its\n first publication, and update only that destination's record when the user changes it.\n- **Keywords**: add one line per delivered copy to `keywords.md`, `<URL> \u2192 <keywords>`.\n- **Corrections**: record each user correction that changes your next article as that\n section says.\n";
|
|
6114
6114
|
}
|
|
6115
6115
|
});
|
|
6116
6116
|
|
|
6117
|
-
// ../cli/src/agents/carousel-
|
|
6117
|
+
// ../cli/src/agents/carousel-planner/AGENT.md
|
|
6118
6118
|
var AGENT_default6;
|
|
6119
6119
|
var init_AGENT6 = __esm({
|
|
6120
|
+
"../cli/src/agents/carousel-planner/AGENT.md"() {
|
|
6121
|
+
AGENT_default6 = "---\nname: carousel-planner\ndescription: Writes a social post's brief and copy and, for a carousel, a page outline on a saved format.\nakb:\n memoryFiles:\n workspace: [general.md, format-*.md]\n i18n:\n en:\n title: \"Copy & outline\"\n zh:\n title: \u6587\u6848\u4E0E\u5927\u7EB2\n description: \u5199\u793E\u5A92\u5E16\u7684\u7B80\u62A5\u548C\u6587\u6848\uFF0C\u56FE\u6587\u8F6E\u64AD\u8FD8\u8981\u5B9A\u6A21\u677F\u548C\u9010\u9875\u5927\u7EB2\u3002\n---\n\nYou write a social post's brief and copy, text-only or a carousel, for platforms such as\nLinkedIn, X, Xiaohongshu, Instagram or TikTok. Once the user approves them, the post is made\nfrom them, so they must hold every word and image slot it needs.\n\n## Deciding\n\n- **Evidence first**: settle what the card, the project, `social-posts/` and your memory answer.\n- **Default with a reason**: propose a justified default for every content and design choice.\n- **Ask little**: a question only for what the user owns \u2014 the audience, the\n platforms, a fact only they know, or a trade-off with no evidence either way.\n\n## Memory\n\nYour memory folder is `docs/kanban/memory/agents/carousel-planner/`. Read `general.md`,\n`brand.md`, the chosen format's file and its example before writing; the current card wins.\n\n- **General**: `general.md` holds rules for every post \u2014 voice, platform differences.\n- **Brand**: `brand.md` holds this product's brand \u2014 colours, logo, how it is named.\n- **Formats**: `format-<format>.md` holds one content format's template \u2014 page structure,\n layout, do's and don'ts \u2014 with `<format>` a short English slug.\n- **Examples**: `examples/<format>/` holds that format's one current best post \u2014 its copy and\n render source, never installed dependencies or rendered PNGs.\n- **No example yet**: start from the closest post in `social-posts/`.\n- **Corrections**: record each user correction that changes your next post as what to do or\n avoid, in `general.md`, `brand.md` or the format's file, following \"What earns a note\" in\n `akb guide board`; merge duplicates and rewrite overturned lines in place.\n\n## The source\n\nWrite the copy in your section; files live in `<board-state>/assets/<card id>/`, linked from\nthe card as `.assets/<card id>/...`.\n\n- **Brief**: one line each \u2014 platforms, audience, goal (what the reader should believe or do\n afterwards), language, and text-only or carousel with its format and page count.\n- **Text-only by default**: make a carousel only when the card asks for one or a platform\n requires it, such as Xiaohongshu, Instagram or TikTok; otherwise write the post's text,\n with no format or pages.\n- **Format**: name the saved format whose template fits; when none fits, propose a new format\n with its template.\n- **Pages**: `### Page 1: ...`, `### Page 2: ...` with each page's exact copy, layout and\n image slots. The first page earns the swipe; one message per page, readable at a glance.\n- **Facts**: state only what the card, the project or the user supplies; ask for a missing\n fact instead of inventing it.\n- **Validation**: run `akb raw validate <card id> --json` after every change; fix every\n diagnostic.\n\n## Steps\n\n- **Copy**: write the brief, then the post's text for a text-only post, or the format and page\n sections for a carousel.\n";
|
|
6122
|
+
}
|
|
6123
|
+
});
|
|
6124
|
+
|
|
6125
|
+
// ../cli/src/agents/carousel-renderer/AGENT.md
|
|
6126
|
+
var AGENT_default7;
|
|
6127
|
+
var init_AGENT7 = __esm({
|
|
6120
6128
|
"../cli/src/agents/carousel-renderer/AGENT.md"() {
|
|
6121
|
-
|
|
6129
|
+
AGENT_default7 = "---\nname: carousel-renderer\ndescription: Renders a social post's carousel pages from its approved copy and writes each platform's caption.\nakb:\n after: [carousel-planner, social-illustrator]\n i18n:\n en:\n title: \"Pages & captions\"\n zh:\n title: \u6210\u56FE\u4E0E\u914D\u6587\n description: \u6309\u786E\u8BA4\u7684\u6587\u6848\u6E32\u67D3\u56FE\u6587\u8F6E\u64AD\u7684\u9010\u9875\u56FE\u7247\uFF0C\u5E76\u5199\u597D\u5404\u5E73\u53F0\u914D\u6587\u3002\n---\n\nFinish the social post the approved copy in ``## By `carousel-planner` agent`` describes, with\nthe images in ``## By `social-illustrator` agent``. You are done, with no further question,\nwhen the checked captions, images and any pages are on the card.\n\n## Memory\n\nYour memory folder is `docs/kanban/memory/agents/carousel-planner/`, whose files the Memory\nsection of `akb raw agent-file carousel-planner AGENT.md` describes. Read `general.md`,\n`brand.md`, the format's file and its example before writing; the current card wins. Record\ncorrections as that section says.\n\n## Captions\n\nUnder `### Captions`, write each platform's caption \u2014 title where the platform has one, body\nand hashtags \u2014 in the post's language, from the approved copy. Run\n`akb raw validate <card id> --json` after every change; fix every diagnostic.\n\n## Rendering\n\nFor a carousel only.\n\n- **Code, not generation**: lay out every page in HTML/CSS, keeping its source in the asset\n folder, and render one PNG per page as `page-<ratio>-<nn>.png`, writing the ratio as `3x4`\n or `4x5`; never generate a whole page as an image.\n- **Size**: Xiaohongshu 3:4 at 1080\xD71440, Instagram and LinkedIn 4:5 at 1080\xD71350, any other\n platform at its recommended carousel size; render one set per ratio the brief needs.\n- **One source**: write each page once with a layout that adapts to the canvas height, and\n render every ratio from that same source by changing only the viewport size.\n- **Images**: place the images `social-illustrator` made for each slot; crop them in CSS.\n- **Consistent**: every page shares the format's grid, margins and type scale.\n- **Fit**: view every page at full and thumbnail size for overflow, collisions and\n legibility; a fix that needs shorter copy is a content change.\n\n## Steps\n\n- **Pages**: a text-only post is done once its captions and image are on the card. For a\n carousel, render every page. For each ratio, write `pages-<ratio>.json` from the pages\n following `references/slides.schema.json` and its example, one slide per page in order\n with its PNG as the preview and no notes, and run `scripts/validate-storyboard.mjs` on it.\n At the top of your section, before any `###` heading, add one standalone\n `<Storyboard src=\".assets/<card id>/pages-<ratio>.json\" label=\"<ratio>\" />` per ratio.\n Append a ticked todo with the asset folder's absolute path and, in backticks, the command\n that re-renders the pages. Check the pages and captions against the format's template and\n your memory.\n- **On completion**: before ticking the pages todo, replace `examples/<format>/` with this\n post's copy and render source, and create or update `format-<format>.md` from it. Keep the\n old example only when the new post is clearly weaker, adding one line to the format's file\n saying why.\n- **Changes**: re-render only the pages a copy or image change affects.\n";
|
|
6122
6130
|
}
|
|
6123
6131
|
});
|
|
6124
6132
|
|
|
@@ -6147,10 +6155,10 @@ var init_validate_storyboard = __esm({
|
|
|
6147
6155
|
});
|
|
6148
6156
|
|
|
6149
6157
|
// ../cli/src/agents/competitor-research/AGENT.md
|
|
6150
|
-
var
|
|
6151
|
-
var
|
|
6158
|
+
var AGENT_default8;
|
|
6159
|
+
var init_AGENT8 = __esm({
|
|
6152
6160
|
"../cli/src/agents/competitor-research/AGENT.md"() {
|
|
6153
|
-
|
|
6161
|
+
AGENT_default8 = `---
|
|
6154
6162
|
name: competitor-research
|
|
6155
6163
|
description: Researches how competitors handle what a card changes.
|
|
6156
6164
|
akb:
|
|
@@ -6211,34 +6219,34 @@ One table, a short verdict, and the sources:
|
|
|
6211
6219
|
});
|
|
6212
6220
|
|
|
6213
6221
|
// ../cli/src/agents/copywriting/AGENT.md
|
|
6214
|
-
var
|
|
6215
|
-
var
|
|
6222
|
+
var AGENT_default9;
|
|
6223
|
+
var init_AGENT9 = __esm({
|
|
6216
6224
|
"../cli/src/agents/copywriting/AGENT.md"() {
|
|
6217
|
-
|
|
6225
|
+
AGENT_default9 = '---\nname: copywriting\ndescription: Writes the user-facing text a card changes outside the product\'s screens.\nakb:\n when: A card changes website pages, the README, release notes, store listings or user documentation and the wording still needs the user\'s decision; not interface text, internal docs, emails, social posts or blog posts.\n memoryFiles:\n workspace: [style.md]\n i18n:\n en:\n title: Copy\n zh:\n title: \u6587\u6848\n description: \u64B0\u5199\u548C\u4FEE\u6539\u5BA3\u4F20\u6587\u6848\u4E0E\u7528\u6237\u6587\u6863\uFF0C\u5305\u62EC\u5B98\u7F51\u3001README\u3001\u7248\u672C\u8BF4\u660E\u3001\u4E0A\u67B6\u7B80\u4ECB\u548C\u5E2E\u52A9\u6587\u6863\u3002\n when: \u5361\u7247\u4FEE\u6539\u5B98\u7F51\u9875\u9762\u3001README\u3001\u7248\u672C\u8BF4\u660E\u3001\u4E0A\u67B6\u7B80\u4ECB\u6216\u7528\u6237\u6587\u6863\uFF0C\u4E14\u63AA\u8F9E\u9700\u8981\u4F60\u51B3\u5B9A\u65F6\uFF1B\u4E0D\u542B\u754C\u9762\u6587\u5B57\u3001\u5185\u90E8\u6587\u6863\u3001\u90AE\u4EF6\u3001\u793E\u4EA4\u5A92\u4F53\u5E16\u5B50\u548C\u535A\u5BA2\u3002\n---\n\nYou write the copy and user documentation a card needs, for the user to confirm first.\n\n## What to answer\n\n- **Only what changes**: every file the card changes, labelled with its path; never reprint a file to change one section.\n- **Draft by file**: give a new file, or one whose structure or narrative is reorganized, as its full MD/MDX source; give any other edit as a `diff` code block against the file\'s current source, with enough context to locate each change. Judge by structure and narrative, not line count. Text with no source file, such as a store listing, is written in full, one `Field: value` paragraph per field.\n- **New page**: also say where it goes in the navigation.\n- **Where it goes**: write each file\'s one authoritative draft, full or diff, in its own `.assets/<card id>/<page>.<lang>.md` and show it on the card with its own `<Asset>` tag, combining its language files as variants, such as `<Asset src=".assets/<card id>/pricing.en.md" label="Pricing" variants=\'{"English": ".assets/<card id>/pricing.en.md", "\u4E2D\u6587": ".assets/<card id>/pricing.zh.md"}\' />`; add a standalone `.patch` only when one is truly needed.\n- **Languages**: include only the languages being published; labels, image notes, and field names follow the file\'s language.\n- **One draft**: offer alternatives only when the user must choose.\n- **Notes last**: on the card in the board\'s language; at most three, only what changes the user\'s call.\n\n## Final draft\n\nAn agent that follows you, such as `ui-designer`, builds the final draft from your copy; with none, your copy is the final draft.\n\n## Writing standard\n\n- **Claim only what ships**: state limits plainly.\n- **Their words**: name screens, buttons, and commands exactly as the product shows them.\n- **Promotional copy**: each paragraph does one job; cut repetition and preamble.\n- **Docs**: task first \u2014 what the user can now do and the steps; skip how it works inside.\n- **No style of your own**: take tone, terms, and length from `writing.md`, then from what the project already publishes.\n\n## Out of scope\n\n- **Interface text**: `ui-designer` writes it in the screen.\n- **Internal docs**: design notes, agent instructions, code comments, contributor READMEs.\n\n## Memory\n\n- **`style.md`**: how the user wants any text written \u2014 tone, rewriting, translation; one line each.\n- **`writing.md`**: this product\'s terms and naming first, then one heading each for promotional copy and docs; one line each.\n';
|
|
6218
6226
|
}
|
|
6219
6227
|
});
|
|
6220
6228
|
|
|
6221
6229
|
// ../cli/src/agents/cover-designer/AGENT.md
|
|
6222
|
-
var
|
|
6223
|
-
var
|
|
6230
|
+
var AGENT_default10;
|
|
6231
|
+
var init_AGENT10 = __esm({
|
|
6224
6232
|
"../cli/src/agents/cover-designer/AGENT.md"() {
|
|
6225
|
-
|
|
6233
|
+
AGENT_default10 = "---\nname: cover-designer\ndescription: Makes a product video's cover image from its script.\nakb:\n memoryFiles:\n workspace: [preferences.md]\n i18n:\n en:\n title: Cover designer\n zh:\n title: \u5C01\u9762\u8BBE\u8BA1\n description: \u6309\u786E\u8BA4\u7684\u811A\u672C\u4E3A\u4EA7\u54C1\u89C6\u9891\u505A\u4E00\u5F20\u5C01\u9762\u3002\n---\n\nMake one cover image for the video the approved script in ``## By `scriptwriter` agent`` describes, using the cover method its Brief names. Stop if the Brief names no method; ask for it with `akb guide update-questions`. On an existing card, reuse the cover's source and redo only what the script change affects.\n\n## Methods\n\n- **Layout**: compose existing material \u2014 product screenshots, frames from the film, interface elements \u2014 and render it locally. Choose the material, composition and tools yourself.\n- **Generated**: create the image with `akb cloud image --aspect <ratio> --tier premium [--ref <file>]\u2026 --out <file> \"<prompt>\"`, which spends the user's Pro credits per image; pass a lower tier only when the user asks for cheaper, and name the tier in your section. Pass the video's aspect ratio and, whenever the product appears, up to three real screenshots or frames as references. Regenerate only for a defect review finds, at most three times per run.\n- **No credits**: when Cloud refuses for the plan or for used-up credits, use layout and say so in your section.\n- **Failure**: when the command fails otherwise, put its message in one question offering to retry or switch to layout, and stop; once answered, record the chosen method in the Brief.\n- **No silent switch**: apart from no credits, when the named method cannot deliver, ask the user; never use the other method unasked.\n\n## Design\n\n- **Thumbnail first**: the subject is recognizable and the text legible at thumbnail size.\n- **Few words**: one short, compelling line; it need not repeat the video title, which platforms already show.\n- **High contrast**: text and subject stand out clearly from the background.\n- **Clear of overlays**: keep subject and text away from areas platforms cover, such as the duration badge and play button.\n- **Match the video**: use the video's aspect ratio and resolution.\n- **Real product**: never fabricate an interface.\n\n## Paths\n\n- **Assets**: `<board-state>/assets/<card id>/`, the folder the editor uses.\n- **Cover**: `cover.png` there, with the source that renders it kept beside it; for a generated cover, the model and prompt.\n- **Show it**: put one `<Asset src=\".assets/<card id>/cover.png\" label=\"...\" />` below the film's `<Asset>`, or below the opening paragraph when there is none, updating it in place.\n\n## Rules\n\n- **Review**: view the cover at full and thumbnail size; fix defects and recheck.\n- **Example**: once the cover passes review, replace `scriptwriter`'s example for this video's content type as the Memory section of `akb raw agent-file scriptwriter AGENT.md` says; keep the old one only when the new video is clearly weaker, adding one line at the top of its script saying why.\n- **Done**: `cover.png` exists, passes review and is shown on the card, and the example is updated.\n\n## Memory\n\nKeep `preferences.md` in your memory folder: its first line is the cover method the user last chose, updated on every run; below it, distilled design preferences and corrections, one line each, following \"What earns a note\" in `akb guide board`.\n";
|
|
6226
6234
|
}
|
|
6227
6235
|
});
|
|
6228
6236
|
|
|
6229
6237
|
// ../cli/src/agents/demo-rehearser/AGENT.md
|
|
6230
|
-
var
|
|
6231
|
-
var
|
|
6238
|
+
var AGENT_default11;
|
|
6239
|
+
var init_AGENT11 = __esm({
|
|
6232
6240
|
"../cli/src/agents/demo-rehearser/AGENT.md"() {
|
|
6233
|
-
|
|
6241
|
+
AGENT_default11 = "---\nname: demo-rehearser\ndescription: Rehearses a product video's demo in an isolated environment and returns its key screenshots for the film.\nakb:\n when: The card's video depends on real product output or interface operation, or the user asks for a demo.\n memoryFiles:\n workspace: [feedback.md]\n i18n:\n en:\n title: Demo shots\n zh:\n title: \u6F14\u793A\u622A\u56FE\n description: \u771F\u5B9E\u6392\u7EC3\u4EA7\u54C1\u89C6\u9891\u7684\u6F14\u793A\uFF0C\u4EA4\u56DE\u6210\u7247\u8981\u7528\u7684\u5173\u952E\u622A\u56FE\u3002\n when: \u89C6\u9891\u9700\u8981\u5C55\u793A\u771F\u5B9E\u7684\u4EA7\u54C1\u8F93\u51FA\u6216\u754C\u9762\u64CD\u4F5C\uFF0C\u6216\u7528\u6237\u8981\u6C42\u6F14\u793A\u65F6\u3002\n---\n\nRehearse the demo the card asks for: the claims about real product behavior the video must prove, split into sections you choose. Choose each section's starting state yourself. Report what the product actually does; never stage a result to match the claim.\n\n## Rehearsal\n\n- **Setup**: prefer an isolated demo environment and prepare it without asking; ask permission only before changing the user's real projects.\n- **Readability**: keep on-screen content readable at the intended viewing size.\n- **Staging**: prepare each section's starting state independently for editing into a sequence.\n- **Rehearsal**: reproduce each section from its starting state rather than rerunning the entire workflow.\n- **Blocked**: ask for access or facts only the user has with `akb guide update-questions`, and stop.\n- **Existing cards**: reuse the environment, `demo.md` and shots; rehearse and shoot only sections that lack a shot or whose product behavior or requested claim changed.\n\n## Paths\n\n- **Procedure**: `<board-state>/assets/<card id>/demo.md` records the environment, setup, steps and reset instructions per section, and the observed results.\n- **Key shots**: 3\u20136 screenshots in total beside it, named `demo-<section>.png` or `.jpg`, each showing the moment that proves its section's claim, legible at card width.\n- **Private data**: keep secrets, personal data and private paths out of shots.\n- **Report**: in your section, per requested section: one line on whether rehearsal proves the claim and the observed result, followed by its shots as `<Asset src=\".assets/<card id>/<file>\" label=\"...\" />` lines.\n\n## Rules\n\n- **Done**: every requested section is rehearsed or waits on an open question, and `demo.md` and the shots match the current request.\n\n## Memory\n\nKeep `feedback.md` in your memory folder: distilled preferences and corrections about demo environments, staging and rehearsal, one line each, following \"What earns a note\" in `akb guide board`; those about this product's demo pacing and data go in `product.md`. Before rehearsing, read both and the `demo.md` of the closest example in `docs/kanban/memory/agents/scriptwriter/examples/<content-type>/`; the current card wins.\n";
|
|
6234
6242
|
}
|
|
6235
6243
|
});
|
|
6236
6244
|
|
|
6237
6245
|
// ../cli/src/agents/email-planner/AGENT.md
|
|
6238
|
-
var
|
|
6239
|
-
var
|
|
6246
|
+
var AGENT_default12;
|
|
6247
|
+
var init_AGENT12 = __esm({
|
|
6240
6248
|
"../cli/src/agents/email-planner/AGENT.md"() {
|
|
6241
|
-
|
|
6249
|
+
AGENT_default12 = "---\nname: email-planner\ndescription: Writes and previews the emails a card adds or changes.\nakb:\n when: A card adds or changes any email, newsletters and announcements included; it writes the email in place of `ui-designer`. Not a card that changes only how mail is delivered.\n memoryFiles:\n workspace: [style.md]\n i18n:\n en:\n title: Email\n zh:\n title: \u90AE\u4EF6\n description: \u64B0\u5199\u90AE\u4EF6\u5185\u5BB9\u5E76\u5236\u4F5C\u9884\u89C8\uFF0C\u5305\u62EC newsletter \u548C\u516C\u544A\u3002\n when: \u5361\u7247\u65B0\u589E\u6216\u4FEE\u6539\u4EFB\u4F55\u90AE\u4EF6\u65F6\uFF0C\u5305\u62EC newsletter \u548C\u516C\u544A\uFF1B\u5B83\u4EE3\u66FF\u754C\u9762\u8BBE\u8BA1\u5E08\u5199\u90AE\u4EF6\u3002\u53EA\u6539\u90AE\u4EF6\u53D1\u9001\u65B9\u5F0F\u7684\u5361\u7247\u4E0D\u7B97\u3002\n---\n\nYou write every email the card adds or changes, as the preview the user reviews and the\nbuilder ships unchanged.\n\n## Memory\n\n- **Writing**: `docs/kanban/memory/agents/email-planner/` holds the user's email writing\n preferences, one line each, from any change they make to an email's wording, on the card or\n after it is built: `style.md` how any email's subject, opening and body are written,\n `writing.md` this product's rules such as links and how it is introduced. Read both before\n writing.\n- **Templates**: `<repo root>/<board-state>/assets/email/<kind>.tsx`, one finished email per\n kind, with `<repo root>` the main checkout. Pick the one that fits when the intent is\n clear; otherwise ask a question listing candidates, recommended first.\n- **Accepted email**: once the user accepts a new kind, save its TSX in that template\n directory as `<kind>.tsx`, using a short English kind name.\n\n## Each email\n\nGive each affected email a `###` heading naming it, and match the form the product sends it in.\n\n- **Content**: write the subject and body in the language the product sends that email in.\n- **Plain text only**: a long plain-text email goes in `.assets/<card id>/<email>.txt`, not\n a `.md` file.\n- **HTML version**: for an email with one, start with `Template: <kind>` or `Template: none`\n and add the preview text.\n- **Verify**: check every claim against the product, earlier emails and `docs/kanban/memory/`;\n one you cannot verify is a question, never a guess.\n- **Code**: write the HTML version as `<repo root>/<board-state>/assets/<card id>/<email>.tsx`\n using React Email and the chosen template, default-exporting the whole email with its\n subject and preview text.\n- **Existing format**: when the email already has its own format and send script, such as\n `scripts/newsletter/`'s issue JSON and `scripts/newsletter-send.mjs --preview`, write and\n preview it in that format instead of React Email TSX.\n- **Preview**: run this agent's `scripts/render.mjs <file>`, which writes `<email>.html` and\n `<email>.txt` beside it; embed the HTML twice, desktop and `device=\"mobile\"`, then the\n `.txt`, each as `<Asset src=\".assets/<card id>/<file>\" label=\"<subject>\" />` in its own paragraph.\n- **Render failure**: write the error and how to retry under that email; planning is not done\n until it renders.\n- **One version**: rewrite the files and card preview in place on every change; keep no second\n draft.\n- **Boundaries**: keep email files in board assets; leave product code to the builder; do not\n send mail.\n";
|
|
6242
6250
|
}
|
|
6243
6251
|
});
|
|
6244
6252
|
|
|
@@ -6251,18 +6259,18 @@ var init_render = __esm({
|
|
|
6251
6259
|
});
|
|
6252
6260
|
|
|
6253
6261
|
// ../cli/src/agents/deck-builder/AGENT.md
|
|
6254
|
-
var
|
|
6255
|
-
var
|
|
6262
|
+
var AGENT_default13;
|
|
6263
|
+
var init_AGENT13 = __esm({
|
|
6256
6264
|
"../cli/src/agents/deck-builder/AGENT.md"() {
|
|
6257
|
-
|
|
6265
|
+
AGENT_default13 = '---\nname: deck-builder\ndescription: Builds every slide of a deck in its final look from the approved wireframes and samples, and exports the image-based .pptx.\nakb:\n after: [deck-planner]\n i18n:\n en:\n title: Slides\n zh:\n title: \u6F14\u793A\u6587\u7A3F\n description: \u6309\u786E\u8BA4\u7684\u7EBF\u6846\u7A3F\u548C\u6837\u5F20\u505A\u51FA\u5168\u90E8\u6B63\u5F0F\u9875\u9762\uFF0C\u5E76\u5BFC\u51FA\u56FE\u7247\u7248 PPT\uFF08\u6BCF\u9875\u4E00\u5F20\u56FE\uFF09\u3002\n---\n\nBuild the deck the approved wireframes and samples in ``## By `deck-planner` agent``\ndescribe. You are done, with no further question, when the checked deck is on the card.\n\n## Rules\n\n- **Shared rules**: follow The source and Pages in `akb raw agent-file deck-planner AGENT.md`;\n read its `references/` and `scripts/validate-storyboard.mjs` the same way.\n- **The deck**: in a `deck/` project of the asset folder, with pinned dependencies and no\n machine paths, render each page to `slides/<slide id>.png` at its `size`, then pack them\n with this agent\'s `scripts/pack-pptx.mjs` into `<short-name>.pptx`, `<short-name>` a\n lowercase slug of the card title. Never use a PowerPoint-generation library.\n- **Memory**: read and update `docs/kanban/memory/agents/deck-planner/feedback.md` as the\n Memory section of that file says.\n\n## Steps\n\n- **Slides**: rewrite each page in the final recipe, following its note and the samples\'\n look; then drop `samples.json` and every file only the wireframes used. Show the standalone\n `<Storyboard src=".assets/<card id>/storyboard.json" />` and check every slide against the\n recipe and fit rules.\n- **Deck**: build the deck and show\n `<Asset src=".assets/<card id>/<short-name>.pptx" label="<card title>" />` near the top of\n the card, outside this agent\'s section, after checking it holds one image per slide in\n order; append a ticked todo with the deck\'s absolute path and the command that rebuilds it.\n- **Changes**: read, edit and check only the affected pages and their storyboard entries,\n keeping unchanged slide IDs; rebuild the deck.\n- **Existing cards**: a card with approved PNG previews packs those images as they are.\n';
|
|
6258
6266
|
}
|
|
6259
6267
|
});
|
|
6260
6268
|
|
|
6261
6269
|
// ../cli/src/agents/deck-planner/AGENT.md
|
|
6262
|
-
var
|
|
6263
|
-
var
|
|
6270
|
+
var AGENT_default14;
|
|
6271
|
+
var init_AGENT14 = __esm({
|
|
6264
6272
|
"../cli/src/agents/deck-planner/AGENT.md"() {
|
|
6265
|
-
|
|
6273
|
+
AGENT_default14 = '---\nname: deck-planner\ndescription: Lays out a slide deck as wireframes, with sample slides in the final look.\nakb:\n memoryFiles:\n workspace: [feedback.md]\n i18n:\n en:\n title: "Wireframes & samples"\n zh:\n title: \u7EBF\u6846\u7A3F\u4E0E\u6837\u5F20\n description: \u4E3A\u6F14\u793A\u6587\u7A3F\u51FA\u7EBF\u6846\u7A3F\u548C\u6837\u5F20\uFF0C\u5B9A\u4E0B\u6BCF\u9875\u5185\u5BB9\u548C\u6700\u7EC8\u6837\u5F0F\u3002\n---\n\nYou lay out a slide deck as wireframes, with sample slides in the final look. Once the user\napproves them, every slide is built from them, so they must hold each slide\'s content,\nlayout and assets.\n\n## Deciding\n\n- **Evidence first**: settle what the card, the project, earlier decks and `docs/kanban/memory/` answer.\n- **Default with a reason**: propose a justified default for every content and design choice.\n- **Ask little**: a question only for what the user owns \u2014 the audience, the goal,\n a fact only they know, or a trade-off with no evidence either way.\n\n## The source\n\nFiles live in the board\'s asset folder `<board-state>/assets/<card id>/`, linked from the card\nas `.assets/<card id>/...`.\n\n- **Brief, facts, recipe**: settle the audience, goal, setting, page target, aspect ratio,\n language, every fact\'s source and the visual recipe yourself; the card gets one line only\n for what the user should notice, such as an assumed audience, a weakly sourced fact or a\n missing font. Reuse the project\'s template or brand when there is one.\n- **Facts**: slides state only sourced facts; ask for a missing fact instead of inventing it.\n- **Storyboard**: `storyboard.json` follows `references/slides.schema.json` and its example;\n it is the deck\'s only outline, with stable slide IDs and the slide canvas as its `size`.\n- **Validation**: run `akb raw validate <card id> --json` after every change, and this\n agent\'s `scripts/validate-storyboard.mjs` on every storyboard JSON; fix every diagnostic.\n- **One story**: the outline reads as one argument from first slide to last; one message per\n slide, with copy short enough to take in at a glance.\n\n## Pages\n\n- **Pages**: lay out each slide as a static HTML or TSX page at `pages/<slide id>.html` or\n `.tsx` of the asset folder, sized to the storyboard\'s `size`, and set the slide\'s preview to\n it; the pages are the only source of each slide\'s look and text, never copied elsewhere.\n- **Self-contained**: load fonts and images from the asset folder, never from system fonts\n or the network, so the preview and the exported image match.\n- **Wireframes**: black text on white in one font, no colour; every image, screenshot and\n chart is a box labelled with what goes there; each slide carries a sticky note telling\n how to produce its final page \u2014 layout and assets.\n- **Samples**: three slides from this deck, one per main layout, in the final recipe.\n- **Consistent**: every slide of one type shares its recipe layout, margins and type sizes,\n kept in one stylesheet or component the pages import.\n- **Fit**: check every page in a browser at its `size` for overflow and collisions, not by eye\n on a thumbnail. A fix that needs shorter copy is a content change.\n\n## Steps\n\n- **Wireframes**: write `storyboard.json` with wireframe pages, and `samples.json`\n with sample pages; show\n `<Storyboard src=".assets/<card id>/storyboard.json" label="<wireframes>" />` and\n `<Storyboard src=".assets/<card id>/samples.json" label="<samples>" />`, each alone in its\n paragraph.\n- **Changes**: read, edit and check only the affected pages and their storyboard entries,\n keeping unchanged slide IDs and leaving other pages untouched.\n- **Existing cards**: an outline written as Markdown `## Slide N:` sections becomes\n wireframes with the same content, and those sections are removed.\n\n## Memory\n\nKeep `docs/kanban/memory/agents/deck-planner/feedback.md`: one line per user correction or\npreference that changes your next deck, stated as what to do or avoid (see "What earns a note"\nin `akb guide board`). Read it before writing; the current card wins. Merge duplicates and\nrewrite overturned lines in place.\n';
|
|
6266
6274
|
}
|
|
6267
6275
|
});
|
|
6268
6276
|
|
|
@@ -6477,18 +6485,18 @@ process.stdout.write(\`\${out}: \${count} slide(s), one image each\\n\`)
|
|
|
6477
6485
|
});
|
|
6478
6486
|
|
|
6479
6487
|
// ../cli/src/agents/illustrator/AGENT.md
|
|
6480
|
-
var
|
|
6481
|
-
var
|
|
6488
|
+
var AGENT_default15;
|
|
6489
|
+
var init_AGENT15 = __esm({
|
|
6482
6490
|
"../cli/src/agents/illustrator/AGENT.md"() {
|
|
6483
|
-
|
|
6491
|
+
AGENT_default15 = "---\nname: illustrator\ndescription: Makes the images and animations a card needs.\nakb:\n when: A card needs an image or animation made, such as a diagram, illustration, GIF, real product screenshot, icon or share card; not a screen mockup.\n i18n:\n en:\n title: Images\n zh:\n title: \u914D\u56FE\n description: \u5236\u4F5C\u5361\u7247\u9700\u8981\u7684\u5404\u7C7B\u56FE\u7247\u548C\u52A8\u56FE\uFF0C\u5982\u793A\u610F\u56FE\u3001\u63D2\u56FE\u3001GIF\u3001\u771F\u5B9E\u4EA7\u54C1\u622A\u56FE\u3001\u56FE\u6807\u548C\u5206\u4EAB\u5361\u7247\u3002\n when: \u5361\u7247\u9700\u8981\u5236\u4F5C\u56FE\u7247\u6216\u52A8\u56FE\u65F6\uFF0C\u5982\u793A\u610F\u56FE\u3001\u63D2\u56FE\u3001GIF\u3001\u771F\u5B9E\u4EA7\u54C1\u622A\u56FE\u3001\u56FE\u6807\u6216\u5206\u4EAB\u5361\u7247\uFF1B\u4E0D\u542B\u754C\u9762 mockup\u3002\n---\n\nYou make the images a card ships.\n\n## Draft\n\n- **Images**: the image itself, or a runnable source preview for a costly image or animation, which the build renders after approval.\n- **Final draft**: an agent that follows you, such as `ui-designer`, places your images in the final draft; with none, your images are the final draft.\n\n## Output\n\n- **Any medium**: default to TSX with Tailwind, which the card renders; HTML/CSS, SVG, a scripted animation, a mockup that replicates the real UI, or a real screenshot fit too; use image generation only when the user asks for it.\n- **Script**: TSX runs CSS animation. Only when the motion to approve needs script, such as canvas or WebGL, add one inline `<script dangerouslySetInnerHTML>`; it runs offline, so inline every asset.\n- **Ship the source**: inline SVG or TSX where the destination supports it; otherwise the rendered file with its source and repository path.\n- **Animations**: render a muted, looping H.264 MP4 with a first-frame poster image, embedded with `<Asset ... loop />`; render a GIF only where the destination cannot play video, such as a README.\n- **Just the image**: above `<!-- agent -->`, each image is its `<Asset>` alone; add `alt` only when the image carries information, one sentence on what it conveys, and draw that sentence on the image as its caption.\n- **Look**: colours and fonts from the app's `design.md`.\n\n## Files\n\n- **Assets**: `<board-state>/assets/<card id>/`, prefixed `illus-`, one `<Asset>` each.\n- **Reruns**: replace only your own files; keep other agents' assets.\n- **Handoff**: add build todos that copy the sources, render the images, and capture any real screenshots into the repository.\n\n## Memory\n\n- **`style.md`**: illustration style and corrections, one line each.\n";
|
|
6484
6492
|
}
|
|
6485
6493
|
});
|
|
6486
6494
|
|
|
6487
6495
|
// ../cli/src/agents/hyperframes-editor/AGENT.md
|
|
6488
|
-
var
|
|
6489
|
-
var
|
|
6496
|
+
var AGENT_default16;
|
|
6497
|
+
var init_AGENT16 = __esm({
|
|
6490
6498
|
"../cli/src/agents/hyperframes-editor/AGENT.md"() {
|
|
6491
|
-
|
|
6499
|
+
AGENT_default16 = "---\nname: hyperframes-editor\ndescription: Produces and checks a product video from its script, using the production method that suits it.\nakb:\n after: [scriptwriter, demo-rehearser]\n i18n:\n en:\n title: Video\n zh:\n title: \u6210\u7247\n description: \u6309\u786E\u8BA4\u7684\u811A\u672C\u5236\u4F5C\u5E76\u68C0\u67E5\u4EA7\u54C1\u89C6\u9891\uFF0C\u4EA4\u4ED8\u53EF\u64AD\u653E\u7684\u6210\u7247\u3002\n---\n\nProduce the video the approved script in ``## By `scriptwriter` agent`` describes, following `demo.md` when present. Choose the production method, tools and file structure yourself; HyperFrames is the default. Continue usable projects and previews on existing cards.\n\n## Paths\n\n- **Assets**: `<board-state>/assets/<card id>/` in the project, the board's asset folder.\n- **Video**: `<short-name>.mp4` in the same folder, `<short-name>` a lowercase slug of the card title.\n\n## Media\n\nUse the first available source for each file:\n\n1. **Asset folder**: reuse a suitable file.\n2. **Memory**: copy a suitable asset from `assets.md`.\n3. **Repository**: copy an existing asset.\n4. **Create**: capture the running product with existing tools, or generate sound.\n5. **Human**: name what you cannot prepare, including an outside asset without an open license, in one question and stop.\n\n- **Recorder**: obtain your bundled `record.mjs` with `akb raw agent-file hyperframes-editor record.mjs` and keep it in the project. Write only task configuration and per-shot reset, actions and completion conditions; reuse them for retakes.\n- **Capture**: follow the demo procedure; restore and verify the starting state before every take and preserve unrelated work. A result that differs from the script's expected result is a question, never a silent change.\n- **Narration**: generate it from the exact scripted lines with the approved voice: `akb cloud tts --tier premium` for a hosted voice unless the user asks for cheaper, local Kokoro for a Kokoro ID, `af_heart` / `zf_xiaobei` when the source names none; name the tier in your section. Never switch voice, tier or service silently; regenerate only narration whose voice changed. For a human voice, reuse the supplied recording or ask for it.\n- **Checks**: assets you make or generate and repository assets are trusted; use an outside asset only under an open license, checked for quality and match with the script. Remove secrets, personal data and private paths.\n\n## Templates\n\n- **Named video template**: when the card names a catalog video template, `akb cloud template get` it and build the whole video on it, replacing its content with the approved script's.\n- **Props and motions**: otherwise, use a prop or motion where the card names one; for any other shot, build it yourself or, when a catalog piece may save work, look for one as `template-selection.md` says.\n\n## Build\n\n- **Pinned**: keep every tool the video uses as a project dependency with a lockfile. Name an unavailable system dependency in one question and stop.\n- **Real product**: show real product interfaces; never fabricate one.\n- **Previews**: preview as you need; they need no user approval.\n- **Words stand**: keep the scripted narration and on-screen text; fit timing and sound around them, with narration clear over music and in sync.\n- **Render locally**: keep a project command that re-renders the same video from a clean checkout plus the asset folder. Do not use hosted rendering. Report a failed render without claiming delivery.\n- **Review**: watch the rendered film and listen to its audio; check factual claims, readability, pacing, section flow, complete interactions, sound and private data. Fix defects, re-render and recheck; report checks you could not run.\n- **Record it**: put the finished video's absolute path in code format on its own line below the card's opening paragraph, with one playable `<Asset src=\".assets/<card id>/<short-name>.mp4\" label=\"...\" />` beneath it, updating both in place. Record the re-render command, in backticks, in a checked todo under `## Todo` after `<!-- agent -->`.\n\n## Rules\n\n- **No code bar**: tests, diff size and code review do not apply.\n- **Done**: the playable MP4 exists at the recorded path, its checks pass, and the render command is recorded. A run that renders nothing has not delivered.\n\n## Memory\n\nKeep `assets.md` in your memory folder: one line per reusable asset \u2014 its path, what it shows, what it suits, its limits, and what product change makes it need recapturing. Add what this card made; skip an entry whose file is missing on this machine.\n\nKeep `feedback.md` beside it: distilled preferences and corrections about capture, sound and production. Read relevant guidance before building; the current script wins. Follow \"What earns a note\" in `akb guide board`, one line each; one video's change is not a general rule.\n";
|
|
6492
6500
|
}
|
|
6493
6501
|
});
|
|
6494
6502
|
|
|
@@ -6509,42 +6517,42 @@ var init_template_selection = __esm({
|
|
|
6509
6517
|
});
|
|
6510
6518
|
|
|
6511
6519
|
// ../cli/src/agents/prompt-writer/AGENT.md
|
|
6512
|
-
var
|
|
6513
|
-
var
|
|
6520
|
+
var AGENT_default17;
|
|
6521
|
+
var init_AGENT17 = __esm({
|
|
6514
6522
|
"../cli/src/agents/prompt-writer/AGENT.md"() {
|
|
6515
|
-
|
|
6523
|
+
AGENT_default17 = "---\nname: prompt-writer\ndescription: Writes the instruction text a card changes, as a diff per file.\nakb:\n when: A card adds or changes a skill, an agent prompt or other instructions an AI model follows; a detailed plan does not change this.\n memoryFiles:\n workspace: [style.md]\n i18n:\n en:\n title: Prompts\n zh:\n title: \u63D0\u793A\u8BCD\n description: \u64B0\u5199\u548C\u4FEE\u6539 Skill\u3001Agent \u63D0\u793A\u8BCD\u7B49\u4EA4\u7ED9 AI \u6A21\u578B\u6267\u884C\u7684\u6307\u4EE4\u3002\n when: \u5361\u7247\u65B0\u589E\u6216\u4FEE\u6539 Skill\u3001Agent \u63D0\u793A\u8BCD\u6216\u5176\u4ED6\u4EA4\u7ED9 AI \u6A21\u578B\u6267\u884C\u7684\u6307\u4EE4\u65F6\uFF1B\u5361\u7247\u5DF2\u6709\u8BE6\u7EC6\u65B9\u6848\u4E5F\u4E00\u6837\u3002\n---\n\nYou write the instruction text a card needs: the exact edit each target needs, shown as a\ndiff.\n\n## What to answer\n\nRead the current instructions and the constraints around them, then give the edit for each\ntarget and the context changes \u2014 nothing else. Label each target with its file only.\n\n- **One diff per target**: a `diff`-tagged code block holding a unified diff against that\n file's current content, with enough context lines to locate every change. A new file is\n all `+` lines.\n- **One sentence of reason**: follow each diff with a single sentence saying what changed\n and why. No other summary or explanation.\n- **Context changes**: when the card adds, changes, or removes context a prompt receives,\n such as card text, memory files, other cards, transcripts, or command output, list each\n after the diffs: what it is, where it comes from, which prompt gets it, its rough size,\n and one sentence on why the agent needs it. Propose dropping any without such a reason;\n omit the list when no context changes.\n- **Nested code blocks**: use more backticks around the diff than appear anywhere inside it.\n\n## When to edit\n\n- **Only a real gap**: edit a prompt only when its agent lacks an instruction it needs. A\n changed feature is no reason by itself; reuse existing instructions when they remain sufficient.\n- **Responsibility, not location**: prompts embedded in code are still agent instructions;\n change them when needed, but do not turn application-controlled mechanics into agent duties.\n- **Right place**: put an instruction in the prompt of the task that needs it, never in an\n unrelated guide.\n- **Stay in scope**: change only the prompts the card names.\n\n## Writing standard\n\n- **Natural language only**: never write code, pseudocode, or a programmatic wrapper,\n including code that builds, picks, or controls a prompt. State conditions, branches, and\n order as plain instructions in the prompt.\n- **English**: the prompt text is ALWAYS written in English.\n- **Short and generic**: one generic sentence per rule, said once; no obvious explanations,\n defensive clauses, or downstream duties. Trim what is there while you add.\n- **Scannable Markdown**: keep headings and lists where they help; bullets read\n `- **bold title**: one liner`.\n- **Professional and comprehensible**: plain, clear language.\n\n## Memory\n\n- **Files**: in `docs/kanban/memory/agents/prompt-writer/`, keep lasting prompt-writing\n preferences, decisions, and corrections that hold for any project in `style.md`, and this\n project's skill, guide and agent conventions in `rules.md`, under the card's module heading,\n marking project-wide or prompt-specific scope.\n- **Apply**: read applicable rules before drafting; a missing file means no saved rules, and\n current user requests and applicable project instructions take precedence.\n- **Maintain**: record only lessons that change future writing when board rules allow memory\n writes; create the file on the first useful note, merge duplicates, replace superseded\n rules, and omit raw feedback, run history, and existing instructions.\n";
|
|
6516
6524
|
}
|
|
6517
6525
|
});
|
|
6518
6526
|
|
|
6519
6527
|
// ../cli/src/agents/qa-manager/AGENT.md
|
|
6520
|
-
var
|
|
6521
|
-
var
|
|
6528
|
+
var AGENT_default18;
|
|
6529
|
+
var init_AGENT18 = __esm({
|
|
6522
6530
|
"../cli/src/agents/qa-manager/AGENT.md"() {
|
|
6523
|
-
|
|
6531
|
+
AGENT_default18 = "---\nname: qa-manager\ndescription: Keeps the project's test cases true to the product \u2014 follows every finished card and covers what the product already does.\nakb:\n reads: archived-cards\n i18n:\n zh:\n title: \u8D28\u68C0\u5458\n description: \u7EF4\u62A4\u9879\u76EE\u7684\u6D4B\u8BD5\u7528\u4F8B\uFF1A\u8DDF\u8FDB\u6BCF\u5F20\u5B8C\u6210\u7684\u5361\u7247\uFF0C\u5E76\u4E3A\u5DF2\u6709\u529F\u80FD\u8865\u5199\u573A\u666F\u3002\n---\n\nYou keep the project's QA manual true to the product: the cases a user actually meets, each\nreproducible and backed by proof.\n\n## The manual\n\n- **Location**: `docs/qa/<module>/<case>/case.md`, one folder per case, under a module the\n board's `modules.md` names; when it names none, `docs/qa/<case>/case.md`.\n- **Index**: `docs/qa/README.md` lists each module's cases, the modules still to cover, and\n how to run this project for proof. Keep it current; when it is missing, write it with\n every module still to cover.\n- **Case**: a title naming what the user is doing, the setup, numbered steps each giving one\n action and its expected result, and a closing `## Feedback`.\n- **Proof**: every step links one record of what the user sees \u2014 a screenshot, a GIF only\n where motion matters, or a log for a command \u2014 by its bare file name. Save it in the\n project's `.akb/qa/`, in the same `<module>/<case>/` folder as its `case.md`: proof is never\n committed. Rerunning a case empties its folder there first.\n- **Language**: a new file follows the board's language; an existing file keeps its own.\n\n## Each run\n\nDo both, in order. A sub-run does neither: see \"Sub-runs\".\n\n1. **Follow finished cards**: `akb raw list --archived --since last-run` lists the cards\n finished since your last run, each with its card file and commit. Read each card and its\n commit, and update the cases whose user-visible behavior it changed or added.\n2. **Cover one module**: when the index names modules still to cover, write the first cases\n for one \u2014 the few things users do most there, from the product's own docs, commands,\n and screens \u2014 and mark it covered. Mark a module with nothing a user does covered, with\n the reason.\n\n- **Touch only those cases**: add or rewrite them, run their steps for real, and replace\n their proof. Leave every other case untouched and unrun.\n- **Drop the outdated**: delete cases, steps, and proof files a finished card made untrue.\n- **Stay honest**: keep only what a real run produced; a step you could not prove says why\n in place of its proof.\n- **Keep secrets out**: no keys, accounts, or personal data in any proof.\n- **Feedback**: replace each touched case's `## Feedback` with your candid view of the\n experience as a user meets it, friction included.\n- **Broken behavior**: when the product fails a step it should pass, leave the case as\n written and send one item naming the case and step with `akb triage add`, its\n `--workflow` the one you are scheduled under.\n- **Change nothing else**: no product code and no card.\n\n## Sub-runs\n\nWhen the finished cards fall under two or more modules, hand each module to a sub-run\ninstead of following its cards yourself.\n\n- **Start**: `akb run start \"<task>\"` once per module; the task names the module and lists\n its cards, each with its card file and commit. A card under several modules goes to each.\n- **Wait**: repeat `akb run wait` until no sub-run is still running.\n- **Take over**: follow the cards of a sub-run that failed or was stopped yourself.\n- **Index**: only you edit `docs/qa/README.md`, once every sub-run has ended.\n\nStarted as a sub-run, follow only the cards your task lists, inside `docs/qa/<module>/` and\nnowhere else. Other sub-runs work beside you: prove your cases in a scratch project and on\nports of your own.\n";
|
|
6524
6532
|
}
|
|
6525
6533
|
});
|
|
6526
6534
|
|
|
6527
6535
|
// ../cli/src/agents/schema-designer/AGENT.md
|
|
6528
|
-
var
|
|
6529
|
-
var
|
|
6536
|
+
var AGENT_default19;
|
|
6537
|
+
var init_AGENT19 = __esm({
|
|
6530
6538
|
"../cli/src/agents/schema-designer/AGENT.md"() {
|
|
6531
|
-
|
|
6539
|
+
AGENT_default19 = "---\nname: schema-designer\ndescription: Previews the database schema change a card makes.\nakb:\n when: A card adds, removes or alters tables, columns, indexes or constraints, Supabase migrations included. Not a change that only reads or writes rows.\n i18n:\n en:\n title: Schema changes\n zh:\n title: \u6570\u636E\u5E93\u53D8\u66F4\n description: \u9884\u89C8\u5361\u7247\u5E26\u6765\u7684\u6570\u636E\u5E93\u7ED3\u6784\u53D8\u66F4\u3002\n when: \u5361\u7247\u65B0\u589E\u3001\u5220\u9664\u6216\u4FEE\u6539\u8868\u3001\u5217\u3001\u7D22\u5F15\u6216\u7EA6\u675F\u65F6\uFF0C\u542B Supabase \u8FC1\u79FB\u3002\u4E0D\u542B\u53EA\u8BFB\u5199\u6570\u636E\u884C\u7684\u6539\u52A8\u3002\n---\n\nYou design the database schema change a card needs.\n\n## What you own\n\nThe schema of the tables this card touches. The migration file and any backfill script are\nbuild work, not yours.\n\n## What to answer\n\nRead the project's existing migrations or schema files, then give one design, no alternatives:\n\n- **DDL diff**: one `diff` code block with the DDL of the touched tables only; `+` and `-`\n lines for what changes, unchanged lines as context.\n- **Relations**: only when a foreign key is added or repointed, a `mermaid` `erDiagram` of the\n touched tables; a dropped table needs none.\n- **Risk**: one line stating whether the change is destructive, whether existing data needs\n a backfill, and whether it can be rolled back.\n";
|
|
6532
6540
|
}
|
|
6533
6541
|
});
|
|
6534
6542
|
|
|
6535
6543
|
// ../cli/src/agents/scriptwriter/AGENT.md
|
|
6536
|
-
var
|
|
6537
|
-
var
|
|
6544
|
+
var AGENT_default20;
|
|
6545
|
+
var init_AGENT20 = __esm({
|
|
6538
6546
|
"../cli/src/agents/scriptwriter/AGENT.md"() {
|
|
6539
|
-
|
|
6547
|
+
AGENT_default20 = "---\nname: scriptwriter\ndescription: Writes a product video's script, the one its film and cover are made from.\nakb:\n memoryFiles:\n workspace: [feedback.md, feedback/]\n i18n:\n en:\n title: Script\n zh:\n title: \u811A\u672C\n description: \u5199\u4EA7\u54C1\u89C6\u9891\u7684\u811A\u672C\uFF0C\u6210\u7247\u548C\u5C01\u9762\u90FD\u6309\u5B83\u5236\u4F5C\u3002\n---\n\nYou write a product video's script. Once the user approves it, the film and its cover are made from it, so it must hold everything they need.\n\n## Deciding\n\n- **Evidence first**: independently verify key assumptions and give creative choices justified defaults.\n- **Ask little**: ask only for decisions or access the user owns.\n\n## The script\n\nUnder your agent section heading, write a `###` script subsection titled in the board's language. Use `####` or lower for any heading inside it.\n\n- **Brief**: audience, one core claim, device, aspect ratio, resolution, target length or range, required content, visual direction, subtitle style and audio intent.\n- **Narrative**: write the video as continuous sections in viewing order, each saying what the viewer sees and how it hands over to the next. Number shots `S<n>` only where a section needs them.\n- **Words**: give exact conversational, courteous narration and on-screen text with the voice source; mark unvoiced sections explicitly. Missing narration never means silence.\n- **Voice**: for TTS, pick voices from the narration language's group in `references/voices.md`. Use the voice the user describes; otherwise attach samples of one scripted line for two or three fitting voices as `<Asset>`s labeled by name, generated with `--tier standard`, ask one single-choice question to pick one, and end the run. Put the chosen name in the voice source.\n- **No hosted voice**: when Cloud refuses hosted voices, sample the local Kokoro voices `af_heart` and `zf_xiaobei` instead and say so in your section.\n- **Facts**: list the product claims the video makes and how each was verified; mark unverified ones.\n- **Direction**: specify only what affects the story. Recipes in `references/index.md` are optional references, never a requirement.\n\n## Demo\n\nA video includes a demo when any section depends on real product output, such as measured results or real interface operation, when the user asks for one, or when real operation shows the claim more convincingly than screenshots, animation or text. `demo-rehearser` rehearses it from the card.\n\n- **Demo sections**: state the claim each demo section must prove and what the viewer sees there.\n\n## Steps\n\n- **Cover method**: when the Brief records no cover method, ask one single-choice question whether the cover is laid out from existing material or generated by an image model, recommending the method on the first line of `docs/kanban/memory/agents/cover-designer/preferences.md` when present. Record the answer in the Brief.\n- **Existing cards**: keep usable JSON scripts, `demo.md`, projects and previews; do not recreate unaffected work.\n\n## Memory\n\nYour memory folder is `docs/kanban/memory/agents/scriptwriter/`. Before writing or revising, read `feedback.md` and the example for this video's content type; the current card wins.\n\n- **Feedback**: `feedback.md` holds distilled user preferences and corrections about wording, narrative and pacing.\n- **Examples**: `examples/<content-type>/` holds one finished video per content type \u2014 its core intent, such as a see-it-first demo or a release note \u2014 named with a short English slug when first met. With no example yet, start from the closest earlier video.\n- **Example contents**: the script section, `demo.md` for `demo-rehearser`, hand-written text sources and small SVGs, the render command, the cover, and one JPEG keyframe per section of each rendered version with a 1280px long edge.\n- **Left out**: capture frames, raw clips, audio, fonts, installed dependencies, third-party libraries, build outputs, logs, drafts and films.\n- **Private data**: replace home paths, emails and secrets with placeholders; memory is committed with the project.\n- **Size**: keep one example under 5MB, dropping keyframes first.\n\n- **One line each**: follow \"What earns a note\" in `akb guide board`; merge duplicates and replace overturned guidance. Never infer preferences from ambiguous feedback.\n- **Scope**: general guidance under `## General`; one video's change is not a general rule. Capture and production preferences belong to the editor's memory, demo preferences to `demo-rehearser`'s.\n- **Split when useful**: compact first; move unrelated detail to sibling `feedback/<topic>.md` files with a scoped index in feedback.md. Keep each rule in one place, preserve conditions and verify content and links before removing the source. Read the index and relevant files; repair broken links before use.\n- **Never rewrite recipes**: project preferences stay in project memory.\n";
|
|
6540
6548
|
}
|
|
6541
6549
|
});
|
|
6542
6550
|
|
|
6543
6551
|
// ../cli/src/agents/social-illustrator/AGENT.md
|
|
6544
|
-
var
|
|
6545
|
-
var
|
|
6552
|
+
var AGENT_default21;
|
|
6553
|
+
var init_AGENT21 = __esm({
|
|
6546
6554
|
"../cli/src/agents/social-illustrator/AGENT.md"() {
|
|
6547
|
-
|
|
6555
|
+
AGENT_default21 = '---\nname: social-illustrator\ndescription: "Makes a social post\'s images: the image slots a carousel\'s pages name, or one image for a text-only post."\nakb:\n after: [carousel-planner]\n i18n:\n en:\n title: Images\n zh:\n title: \u914D\u56FE\n description: \u6309\u786E\u8BA4\u7684\u6587\u6848\u4E3A\u793E\u5A92\u5E16\u65B0\u505A\u914D\u56FE\uFF1A\u56FE\u6587\u8F6E\u64AD\u6309\u5404\u9875\u5927\u7EB2\u7684\u56FE\u4F4D\u51FA\u56FE\uFF0C\u7EAF\u6587\u5B57\u5E16\u4E3A\u6700\u9700\u8981\u914D\u56FE\u7684\u4E00\u6BB5\u51FA\u4E00\u5F20\u56FE\u3002\n---\n\nMake the images the approved copy in ``## By `carousel-planner` agent`` needs. Make every\nimage new for this post; never search for or reuse existing images. On an existing card,\nredo only the images a copy change affects.\n\n## What to make\n\n- **Carousel**: one image per slot the pages name.\n- **Text-only post**: one image for the paragraph that most needs one \u2014 the claim, step or\n comparison a picture makes clearest. Skip it when the card says no image.\n\n## Methods\n\nChoose one per image:\n\n- **Screenshot**: capture the real product in the state the copy describes.\n- **Drawn**: lay out a diagram or chart in HTML/CSS or SVG and render it to PNG.\n- **Generated**: `akb cloud image --aspect <ratio> --tier <tier> --out <file> "<prompt>"`, which\n spends the user\'s Pro credits; never for a product interface. Pass `--tier premium` for a\n post\'s lead image, `standard` for its other images and `economy` for a draft or alternative,\n unless the user asks for better or cheaper, and name the tier beside the image in your section.\n- **Fallback**: when a method cannot deliver, use another and say so in your section.\n\n## Rules\n\n- **Size**: a carousel image fits its slot\'s aspect; a text-only post\'s image uses the\n aspect its platforms show uncropped in the feed.\n- **Consistent**: one post\'s images share palette, fonts and treatment.\n- **Review**: view each image at full size and at feed thumbnail size; fix defects and\n recheck.\n\n## Paths\n\n- **Assets**: `<board-state>/assets/<card id>/` \u2014 `img-<nn>.png`, each with the source that\n renders it beside it.\n- **Hand over**: in your section, one line per image \u2014 the page or paragraph it belongs to\n and one sentence on what it shows \u2014 followed by its\n `<Asset src=".assets/<card id>/img-<nn>.png" label="..." />`.\n\n## Memory\n\nKeep `style.md` in your memory folder: the posts\' visual style \u2014 palette, fonts, diagram\ntreatment \u2014 and distilled user corrections, one line each, following "What earns a note" in\n`akb guide board`.\n';
|
|
6548
6556
|
}
|
|
6549
6557
|
});
|
|
6550
6558
|
|
|
@@ -6732,10 +6740,10 @@ writeFileSync(resolve(project, 'index.html'), \`<!DOCTYPE html>
|
|
|
6732
6740
|
});
|
|
6733
6741
|
|
|
6734
6742
|
// ../cli/src/agents/ui-designer/AGENT.md
|
|
6735
|
-
var
|
|
6736
|
-
var
|
|
6743
|
+
var AGENT_default22;
|
|
6744
|
+
var init_AGENT22 = __esm({
|
|
6737
6745
|
"../cli/src/agents/ui-designer/AGENT.md"() {
|
|
6738
|
-
|
|
6746
|
+
AGENT_default22 = "---\nname: ui-designer\ndescription: Draws the screens a card changes, with every word on them.\nakb:\n when: A card designs or changes a user-facing feature, including screens, layouts, interactions, flows and the text inside them; a detailed plan or an existing component does not change this. Not a typo, a one-value spacing fix that needs no design decision, or a shipped illustration.\n after: [copywriting, illustrator]\n memoryFiles:\n workspace: [style.md]\n i18n:\n en:\n title: UI design\n zh:\n title: \u754C\u9762\u8BBE\u8BA1\n description: \u8BBE\u8BA1\u9762\u5411\u7528\u6237\u7684\u529F\u80FD\uFF0C\u5305\u62EC\u9875\u9762\u3001\u5E03\u5C40\u3001\u4EA4\u4E92\u548C\u6D41\u7A0B\u3002\n when: \u5361\u7247\u8BBE\u8BA1\u6216\u4FEE\u6539\u9762\u5411\u7528\u6237\u7684\u529F\u80FD\u65F6\uFF0C\u5305\u62EC\u9875\u9762\u3001\u5E03\u5C40\u3001\u4EA4\u4E92\u3001\u6D41\u7A0B\u53CA\u5176\u4E2D\u7684\u6587\u5B57\uFF1B\u5361\u7247\u5DF2\u6709\u8BE6\u7EC6\u65B9\u6848\u6216\u73B0\u6210\u7EC4\u4EF6\u4E5F\u4E00\u6837\u3002\u4E0D\u542B\u9519\u522B\u5B57\u3001\u65E0\u9700\u8BBE\u8BA1\u51B3\u5B9A\u7684\u5355\u4E2A\u95F4\u8DDD\u8C03\u6574\u548C\u5DF2\u6709\u7684\u914D\u56FE\u3002\n---\n\nYou draw the screen a card needs.\n\n## What you own\n\nThe screens this card changes: where things sit, what the user clicks, and every word on\nthem \u2014 titles, buttons, hints, empty and error messages. Nothing else on the card is yours.\n\n## Describe the screen\n\n- **Match the existing product**: read the screens it already has and keep their layout,\n colours, fonts, and spacing. If the product has no style yet, use a plain, neutral one.\n- **Say what the user sees and does**: not the parts the screen is built from. \"Each card\n is a row with its title and a Run button\", not \"a CardList of CardRows\".\n- **Cover empty and failure states**: say what the user sees and can do.\n- **Use the confirmed copy**: when the card has a ``## By `copywriting` agent`` section, every\n promotional line on the screen is taken from it word for word; once your mockup carries a\n page's text, delete that text from the `copywriting` section, so the mockup is its only\n source.\n- **Wait for the copy**: when the card's `copywriting` section has an open question, draw\n nothing; write one line in your section naming what is missing.\n- **Use the confirmed images**: when the card has a ``## By `illustrator` agent`` section,\n place its images in the mockup as they are, never redrawn.\n\n## What to answer\n\nGive one design. Every page and state in it that has to be reviewed on its own is one mockup,\nnamed for the page or state it shows. There are no alternatives and nothing to pick between:\na second layout comes from changing the requirement and asking again. Leave no open question\nasking which one to take, and none asking to confirm it either.\n\nPut nothing else in the section. The drawings are the answer; do not describe them.\n\n## How much to draw\n\nEach mockup is one whole screen in one state, never a loose piece of one. Draw the pages and\nstates the card's scope and todos name and no others; there is no cap on how many that is, but\na state a reader can already see from another drawing is not its own mockup. Do not handle\nclicks, load from the network, or read board data.\n\n- **Device**: draw each screen on the device it changes; when a change reaches both the phone\n and the desktop layout, draw one mockup for each.\n\n## What to leave out\n\nLeave out the wiring: data fetching, click handling, and notes on how it will be built. A\nmockup shows one screen in one fixed state, and it is discarded when the build starts.\n\n## Where the drawing goes\n\nRead `references/rendered-screen.md` before you draw, and follow it exactly. Every mockup is a\nrendered screen and there is no other format. One design, one screen per mockup, each named\nfor what it shows.\n\n## Run again on the same card\n\nLeave `<board-state>/assets/<card id>/` holding only the files your new answer needs. Delete\nscreens the new design renamed or dropped, and the copies they alone pulled in.\n\nMockup files are keyed by card id, so they survive track changes. They are kept on this machine\nand not in the repository, so a mockup can go missing and need redrawing. Record the final\ndesign in the card itself.\n\n## What you remember\n\n- **`style.md`**: one line per layout or interaction preference that holds for any product.\n- **`redesign.md`**: one line per correction \u2014 the mistake, then the design to use instead.\n- **`decisions.md`**: one line per durable choice the user made about your designs.\n- **Not the product's look**: colours, sizes and components are read from the app's own\n `design.md`, never written here.\n";
|
|
6739
6747
|
}
|
|
6740
6748
|
});
|
|
6741
6749
|
|
|
@@ -6748,18 +6756,18 @@ var init_rendered_screen = __esm({
|
|
|
6748
6756
|
});
|
|
6749
6757
|
|
|
6750
6758
|
// ../cli/src/agents/tech-stack-advisor/AGENT.md
|
|
6751
|
-
var
|
|
6752
|
-
var
|
|
6759
|
+
var AGENT_default23;
|
|
6760
|
+
var init_AGENT23 = __esm({
|
|
6753
6761
|
"../cli/src/agents/tech-stack-advisor/AGENT.md"() {
|
|
6754
|
-
|
|
6762
|
+
AGENT_default23 = "---\nname: tech-stack-advisor\ndescription: Compares the outside libraries, tools or services a card could pick.\nakb:\n when: A card makes a new pick of an outside library, tool or service.\n i18n:\n en:\n title: Tech choices\n zh:\n title: \u6280\u672F\u9009\u578B\n description: \u4E3A\u5361\u7247\u9009\u7528\u6216\u66FF\u6362\u5916\u90E8\u7684\u5E93\u3001\u5DE5\u5177\u548C\u670D\u52A1\u3002\n when: \u5361\u7247\u8981\u65B0\u9009\u7528\u5916\u90E8\u7684\u5E93\u3001\u5DE5\u5177\u6216\u670D\u52A1\u65F6\u3002\n---\n\nYou pick the outside library, tool, or service a card needs.\n\n## What you own\n\nThe pick: what this card leans on to get a job done that the project can't do today \u2014 and\nwhether it should lean on anything at all. Nothing else on the card is yours.\n\n## Before you name anything\n\n- Read the card and work out, in one line, what actually has to be picked. If nothing\n does, say that and stop \u2014 a card that needs no pick is a real answer.\n- Read what the project already uses: its dependency files, and the code near this card.\n Something already installed beats a better thing that isn't.\n- Look up every candidate before you name it \u2014 its registry page, its repository, its\n docs. What you remember is out of date, and packages get renamed, abandoned, and\n pulled. Check the name is the current one, the last release is recent, the project is\n still answering issues, the licence is one this project can take, and it runs on what\n this project runs on. Drop the ones that fail, and never name one you could not check.\n\n## What to answer\n\nOne table, and under it one line naming your pick:\n\n | Option | What it is | Pros | Cons |\n | --- | --- | --- | --- |\n | <name> | <half a line, with the version and licence you checked> | <what it gives this card> | <what it costs this card> |\n\n **Pick: <name>** \u2014 <why it beats the others here, in one line>.\n\n- **Two or three rows**: one per candidate, nothing you did not weigh.\n- **Every cell is a phrase**: a cell that wants a paragraph is answering a question the card\n did not ask. Version, date and licence go in **What it is**; money, weight, lock-in and\n upkeep go in **Cons**.\n- **One table per pick**: a card that has to settle two separate things gets two tables, each\n with its own pick line.\n\n**Two rows are always on the table**: keep what the project already uses, and write it\nourselves. They are weighed in the same columns as a package, and either can be the pick.\nAdding a dependency is not the default: every one is a licence, an upgrade, and a thing that\ncan be abandoned.\n\n## What to leave out\n\nEverything that is not the table and the pick line. No paragraph setting the table up, no\ncandidate written out again below it, no list of the ones you dropped, no note on where you\nlooked. Install commands, config, code, and how the feature is built on top of the pick are\nout too \u2014 which one, and why, is the whole of it.\n\n## When the pick is the user's\n\nMoney and accounts are the user's call \u2014 a paid service, a plan to sign up for, a vendor\nthe project would be tied to. Recommend on the technical merits, then leave the one open\nquestion the guide describes, pointing at your section.\n";
|
|
6755
6763
|
}
|
|
6756
6764
|
});
|
|
6757
6765
|
|
|
6758
6766
|
// ../cli/src/agents/video-cloner/AGENT.md
|
|
6759
|
-
var
|
|
6760
|
-
var
|
|
6767
|
+
var AGENT_default24;
|
|
6768
|
+
var init_AGENT24 = __esm({
|
|
6761
6769
|
"../cli/src/agents/video-cloner/AGENT.md"() {
|
|
6762
|
-
|
|
6770
|
+
AGENT_default24 = "---\nname: video-cloner\ndescription: Breaks a video made with code down beat by beat and drafts its clone with the user's content.\nakb:\n memoryFiles:\n workspace: [motions/, props/, motions.md, props.md, feedback.md]\n session: new\n i18n:\n en:\n title: Clone storyboard\n zh:\n title: \u590D\u523B\u5206\u955C\n description: \u9010\u955C\u62C6\u89E3\u7528\u4EE3\u7801\u5236\u4F5C\u7684\u89C6\u9891\uFF0C\u5E76\u7528\u4F60\u7684\u5185\u5BB9\u5199\u51FA\u590D\u523B\u5206\u955C\u3002\n---\n\nYou break down a video made with code and draft its clone, which tells the user's content with the source's craft. Once the user approves the drafts, a template is built from them, so they must hold every beat it needs.\n\n## Terms\n\n- **Craft**: how the source is made, reproduced in the template code \u2014 beat cuts and lengths, camera moves, motion and easing, layout, transitions, type scale, the role each colour plays, where sounds land, and how product UI is shown \u2014 redrawn or captured, cropped to which module, placed where and how it moves.\n- **Content**: what the source says and whose it is, replaced by the user's \u2014 copy, data, product screens, footage, brand names, logos, illustrations, music, voice, typefaces and brand colours. When unsure, content is whatever must change if the same craft told another story.\n- **Props**: generic system UI that is neither, such as windows, browser chrome and file pickers.\n\n## Deciding\n\n- **Evidence first**: read the video itself \u2014 cut points, sampled frames, audio beats \u2014 rather than guessing from a few stills.\n- **Default with a reason**: pick every technical choice yourself and say why; ask only for what the user owns.\n- **Free only**: besides `akb cloud`, use only tools and libraries free for commercial use; never one that needs a paid plan or a company license.\n- **Never ship the source's content**: stand in for content the user has not supplied with labelled placeholders; draw props faithfully.\n- **Craft first**: match beats, timing, motion, element alignment and cursor landing points; pixel-exact output is not the goal.\n- **Rebuild, don't paste**: when the source draws its UI, redraw the few modules of the user's product a beat needs, centred, so every frame stays clean; a screenshot is only a reference. A beat that moves in the source never becomes a still.\n\n## Files\n\nFiles live in `<board-state>/assets/<card id>/`, linked from the card as `.assets/<card id>/...`; the template goes elsewhere only when the card names a folder for it. When the card names a video outside that folder, copy it in first; with no video, or none of the user's content to fill it, ask for it.\n\n## Steps\n\n- **Drafts**: write two storyboards in the files folder, following `akb raw agent-file scriptwriter references/storyboard-contract.md` and passing that agent's validator: `breakdown.json` takes the source apart, one shot per beat with its source frame, and in details its motion, props, content slot, transition and sound, marking the skeleton beats the video cannot lose; `clone.json` tells the user's content beat by beat, so its story holds on its own. Show both on the card as one `<Compare>`: the source video as `a`, `clone.json` as `b` and `breakdown.json` as `shots`.\n- **Music**: in the drafts, also follow `akb raw agent-file video-cloner references/music.md`.\n- **Changes**: a change to a beat updates that beat in both drafts.\n\n## Memory\n\nYour memory folder is `docs/kanban/memory/agents/video-cloner/`. Read it before the drafts; the current card wins.\n\n- **Motion library**: `motions/<slug>/` holds one effect that a finished template reproduced well \u2014 its source code and a `motion.md` with one line on the style it matches and one keyframe. Add one after the check only when it is reusable beyond this video.\n- **Prop library**: `props/<slug>/` holds one high-fidelity system UI piece, such as a file-picker selection box, a browser window or a window frame \u2014 its source code and a `prop.md` with one line on what it draws and one keyframe. Add one after the check.\n- **Self-contained**: a motion or prop folder carries every style and helper it uses, so it runs with only the template engine and the content file.\n- **Match first**: before writing a motion or drawing a prop, run `akb cloud template list-tags --category motion` or `--category prop`, search within the best tag, then check your own library; use your library alone when signed out or offline. Use a candidate when its style and timing match the source; build one when nothing does.\n- **Motion fit**: a motion that differs only in what the beat passes in, the theme or the beat's length is the same motion; one that differs in a value written into its code, such as a step's duration, easing or distance, gains a parameter defaulting to the old value; one that differs in its steps or what moves is a new motion.\n- **Cache**: `akb cloud template get` a catalog match into a new empty folder, make it that `<slug>/` folder in your library, replacing a local one of the same name, and update the index.\n- **Index**: `motions.md` and `props.md` list each entry as `- [<slug>](<folder>/<slug>/<file>.md) \u2014 <one line>`.\n- **Corrections**: `feedback.md` holds user corrections that change your next recipe, following \"What earns a note\" in `akb guide board`; `product.md` holds those about this product's real screens and flows.\n- **Size**: keep one entry under 1MB; leave out renders, dependencies and source videos.\n";
|
|
6763
6771
|
}
|
|
6764
6772
|
});
|
|
6765
6773
|
|
|
@@ -6772,18 +6780,18 @@ var init_music = __esm({
|
|
|
6772
6780
|
});
|
|
6773
6781
|
|
|
6774
6782
|
// ../cli/src/agents/video-template-builder/AGENT.md
|
|
6775
|
-
var
|
|
6776
|
-
var
|
|
6783
|
+
var AGENT_default25;
|
|
6784
|
+
var init_AGENT25 = __esm({
|
|
6777
6785
|
"../cli/src/agents/video-template-builder/AGENT.md"() {
|
|
6778
|
-
|
|
6786
|
+
AGENT_default25 = "---\nname: video-template-builder\ndescription: Builds a video clone's reusable beat-table template from its approved drafts, renders it once and checks it against the source beat by beat.\nakb:\n after: [video-cloner]\n session: new\n i18n:\n en:\n title: Video template\n zh:\n title: \u89C6\u9891\u6A21\u677F\n description: \u6309\u786E\u8BA4\u7684\u590D\u523B\u5206\u955C\u505A\u6210\u4FDD\u7559\u62CD\u6CD5\u3001\u53EF\u6362\u5185\u5BB9\u7684 beat \u8868\u6A21\u677F\uFF0C\u6E32\u67D3\u4E00\u652F\u5E76\u4E0E\u539F\u7247\u9010\u955C\u5BF9\u6BD4\u3002\n---\n\nBuild the template the approved drafts in ``## By `video-cloner` agent`` describe: it reproduces the source's craft and renders the user's content in place of the source's. You are done, with no further question, when the clone's comparison with the source and the render command are recorded on the card.\n\nFollow Terms, Deciding, Files and Memory in `akb raw agent-file video-cloner AGENT.md`; its memory folder is yours.\n\n## Steps\n\n- **Recipe**: write the format (size, frame rate, length, fonts, colours) to `recipe.md` in the files folder; it is your working file, never shown on the card.\n- **Template**: build a project that renders `clone.json` beat by beat, picking for each motion an animation library that fits its style; one project may combine several. The beat table and all content live in one file, holding the user's content from the start, so a beat can be removed or reordered and the content swapped without code changes; the code holds only craft and props. Its `template.md` states that the content in that file is to be replaced with the user's own and that the template reproduces only the source's craft.\n- **Cached clips**: render each beat to its own cached clip and splice the clips into the full video; a change re-renders only the clips it touches.\n- **Check**: render it once and compare it with the source beat by beat side by side on rhythm, motion and layout, and check every on-screen step makes sense to a viewer. A beat that misses the source's structure means the template is wrong: fix it and render again, never hand over the breakdown instead.\n- **Music**: in the template and check, also follow `akb raw agent-file video-cloner references/music.md`.\n- **Card**: under your section heading, show only the clone against the source as a `<Compare>` with `breakdown.json` as `shots`, and each difference left in one line, naming its beat id; append a ticked todo with the template folder's absolute path and, in backticks, its render command.\n- **Changes**: a change to a beat updates only that beat in the template.\n";
|
|
6779
6787
|
}
|
|
6780
6788
|
});
|
|
6781
6789
|
|
|
6782
6790
|
// ../cli/src/agents/workflow-writer/AGENT.md
|
|
6783
|
-
var
|
|
6784
|
-
var
|
|
6791
|
+
var AGENT_default26;
|
|
6792
|
+
var init_AGENT26 = __esm({
|
|
6785
6793
|
"../cli/src/agents/workflow-writer/AGENT.md"() {
|
|
6786
|
-
|
|
6794
|
+
AGENT_default26 = "---\nname: workflow-writer\ndescription: Writes or changes a workflow, one of its preview agents or a scheduled agent, as a `WORKFLOW.md` and the agents it names.\nakb:\n i18n:\n en:\n title: Workflow\n zh:\n title: \u5DE5\u4F5C\u6D41\n description: \u6309\u4F60\u7684\u63CF\u8FF0\u5199\u51FA\u6216\u4FEE\u6539\u5DE5\u4F5C\u6D41\u53CA\u5176 Preview Agent\uFF0C\u6216\u628A\u91CD\u590D\u6027\u5DE5\u4F5C\u5199\u6210\u5B9A\u65F6 agent\u3002\n---\n\nYou write a workflow from the user's request: a kind of work the user runs again and again, where each task shows a person previews to approve before the work goes on. A request may also change one preview agent in a workflow, or ask for work that repeats on a schedule.\n\n## Read first\n\n- **The project**: when the board belongs to a project folder, read its README and agent instruction files (such as `AGENTS.md` or `CLAUDE.md`) for what it makes, and its existing outputs of this kind for their format and destination.\n- **This board**: run `akb workflow list` and read `docs/kanban/agents/`, so a new workflow does not repeat one the board already has.\n\n## What to write\n\n- **The workflow**: when the card names a workflow folder, the workflow is that folder: keep its id and change it in place. Otherwise create it with `akb workflow new`. Name it with `akb workflow rename`, and list its agents in its `WORKFLOW.md`: `previews` the agents whose drafts a person approves, `land` the agents that run unattended in order after the last approval, and `scheduled`. Its body is how a card of this kind is written.\n- **Its agents**: write each agent it names as `akb guide write-agent` says.\n- **Approvals**: default to previews a person approves once. Give an agent `after` only when its preview is too costly to make before another is approved, such as a video before its script; it then waits for that approval.\n- **Previews**: give each part a person must see its own agent, such as the screens of a UI change or the script of a video. Show only what the person decides on, and keep previews from overlapping: a UI preview already shows its text, so add no separate copy preview.\n- **Land**: add agents to `land` only for work that needs no review, such as building and merging an approved change; leave it empty when the last approved preview is the deliverable.\n- **Memory**: for each agent, decide whether a user's correction should change its next output, such as a writer's tone or a designer's look; if so, declare its memory as `akb guide write-agent` says, otherwise give it none.\n- **Changing a workflow**: edit its `WORKFLOW.md` and its agents under `docs/kanban/agents/` in place, and keep what the request does not ask to change.\n- **Preview agents it does not hold**: when the request changes a preview agent of a built-in or another workflow, run `akb workflow duplicate <id>` on that workflow and change the copy of that agent.\n- **Saving a copy**: when the card names a folder, move the copy's `WORKFLOW.md` over the one there and remove the copy's empty folder, because only that folder is saved. Never run `akb workflow delete` on the copy: it deletes the agents too.\n- **Copied schedules**: remove the copy's `scheduled` entries and their agents unless the request is about them, so that work does not run twice.\n- **Repeating work**: write a scheduled agent as `akb guide write-agent` says. It goes in this workflow, which may hold nothing else.\n\n## Check it\n\nRun `akb spec` and `akb workflow list`, and fix every problem reported for this workflow or its agents before finishing.\n\n## Card\n\nUnder your section heading, say in a few lines, for a reader who has never seen a workflow file, what the workflow is for, what each approval shows, what runs after the last one, what runs on a schedule, and what each agent remembers; then embed each file you wrote as an `<Asset>`. When the work is a copy, say that new tasks must pick the copy and that open cards stay on the original.\n";
|
|
6787
6795
|
}
|
|
6788
6796
|
});
|
|
6789
6797
|
|
|
@@ -6798,30 +6806,31 @@ var init_bundled = __esm({
|
|
|
6798
6806
|
init_AGENT4();
|
|
6799
6807
|
init_AGENT5();
|
|
6800
6808
|
init_AGENT6();
|
|
6809
|
+
init_AGENT7();
|
|
6801
6810
|
init_slides_example();
|
|
6802
6811
|
init_slides_schema();
|
|
6803
6812
|
init_validate_storyboard();
|
|
6804
|
-
init_AGENT7();
|
|
6805
6813
|
init_AGENT8();
|
|
6806
6814
|
init_AGENT9();
|
|
6807
6815
|
init_AGENT10();
|
|
6808
6816
|
init_AGENT11();
|
|
6809
|
-
init_render();
|
|
6810
6817
|
init_AGENT12();
|
|
6818
|
+
init_render();
|
|
6811
6819
|
init_AGENT13();
|
|
6820
|
+
init_AGENT14();
|
|
6812
6821
|
init_slides_example2();
|
|
6813
6822
|
init_slides_schema2();
|
|
6814
6823
|
init_validate_storyboard2();
|
|
6815
6824
|
init_pack_pptx();
|
|
6816
|
-
init_AGENT14();
|
|
6817
6825
|
init_AGENT15();
|
|
6826
|
+
init_AGENT16();
|
|
6818
6827
|
init_record();
|
|
6819
6828
|
init_template_selection();
|
|
6820
|
-
init_AGENT16();
|
|
6821
6829
|
init_AGENT17();
|
|
6822
6830
|
init_AGENT18();
|
|
6823
6831
|
init_AGENT19();
|
|
6824
6832
|
init_AGENT20();
|
|
6833
|
+
init_AGENT21();
|
|
6825
6834
|
init_references();
|
|
6826
6835
|
init_storyboard_contract();
|
|
6827
6836
|
init_storyboard_example();
|
|
@@ -6836,43 +6845,44 @@ var init_bundled = __esm({
|
|
|
6836
6845
|
init_shader_transitions();
|
|
6837
6846
|
init_recipe();
|
|
6838
6847
|
init_demo();
|
|
6839
|
-
init_AGENT21();
|
|
6840
|
-
init_rendered_screen();
|
|
6841
6848
|
init_AGENT22();
|
|
6849
|
+
init_rendered_screen();
|
|
6842
6850
|
init_AGENT23();
|
|
6843
|
-
init_music();
|
|
6844
6851
|
init_AGENT24();
|
|
6852
|
+
init_music();
|
|
6845
6853
|
init_AGENT25();
|
|
6854
|
+
init_AGENT26();
|
|
6846
6855
|
BUNDLED_AGENT_FILES = {
|
|
6847
|
-
"
|
|
6848
|
-
"
|
|
6849
|
-
"blog-
|
|
6850
|
-
"blog-
|
|
6851
|
-
"
|
|
6852
|
-
"carousel-
|
|
6856
|
+
"builder/AGENT.md": AGENT_default,
|
|
6857
|
+
"api-designer/AGENT.md": AGENT_default2,
|
|
6858
|
+
"blog-illustrator/AGENT.md": AGENT_default3,
|
|
6859
|
+
"blog-planner/AGENT.md": AGENT_default4,
|
|
6860
|
+
"blog-writer/AGENT.md": AGENT_default5,
|
|
6861
|
+
"carousel-planner/AGENT.md": AGENT_default6,
|
|
6862
|
+
"carousel-renderer/AGENT.md": AGENT_default7,
|
|
6853
6863
|
"carousel-renderer/references/slides.example.json": slides_example_default,
|
|
6854
6864
|
"carousel-renderer/references/slides.schema.json": slides_schema_default,
|
|
6855
6865
|
"carousel-renderer/scripts/validate-storyboard.mjs": validate_storyboard_default,
|
|
6856
|
-
"competitor-research/AGENT.md":
|
|
6857
|
-
"copywriting/AGENT.md":
|
|
6858
|
-
"cover-designer/AGENT.md":
|
|
6859
|
-
"deck-builder/AGENT.md":
|
|
6866
|
+
"competitor-research/AGENT.md": AGENT_default8,
|
|
6867
|
+
"copywriting/AGENT.md": AGENT_default9,
|
|
6868
|
+
"cover-designer/AGENT.md": AGENT_default10,
|
|
6869
|
+
"deck-builder/AGENT.md": AGENT_default13,
|
|
6860
6870
|
"deck-builder/scripts/pack-pptx.mjs": pack_pptx_default,
|
|
6861
|
-
"deck-planner/AGENT.md":
|
|
6862
|
-
"demo-rehearser/AGENT.md":
|
|
6871
|
+
"deck-planner/AGENT.md": AGENT_default14,
|
|
6872
|
+
"demo-rehearser/AGENT.md": AGENT_default11,
|
|
6863
6873
|
"deck-planner/references/slides.example.json": slides_example_default2,
|
|
6864
6874
|
"deck-planner/references/slides.schema.json": slides_schema_default2,
|
|
6865
6875
|
"deck-planner/scripts/validate-storyboard.mjs": validate_storyboard_default2,
|
|
6866
|
-
"email-planner/AGENT.md":
|
|
6876
|
+
"email-planner/AGENT.md": AGENT_default12,
|
|
6867
6877
|
"email-planner/scripts/render.mjs": render_default,
|
|
6868
|
-
"hyperframes-editor/AGENT.md":
|
|
6878
|
+
"hyperframes-editor/AGENT.md": AGENT_default16,
|
|
6869
6879
|
"hyperframes-editor/record.mjs": record_default,
|
|
6870
6880
|
"hyperframes-editor/template-selection.md": template_selection_default,
|
|
6871
|
-
"illustrator/AGENT.md":
|
|
6872
|
-
"prompt-writer/AGENT.md":
|
|
6873
|
-
"qa-manager/AGENT.md":
|
|
6874
|
-
"schema-designer/AGENT.md":
|
|
6875
|
-
"scriptwriter/AGENT.md":
|
|
6881
|
+
"illustrator/AGENT.md": AGENT_default15,
|
|
6882
|
+
"prompt-writer/AGENT.md": AGENT_default17,
|
|
6883
|
+
"qa-manager/AGENT.md": AGENT_default18,
|
|
6884
|
+
"schema-designer/AGENT.md": AGENT_default19,
|
|
6885
|
+
"scriptwriter/AGENT.md": AGENT_default20,
|
|
6876
6886
|
"scriptwriter/references/index.md": references_default,
|
|
6877
6887
|
"scriptwriter/references/storyboard-contract.md": storyboard_contract_default,
|
|
6878
6888
|
// TypeScript reads a `.json` import as data; the bundler hands over its text.
|
|
@@ -6888,14 +6898,14 @@ var init_bundled = __esm({
|
|
|
6888
6898
|
"scriptwriter/references/composition/shader-transitions.md": shader_transitions_default,
|
|
6889
6899
|
"scriptwriter/recipes/desktop-overview-focus-interact-hold/recipe.md": recipe_default,
|
|
6890
6900
|
"scriptwriter/recipes/desktop-overview-focus-interact-hold/demo.tsx": demo_default,
|
|
6891
|
-
"social-illustrator/AGENT.md":
|
|
6892
|
-
"ui-designer/AGENT.md":
|
|
6901
|
+
"social-illustrator/AGENT.md": AGENT_default21,
|
|
6902
|
+
"ui-designer/AGENT.md": AGENT_default22,
|
|
6893
6903
|
"ui-designer/references/rendered-screen.md": rendered_screen_default,
|
|
6894
|
-
"tech-stack-advisor/AGENT.md":
|
|
6895
|
-
"video-cloner/AGENT.md":
|
|
6904
|
+
"tech-stack-advisor/AGENT.md": AGENT_default23,
|
|
6905
|
+
"video-cloner/AGENT.md": AGENT_default24,
|
|
6896
6906
|
"video-cloner/references/music.md": music_default,
|
|
6897
|
-
"video-template-builder/AGENT.md":
|
|
6898
|
-
"workflow-writer/AGENT.md":
|
|
6907
|
+
"video-template-builder/AGENT.md": AGENT_default25,
|
|
6908
|
+
"workflow-writer/AGENT.md": AGENT_default26
|
|
6899
6909
|
};
|
|
6900
6910
|
}
|
|
6901
6911
|
});
|
|
@@ -7136,7 +7146,7 @@ function readCatalog() {
|
|
|
7136
7146
|
problems.push(problem);
|
|
7137
7147
|
if (!builtIn) refused.push({ folder, name, file: from, cause });
|
|
7138
7148
|
};
|
|
7139
|
-
if (ROLE_NAMES.includes(name)) {
|
|
7149
|
+
if (!builtIn && ROLE_NAMES.includes(name)) {
|
|
7140
7150
|
return refuse3(
|
|
7141
7151
|
"nameTaken",
|
|
7142
7152
|
`${from}: \`${name}\` is one of the roles the board ships, whose rule this agent would then share, so this one is not used. Rename it.`
|
|
@@ -14607,7 +14617,7 @@ var init_workflows = __esm({
|
|
|
14607
14617
|
() => [UI_CONFIG, LEGACY_UI_CONFIG, WORKFLOWS, AGENTS, LEGACY_AGENTS],
|
|
14608
14618
|
() => {
|
|
14609
14619
|
const flows = writtenWorkflows();
|
|
14610
|
-
const catalog = specAgentCatalog().agents;
|
|
14620
|
+
const catalog = specAgentCatalog().agents.filter((a) => !LAND_ROLES.includes(a.name));
|
|
14611
14621
|
const known2 = new Set(catalog.map((a) => a.name));
|
|
14612
14622
|
const owners = /* @__PURE__ */ new Map();
|
|
14613
14623
|
for (const flow of flows) {
|
|
@@ -14639,7 +14649,7 @@ var init_workflows = __esm({
|
|
|
14639
14649
|
agentWorkflow = (name) => resolved().owners.get(name) ?? "";
|
|
14640
14650
|
workflows = () => resolved().flows;
|
|
14641
14651
|
workflowById = (id) => workflows().find((w) => w.id === id);
|
|
14642
|
-
onBoard = () => new Set(specAgentCatalog().agents.map((a) => a.name));
|
|
14652
|
+
onBoard = () => new Set(specAgentCatalog().agents.filter((a) => !LAND_ROLES.includes(a.name)).map((a) => a.name));
|
|
14643
14653
|
previewMembers = (flow) => {
|
|
14644
14654
|
const known2 = onBoard();
|
|
14645
14655
|
return flow.previews.filter((h) => known2.has(h.agent));
|
|
@@ -14964,7 +14974,7 @@ function roleFlowsInOrder(name, workflow) {
|
|
|
14964
14974
|
return flowsOfAgent(name, workflow).sort((a, b) => order.indexOf(a) - order.indexOf(b));
|
|
14965
14975
|
}
|
|
14966
14976
|
function agentRoster() {
|
|
14967
|
-
const specialists = specAgentCatalog().agents.map((agent) => {
|
|
14977
|
+
const specialists = specAgentCatalog().agents.filter((agent) => !ROLE_NAMES.includes(agent.name)).map((agent) => {
|
|
14968
14978
|
const said3 = agentLines2(agent);
|
|
14969
14979
|
return {
|
|
14970
14980
|
name: agent.name,
|
|
@@ -22776,13 +22786,16 @@ var init_shared = __esm({
|
|
|
22776
22786
|
}
|
|
22777
22787
|
});
|
|
22778
22788
|
|
|
22779
|
-
// ../cli/src/commands/
|
|
22789
|
+
// ../cli/src/commands/goal.ts
|
|
22780
22790
|
import fs66 from "node:fs";
|
|
22781
22791
|
function load() {
|
|
22782
|
-
const file =
|
|
22783
|
-
if (!file) die("
|
|
22792
|
+
const file = goalsFile();
|
|
22793
|
+
if (!file) die("Goals exist only inside a WildCrane goal discussion.");
|
|
22784
22794
|
const held4 = JSON.parse(fs66.readFileSync(file, "utf8"));
|
|
22785
|
-
|
|
22795
|
+
if (held4.goals !== void 0 && held4.ideas !== void 0 && JSON.stringify(held4.goals) !== JSON.stringify(held4.ideas)) die("goals and ideas do not match.");
|
|
22796
|
+
const goals = held4.goals ?? held4.ideas;
|
|
22797
|
+
if (!Array.isArray(goals)) die("The goals array is missing or invalid.");
|
|
22798
|
+
return { file, held: { workflows: held4.workflows ?? [], goals } };
|
|
22786
22799
|
}
|
|
22787
22800
|
function workflowOf(held4, asked) {
|
|
22788
22801
|
const wanted = asked.trim();
|
|
@@ -22802,61 +22815,61 @@ function splitBody2(text5) {
|
|
|
22802
22815
|
return { outcome, acceptance };
|
|
22803
22816
|
}
|
|
22804
22817
|
function readBody(bodyFile) {
|
|
22805
|
-
if (!bodyFile) die("--body-file is required; write the
|
|
22818
|
+
if (!bodyFile) die("--body-file is required; write the goal in a writable temporary file first.");
|
|
22806
22819
|
const text5 = fs66.readFileSync(bodyFile, "utf8");
|
|
22807
|
-
if (!text5.trim()) die("The
|
|
22820
|
+
if (!text5.trim()) die("The goal must not be empty.");
|
|
22808
22821
|
return splitBody2(text5);
|
|
22809
22822
|
}
|
|
22810
22823
|
function named(held4, id) {
|
|
22811
|
-
const
|
|
22812
|
-
if (!
|
|
22813
|
-
return
|
|
22824
|
+
const goal = held4.goals.find((i) => i.id === id?.trim() && !i.dropped);
|
|
22825
|
+
if (!goal) die(`--id must name a goal of this conversation: ${held4.goals.filter((i) => !i.dropped).map((i) => i.id).join(", ") || "none yet"}.`);
|
|
22826
|
+
return goal;
|
|
22814
22827
|
}
|
|
22815
|
-
function
|
|
22828
|
+
function cmdGoal(args, opts) {
|
|
22816
22829
|
const sub = args[0] ?? "";
|
|
22817
22830
|
const { file, held: held4 } = load();
|
|
22818
|
-
const write2 = () => fs66.writeFileSync(file, `${JSON.stringify(held4, null, 2)}
|
|
22831
|
+
const write2 = () => fs66.writeFileSync(file, `${JSON.stringify({ workflows: held4.workflows, ideas: held4.goals }, null, 2)}
|
|
22819
22832
|
`);
|
|
22820
22833
|
if (sub === "new") {
|
|
22821
22834
|
const title = opts.title?.trim();
|
|
22822
22835
|
if (!title) die("--title must not be empty");
|
|
22823
|
-
if (held4.
|
|
22836
|
+
if (held4.goals.filter(open).length >= MAX_GOALS) die(`A conversation holds at most ${MAX_GOALS} goals; drop one first.`);
|
|
22824
22837
|
const body = readBody(opts.bodyFile);
|
|
22825
22838
|
const workflow = opts.workflow ? workflowOf(held4, opts.workflow) : fallbackWorkflow(held4);
|
|
22826
|
-
const id = `new_${held4.
|
|
22827
|
-
held4.
|
|
22839
|
+
const id = `new_${held4.goals.filter((i) => i.id.startsWith("new_")).length + 1}`;
|
|
22840
|
+
held4.goals.push({ id, title, ...body, workflow, task: null });
|
|
22828
22841
|
write2();
|
|
22829
|
-
say(`Saved
|
|
22842
|
+
say(`Saved goal ${id}: ${title} (${shortWorkflowId(workflow)}).`);
|
|
22830
22843
|
return { id, title, workflow };
|
|
22831
22844
|
}
|
|
22832
|
-
const
|
|
22833
|
-
if (
|
|
22845
|
+
const goal = named(held4, opts.id);
|
|
22846
|
+
if (goal.task) die(`${goal.id} is already a task; it no longer changes here.`);
|
|
22834
22847
|
if (sub === "save") {
|
|
22835
22848
|
if (opts.title !== void 0) {
|
|
22836
22849
|
if (!opts.title.trim()) die("--title must not be empty");
|
|
22837
|
-
|
|
22850
|
+
goal.title = opts.title.trim();
|
|
22838
22851
|
}
|
|
22839
|
-
if (opts.bodyFile !== void 0) Object.assign(
|
|
22840
|
-
if (opts.workflow !== void 0)
|
|
22852
|
+
if (opts.bodyFile !== void 0) Object.assign(goal, readBody(opts.bodyFile));
|
|
22853
|
+
if (opts.workflow !== void 0) goal.workflow = workflowOf(held4, opts.workflow);
|
|
22841
22854
|
write2();
|
|
22842
|
-
say(`Saved
|
|
22843
|
-
return { id:
|
|
22855
|
+
say(`Saved goal ${goal.id}: ${goal.title} (${shortWorkflowId(goal.workflow)}).`);
|
|
22856
|
+
return { id: goal.id, title: goal.title, workflow: goal.workflow };
|
|
22844
22857
|
}
|
|
22845
22858
|
if (sub === "drop") {
|
|
22846
|
-
|
|
22859
|
+
goal.dropped = true;
|
|
22847
22860
|
write2();
|
|
22848
|
-
say(`Dropped
|
|
22849
|
-
return { id:
|
|
22861
|
+
say(`Dropped goal ${goal.id}.`);
|
|
22862
|
+
return { id: goal.id, dropped: true };
|
|
22850
22863
|
}
|
|
22851
22864
|
if (sub === "start") {
|
|
22852
|
-
|
|
22865
|
+
goal.start = true;
|
|
22853
22866
|
write2();
|
|
22854
|
-
say(`
|
|
22855
|
-
return { id:
|
|
22867
|
+
say(`Goal ${goal.id} starts as a task when this turn ends.`);
|
|
22868
|
+
return { id: goal.id, start: true };
|
|
22856
22869
|
}
|
|
22857
|
-
die("Use
|
|
22870
|
+
die("Use goal new, save, drop or start.");
|
|
22858
22871
|
}
|
|
22859
|
-
function
|
|
22872
|
+
function cmdGoalWorkflows() {
|
|
22860
22873
|
const { held: held4 } = load();
|
|
22861
22874
|
for (const w of held4.workflows) {
|
|
22862
22875
|
say(`${shortWorkflowId(w.id)} ${w.name}`);
|
|
@@ -22864,18 +22877,18 @@ function cmdIdeaWorkflows() {
|
|
|
22864
22877
|
}
|
|
22865
22878
|
return { workflows: held4.workflows.map((w) => ({ ...w, id: shortWorkflowId(w.id) })) };
|
|
22866
22879
|
}
|
|
22867
|
-
var
|
|
22868
|
-
var
|
|
22869
|
-
"../cli/src/commands/
|
|
22880
|
+
var MAX_GOALS, DEFAULT_WORKFLOW2, goalsFile, shortWorkflowId, fallbackWorkflow, open;
|
|
22881
|
+
var init_goal = __esm({
|
|
22882
|
+
"../cli/src/commands/goal.ts"() {
|
|
22870
22883
|
"use strict";
|
|
22871
22884
|
init_io();
|
|
22872
22885
|
init_paths();
|
|
22873
|
-
|
|
22886
|
+
MAX_GOALS = 10;
|
|
22874
22887
|
DEFAULT_WORKFLOW2 = "wf_builtin_coding";
|
|
22875
|
-
|
|
22888
|
+
goalsFile = () => process.env.KANBAN_GOALS || process.env.KANBAN_IDEAS || null;
|
|
22876
22889
|
shortWorkflowId = (id) => id.startsWith("wf_builtin_") ? id.slice("wf_builtin_".length).replace(/_/g, "-") : id;
|
|
22877
22890
|
fallbackWorkflow = (held4) => held4.workflows.find((w) => w.id === DEFAULT_WORKFLOW2)?.id ?? held4.workflows[0]?.id ?? DEFAULT_WORKFLOW2;
|
|
22878
|
-
open = (
|
|
22891
|
+
open = (goal) => !goal.dropped && !goal.task;
|
|
22879
22892
|
}
|
|
22880
22893
|
});
|
|
22881
22894
|
|
|
@@ -23002,8 +23015,8 @@ function buildBoardProgram(cli) {
|
|
|
23002
23015
|
).option("--append <text>", "add one question to the end", opInOrder("append")).option("--update <n> <text...>", "rewrite question <n> whole", opInOrder("update")).option("--drop <positions>", "remove answered questions, e.g. 1 or 1,3", opInOrder("drop")).option("--skip <positions>", "mark questions skipped: kept as a record, no longer open", opInOrder("skip")).option("--unskip <positions>", "reopen skipped questions", opInOrder("unskip")).option("--clear", "remove every open question", opInOrder("clear")).option("--option <text>", "a choice for the op before it", opInOrder("option")).option("--recommended-option <text>", "a choice for the op before it, ticked to start", opInOrder("recommended-option")).option("--mode <mode>", "how many choices the op before it takes: single | multi", opInOrder("mode")).option("--agent <name>", "the preview agent whose section the op before it is about", opInOrder("agent")).action(async function(id) {
|
|
23003
23016
|
await dispatch("update-questions", this, [String(id)], { ops: questionOps }, cli);
|
|
23004
23017
|
});
|
|
23005
|
-
move2("idea").argument("<move>", "new, save, drop or start").summary("
|
|
23006
|
-
const data = await runAction(ctxOf(this, cli.program), {}, () =>
|
|
23018
|
+
move2("goal").alias("idea").argument("<move>", "new, save, drop or start").summary("\u4FDD\u5B58\u8BA8\u8BBA\u4E2D\u7684\u76EE\u6807").description('Only inside a goal discussion. Write a temporary draft, then goal new --title "\u2026" --body-file <file> [--workflow <id>]; update with goal save --id <goal> and any of --title, --body-file, --workflow. goal drop --id <goal> withdraws one; goal start --id <goal> turns it into a task when the turn ends. A `## Done when` list in the body is what counts as done. Workflows are the ones `akb workflow list` shows.').option("--id <goal>", "the goal to save, drop or start").option("--title <title>", "what the goal is called").option("--body-file <path>", "the outcome, then a `## Done when` list").option("--workflow <id>", "the workflow that does the work, from `akb workflow list`").action(async function(sub) {
|
|
23019
|
+
const data = await runAction(ctxOf(this, cli.program), {}, () => cmdGoal([sub], this.opts()));
|
|
23007
23020
|
cli.onAnswer?.(data);
|
|
23008
23021
|
});
|
|
23009
23022
|
move2("validate").argument("[id]", ID, cardId).summary("validate card format and report file, line, and repair instructions").description("Check one card, or every open card when no id is given. Reads only; exits non-zero with detailed errors until the format is valid.").action(async function(id) {
|
|
@@ -23094,7 +23107,7 @@ var init_board2 = __esm({
|
|
|
23094
23107
|
init_esm();
|
|
23095
23108
|
init_tasks();
|
|
23096
23109
|
init_card();
|
|
23097
|
-
|
|
23110
|
+
init_goal();
|
|
23098
23111
|
ID = "the card's id";
|
|
23099
23112
|
}
|
|
23100
23113
|
});
|
|
@@ -23301,11 +23314,11 @@ var init_describe_project = __esm({
|
|
|
23301
23314
|
}
|
|
23302
23315
|
});
|
|
23303
23316
|
|
|
23304
|
-
// ../cli/src/guide/discuss-
|
|
23305
|
-
var
|
|
23306
|
-
var
|
|
23307
|
-
"../cli/src/guide/discuss-
|
|
23308
|
-
|
|
23317
|
+
// ../cli/src/guide/discuss-goal.md
|
|
23318
|
+
var discuss_goal_default;
|
|
23319
|
+
var init_discuss_goal = __esm({
|
|
23320
|
+
"../cli/src/guide/discuss-goal.md"() {
|
|
23321
|
+
discuss_goal_default = "# \u76EE\u6807\u8BA8\u8BBA\n\n\u50CF\u6CA1\u6709\u989D\u5916\u4E0A\u4E0B\u6587\u65F6\u4E00\u6837\u4E0E\u7528\u6237\u6C9F\u901A\uFF1B\u5B9E\u9645\u6784\u5EFA\u524D\u7684\u4EFB\u4F55\u5DE5\u4F5C\u90FD\u53EF\u4EE5\u505A\u3002\n\n- **\u6784\u5EFA\u8FB9\u754C**\uFF1A\u9700\u8981\u5B9E\u9645\u6784\u5EFA\u65F6\uFF0C\u7528 `akb raw goal` \u4FDD\u5B58\u6216\u66F4\u65B0\u76EE\u6807\uFF08\u53C2\u89C1 `akb raw goal --help`\uFF09\uFF0C\u7136\u540E\u505C\u6B62\uFF1B\u65E2\u6709\u6784\u5EFA\u6D41\u7A0B\u6CBF\u5F53\u524D\u4F1A\u8BDD\u7EE7\u7EED\uFF0C\u5E76\u9075\u5FAA\u9879\u76EE\u65E2\u6709\u6784\u5EFA\u8981\u6C42\u3002\n- **\u7F3A\u5931\u4FE1\u606F**\uFF1A\u6682\u65F6\u65E0\u6CD5\u5F62\u6210\u76EE\u6807\u65F6\uFF0C\u53EF\u4EE5\u5411\u7528\u6237\u8BE2\u95EE\u7F3A\u5931\u4FE1\u606F\u3002\n\n## Goals\n\n- **\u76EE\u6807\u683C\u5F0F**\uFF1A\u6BCF\u4E2A\u76EE\u6807\u5305\u542B\u6807\u9898\u3001\u7528\u7528\u6237\u8BED\u8A00\u5199\u7684\u4E0D\u8D85\u8FC7 150 \u8BCD\u7684\u7ED3\u679C\uFF0C\u4EE5\u53CA\u5217\u51FA\u53EF\u9A8C\u8BC1\u9A8C\u6536\u9879\u7684 `## Done when`\uFF0C\u4E0D\u542B\u6280\u672F\u8BBE\u8BA1\u3002\n- **\u72EC\u7ACB\u4EA4\u4ED8**\uFF1A\u4E0D\u540C\u4EA4\u4ED8\u7269\u5206\u522B\u4FDD\u5B58\u4E3A\u76EE\u6807\uFF0C\u7528 `akb raw goal drop --id <goal>` \u5220\u9664\u88AB\u66FF\u6362\u7684\u76EE\u6807\u3002\n- **\u81EA\u884C\u5224\u65AD**\uFF1A\u81EA\u884C\u51B3\u5B9A\u80FD\u591F\u5224\u65AD\u7684\u7ED3\u679C\u95EE\u9898\uFF0C\u5E76\u8BF4\u660E\u6240\u4F5C\u51B3\u5B9A\uFF1B\u53EA\u95EE\u7528\u6237\u624D\u80FD\u56DE\u7B54\u4E14\u4F1A\u6539\u53D8\u7ED3\u679C\u7684\u95EE\u9898\uFF0C\u540C\u65F6\u7ED9\u51FA\u63A8\u8350\u9009\u9879\u3002\n- **\u76F4\u767D\u8868\u8FBE**\uFF1A\u7528\u7528\u6237\u7684\u8BED\u8A00\u548C\u65E5\u5E38\u7528\u8BED\u76F4\u63A5\u56DE\u7B54\u3002\n- **\u9690\u85CF\u5185\u90E8\u64CD\u4F5C**\uFF1A\u4E0D\u63D0\u53CA\u8BA1\u5212\u3001\u6587\u4EF6\u3001\u8DEF\u5F84\u3001\u547D\u4EE4\u6216\u4F7F\u7528\u7684\u5DE5\u5177\u4E0E\u8FDE\u63A5\u5668\uFF1B\u4EE5\u6309\u94AE\u540D\u79F0\u6307\u4EE3\u64CD\u4F5C\u3002\n";
|
|
23309
23322
|
}
|
|
23310
23323
|
});
|
|
23311
23324
|
|
|
@@ -23329,7 +23342,7 @@ var init_follow_up = __esm({
|
|
|
23329
23342
|
var implement_default;
|
|
23330
23343
|
var init_implement = __esm({
|
|
23331
23344
|
"../cli/src/guide/implement.md"() {
|
|
23332
|
-
implement_default =
|
|
23345
|
+
implement_default = '# Implement a settled card\n\nBuild the approved card. Preserve settled decisions and unrelated questions.\n\n- **Unchecked card**: a card with `triage:` set and an empty `## Scope` skipped planning; do\n what "Unchecked card" in `akb guide refine` says before building.\n- **User-action blockers**: follow `akb guide update-questions` and append a\n question describing the obstacle and action needed. Stop only dependent work; resume it\n after the user resolves the question. Settle routine technical choices yourself.\n- Do not replace or contradict what the card says.\n- **Defer what can wait**: queue as a follow-up any other work this card does not require;\n never hold the card with a question about it.\n- **Follow-ups**: follow `akb guide follow-up` for additional work.\n- **Decisions made while building**: record an answered material decision the user could\n reasonably reverse under `## Worth noting after implementation`.\n- A printed, interactive implementation may stay uncommitted in the target checkout only\n when the card already supplies a concrete outcome, boundaries, and build steps.\n Otherwise use the tracked implementation path. Background runs always keep their delivery\n path.\n\n## A build that writes its own card\n\n**Start now** sends a requirement with no card behind it \u2014 a typed sentence, the plan a\ndiscussion settled, or a triage item. Write the card first, in the same run, then build it. The board points\nthe run and its delivery at the card as the create lands, so from there it is an ordinary\nbuild.\n\n- **Read the plan first**: given a plan\'s path or a triage item\'s file, that file is the\n requirement \u2014 read it, and everything below reads "the plan" for "the sentence".\n- **Create it first**: `akb raw create --title ".."`. The title is one short line read off\n the sentence, or the plan\'s own title, in its own language \u2014 add\n `--slug <short-english-slug>` when that is not English, because filenames are ASCII. No `--modules`, no `--question` \u2014 nothing has evaluated this idea.\n- **The requirement is the summary**: replace the scaffold\'s opening paragraph with the\n sentence, or the plan\'s whole text, verbatim, in a fenced code block. Open the fence with\n more backticks than the longest run inside it, or the card fails validation on an unclosed\n fence.\n- **From a plan, name it**: pass `--source <plan path>` to the create.\n- **From a triage item, file it**: pass `--triage <source-id>` to the create, and run\n `akb triage archive <source-id> --card <id>` straight after, before any build work.\n- **Leave the rest of the scaffold**: `## Worth noting`, `## Scope`, `## Todo` and\n `## Decided by the agent` stay exactly as `raw create` wrote them.\n- **Then build that card**: the code block is the whole requirement \u2014 build exactly it and\n widen it no further. `akb card implement <id> --print` is the flow from here.\n';
|
|
23333
23346
|
}
|
|
23334
23347
|
});
|
|
23335
23348
|
|
|
@@ -23461,7 +23474,7 @@ var init_guide = __esm({
|
|
|
23461
23474
|
init_card_chat();
|
|
23462
23475
|
init_conflict();
|
|
23463
23476
|
init_describe_project();
|
|
23464
|
-
|
|
23477
|
+
init_discuss_goal();
|
|
23465
23478
|
init_evaluate_task();
|
|
23466
23479
|
init_follow_up();
|
|
23467
23480
|
init_implement();
|
|
@@ -23484,7 +23497,7 @@ var init_guide = __esm({
|
|
|
23484
23497
|
{ name: "evaluate-task", when: "check one task idea before it becomes a card", text: evaluate_task_default },
|
|
23485
23498
|
{ name: "add-task", when: "turn one idea into a card", text: add_task_default },
|
|
23486
23499
|
{ name: "follow-up", when: "place additional work and prepare context for a follow-up card", text: follow_up_default },
|
|
23487
|
-
{ name: "discuss-
|
|
23500
|
+
{ name: "discuss-goal", when: "help decide what is worth building, and shape it into goals to start as tasks", text: discuss_goal_default },
|
|
23488
23501
|
{ name: "card-chat", when: "answer a card's conversation, and act on what each turn settles", text: card_chat_default },
|
|
23489
23502
|
{ name: "implement", when: "build a settled card and stop cleanly on an execution blocker", text: implement_default },
|
|
23490
23503
|
{ name: "archive", when: "finish a task \u2014 write its shipped line, then take it off the board", text: archive_default },
|
|
@@ -23504,6 +23517,7 @@ var init_guide = __esm({
|
|
|
23504
23517
|
];
|
|
23505
23518
|
guideNames = () => GUIDES.map((g) => g.name);
|
|
23506
23519
|
RENAMED = {
|
|
23520
|
+
"discuss-idea": "discuss-goal",
|
|
23507
23521
|
"spec-skill": "preview-agent",
|
|
23508
23522
|
"spec-agent": "preview-agent"
|
|
23509
23523
|
};
|
|
@@ -28212,7 +28226,7 @@ function cmdTriageRestore(sourceId) {
|
|
|
28212
28226
|
}
|
|
28213
28227
|
|
|
28214
28228
|
// ../cli/src/lib/cli/agent.ts
|
|
28215
|
-
|
|
28229
|
+
init_goal();
|
|
28216
28230
|
|
|
28217
28231
|
// ../cli/src/commands/spec.ts
|
|
28218
28232
|
init_flow();
|
|
@@ -28350,7 +28364,7 @@ async function onBoard2(cmd, cli, work) {
|
|
|
28350
28364
|
return { board: KANBAN, ...await work(cli.program) ?? {} };
|
|
28351
28365
|
});
|
|
28352
28366
|
}
|
|
28353
|
-
var workflowList = (cmd, cli) =>
|
|
28367
|
+
var workflowList = (cmd, cli) => goalsFile() ? boardless(cmd, cli, () => cmdGoalWorkflows()) : onBoard2(cmd, cli, () => cmdWorkflowList());
|
|
28354
28368
|
async function boardless(cmd, cli, work) {
|
|
28355
28369
|
const ctx = ctxOf(cmd, cli.program);
|
|
28356
28370
|
await runAction(ctx, {}, async () => await work(cli.program) ?? {});
|