geo-ai-search-optimization 1.2.19 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/package.json +1 -1
- package/resources/geo-ai-search-optimization/references/skill-bundle-map.md +10 -0
- package/resources/geo-ai-search-optimization-agent-continue/SKILL.md +24 -0
- package/resources/geo-ai-search-optimization-agent-continue/agents/openai.yaml +4 -0
- package/resources/geo-ai-search-optimization-usage/SKILL.md +30 -25
- package/src/agent-continue.js +316 -0
- package/src/agent-resume.js +4 -2
- package/src/agent-session.js +10 -0
- package/src/auto-flow.js +27 -7
- package/src/cli.js +37 -0
- package/src/index.js +1 -0
- package/src/skills.js +3 -0
package/README.md
CHANGED
|
@@ -84,6 +84,26 @@ geo-ai-search-optimization agent-resume ./reports/agent-playbook-pack.json --for
|
|
|
84
84
|
- 恢复后下一条是什么
|
|
85
85
|
- 可直接复制给 agent 的 resume prompt
|
|
86
86
|
|
|
87
|
+
## Agent Continue 命令
|
|
88
|
+
|
|
89
|
+
如果你希望 agent 不只知道从哪里恢复,还要知道这一轮做完之后该更新哪些状态工件,可以直接用 `agent-continue`:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
geo-ai-search-optimization agent-continue ./your-site
|
|
93
|
+
geo-ai-search-optimization agent-continue ./reports/agent-playbook-pack.json
|
|
94
|
+
geo-ai-search-optimization agent-continue ./reports/agent-resume.json --format json --out ./reports/agent-continue.json
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
它会输出:
|
|
98
|
+
|
|
99
|
+
- 这一轮怎么继续
|
|
100
|
+
- 现在先执行哪条命令
|
|
101
|
+
- 这轮的 do-now checklist
|
|
102
|
+
- 执行后先验证什么
|
|
103
|
+
- 完成后更新哪些工件
|
|
104
|
+
- 可以进入收尾时跑什么
|
|
105
|
+
- 可直接复制给 agent 的 continue prompt
|
|
106
|
+
|
|
87
107
|
## Auto Flow 命令
|
|
88
108
|
|
|
89
109
|
如果你希望 agent 不用自己判断现在该用哪个 skill、该跑哪个命令,可以直接用 `auto-flow`:
|
|
@@ -704,6 +724,7 @@ geo-ai-search-optimization install
|
|
|
704
724
|
geo-ai-search-optimization install --target ./tmp/custom-skills --json
|
|
705
725
|
geo-ai-search-optimization agent-orchestrator ./your-site
|
|
706
726
|
geo-ai-search-optimization agent-resume ./your-site
|
|
727
|
+
geo-ai-search-optimization agent-continue ./your-site
|
|
707
728
|
geo-ai-search-optimization auto-flow "audit this site and tell me the next skill"
|
|
708
729
|
geo-ai-search-optimization agent-session ./your-site
|
|
709
730
|
geo-ai-search-optimization agent-runbook ./your-site
|
|
@@ -785,6 +806,23 @@ geo-ai-search-optimization help
|
|
|
785
806
|
- 输出 do-now checklist、stop checklist、success checklist、验证命令和回报模板
|
|
786
807
|
- 新增 `geo-ai-search-optimization-agent-executor` skill
|
|
787
808
|
|
|
809
|
+
## New in 1.3.0
|
|
810
|
+
|
|
811
|
+
- 正式进入 `1.3` 主线,把 agent-first 的执行闭环收敛成更明确的继续入口
|
|
812
|
+
- 新增 `agent-continue`
|
|
813
|
+
- 把 `agent-resume` 再推进成“继续这一轮并回写状态工件”的微闭环入口
|
|
814
|
+
- 输出 `continue_now`、`validate_after`、`update_artifacts`、`closeout_when_ready`、`report_back`
|
|
815
|
+
- `auto-flow`、`agent-session` 已能把 `playbook-pack / agent-resume / agent-continue` 统一接成继续链
|
|
816
|
+
- 新增 `geo-ai-search-optimization-agent-continue` skill
|
|
817
|
+
|
|
818
|
+
## New in 1.2.20
|
|
819
|
+
|
|
820
|
+
- 新增 `agent-continue`
|
|
821
|
+
- 把 `agent-resume` 再推进成“继续这一轮并回写状态工件”的微闭环入口
|
|
822
|
+
- 输出 `continue_now`、`validate_after`、`update_artifacts`、`closeout_when_ready`、`report_back`
|
|
823
|
+
- `auto-flow`、`agent-session` 已能把 `playbook-pack / agent-resume / agent-continue` 统一接成继续链
|
|
824
|
+
- 新增 `geo-ai-search-optimization-agent-continue` skill
|
|
825
|
+
|
|
788
826
|
## New in 1.2.19
|
|
789
827
|
|
|
790
828
|
- 新增 `agent-resume`
|
|
@@ -1040,6 +1078,7 @@ The installed package now includes a bundled GEO skill pack, including:
|
|
|
1040
1078
|
- `geo-ai-search-optimization-auto-flow`
|
|
1041
1079
|
- `geo-ai-search-optimization-agent-orchestrator`
|
|
1042
1080
|
- `geo-ai-search-optimization-agent-resume`
|
|
1081
|
+
- `geo-ai-search-optimization-agent-continue`
|
|
1043
1082
|
- `geo-ai-search-optimization-agent-session`
|
|
1044
1083
|
- `geo-ai-search-optimization-agent-runbook`
|
|
1045
1084
|
- `geo-ai-search-optimization-agent-executor`
|
package/package.json
CHANGED
|
@@ -52,6 +52,16 @@ Best for:
|
|
|
52
52
|
- telling the next agent exactly where to continue and what not to reset
|
|
53
53
|
- turning a previously interrupted GEO chain into one resume command plus one follow-up command
|
|
54
54
|
|
|
55
|
+
### `geo-ai-search-optimization-agent-continue`
|
|
56
|
+
|
|
57
|
+
Use this when the next agent should not only resume, but also finish one execution round and immediately write the new state back into GEO artifacts.
|
|
58
|
+
|
|
59
|
+
Best for:
|
|
60
|
+
|
|
61
|
+
- continuing the current packet and then updating status-board, checkpoint, or decision-log style artifacts
|
|
62
|
+
- turning a resume point into a one-round execution loop
|
|
63
|
+
- giving the next agent one execution command, one validation set, and one writeback list
|
|
64
|
+
|
|
55
65
|
### `geo-ai-search-optimization-agent-session`
|
|
56
66
|
|
|
57
67
|
Use this when the next agent needs a runnable session plan, not just a routing answer.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: geo-ai-search-optimization-agent-continue
|
|
3
|
+
description: Continue one GEO execution round from a reliable recovery point and write the new state back into GEO artifacts. Use when an agent, PM, or workflow already has a GEO resume point, playbook pack, decision log, status board, or similar artifact and needs the next execution command, validation steps, state writeback commands, and closeout path for this round.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GEO Agent Continue
|
|
7
|
+
|
|
8
|
+
Use this skill when the next agent should continue one round, not restart or over-plan.
|
|
9
|
+
|
|
10
|
+
`GEO = Generative Engine Optimization`
|
|
11
|
+
|
|
12
|
+
## What it does
|
|
13
|
+
|
|
14
|
+
- turns a GEO resume point into one concrete execution round
|
|
15
|
+
- tells the next agent what to run now
|
|
16
|
+
- lists what to validate after the round
|
|
17
|
+
- shows which GEO status artifacts should be updated next
|
|
18
|
+
- keeps the round connected to closeout commands when the work is ready
|
|
19
|
+
|
|
20
|
+
## Best use
|
|
21
|
+
|
|
22
|
+
- when GEO work already has a current packet and should keep moving
|
|
23
|
+
- when the next agent must update status-board, checkpoint, or decision-log after execution
|
|
24
|
+
- when PM wants one clean “do this round, then write back state” artifact
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "GEO Agent Continue"
|
|
3
|
+
short_description: "Continue one GEO round and write status back"
|
|
4
|
+
default_prompt: "Use $geo-ai-search-optimization-agent-continue to continue this GEO round from the latest reliable point, run the next execution command, validate the result, and list which GEO status artifacts must be updated afterward."
|
|
@@ -13,34 +13,35 @@ 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 twenty-
|
|
16
|
+
The package is best explained as twenty-seven layers:
|
|
17
17
|
|
|
18
18
|
1. `agent-orchestrator`: choose the one next GEO command to run right now
|
|
19
19
|
2. `agent-resume`: resume from the latest reliable GEO checkpoint instead of restarting the whole chain
|
|
20
|
-
3. `
|
|
21
|
-
4. `
|
|
22
|
-
5. `agent-
|
|
23
|
-
6. `agent-
|
|
24
|
-
7. `agent-
|
|
25
|
-
8. `agent-
|
|
26
|
-
9. `agent-
|
|
27
|
-
10. `agent-
|
|
28
|
-
11. `agent-
|
|
29
|
-
12. `agent-
|
|
30
|
-
13. `agent-
|
|
31
|
-
14. `
|
|
32
|
-
15. `
|
|
33
|
-
16. `
|
|
34
|
-
17. `
|
|
35
|
-
18. `
|
|
36
|
-
19. `
|
|
37
|
-
20. `
|
|
38
|
-
21. `
|
|
39
|
-
22. `
|
|
40
|
-
23. `
|
|
41
|
-
24. `
|
|
42
|
-
25. `
|
|
43
|
-
26. `
|
|
20
|
+
3. `agent-continue`: continue this round and write status artifacts back after execution
|
|
21
|
+
4. `auto-flow`: auto-select the next skill and command chain
|
|
22
|
+
5. `agent-session`: build a runnable session for the next agent
|
|
23
|
+
6. `agent-runbook`: execution manual and checklist for the next agent
|
|
24
|
+
7. `agent-executor`: choose one packet to execute right now
|
|
25
|
+
8. `agent-batch-executor`: queue the first few packets, but still advance one packet at a time
|
|
26
|
+
9. `agent-progress-tracker`: track which packet is done, which one is active, and what comes next
|
|
27
|
+
10. `agent-status-board`: turn the execution state into a board view for PM and agents
|
|
28
|
+
11. `agent-checkpoint`: freeze the current round into a continue / unblock / closeout decision
|
|
29
|
+
12. `agent-decision-log`: preserve why each round continued, paused, or closed out
|
|
30
|
+
13. `agent-retrospective`: explain multi-round patterns, lessons, and next-round advice
|
|
31
|
+
14. `agent-playbook-pack`: compress retrospective, decision history, and handoff into one resume entrypoint
|
|
32
|
+
15. `skills`: inspect the bundled skill package
|
|
33
|
+
16. `onboard-url` / `onboard`: first look
|
|
34
|
+
17. `scan`: raw signal check
|
|
35
|
+
18. `audit` / `report`: diagnosis
|
|
36
|
+
19. `fix-plan` / `owner-board`: execution planning
|
|
37
|
+
20. `agent-handoff`: agent takeover package
|
|
38
|
+
21. `apply-plan`: execution loop
|
|
39
|
+
22. `completion-report`: closeout
|
|
40
|
+
23. `handoff-bundle`: all-in-one package
|
|
41
|
+
24. `share-pack`: audience-ready delivery
|
|
42
|
+
25. `export-pack`: folder export
|
|
43
|
+
26. `html-pack` / `publish-pack`: browsable and final delivery output
|
|
44
|
+
27. `pm-brief` / `roadmap`: stakeholder alignment
|
|
44
45
|
|
|
45
46
|
## Recommended command order
|
|
46
47
|
|
|
@@ -49,6 +50,7 @@ If the user only has a website URL:
|
|
|
49
50
|
```bash
|
|
50
51
|
npx geo-ai-search-optimization agent-orchestrator https://example.com
|
|
51
52
|
npx geo-ai-search-optimization agent-resume https://example.com
|
|
53
|
+
npx geo-ai-search-optimization agent-continue https://example.com
|
|
52
54
|
npx geo-ai-search-optimization auto-flow https://example.com
|
|
53
55
|
npx geo-ai-search-optimization agent-session https://example.com
|
|
54
56
|
npx geo-ai-search-optimization agent-runbook https://example.com
|
|
@@ -70,6 +72,7 @@ If the user has the website codebase:
|
|
|
70
72
|
```bash
|
|
71
73
|
npx geo-ai-search-optimization agent-orchestrator ./your-site
|
|
72
74
|
npx geo-ai-search-optimization agent-resume ./your-site
|
|
75
|
+
npx geo-ai-search-optimization agent-continue ./your-site
|
|
73
76
|
npx geo-ai-search-optimization auto-flow ./your-site
|
|
74
77
|
npx geo-ai-search-optimization agent-session ./your-site
|
|
75
78
|
npx geo-ai-search-optimization agent-runbook ./your-site
|
|
@@ -100,6 +103,7 @@ npx geo-ai-search-optimization roadmap ./your-site
|
|
|
100
103
|
|
|
101
104
|
- `agent-orchestrator`: choose the one next GEO command to run now, plus expected artifact, stop conditions, and follow-up command
|
|
102
105
|
- `agent-resume`: resume from the latest reliable checkpoint, confirm what not to reset, and tell the next agent the one resume command to run
|
|
106
|
+
- `agent-continue`: continue the current round, validate it, and tell the next agent which state artifacts to update right after execution
|
|
103
107
|
- `auto-flow`: auto-select the next skill and command order from a task brief, URL, project path, or GEO artifact
|
|
104
108
|
- `agent-session`: build a step-by-step session packet for the next agent from the same kinds of inputs
|
|
105
109
|
- `agent-runbook`: build a checklist-driven runbook with preflight, validation, and reporting rules
|
|
@@ -137,6 +141,7 @@ When explaining the tool to a user:
|
|
|
137
141
|
- prefer telling them which command to run next, not listing every command
|
|
138
142
|
- if the user or next agent wants just one next command, move them to `agent-orchestrator`
|
|
139
143
|
- if the user or next agent needs to continue from the latest reliable checkpoint without restarting, move them to `agent-resume`
|
|
144
|
+
- if the user or next agent needs one round of execution plus status writeback, move them to `agent-continue`
|
|
140
145
|
- if the user or the next agent is unsure where to start, move them to `auto-flow` first
|
|
141
146
|
- if the user wants something the next agent can follow step by step, move them to `agent-session`
|
|
142
147
|
- if the user wants the next agent to follow a checklist and execution manual, move them to `agent-runbook`
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { createAgentExecutor } from "./agent-executor.js";
|
|
2
|
+
import { createAgentResume } from "./agent-resume.js";
|
|
3
|
+
import { writeScanOutput } from "./scan.js";
|
|
4
|
+
|
|
5
|
+
const VALID_FORMATS = new Set(["markdown", "json"]);
|
|
6
|
+
|
|
7
|
+
function normalizeFormat(format) {
|
|
8
|
+
const resolved = (format || "markdown").toLowerCase();
|
|
9
|
+
if (!VALID_FORMATS.has(resolved)) {
|
|
10
|
+
throw new Error(`不支持的 agent-continue 格式:${format}。可选值:${Array.from(VALID_FORMATS).join(", ")}`);
|
|
11
|
+
}
|
|
12
|
+
return resolved;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function inferContinueMode(resume, executor) {
|
|
16
|
+
if (resume.resume_mode === "needs-context") {
|
|
17
|
+
return "needs-context";
|
|
18
|
+
}
|
|
19
|
+
if (
|
|
20
|
+
resume.resume_mode === "resume-closeout" ||
|
|
21
|
+
/\b(completion-report|meeting-pack|publish-pack)\b/.test(resume.resume_command || "")
|
|
22
|
+
) {
|
|
23
|
+
return "closeout-loop";
|
|
24
|
+
}
|
|
25
|
+
if (executor?.selectedPacket) {
|
|
26
|
+
return "single-packet-loop";
|
|
27
|
+
}
|
|
28
|
+
if (/\bagent-batch-executor\b/.test(resume.resume_command || "")) {
|
|
29
|
+
return "batch-loop";
|
|
30
|
+
}
|
|
31
|
+
if (/\b(agent-status-board|agent-progress-tracker|agent-checkpoint|agent-decision-log)\b/.test(resume.resume_command || "")) {
|
|
32
|
+
return "tracking-loop";
|
|
33
|
+
}
|
|
34
|
+
return "workflow-loop";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function tryCreateExecutor(resume) {
|
|
38
|
+
if (!resume?.source || !resume?.currentPacket?.id) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
return await createAgentExecutor(resume.source, {
|
|
44
|
+
format: "json",
|
|
45
|
+
taskId: resume.currentPacket.id
|
|
46
|
+
});
|
|
47
|
+
} catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function buildContinueNow(resume, executor) {
|
|
53
|
+
if (executor?.selectedPacket) {
|
|
54
|
+
return `geo-ai-search-optimization agent-executor ${resume.source} --task ${executor.selectedPacket.id}`;
|
|
55
|
+
}
|
|
56
|
+
return resume.resume_command;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function buildContinueSummary(mode, resume, executor) {
|
|
60
|
+
if (mode === "needs-context") {
|
|
61
|
+
return "当前还缺恢复所需上下文,先补网址、目录或 GEO 工件,再继续这一轮。";
|
|
62
|
+
}
|
|
63
|
+
if (mode === "closeout-loop") {
|
|
64
|
+
return "当前最稳的继续方式是进入收尾与交付,不要重新打开新的执行包。";
|
|
65
|
+
}
|
|
66
|
+
if (mode === "single-packet-loop" && executor?.selectedPacket) {
|
|
67
|
+
return `这一轮先把 ${executor.selectedPacket.id} 做完,完成后马上回写状态与决策工件。`;
|
|
68
|
+
}
|
|
69
|
+
if (mode === "batch-loop") {
|
|
70
|
+
return "当前适合沿着批次继续,但每次仍然只推进一包,再更新状态。";
|
|
71
|
+
}
|
|
72
|
+
if (mode === "tracking-loop") {
|
|
73
|
+
return "当前更适合先校准状态,再决定是否进入下一包或收尾。";
|
|
74
|
+
}
|
|
75
|
+
return "当前应先按既有恢复命令继续,再根据结果更新状态,不要重新规划整条链。";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function buildDoNowChecklist(mode, resume, executor, continueNow) {
|
|
79
|
+
if (mode === "needs-context") {
|
|
80
|
+
return [...resume.contextNeeded];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (executor?.selectedPacket) {
|
|
84
|
+
return Array.from(
|
|
85
|
+
new Set([
|
|
86
|
+
...executor.doNowChecklist,
|
|
87
|
+
"完成这一包后,立刻更新状态看板和决策历史,不要只做代码动作不回写工件。"
|
|
88
|
+
])
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const items = [`先运行:${continueNow}`];
|
|
93
|
+
if (resume.currentPacket) {
|
|
94
|
+
items.push(`继续围绕当前包 ${resume.currentPacket.id} 推进,不要中途切到别的包。`);
|
|
95
|
+
}
|
|
96
|
+
if (resume.after_resume) {
|
|
97
|
+
items.push(`这一步完成后,继续运行:${resume.after_resume}`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return items;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function buildValidateAfter(mode, resume, executor) {
|
|
104
|
+
if (mode === "needs-context") {
|
|
105
|
+
return ["确认已经拿到网址、目录或 GEO JSON 工件,再重新进入继续链。"];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (executor?.validationCommands?.length) {
|
|
109
|
+
return Array.from(new Set(executor.validationCommands));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const items = [];
|
|
113
|
+
if (resume.expected_artifact) {
|
|
114
|
+
items.push(`确认这一步真的产出了:${resume.expected_artifact}`);
|
|
115
|
+
}
|
|
116
|
+
if (mode === "closeout-loop") {
|
|
117
|
+
items.push("确认收尾输出里已经明确写出:已完成、未完成、待验证、下一轮任务。");
|
|
118
|
+
} else {
|
|
119
|
+
items.push("确认这一步没有把恢复链跑偏,也没有跳过当前包。");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return items;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function buildUpdateArtifacts(mode, resume) {
|
|
126
|
+
if (mode === "needs-context" || !resume.source) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (mode === "closeout-loop") {
|
|
131
|
+
return [
|
|
132
|
+
`geo-ai-search-optimization completion-report ${resume.source}`,
|
|
133
|
+
`geo-ai-search-optimization meeting-pack ${resume.source}`,
|
|
134
|
+
`geo-ai-search-optimization publish-pack ${resume.source}`
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return [
|
|
139
|
+
`geo-ai-search-optimization agent-status-board ${resume.source}`,
|
|
140
|
+
`geo-ai-search-optimization agent-checkpoint ${resume.source}`,
|
|
141
|
+
`geo-ai-search-optimization agent-decision-log ${resume.source}`
|
|
142
|
+
];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function buildCloseoutWhenReady(resume) {
|
|
146
|
+
if (!resume.source) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return [
|
|
151
|
+
`geo-ai-search-optimization completion-report ${resume.source}`,
|
|
152
|
+
`geo-ai-search-optimization handoff-bundle ${resume.source}`,
|
|
153
|
+
`geo-ai-search-optimization publish-pack ${resume.source}`
|
|
154
|
+
];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function buildReportBack(mode, executor) {
|
|
158
|
+
if (executor?.userReplyTemplate) {
|
|
159
|
+
return executor.userReplyTemplate;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (mode === "closeout-loop") {
|
|
163
|
+
return [
|
|
164
|
+
"这轮我已经进入收尾阶段。",
|
|
165
|
+
"我整理了什么:",
|
|
166
|
+
"- ",
|
|
167
|
+
"我确认了哪些剩余风险:",
|
|
168
|
+
"- ",
|
|
169
|
+
"下一轮建议:",
|
|
170
|
+
"- "
|
|
171
|
+
].join("\n");
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return [
|
|
175
|
+
"这轮我已经从最近一个可靠恢复点继续。",
|
|
176
|
+
"我先做了什么:",
|
|
177
|
+
"- ",
|
|
178
|
+
"我验证了什么:",
|
|
179
|
+
"- ",
|
|
180
|
+
"我接着更新了哪些状态工件:",
|
|
181
|
+
"- ",
|
|
182
|
+
"下一步:",
|
|
183
|
+
"- "
|
|
184
|
+
].join("\n");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function buildContinuePrompt(artifact) {
|
|
188
|
+
const lines = [
|
|
189
|
+
"你现在进入 GEO Agent Continue 模式。",
|
|
190
|
+
`当前输入:${artifact.source}`,
|
|
191
|
+
`继续模式:${artifact.continue_mode}`,
|
|
192
|
+
`继续摘要:${artifact.continue_summary}`,
|
|
193
|
+
`现在先执行:${artifact.continue_now || "先补上下文"}`
|
|
194
|
+
];
|
|
195
|
+
|
|
196
|
+
if (artifact.currentPacket) {
|
|
197
|
+
lines.push(`当前包:${artifact.currentPacket.id}|${artifact.currentPacket.title}`);
|
|
198
|
+
}
|
|
199
|
+
if (artifact.nextPacket) {
|
|
200
|
+
lines.push(`下一包:${artifact.nextPacket.id}|${artifact.nextPacket.title}`);
|
|
201
|
+
}
|
|
202
|
+
if (artifact.validate_after.length > 0) {
|
|
203
|
+
lines.push("执行后先验证:");
|
|
204
|
+
for (const item of artifact.validate_after) {
|
|
205
|
+
lines.push(`- ${item}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (artifact.update_artifacts.length > 0) {
|
|
209
|
+
lines.push("完成这轮后更新这些工件:");
|
|
210
|
+
for (const item of artifact.update_artifacts) {
|
|
211
|
+
lines.push(`- ${item}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
lines.push("不要重新规划整条链。先继续这一轮,再回写状态与决策。");
|
|
216
|
+
return lines.join("\n");
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export async function createAgentContinue(input, options = {}) {
|
|
220
|
+
const format = normalizeFormat(options.format);
|
|
221
|
+
const resume = await createAgentResume(input, {
|
|
222
|
+
format: "json",
|
|
223
|
+
intent: options.intent
|
|
224
|
+
});
|
|
225
|
+
const executor = await tryCreateExecutor(resume);
|
|
226
|
+
const continueMode = inferContinueMode(resume, executor);
|
|
227
|
+
const continueNow = buildContinueNow(resume, executor);
|
|
228
|
+
|
|
229
|
+
const artifact = {
|
|
230
|
+
kind: "geo-agent-continue",
|
|
231
|
+
input,
|
|
232
|
+
source: resume.source,
|
|
233
|
+
sourceType: resume.sourceType,
|
|
234
|
+
artifactKind: resume.kind,
|
|
235
|
+
format,
|
|
236
|
+
continue_mode: continueMode,
|
|
237
|
+
continue_summary: buildContinueSummary(continueMode, resume, executor),
|
|
238
|
+
continue_now: continueNow,
|
|
239
|
+
currentPacket: executor?.selectedPacket || resume.currentPacket || null,
|
|
240
|
+
nextPacket: resume.nextPacket || null,
|
|
241
|
+
do_now_checklist: buildDoNowChecklist(continueMode, resume, executor, continueNow),
|
|
242
|
+
validate_after: buildValidateAfter(continueMode, resume, executor),
|
|
243
|
+
update_artifacts: buildUpdateArtifacts(continueMode, resume),
|
|
244
|
+
closeout_when_ready: buildCloseoutWhenReady(resume),
|
|
245
|
+
do_not_restart: resume.do_not_reset,
|
|
246
|
+
report_back: buildReportBack(continueMode, executor),
|
|
247
|
+
selectedSkill: {
|
|
248
|
+
name: "geo-ai-search-optimization-agent-continue",
|
|
249
|
+
displayName: "GEO Agent Continue",
|
|
250
|
+
shortDescription: "Continue one GEO round and write status back"
|
|
251
|
+
},
|
|
252
|
+
resume,
|
|
253
|
+
executor,
|
|
254
|
+
continue_prompt: ""
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
artifact.continue_prompt = buildContinuePrompt(artifact);
|
|
258
|
+
return artifact;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function renderAgentContinueMarkdown(artifact) {
|
|
262
|
+
const lines = [
|
|
263
|
+
"# GEO Agent Continue",
|
|
264
|
+
"",
|
|
265
|
+
`- 输入:\`${artifact.source}\``,
|
|
266
|
+
`- 输入类型:\`${artifact.sourceType}\``,
|
|
267
|
+
`- 继续模式:\`${artifact.continue_mode}\``,
|
|
268
|
+
`- 当前建议 skill:\`${artifact.selectedSkill.name}\``,
|
|
269
|
+
"",
|
|
270
|
+
"## 这一轮怎么继续",
|
|
271
|
+
"",
|
|
272
|
+
`- ${artifact.continue_summary}`,
|
|
273
|
+
`- 现在先执行:\`${artifact.continue_now || "先补上下文"}\``
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
if (artifact.currentPacket) {
|
|
277
|
+
lines.push("", "## 当前包", "", `- ${artifact.currentPacket.id}|${artifact.currentPacket.title}`);
|
|
278
|
+
}
|
|
279
|
+
if (artifact.nextPacket) {
|
|
280
|
+
lines.push("", "## 下一包", "", `- ${artifact.nextPacket.id}|${artifact.nextPacket.title}`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
lines.push("", "## 现在先做什么", "");
|
|
284
|
+
for (const item of artifact.do_now_checklist) {
|
|
285
|
+
lines.push(`- ${item}`);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
lines.push("", "## 执行后先验证", "");
|
|
289
|
+
for (const item of artifact.validate_after) {
|
|
290
|
+
lines.push(`- ${item}`);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
lines.push("", "## 这轮完成后更新哪些工件", "");
|
|
294
|
+
for (const item of artifact.update_artifacts) {
|
|
295
|
+
lines.push(`- \`${item}\``);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
lines.push("", "## 可以进入收尾时跑什么", "");
|
|
299
|
+
for (const item of artifact.closeout_when_ready) {
|
|
300
|
+
lines.push(`- \`${item}\``);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
lines.push("", "## 不要重启整条链", "");
|
|
304
|
+
for (const item of artifact.do_not_restart) {
|
|
305
|
+
lines.push(`- ${item}`);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
lines.push("", "## 回报模板", "", "```text", artifact.report_back, "```");
|
|
309
|
+
lines.push("", "## 可直接复制给 Agent 的 Continue Prompt", "", "```text", artifact.continue_prompt, "```");
|
|
310
|
+
|
|
311
|
+
return `${lines.join("\n")}\n`;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export async function writeAgentContinueOutput(outputPath, content) {
|
|
315
|
+
return writeScanOutput(outputPath, content);
|
|
316
|
+
}
|
package/src/agent-resume.js
CHANGED
|
@@ -237,12 +237,14 @@ export async function createAgentResume(input, options = {}) {
|
|
|
237
237
|
const resumeCommand = buildResumeCommand(orchestrator, playbookPack);
|
|
238
238
|
const afterResume = buildAfterResume(orchestrator, playbookPack, resumeCommand);
|
|
239
239
|
const expectedArtifact = buildExpectedArtifact(orchestrator, playbookPack, resumeCommand);
|
|
240
|
+
const source = playbookPack?.source || orchestrator.source;
|
|
241
|
+
const sourceType = playbookPack?.sourceType || orchestrator.sourceType;
|
|
240
242
|
|
|
241
243
|
const resume = {
|
|
242
244
|
kind: "geo-agent-resume",
|
|
243
245
|
input,
|
|
244
|
-
source
|
|
245
|
-
sourceType
|
|
246
|
+
source,
|
|
247
|
+
sourceType,
|
|
246
248
|
artifactKind: orchestrator.artifactKind,
|
|
247
249
|
format,
|
|
248
250
|
resume_mode: inferResumeMode(orchestrator, playbookPack),
|
package/src/agent-session.js
CHANGED
|
@@ -49,6 +49,9 @@ function inferSkillForCommand(commandName, flow) {
|
|
|
49
49
|
if (commandName === "agent-resume") {
|
|
50
50
|
return "geo-ai-search-optimization-agent-resume";
|
|
51
51
|
}
|
|
52
|
+
if (commandName === "agent-continue") {
|
|
53
|
+
return "geo-ai-search-optimization-agent-continue";
|
|
54
|
+
}
|
|
52
55
|
if (commandName === "agent-runbook") {
|
|
53
56
|
return "geo-ai-search-optimization-agent-runbook";
|
|
54
57
|
}
|
|
@@ -119,6 +122,8 @@ function inferStepPurpose(commandName, flow) {
|
|
|
119
122
|
return "快速建立从 0 到 1 的执行顺序。";
|
|
120
123
|
case "agent-resume":
|
|
121
124
|
return "从最近一个可靠恢复点继续,而不是把整条 GEO 链重新跑一遍。";
|
|
125
|
+
case "agent-continue":
|
|
126
|
+
return "继续当前这一轮,并把状态、检查点和决策工件一并回写。";
|
|
122
127
|
case "onboard":
|
|
123
128
|
case "onboard-url":
|
|
124
129
|
return "先从网址或引导流程拿到首轮 GEO 判断。";
|
|
@@ -198,6 +203,8 @@ function inferExpectedArtifact(commandName) {
|
|
|
198
203
|
return "agent 交接工件";
|
|
199
204
|
case "agent-resume":
|
|
200
205
|
return "agent 恢复入口工件";
|
|
206
|
+
case "agent-continue":
|
|
207
|
+
return "agent 单轮继续工件";
|
|
201
208
|
case "agent-runbook":
|
|
202
209
|
return "agent 执行手册";
|
|
203
210
|
case "agent-executor":
|
|
@@ -248,6 +255,9 @@ function buildStepInstructions(parsedCommand, flow) {
|
|
|
248
255
|
if (parsedCommand.commandName === "agent-resume") {
|
|
249
256
|
lines.push("先确认恢复点、当前包和不要重置的内容,再继续执行。");
|
|
250
257
|
}
|
|
258
|
+
if (parsedCommand.commandName === "agent-continue") {
|
|
259
|
+
lines.push("这一步不只继续当前包,还要把这一轮完成后的状态与决策工件一起更新。");
|
|
260
|
+
}
|
|
251
261
|
if (parsedCommand.commandName === "apply-plan") {
|
|
252
262
|
lines.push("执行包出来后,优先从第一包开始,不要同时展开太多任务。");
|
|
253
263
|
}
|
package/src/auto-flow.js
CHANGED
|
@@ -41,6 +41,9 @@ function detectArtifactKindFromParsedJson(parsed) {
|
|
|
41
41
|
function inferTaskTextMode(text) {
|
|
42
42
|
const normalized = String(text).toLowerCase();
|
|
43
43
|
|
|
44
|
+
if (/(agent-continue|continue this round|继续这轮|继续当前轮次|回写状态后继续)/i.test(normalized)) {
|
|
45
|
+
return "execute";
|
|
46
|
+
}
|
|
44
47
|
if (/(agent-resume|resume|恢复继续|从中断处继续|接着上次继续|从最近恢复点继续)/i.test(normalized)) {
|
|
45
48
|
return "execute";
|
|
46
49
|
}
|
|
@@ -177,6 +180,9 @@ function resolveEffectiveIntent(intent, detected) {
|
|
|
177
180
|
if (detected.artifactKind === "geo-agent-resume") {
|
|
178
181
|
return detected.parsed?.resume_mode === "resume-closeout" ? "closeout" : "execute";
|
|
179
182
|
}
|
|
183
|
+
if (detected.artifactKind === "geo-agent-continue") {
|
|
184
|
+
return detected.parsed?.continue_mode === "closeout-loop" ? "closeout" : "execute";
|
|
185
|
+
}
|
|
180
186
|
if (
|
|
181
187
|
[
|
|
182
188
|
"geo-share-pack",
|
|
@@ -431,20 +437,23 @@ function buildCommandChain(detected, intent) {
|
|
|
431
437
|
const baseSource = detected.parsed?.source || source;
|
|
432
438
|
return detected.parsed?.playbookStatus === "closeout-ready"
|
|
433
439
|
? [
|
|
434
|
-
`geo-ai-search-optimization agent-
|
|
440
|
+
`geo-ai-search-optimization agent-continue ${source}`,
|
|
435
441
|
`geo-ai-search-optimization meeting-pack ${baseSource}`,
|
|
436
442
|
`geo-ai-search-optimization publish-pack ${baseSource}`
|
|
437
443
|
]
|
|
438
444
|
: [
|
|
439
|
-
`geo-ai-search-optimization agent-
|
|
445
|
+
`geo-ai-search-optimization agent-continue ${source}`,
|
|
440
446
|
`geo-ai-search-optimization agent-status-board ${baseSource}`,
|
|
441
447
|
`geo-ai-search-optimization agent-decision-log ${baseSource}`
|
|
442
448
|
];
|
|
443
449
|
}
|
|
444
450
|
case "geo-agent-resume": {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
451
|
+
return [`geo-ai-search-optimization agent-continue ${source}`];
|
|
452
|
+
}
|
|
453
|
+
case "geo-agent-continue": {
|
|
454
|
+
const continueNow = detected.parsed?.continue_now;
|
|
455
|
+
const updates = Array.isArray(detected.parsed?.update_artifacts) ? detected.parsed.update_artifacts : [];
|
|
456
|
+
return [continueNow, ...updates.slice(0, 2)].filter(Boolean);
|
|
448
457
|
}
|
|
449
458
|
case "geo-apply-plan":
|
|
450
459
|
return [
|
|
@@ -527,7 +536,8 @@ function pickSkillName(detected, intent) {
|
|
|
527
536
|
case "geo-agent-decision-log":
|
|
528
537
|
case "geo-agent-playbook-pack":
|
|
529
538
|
case "geo-agent-resume":
|
|
530
|
-
|
|
539
|
+
case "geo-agent-continue":
|
|
540
|
+
return "geo-ai-search-optimization-agent-continue";
|
|
531
541
|
case "geo-agent-retrospective":
|
|
532
542
|
return "geo-ai-search-optimization-agent-retrospective";
|
|
533
543
|
case "geo-completion-report":
|
|
@@ -572,6 +582,7 @@ function buildSecondarySkillNames(primarySkill, intent, detected) {
|
|
|
572
582
|
"geo-agent-checkpoint",
|
|
573
583
|
"geo-agent-decision-log",
|
|
574
584
|
"geo-agent-resume",
|
|
585
|
+
"geo-agent-continue",
|
|
575
586
|
"geo-agent-playbook-pack",
|
|
576
587
|
"geo-apply-plan"
|
|
577
588
|
].includes(
|
|
@@ -579,6 +590,7 @@ function buildSecondarySkillNames(primarySkill, intent, detected) {
|
|
|
579
590
|
)
|
|
580
591
|
) {
|
|
581
592
|
names.add("geo-ai-search-optimization-agent-resume");
|
|
593
|
+
names.add("geo-ai-search-optimization-agent-continue");
|
|
582
594
|
names.add("geo-ai-search-optimization-agent-batch-executor");
|
|
583
595
|
names.add("geo-ai-search-optimization-agent-progress-tracker");
|
|
584
596
|
names.add("geo-ai-search-optimization-agent-status-board");
|
|
@@ -600,6 +612,9 @@ function buildSecondarySkillNames(primarySkill, intent, detected) {
|
|
|
600
612
|
}
|
|
601
613
|
|
|
602
614
|
function buildStage(intent, detected) {
|
|
615
|
+
if (detected.artifactKind === "geo-agent-continue") {
|
|
616
|
+
return "继续执行";
|
|
617
|
+
}
|
|
603
618
|
if (detected.artifactKind === "geo-agent-resume") {
|
|
604
619
|
return "恢复继续";
|
|
605
620
|
}
|
|
@@ -624,6 +639,7 @@ function buildStage(intent, detected) {
|
|
|
624
639
|
"geo-agent-checkpoint",
|
|
625
640
|
"geo-agent-decision-log",
|
|
626
641
|
"geo-agent-resume",
|
|
642
|
+
"geo-agent-continue",
|
|
627
643
|
"geo-agent-playbook-pack",
|
|
628
644
|
"geo-agent-retrospective",
|
|
629
645
|
"geo-apply-plan",
|
|
@@ -644,6 +660,7 @@ function buildStage(intent, detected) {
|
|
|
644
660
|
"geo-agent-checkpoint",
|
|
645
661
|
"geo-agent-decision-log",
|
|
646
662
|
"geo-agent-resume",
|
|
663
|
+
"geo-agent-continue",
|
|
647
664
|
"geo-agent-playbook-pack",
|
|
648
665
|
"geo-agent-retrospective",
|
|
649
666
|
"geo-apply-plan",
|
|
@@ -732,8 +749,11 @@ function buildNextAction(detected, intent, commands) {
|
|
|
732
749
|
return `先运行 \`${commands[0]}\` 生成适合外发或交接的结果。`;
|
|
733
750
|
}
|
|
734
751
|
if (intent === "execute") {
|
|
752
|
+
if (detected.artifactKind === "geo-agent-continue") {
|
|
753
|
+
return `先运行 \`${commands[0]}\`,继续当前这一轮,并把状态与决策工件一起回写。`;
|
|
754
|
+
}
|
|
735
755
|
if (detected.artifactKind === "geo-agent-resume") {
|
|
736
|
-
return `先运行 \`${commands[0]}
|
|
756
|
+
return `先运行 \`${commands[0]}\`,把恢复点推进成一轮真正的继续闭环。`;
|
|
737
757
|
}
|
|
738
758
|
if (detected.artifactKind === "geo-agent-progress-tracker") {
|
|
739
759
|
return `先运行 \`${commands[0]}\`,先确认最近一个可靠恢复点,再继续当前执行包。`;
|
package/src/cli.js
CHANGED
|
@@ -7,6 +7,11 @@ import {
|
|
|
7
7
|
renderAgentBatchExecutorMarkdown,
|
|
8
8
|
writeAgentBatchExecutorOutput
|
|
9
9
|
} from "./agent-batch-executor.js";
|
|
10
|
+
import {
|
|
11
|
+
createAgentContinue,
|
|
12
|
+
renderAgentContinueMarkdown,
|
|
13
|
+
writeAgentContinueOutput
|
|
14
|
+
} from "./agent-continue.js";
|
|
10
15
|
import { createAgentExecutor, renderAgentExecutorMarkdown, writeAgentExecutorOutput } from "./agent-executor.js";
|
|
11
16
|
import { createAgentHandoff, renderAgentHandoffMarkdown, writeAgentHandoffOutput } from "./agent-handoff.js";
|
|
12
17
|
import {
|
|
@@ -88,6 +93,7 @@ function printHelp() {
|
|
|
88
93
|
" geo-ai-search-optimization install [--target <dir>] [--json]",
|
|
89
94
|
" geo-ai-search-optimization agent-orchestrator <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--format <markdown|json>] [--out <file>]",
|
|
90
95
|
" geo-ai-search-optimization agent-resume <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--format <markdown|json>] [--out <file>]",
|
|
96
|
+
" geo-ai-search-optimization agent-continue <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--format <markdown|json>] [--out <file>]",
|
|
91
97
|
" geo-ai-search-optimization auto-flow <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--json] [--out <file>]",
|
|
92
98
|
" geo-ai-search-optimization agent-session <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--json] [--out <file>]",
|
|
93
99
|
" geo-ai-search-optimization agent-runbook <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--task <id>] [--format <markdown|json>] [--out <file>]",
|
|
@@ -241,6 +247,32 @@ async function handleAgentResume(args) {
|
|
|
241
247
|
process.stdout.write(renderedOutput);
|
|
242
248
|
}
|
|
243
249
|
|
|
250
|
+
async function handleAgentContinue(args) {
|
|
251
|
+
const input = args.find((value) => !value.startsWith("-"));
|
|
252
|
+
if (!input) {
|
|
253
|
+
throw new Error("agent-continue 需要一个输入值,可以是任务描述、项目路径、网站网址或已导出的工件");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const format = getFlagValue(args, "--format") || (hasFlag(args, "--json") ? "json" : undefined);
|
|
257
|
+
const artifact = await createAgentContinue(input, {
|
|
258
|
+
intent: getFlagValue(args, "--intent"),
|
|
259
|
+
format
|
|
260
|
+
});
|
|
261
|
+
const outputJson = artifact.format === "json";
|
|
262
|
+
const renderedOutput = outputJson
|
|
263
|
+
? `${JSON.stringify(artifact, null, 2)}\n`
|
|
264
|
+
: renderAgentContinueMarkdown(artifact);
|
|
265
|
+
|
|
266
|
+
const outputPath = getFlagValue(args, "--out");
|
|
267
|
+
if (outputPath) {
|
|
268
|
+
const resolvedOutputPath = await writeAgentContinueOutput(outputPath, renderedOutput);
|
|
269
|
+
process.stdout.write(`已保存 agent-continue 结果:${resolvedOutputPath}\n`);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
process.stdout.write(renderedOutput);
|
|
274
|
+
}
|
|
275
|
+
|
|
244
276
|
async function handleAgentSession(args) {
|
|
245
277
|
const input = args.find((value) => !value.startsWith("-"));
|
|
246
278
|
if (!input) {
|
|
@@ -1067,6 +1099,11 @@ export async function runCli(args = []) {
|
|
|
1067
1099
|
return;
|
|
1068
1100
|
}
|
|
1069
1101
|
|
|
1102
|
+
if (command === "agent-continue") {
|
|
1103
|
+
await handleAgentContinue(rest);
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1070
1107
|
if (command === "agent-session") {
|
|
1071
1108
|
await handleAgentSession(rest);
|
|
1072
1109
|
return;
|
package/src/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export {
|
|
|
7
7
|
} from "./interactive-onboarding.js";
|
|
8
8
|
export { createAutoFlow, renderAutoFlowMarkdown, writeAutoFlowOutput } from "./auto-flow.js";
|
|
9
9
|
export { createApplyPlan, renderApplyPlanMarkdown, writeApplyPlanOutput } from "./apply-plan.js";
|
|
10
|
+
export { createAgentContinue, renderAgentContinueMarkdown, writeAgentContinueOutput } from "./agent-continue.js";
|
|
10
11
|
export { createAgentOrchestrator, renderAgentOrchestratorMarkdown, writeAgentOrchestratorOutput } from "./agent-orchestrator.js";
|
|
11
12
|
export { createAgentResume, renderAgentResumeMarkdown, writeAgentResumeOutput } from "./agent-resume.js";
|
|
12
13
|
export { createAgentBatchExecutor, renderAgentBatchExecutorMarkdown, writeAgentBatchExecutorOutput } from "./agent-batch-executor.js";
|
package/src/skills.js
CHANGED
|
@@ -7,6 +7,7 @@ const SKILL_ORDER = [
|
|
|
7
7
|
"geo-ai-search-optimization-auto-flow",
|
|
8
8
|
"geo-ai-search-optimization-agent-orchestrator",
|
|
9
9
|
"geo-ai-search-optimization-agent-resume",
|
|
10
|
+
"geo-ai-search-optimization-agent-continue",
|
|
10
11
|
"geo-ai-search-optimization-agent-session",
|
|
11
12
|
"geo-ai-search-optimization-agent-runbook",
|
|
12
13
|
"geo-ai-search-optimization-agent-executor",
|
|
@@ -33,6 +34,7 @@ const SKILL_CATEGORY = {
|
|
|
33
34
|
"geo-ai-search-optimization-auto-flow": "routing",
|
|
34
35
|
"geo-ai-search-optimization-agent-orchestrator": "routing",
|
|
35
36
|
"geo-ai-search-optimization-agent-resume": "routing",
|
|
37
|
+
"geo-ai-search-optimization-agent-continue": "routing",
|
|
36
38
|
"geo-ai-search-optimization-agent-session": "routing",
|
|
37
39
|
"geo-ai-search-optimization-agent-runbook": "execution",
|
|
38
40
|
"geo-ai-search-optimization-agent-executor": "execution",
|
|
@@ -177,6 +179,7 @@ export function renderBundledSkillsMarkdown(bundle) {
|
|
|
177
179
|
"- 先看核心 GEO skill。",
|
|
178
180
|
"- 如果你只想让 agent 立刻知道现在唯一该跑哪条命令,先跑 agent-orchestrator。",
|
|
179
181
|
"- 如果工作中断后要从最近一个可靠恢复点继续,先跑 agent-resume。",
|
|
182
|
+
"- 如果你希望 agent 不只恢复,还要拿到这一轮继续后的状态回写动作,继续跑 agent-continue。",
|
|
180
183
|
"- 如果 agent 需要自动选 skill,先跑 auto-flow。",
|
|
181
184
|
"- 如果要给 agent 明确步骤,继续进入 agent-session。",
|
|
182
185
|
"- 如果要给 agent 一份执行手册和检查表,再进入 agent-runbook。",
|