geo-ai-search-optimization 1.2.12 → 1.2.13

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 CHANGED
@@ -165,6 +165,27 @@ geo-ai-search-optimization agent-progress-tracker ./reports/agent-batch-executor
165
165
  - 建议下一步命令
166
166
  - 可直接复制给 agent 的 progress prompt
167
167
 
168
+ ## Agent Status Board 命令
169
+
170
+ 如果你希望把当前执行状态直接整理成更像团队协作看板的分栏视图,而不是只看一份文字进度摘要,可以直接用 `agent-status-board`:
171
+
172
+ ```bash
173
+ geo-ai-search-optimization agent-status-board ./your-site
174
+ geo-ai-search-optimization agent-status-board ./reports/apply-plan.json --completed fix-01 --current fix-02
175
+ geo-ai-search-optimization agent-status-board ./reports/agent-progress-tracker.json --blocked "缺少仓库权限,缺少模板文件" --format json --out ./reports/agent-status-board.json
176
+ ```
177
+
178
+ `agent-status-board` 会输出:
179
+
180
+ - 已完成栏
181
+ - 进行中栏
182
+ - 阻塞栏
183
+ - 下一步栏
184
+ - 排队中栏
185
+ - 收尾栏
186
+ - 建议下一步命令
187
+ - 可直接复制给 agent 的 status board prompt
188
+
168
189
  ## Quick Start
169
190
 
170
191
  如果你要从 0 到 1 启动一个 GEO 项目,建议照这个顺序做。
@@ -564,6 +585,7 @@ geo-ai-search-optimization agent-runbook ./your-site
564
585
  geo-ai-search-optimization agent-executor ./your-site
565
586
  geo-ai-search-optimization agent-batch-executor ./your-site
566
587
  geo-ai-search-optimization agent-progress-tracker ./your-site
588
+ geo-ai-search-optimization agent-status-board ./your-site
567
589
  geo-ai-search-optimization skills
568
590
  geo-ai-search-optimization where
569
591
  geo-ai-search-optimization doctor
@@ -634,6 +656,13 @@ geo-ai-search-optimization help
634
656
  - 输出 do-now checklist、stop checklist、success checklist、验证命令和回报模板
635
657
  - 新增 `geo-ai-search-optimization-agent-executor` skill
636
658
 
659
+ ## New in 1.2.13
660
+
661
+ - 新增 `agent-status-board` 命令
662
+ - 把当前执行状态整理成更像看板的分栏视图
663
+ - 支持从 `apply-plan`、`agent-progress-tracker`、`agent-batch-executor` 等工件继续生成状态看板
664
+ - 新增 `geo-ai-search-optimization-agent-status-board` skill
665
+
637
666
  ## New in 1.2.12
638
667
 
639
668
  - 新增 `agent-progress-tracker` 命令
@@ -840,6 +869,7 @@ The installed package now includes a bundled GEO skill pack, including:
840
869
  - `geo-ai-search-optimization-agent-executor`
841
870
  - `geo-ai-search-optimization-agent-batch-executor`
842
871
  - `geo-ai-search-optimization-agent-progress-tracker`
872
+ - `geo-ai-search-optimization-agent-status-board`
843
873
  - `geo-ai-search-optimization-usage`
844
874
  - `geo-ai-search-optimization-agent-handoff`
845
875
  - `geo-ai-search-optimization-repair-loop`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geo-ai-search-optimization",
3
- "version": "1.2.12",
3
+ "version": "1.2.13",
4
4
  "description": "Install and run a Generative Engine Optimization (GEO)-first, SEO-supported Codex skill for website optimization.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -82,6 +82,16 @@ Best for:
82
82
  - clarifying the current active packet and the next packet
83
83
  - surfacing blockers before the team moves into closeout or the next batch
84
84
 
85
+ ### `geo-ai-search-optimization-agent-status-board`
86
+
87
+ Use this when the next agent should present execution state as a board instead of a plain progress summary.
88
+
89
+ Best for:
90
+
91
+ - giving PM and agent the same execution view
92
+ - showing done, in-progress, blocked, next, and queued packets in one artifact
93
+ - turning progress tracking into a more shareable coordination output
94
+
85
95
  ## Usage guide
86
96
 
87
97
  ### `geo-ai-search-optimization-usage`
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: geo-ai-search-optimization-agent-status-board
3
+ description: Turn GEO execution state into a board-style artifact for PM and agent coordination. Use when an agent should present done, in-progress, blocked, next, queued, and closeout states from apply-plan, agent-progress-tracker, agent-batch-executor, or related execution artifacts.
4
+ ---
5
+
6
+ # GEO Agent Status Board
7
+
8
+ Use this skill when the next agent should explain execution state as a board, not just as a paragraph summary.
9
+
10
+ `GEO = Generative Engine Optimization`
11
+
12
+ ## What it does
13
+
14
+ - turns current GEO execution state into board columns
15
+ - keeps PM and agent aligned on the same packet status
16
+ - shows done, in-progress, blocked, next, queued, and closeout views
17
+ - points to the next command and preserves the underlying progress tracker
18
+
19
+ ## Best use
20
+
21
+ - when a PM asks for a coordination-friendly view
22
+ - when progress tracking exists but still feels too text-heavy
23
+ - when the next agent should continue from a board artifact instead of rebuilding context
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "GEO Agent Status Board"
3
+ short_description: "Present GEO execution state as a board"
4
+ default_prompt: "Use $geo-ai-search-optimization-agent-status-board to turn this GEO execution state into a board with done, in-progress, blocked, next, queued, and closeout columns."
@@ -13,7 +13,7 @@ Treat this tool as a PM-friendly GEO workflow for websites.
13
13
 
14
14
  `GEO = Generative Engine Optimization`
15
15
 
16
- The package is best explained as nineteen layers:
16
+ The package is best explained as twenty layers:
17
17
 
18
18
  1. `auto-flow`: auto-select the next skill and command chain
19
19
  2. `agent-session`: build a runnable session for the next agent
@@ -21,19 +21,20 @@ The package is best explained as nineteen layers:
21
21
  4. `agent-executor`: choose one packet to execute right now
22
22
  5. `agent-batch-executor`: queue the first few packets, but still advance one packet at a time
23
23
  6. `agent-progress-tracker`: track which packet is done, which one is active, and what comes next
24
- 7. `skills`: inspect the bundled skill package
25
- 8. `onboard-url` / `onboard`: first look
26
- 9. `scan`: raw signal check
27
- 10. `audit` / `report`: diagnosis
28
- 11. `fix-plan` / `owner-board`: execution planning
29
- 12. `agent-handoff`: agent takeover package
30
- 13. `apply-plan`: execution loop
31
- 14. `completion-report`: closeout
32
- 15. `handoff-bundle`: all-in-one package
33
- 16. `share-pack`: audience-ready delivery
34
- 17. `export-pack`: folder export
35
- 18. `html-pack` / `publish-pack`: browsable and final delivery output
36
- 19. `pm-brief` / `roadmap`: stakeholder alignment
24
+ 7. `agent-status-board`: turn the execution state into a board view for PM and agents
25
+ 8. `skills`: inspect the bundled skill package
26
+ 9. `onboard-url` / `onboard`: first look
27
+ 10. `scan`: raw signal check
28
+ 11. `audit` / `report`: diagnosis
29
+ 12. `fix-plan` / `owner-board`: execution planning
30
+ 13. `agent-handoff`: agent takeover package
31
+ 14. `apply-plan`: execution loop
32
+ 15. `completion-report`: closeout
33
+ 16. `handoff-bundle`: all-in-one package
34
+ 17. `share-pack`: audience-ready delivery
35
+ 18. `export-pack`: folder export
36
+ 19. `html-pack` / `publish-pack`: browsable and final delivery output
37
+ 20. `pm-brief` / `roadmap`: stakeholder alignment
37
38
 
38
39
  ## Recommended command order
39
40
 
@@ -46,6 +47,7 @@ npx geo-ai-search-optimization agent-runbook https://example.com
46
47
  npx geo-ai-search-optimization agent-executor https://example.com
47
48
  npx geo-ai-search-optimization agent-batch-executor https://example.com
48
49
  npx geo-ai-search-optimization agent-progress-tracker https://example.com
50
+ npx geo-ai-search-optimization agent-status-board https://example.com
49
51
  npx geo-ai-search-optimization onboard-url https://example.com
50
52
  npx geo-ai-search-optimization pm-brief https://example.com
51
53
  npx geo-ai-search-optimization roadmap https://example.com
@@ -60,6 +62,7 @@ npx geo-ai-search-optimization agent-runbook ./your-site
60
62
  npx geo-ai-search-optimization agent-executor ./your-site
61
63
  npx geo-ai-search-optimization agent-batch-executor ./your-site
62
64
  npx geo-ai-search-optimization agent-progress-tracker ./your-site
65
+ npx geo-ai-search-optimization agent-status-board ./your-site
63
66
  npx geo-ai-search-optimization scan ./your-site
64
67
  npx geo-ai-search-optimization audit ./your-site
65
68
  npx geo-ai-search-optimization fix-plan ./your-site
@@ -83,6 +86,7 @@ npx geo-ai-search-optimization roadmap ./your-site
83
86
  - `agent-executor`: select one packet to execute now and package it into a single-task entrypoint
84
87
  - `agent-batch-executor`: line up the first few packets in execution order while preserving one-packet-at-a-time discipline
85
88
  - `agent-progress-tracker`: show execution progress, current packet, blockers, and the next packet to advance
89
+ - `agent-status-board`: present the current execution state as a board with done, in-progress, blocked, next, and queued columns
86
90
  - `onboard-url`: first-time website check from a live URL
87
91
  - `onboard`: interactive first-time onboarding
88
92
  - `skills`: list the bundled skills and decide which skill or command chain fits the task
@@ -113,6 +117,7 @@ When explaining the tool to a user:
113
117
  - if the user wants the next agent to start one concrete task now, move them to `agent-executor`
114
118
  - if the user wants the next agent to continuously advance the first 2 to 3 packets in order, move them to `agent-batch-executor`
115
119
  - if the user wants the next agent to explain current progress, blockers, and the next packet, move them to `agent-progress-tracker`
120
+ - if the user wants the next agent to present execution state as a board for PM and agent coordination, move them to `agent-status-board`
116
121
  - explain the result in PM language, not implementation jargon
117
122
  - if the user sounds new, start with `onboard-url` or `quick-start`
118
123
  - if the user wants another agent to take over, move them to `agent-handoff`
@@ -120,6 +120,20 @@ function buildExecutionContextFromParsedArtifact(parsed, input) {
120
120
  };
121
121
  }
122
122
 
123
+ if (parsed?.kind === "geo-agent-status-board" && parsed.tracker?.applyPlan?.kind === "geo-apply-plan") {
124
+ return {
125
+ source: parsed.source || parsed.tracker.source || parsed.tracker.applyPlan.source || input,
126
+ sourceType: parsed.sourceType || parsed.tracker.sourceType || parsed.tracker.applyPlan.sourceType || "json",
127
+ artifactKind: parsed.kind,
128
+ applyPlan: parsed.tracker.applyPlan,
129
+ trackerState: {
130
+ currentTaskId: parsed.tracker.currentTaskId || parsed.tracker.activePacket?.id || null,
131
+ completedPacketIds: parsed.tracker.completedPacketIds || [],
132
+ blockedReasons: parsed.tracker.blockedReasons || []
133
+ }
134
+ };
135
+ }
136
+
123
137
  if (parsed?.kind === "geo-completion-report") {
124
138
  return {
125
139
  source: parsed.source || input,
@@ -58,6 +58,9 @@ function inferSkillForCommand(commandName, flow) {
58
58
  if (commandName === "agent-progress-tracker") {
59
59
  return "geo-ai-search-optimization-agent-progress-tracker";
60
60
  }
61
+ if (commandName === "agent-status-board") {
62
+ return "geo-ai-search-optimization-agent-status-board";
63
+ }
61
64
  if (commandName === "skills" || commandName === "quick-start") {
62
65
  return "geo-ai-search-optimization-usage";
63
66
  }
@@ -126,6 +129,8 @@ function inferStepPurpose(commandName, flow) {
126
129
  return "把前几包任务排成连续执行顺序,但保持一次只推进一包。";
127
130
  case "agent-progress-tracker":
128
131
  return "追踪当前做到第几包、卡点在哪里,以及下一包该推进什么。";
132
+ case "agent-status-board":
133
+ return "把当前执行状态整理成 PM 和 agent 都能直接消费的分栏看板。";
129
134
  case "apply-plan":
130
135
  return "把交接结果推进到具体执行包。";
131
136
  case "completion-report":
@@ -174,6 +179,8 @@ function inferExpectedArtifact(commandName) {
174
179
  return "agent 多任务批次执行包";
175
180
  case "agent-progress-tracker":
176
181
  return "agent 执行进度追踪工件";
182
+ case "agent-status-board":
183
+ return "agent 执行状态看板";
177
184
  case "apply-plan":
178
185
  return "执行包";
179
186
  case "completion-report":
@@ -218,6 +225,9 @@ function buildStepInstructions(parsedCommand, flow) {
218
225
  if (parsedCommand.commandName === "agent-progress-tracker") {
219
226
  lines.push("这一步用于校准当前做到哪、当前卡点和下一包,不要跳过状态确认直接进入收尾。");
220
227
  }
228
+ if (parsedCommand.commandName === "agent-status-board") {
229
+ lines.push("这一步用于把当前执行状态转成看板视图,方便 PM 和 agent 对齐当前阶段。");
230
+ }
221
231
  if (parsedCommand.commandName === "agent-handoff" && flow.intent === "execute") {
222
232
  lines.push("如果还是 advice-only,说明还缺仓库或本地项目上下文。");
223
233
  }
@@ -0,0 +1,246 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import {
4
+ createAgentProgressTracker,
5
+ renderAgentProgressTrackerMarkdown,
6
+ writeAgentProgressTrackerOutput
7
+ } from "./agent-progress-tracker.js";
8
+
9
+ const VALID_FORMATS = new Set(["markdown", "json"]);
10
+
11
+ function normalizeFormat(format) {
12
+ const resolved = (format || "markdown").toLowerCase();
13
+ if (!VALID_FORMATS.has(resolved)) {
14
+ throw new Error(`不支持的 agent-status-board 格式:${format}。可选值:${Array.from(VALID_FORMATS).join(", ")}`);
15
+ }
16
+ return resolved;
17
+ }
18
+
19
+ async function pathExists(targetPath) {
20
+ try {
21
+ await fs.access(targetPath);
22
+ return true;
23
+ } catch {
24
+ return false;
25
+ }
26
+ }
27
+
28
+ function buildCard(packet, extra = {}) {
29
+ if (!packet) {
30
+ return null;
31
+ }
32
+
33
+ return {
34
+ id: packet.id,
35
+ title: packet.title,
36
+ owner: packet.owner,
37
+ priority: packet.priority || "P1",
38
+ ...extra
39
+ };
40
+ }
41
+
42
+ function buildBlockedCards(tracker) {
43
+ if (tracker.blockedReasons.length === 0) {
44
+ return [];
45
+ }
46
+
47
+ return tracker.blockedReasons.map((reason, index) => ({
48
+ id: `block-${index + 1}`,
49
+ title: reason,
50
+ owner: tracker.activePacket?.owner || "待确认",
51
+ priority: tracker.activePacket?.priority || "P1",
52
+ currentPacketId: tracker.activePacket?.id || null
53
+ }));
54
+ }
55
+
56
+ function buildQueuedCards(tracker) {
57
+ return tracker.remainingPackets
58
+ .filter((packet) => packet.id !== tracker.activePacket?.id && packet.id !== tracker.nextPacket?.id)
59
+ .map((packet) => buildCard(packet));
60
+ }
61
+
62
+ function buildColumns(tracker) {
63
+ return {
64
+ completed: tracker.completedPackets.map((packet) => buildCard(packet)),
65
+ inProgress: tracker.activePacket ? [buildCard(tracker.activePacket)] : [],
66
+ blocked: buildBlockedCards(tracker),
67
+ nextUp: tracker.nextPacket ? [buildCard(tracker.nextPacket)] : [],
68
+ queued: buildQueuedCards(tracker),
69
+ closeout:
70
+ tracker.status === "completed"
71
+ ? [
72
+ {
73
+ id: "closeout-01",
74
+ title: "进入 completion-report / handoff-bundle / publish-pack",
75
+ owner: "PM / Agent",
76
+ priority: "P1"
77
+ }
78
+ ]
79
+ : []
80
+ };
81
+ }
82
+
83
+ function buildBoardSummary(tracker) {
84
+ if (tracker.status === "blocked") {
85
+ return `当前执行被阻塞,先处理 ${tracker.blockedReasons.length} 个阻塞项,再继续推进 ${tracker.activePacket?.id || "当前包"}。`;
86
+ }
87
+ if (tracker.status === "completed") {
88
+ return "当前批次已完成,接下来适合进入复盘与交付阶段。";
89
+ }
90
+ if (tracker.status === "in-progress") {
91
+ return `当前正在推进 ${tracker.activePacket?.id || "当前包"},下一包是 ${tracker.nextPacket?.id || "收尾"}。`;
92
+ }
93
+ if (tracker.status === "not-started") {
94
+ return `当前还没开始,建议从 ${tracker.activePacket?.id || "第一包"} 启动。`;
95
+ }
96
+ return "当前还缺上下文,先补执行信息再进入状态看板。";
97
+ }
98
+
99
+ function buildBoardPrompt(board) {
100
+ const lines = [
101
+ "你现在进入 GEO 执行状态看板模式。",
102
+ `当前输入:${board.source}`,
103
+ `当前状态:${board.boardStatus}`,
104
+ `进度:${board.progressPercent}%`,
105
+ `看板总结:${board.boardSummary}`
106
+ ];
107
+
108
+ if (board.columns.inProgress.length > 0) {
109
+ const current = board.columns.inProgress[0];
110
+ lines.push(`当前进行中:${current.id}|${current.title}`);
111
+ }
112
+ if (board.columns.nextUp.length > 0) {
113
+ const next = board.columns.nextUp[0];
114
+ lines.push(`下一步:${next.id}|${next.title}`);
115
+ }
116
+ if (board.columns.blocked.length > 0) {
117
+ lines.push(`阻塞项数量:${board.columns.blocked.length}`);
118
+ }
119
+
120
+ lines.push("请按看板方式说明:已完成、进行中、阻塞、下一步、排队中的任务。");
121
+ return lines.join("\n");
122
+ }
123
+
124
+ async function resolveTracker(input, options = {}) {
125
+ const resolvedPath = path.resolve(input);
126
+ if (await pathExists(resolvedPath)) {
127
+ try {
128
+ const raw = await fs.readFile(resolvedPath, "utf8");
129
+ const parsed = JSON.parse(raw);
130
+ if (parsed?.kind === "geo-agent-status-board" && parsed.tracker?.kind === "geo-agent-progress-tracker") {
131
+ return createAgentProgressTracker(parsed.tracker.source || input, {
132
+ format: "json",
133
+ currentTaskId: options.currentTaskId || parsed.tracker.currentTaskId,
134
+ completedPacketIds:
135
+ options.completedPacketIds != null
136
+ ? options.completedPacketIds
137
+ : (parsed.tracker.completedPacketIds || []).join(","),
138
+ blockedReasons:
139
+ options.blockedReasons != null ? options.blockedReasons : (parsed.tracker.blockedReasons || []).join(",")
140
+ });
141
+ }
142
+ } catch {
143
+ // Fall through to tracker generation
144
+ }
145
+ }
146
+
147
+ return createAgentProgressTracker(input, {
148
+ format: "json",
149
+ currentTaskId: options.currentTaskId,
150
+ completedPacketIds: options.completedPacketIds,
151
+ blockedReasons: options.blockedReasons
152
+ });
153
+ }
154
+
155
+ export async function createAgentStatusBoard(input, options = {}) {
156
+ const format = normalizeFormat(options.format);
157
+ const tracker = await resolveTracker(input, options);
158
+ const columns = buildColumns(tracker);
159
+
160
+ const board = {
161
+ kind: "geo-agent-status-board",
162
+ input,
163
+ source: tracker.source,
164
+ sourceType: tracker.sourceType,
165
+ artifactKind: tracker.artifactKind,
166
+ format,
167
+ boardStatus: tracker.status,
168
+ boardSummary: buildBoardSummary(tracker),
169
+ progressPercent: tracker.progressPercent,
170
+ totalPackets: tracker.totalPackets,
171
+ completedCount: tracker.completedCount,
172
+ remainingCount: tracker.remainingCount,
173
+ columns,
174
+ suggestedNextCommand: tracker.suggestedNextCommand,
175
+ followupCommands: tracker.followupCommands,
176
+ boardPrompt: "",
177
+ tracker
178
+ };
179
+
180
+ board.boardPrompt = buildBoardPrompt(board);
181
+ return board;
182
+ }
183
+
184
+ export function renderAgentStatusBoardMarkdown(board) {
185
+ const lines = [
186
+ "# GEO Agent Status Board",
187
+ "",
188
+ `- 输入:\`${board.source}\``,
189
+ `- 来源类型:\`${board.sourceType}\``,
190
+ `- 工件类型:\`${board.artifactKind}\``,
191
+ `- 看板状态:\`${board.boardStatus}\``,
192
+ `- 进度:\`${board.progressPercent}%\``,
193
+ `- 已完成:\`${board.completedCount}/${board.totalPackets}\``,
194
+ `- 看板总结:${board.boardSummary}`,
195
+ ""
196
+ ];
197
+
198
+ const sections = [
199
+ ["已完成", board.columns.completed],
200
+ ["进行中", board.columns.inProgress],
201
+ ["阻塞", board.columns.blocked],
202
+ ["下一步", board.columns.nextUp],
203
+ ["排队中", board.columns.queued],
204
+ ["收尾", board.columns.closeout]
205
+ ];
206
+
207
+ for (const [label, items] of sections) {
208
+ lines.push(`## ${label}`, "");
209
+ if (items.length === 0) {
210
+ lines.push("- 当前没有内容。", "");
211
+ continue;
212
+ }
213
+
214
+ for (const item of items) {
215
+ lines.push(`- ${item.id}|${item.title}`);
216
+ lines.push(` - Owner:${item.owner}`);
217
+ lines.push(` - 优先级:${item.priority}`);
218
+ if (item.currentPacketId) {
219
+ lines.push(` - 当前关联包:${item.currentPacketId}`);
220
+ }
221
+ }
222
+ lines.push("");
223
+ }
224
+
225
+ lines.push("## 建议下一步命令", "");
226
+ lines.push(`- \`${board.suggestedNextCommand}\``);
227
+
228
+ lines.push("", "## 后续命令", "");
229
+ for (const command of board.followupCommands) {
230
+ lines.push(`- \`${command}\``);
231
+ }
232
+
233
+ lines.push("", "## 可直接复制给 Agent 的 Status Board Prompt", "", "```text");
234
+ lines.push(board.boardPrompt || buildBoardPrompt(board));
235
+ lines.push("```");
236
+
237
+ lines.push("", "## 详细进度追踪", "");
238
+ lines.push(renderAgentProgressTrackerMarkdown(board.tracker).trim());
239
+ lines.push("");
240
+
241
+ return `${lines.join("\n")}\n`;
242
+ }
243
+
244
+ export async function writeAgentStatusBoardOutput(outputPath, content) {
245
+ return writeAgentProgressTrackerOutput(outputPath, content);
246
+ }
package/src/auto-flow.js CHANGED
@@ -50,6 +50,9 @@ function inferTaskTextMode(text) {
50
50
  if (/(progress-tracker|progress tracker|进度追踪|做到第几包|卡在哪|下一包是什么)/i.test(normalized)) {
51
51
  return "execute";
52
52
  }
53
+ if (/(status-board|status board|状态看板|执行看板|看板视图|board 视图)/i.test(normalized)) {
54
+ return "execute";
55
+ }
53
56
  if (/(executor|先做哪一个|先做哪一包|single task|执行第一包|先执行一个任务)/i.test(normalized)) {
54
57
  return "execute";
55
58
  }
@@ -169,6 +172,7 @@ function resolveEffectiveIntent(intent, detected) {
169
172
  "geo-agent-executor",
170
173
  "geo-agent-batch-executor",
171
174
  "geo-agent-progress-tracker",
175
+ "geo-agent-status-board",
172
176
  "geo-apply-plan",
173
177
  "geo-handoff-bundle",
174
178
  "geo-fix-plan"
@@ -329,6 +333,24 @@ function buildCommandChain(detected, intent) {
329
333
  `geo-ai-search-optimization completion-report ${source}`,
330
334
  `geo-ai-search-optimization handoff-bundle ${source}`
331
335
  ];
336
+ case "geo-agent-status-board":
337
+ return detected.parsed?.boardStatus === "completed"
338
+ ? [
339
+ `geo-ai-search-optimization completion-report ${source}`,
340
+ `geo-ai-search-optimization handoff-bundle ${source}`,
341
+ `geo-ai-search-optimization publish-pack ${source}`
342
+ ]
343
+ : detected.parsed?.tracker?.currentTaskId
344
+ ? [
345
+ `geo-ai-search-optimization agent-executor ${source} --task ${detected.parsed.tracker.currentTaskId}`,
346
+ `geo-ai-search-optimization agent-progress-tracker ${source}`,
347
+ `geo-ai-search-optimization completion-report ${source}`
348
+ ]
349
+ : [
350
+ `geo-ai-search-optimization agent-progress-tracker ${source}`,
351
+ `geo-ai-search-optimization completion-report ${source}`,
352
+ `geo-ai-search-optimization handoff-bundle ${source}`
353
+ ];
332
354
  case "geo-apply-plan":
333
355
  return [
334
356
  `geo-ai-search-optimization agent-executor ${source}`,
@@ -406,6 +428,8 @@ function pickSkillName(detected, intent) {
406
428
  return "geo-ai-search-optimization-agent-batch-executor";
407
429
  case "geo-agent-progress-tracker":
408
430
  return "geo-ai-search-optimization-agent-progress-tracker";
431
+ case "geo-agent-status-board":
432
+ return "geo-ai-search-optimization-agent-status-board";
409
433
  case "geo-completion-report":
410
434
  return "geo-ai-search-optimization-completion-report";
411
435
  case "geo-handoff-bundle":
@@ -444,6 +468,7 @@ function buildSecondarySkillNames(primarySkill, intent, detected) {
444
468
  "geo-agent-executor",
445
469
  "geo-agent-batch-executor",
446
470
  "geo-agent-progress-tracker",
471
+ "geo-agent-status-board",
447
472
  "geo-apply-plan"
448
473
  ].includes(
449
474
  detected.artifactKind
@@ -451,6 +476,7 @@ function buildSecondarySkillNames(primarySkill, intent, detected) {
451
476
  ) {
452
477
  names.add("geo-ai-search-optimization-agent-batch-executor");
453
478
  names.add("geo-ai-search-optimization-agent-progress-tracker");
479
+ names.add("geo-ai-search-optimization-agent-status-board");
454
480
  names.add("geo-ai-search-optimization-agent-executor");
455
481
  names.add("geo-ai-search-optimization-agent-runbook");
456
482
  names.add("geo-ai-search-optimization-agent-handoff");
@@ -482,6 +508,7 @@ function buildStage(intent, detected) {
482
508
  "geo-agent-executor",
483
509
  "geo-agent-batch-executor",
484
510
  "geo-agent-progress-tracker",
511
+ "geo-agent-status-board",
485
512
  "geo-apply-plan",
486
513
  "geo-handoff-bundle"
487
514
  ].includes(detected.artifactKind)
@@ -496,6 +523,7 @@ function buildStage(intent, detected) {
496
523
  "geo-agent-executor",
497
524
  "geo-agent-batch-executor",
498
525
  "geo-agent-progress-tracker",
526
+ "geo-agent-status-board",
499
527
  "geo-apply-plan",
500
528
  "geo-handoff-bundle"
501
529
  ].includes(detected.artifactKind)
package/src/cli.js CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  renderAgentProgressTrackerMarkdown,
15
15
  writeAgentProgressTrackerOutput
16
16
  } from "./agent-progress-tracker.js";
17
+ import { createAgentStatusBoard, renderAgentStatusBoardMarkdown, writeAgentStatusBoardOutput } from "./agent-status-board.js";
17
18
  import { createAgentRunbook, renderAgentRunbookMarkdown, writeAgentRunbookOutput } from "./agent-runbook.js";
18
19
  import { createAgentSession, renderAgentSessionMarkdown, writeAgentSessionOutput } from "./agent-session.js";
19
20
  import { createAutoFlow, renderAutoFlowMarkdown, writeAutoFlowOutput } from "./auto-flow.js";
@@ -77,6 +78,7 @@ function printHelp() {
77
78
  " geo-ai-search-optimization agent-executor <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--task <id>] [--format <markdown|json>] [--out <file>]",
78
79
  " geo-ai-search-optimization agent-batch-executor <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--task <id>] [--count <count>] [--format <markdown|json>] [--out <file>]",
79
80
  " geo-ai-search-optimization agent-progress-tracker <input> [--current <id>] [--completed <id,id>] [--blocked <reason,reason>] [--format <markdown|json>] [--out <file>]",
81
+ " geo-ai-search-optimization agent-status-board <input> [--current <id>] [--completed <id,id>] [--blocked <reason,reason>] [--format <markdown|json>] [--out <file>]",
80
82
  " geo-ai-search-optimization skills [--json]",
81
83
  " geo-ai-search-optimization where",
82
84
  " geo-ai-search-optimization doctor [--json]",
@@ -303,6 +305,34 @@ async function handleAgentProgressTracker(args) {
303
305
  process.stdout.write(renderedOutput);
304
306
  }
305
307
 
308
+ async function handleAgentStatusBoard(args) {
309
+ const input = args.find((value) => !value.startsWith("-"));
310
+ if (!input) {
311
+ throw new Error("agent-status-board 需要一个输入值,可以是项目路径、网站网址或已导出的工件");
312
+ }
313
+
314
+ const format = getFlagValue(args, "--format") || (hasFlag(args, "--json") ? "json" : undefined);
315
+ const board = await createAgentStatusBoard(input, {
316
+ format,
317
+ currentTaskId: getFlagValue(args, "--current"),
318
+ completedPacketIds: getFlagValue(args, "--completed"),
319
+ blockedReasons: getFlagValue(args, "--blocked")
320
+ });
321
+ const outputJson = board.format === "json";
322
+ const renderedOutput = outputJson
323
+ ? `${JSON.stringify(board, null, 2)}\n`
324
+ : renderAgentStatusBoardMarkdown(board);
325
+
326
+ const outputPath = getFlagValue(args, "--out");
327
+ if (outputPath) {
328
+ const resolvedOutputPath = await writeAgentStatusBoardOutput(outputPath, renderedOutput);
329
+ process.stdout.write(`已保存 agent status board:${resolvedOutputPath}\n`);
330
+ return;
331
+ }
332
+
333
+ process.stdout.write(renderedOutput);
334
+ }
335
+
306
336
  function handleWhere() {
307
337
  process.stdout.write(
308
338
  [
@@ -873,6 +903,11 @@ export async function runCli(args = []) {
873
903
  return;
874
904
  }
875
905
 
906
+ if (command === "agent-status-board") {
907
+ await handleAgentStatusBoard(rest);
908
+ return;
909
+ }
910
+
876
911
  if (command === "skills") {
877
912
  await handleSkills(rest);
878
913
  return;
package/src/index.js CHANGED
@@ -15,6 +15,7 @@ export {
15
15
  renderAgentProgressTrackerMarkdown,
16
16
  writeAgentProgressTrackerOutput
17
17
  } from "./agent-progress-tracker.js";
18
+ export { createAgentStatusBoard, renderAgentStatusBoardMarkdown, writeAgentStatusBoardOutput } from "./agent-status-board.js";
18
19
  export { createAgentRunbook, renderAgentRunbookMarkdown, writeAgentRunbookOutput } from "./agent-runbook.js";
19
20
  export { createAgentSession, renderAgentSessionMarkdown, writeAgentSessionOutput } from "./agent-session.js";
20
21
  export { createCompletionReport, renderCompletionReportMarkdown, writeCompletionReportOutput } from "./completion-report.js";
package/src/skills.js CHANGED
@@ -10,6 +10,7 @@ const SKILL_ORDER = [
10
10
  "geo-ai-search-optimization-agent-executor",
11
11
  "geo-ai-search-optimization-agent-batch-executor",
12
12
  "geo-ai-search-optimization-agent-progress-tracker",
13
+ "geo-ai-search-optimization-agent-status-board",
13
14
  "geo-ai-search-optimization-usage",
14
15
  "geo-ai-search-optimization-agent-handoff",
15
16
  "geo-ai-search-optimization-repair-loop",
@@ -29,6 +30,7 @@ const SKILL_CATEGORY = {
29
30
  "geo-ai-search-optimization-agent-executor": "execution",
30
31
  "geo-ai-search-optimization-agent-batch-executor": "execution",
31
32
  "geo-ai-search-optimization-agent-progress-tracker": "execution",
33
+ "geo-ai-search-optimization-agent-status-board": "execution",
32
34
  "geo-ai-search-optimization-usage": "guidance",
33
35
  "geo-ai-search-optimization-agent-handoff": "execution",
34
36
  "geo-ai-search-optimization-repair-loop": "execution",
@@ -167,6 +169,7 @@ export function renderBundledSkillsMarkdown(bundle) {
167
169
  "- 如果要直接告诉 agent 这轮先做哪 1 包,再进入 agent-executor。",
168
170
  "- 如果要连续推进前 2 到 3 包,但仍然一次只做一包,再进入 agent-batch-executor。",
169
171
  "- 如果要追踪目前做到第几包、卡在哪、下一包是什么,再进入 agent-progress-tracker。",
172
+ "- 如果要把当前执行状态直接整理成看板,再进入 agent-status-board。",
170
173
  "- 再看 usage skill,知道什么时候该跑哪个命令。",
171
174
  "- 如果要交给 agent 执行,再进入 handoff / apply / completion 这一条执行链。",
172
175
  "- 如果要产出给团队分发,再进入 share / export / html / publish 这一条交付链。",