geo-ai-search-optimization 1.3.7 → 1.3.8
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 +8 -0
- package/package.json +1 -1
- package/src/cli-flow-commands.js +60 -84
- package/src/cli-shared.js +23 -0
- package/src/cli-site-ops-commands.js +93 -124
package/README.md
CHANGED
|
@@ -886,6 +886,14 @@ geo-ai-search-optimization help
|
|
|
886
886
|
- `src/cli-agent-execution-commands.js` 与 `src/cli-planning-delivery-commands.js` 现在改用声明式组合,减少重复的 `create / render / write` handler 模板代码
|
|
887
887
|
- CLI 架构从“按命令族拆文件”进一步推进到“adapter + shared composition”模式
|
|
888
888
|
|
|
889
|
+
## New in 1.3.8
|
|
890
|
+
|
|
891
|
+
- 继续把共享组合器推广到 `flow` 与 `site-ops` 两层
|
|
892
|
+
- `src/cli-shared.js` 新增 `createStructuredOutputCommandHandler`
|
|
893
|
+
- `src/cli-flow-commands.js` 现在统一通过组合器编排 `auto-flow / agent-orchestrator / agent-resume / agent-continue / agent-state-pack / agent-session`
|
|
894
|
+
- `src/cli-site-ops-commands.js` 现在统一通过组合器编排 `doctor / quick-start / onboard / onboard-url / audit / scan`
|
|
895
|
+
- CLI 架构进一步收敛到“命令族 adapter + shared composition primitives”的模式
|
|
896
|
+
|
|
889
897
|
## New in 1.2.20
|
|
890
898
|
|
|
891
899
|
- 新增 `agent-continue`
|
package/package.json
CHANGED
package/src/cli-flow-commands.js
CHANGED
|
@@ -17,11 +17,12 @@ import {
|
|
|
17
17
|
} from "./agent-state-pack.js";
|
|
18
18
|
import { createAgentSession, renderAgentSessionMarkdown, writeAgentSessionOutput } from "./agent-session.js";
|
|
19
19
|
import {
|
|
20
|
+
createArtifactCommandHandler,
|
|
21
|
+
createStructuredOutputCommandHandler,
|
|
20
22
|
getFlagValue,
|
|
21
23
|
getJsonCapableFormat,
|
|
22
24
|
getRequiredInput,
|
|
23
|
-
hasFlag
|
|
24
|
-
writeOrPrintArtifact
|
|
25
|
+
hasFlag
|
|
25
26
|
} from "./cli-shared.js";
|
|
26
27
|
|
|
27
28
|
export const FLOW_HELP_LINES = [
|
|
@@ -33,105 +34,80 @@ export const FLOW_HELP_LINES = [
|
|
|
33
34
|
" geo-ai-search-optimization agent-session <input> [--intent <auto|diagnose|guide|execute|share|closeout>] [--json] [--out <file>]"
|
|
34
35
|
];
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
process.stdout.write(renderedOutput);
|
|
52
|
-
}
|
|
37
|
+
const handleAutoFlow = createStructuredOutputCommandHandler({
|
|
38
|
+
commandLabel: "auto-flow",
|
|
39
|
+
execute: async (args) => {
|
|
40
|
+
const input = getRequiredInput(args, "auto-flow");
|
|
41
|
+
return createAutoFlow(input, {
|
|
42
|
+
intent: getFlagValue(args, "--intent")
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
renderMarkdown: renderAutoFlowMarkdown,
|
|
46
|
+
writeOutput: writeAutoFlowOutput,
|
|
47
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
48
|
+
});
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
const handleAgentOrchestrator = createArtifactCommandHandler({
|
|
51
|
+
commandName: "agent-orchestrator",
|
|
52
|
+
commandLabel: "agent-orchestrator",
|
|
53
|
+
createArtifact: createAgentOrchestrator,
|
|
54
|
+
renderMarkdown: renderAgentOrchestratorMarkdown,
|
|
55
|
+
writeOutput: writeAgentOrchestratorOutput,
|
|
56
|
+
getOptions: (args) => ({
|
|
57
57
|
intent: getFlagValue(args, "--intent"),
|
|
58
58
|
format: getJsonCapableFormat(args)
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
args,
|
|
62
|
-
commandName: "agent-orchestrator",
|
|
63
|
-
artifact,
|
|
64
|
-
renderMarkdown: renderAgentOrchestratorMarkdown,
|
|
65
|
-
writeOutput: writeAgentOrchestratorOutput,
|
|
66
|
-
outputJson: artifact.format === "json"
|
|
67
|
-
});
|
|
68
|
-
}
|
|
59
|
+
})
|
|
60
|
+
});
|
|
69
61
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
62
|
+
const handleAgentResume = createArtifactCommandHandler({
|
|
63
|
+
commandName: "agent-resume",
|
|
64
|
+
commandLabel: "agent-resume",
|
|
65
|
+
createArtifact: createAgentResume,
|
|
66
|
+
renderMarkdown: renderAgentResumeMarkdown,
|
|
67
|
+
writeOutput: writeAgentResumeOutput,
|
|
68
|
+
getOptions: (args) => ({
|
|
73
69
|
intent: getFlagValue(args, "--intent"),
|
|
74
70
|
format: getJsonCapableFormat(args)
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
args,
|
|
78
|
-
commandName: "agent-resume",
|
|
79
|
-
artifact,
|
|
80
|
-
renderMarkdown: renderAgentResumeMarkdown,
|
|
81
|
-
writeOutput: writeAgentResumeOutput,
|
|
82
|
-
outputJson: artifact.format === "json"
|
|
83
|
-
});
|
|
84
|
-
}
|
|
71
|
+
})
|
|
72
|
+
});
|
|
85
73
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
74
|
+
const handleAgentContinue = createArtifactCommandHandler({
|
|
75
|
+
commandName: "agent-continue",
|
|
76
|
+
commandLabel: "agent-continue",
|
|
77
|
+
createArtifact: createAgentContinue,
|
|
78
|
+
renderMarkdown: renderAgentContinueMarkdown,
|
|
79
|
+
writeOutput: writeAgentContinueOutput,
|
|
80
|
+
getOptions: (args) => ({
|
|
89
81
|
intent: getFlagValue(args, "--intent"),
|
|
90
82
|
format: getJsonCapableFormat(args)
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
args,
|
|
94
|
-
commandName: "agent-continue",
|
|
95
|
-
artifact,
|
|
96
|
-
renderMarkdown: renderAgentContinueMarkdown,
|
|
97
|
-
writeOutput: writeAgentContinueOutput,
|
|
98
|
-
outputJson: artifact.format === "json"
|
|
99
|
-
});
|
|
100
|
-
}
|
|
83
|
+
})
|
|
84
|
+
});
|
|
101
85
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
86
|
+
const handleAgentStatePack = createArtifactCommandHandler({
|
|
87
|
+
commandName: "agent-state-pack",
|
|
88
|
+
commandLabel: "agent-state-pack",
|
|
89
|
+
createArtifact: createAgentStatePack,
|
|
90
|
+
renderMarkdown: renderAgentStatePackMarkdown,
|
|
91
|
+
writeOutput: writeAgentStatePackOutput,
|
|
92
|
+
getOptions: (args) => ({
|
|
105
93
|
intent: getFlagValue(args, "--intent"),
|
|
106
94
|
format: getJsonCapableFormat(args),
|
|
107
95
|
currentTaskId: getFlagValue(args, "--current"),
|
|
108
96
|
completedPacketIds: getFlagValue(args, "--completed"),
|
|
109
97
|
blockedReasons: getFlagValue(args, "--blocked")
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
args,
|
|
113
|
-
commandName: "agent-state-pack",
|
|
114
|
-
artifact,
|
|
115
|
-
renderMarkdown: renderAgentStatePackMarkdown,
|
|
116
|
-
writeOutput: writeAgentStatePackOutput,
|
|
117
|
-
outputJson: artifact.format === "json"
|
|
118
|
-
});
|
|
119
|
-
}
|
|
98
|
+
})
|
|
99
|
+
});
|
|
120
100
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
101
|
+
const handleAgentSession = createArtifactCommandHandler({
|
|
102
|
+
commandName: "agent-session",
|
|
103
|
+
commandLabel: "agent-session",
|
|
104
|
+
createArtifact: createAgentSession,
|
|
105
|
+
renderMarkdown: renderAgentSessionMarkdown,
|
|
106
|
+
writeOutput: writeAgentSessionOutput,
|
|
107
|
+
getOptions: (args) => ({
|
|
124
108
|
intent: getFlagValue(args, "--intent")
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
args,
|
|
128
|
-
commandName: "agent-session",
|
|
129
|
-
artifact,
|
|
130
|
-
renderMarkdown: renderAgentSessionMarkdown,
|
|
131
|
-
writeOutput: writeAgentSessionOutput,
|
|
132
|
-
outputJson: hasFlag(args, "--json")
|
|
133
|
-
});
|
|
134
|
-
}
|
|
109
|
+
})
|
|
110
|
+
});
|
|
135
111
|
|
|
136
112
|
export const FLOW_COMMAND_HANDLERS = {
|
|
137
113
|
"auto-flow": handleAutoFlow,
|
package/src/cli-shared.js
CHANGED
|
@@ -90,3 +90,26 @@ export function createPackCommandHandler({
|
|
|
90
90
|
process.stdout.write(renderMarkdown(pack));
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
|
+
|
|
94
|
+
export function createStructuredOutputCommandHandler({
|
|
95
|
+
commandLabel,
|
|
96
|
+
execute,
|
|
97
|
+
renderMarkdown,
|
|
98
|
+
writeOutput,
|
|
99
|
+
getOutputJson
|
|
100
|
+
}) {
|
|
101
|
+
return async function structuredOutputCommandHandler(args) {
|
|
102
|
+
const result = await execute(args);
|
|
103
|
+
const outputJson = getOutputJson ? getOutputJson(args, result) : hasFlag(args, "--json");
|
|
104
|
+
const renderedOutput = outputJson ? `${JSON.stringify(result, null, 2)}\n` : renderMarkdown(result);
|
|
105
|
+
const outputPath = getFlagValue(args, "--out");
|
|
106
|
+
|
|
107
|
+
if (outputPath) {
|
|
108
|
+
const resolvedOutputPath = await writeOutput(outputPath, renderedOutput);
|
|
109
|
+
process.stdout.write(`已保存 ${commandLabel} 结果:${resolvedOutputPath}\n`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
process.stdout.write(renderedOutput);
|
|
114
|
+
};
|
|
115
|
+
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { auditProject, renderAuditMarkdown, writeAuditOutput } from "./audit.js";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
createStructuredOutputCommandHandler,
|
|
4
|
+
getFlagValue,
|
|
5
|
+
hasFlag,
|
|
6
|
+
parsePositiveInteger
|
|
7
|
+
} from "./cli-shared.js";
|
|
3
8
|
import { renderDoctorMarkdown, runDoctor } from "./doctor.js";
|
|
4
9
|
import {
|
|
5
10
|
renderInteractiveOnboardingMarkdown,
|
|
@@ -23,74 +28,51 @@ export const SITE_OPS_HELP_LINES = [
|
|
|
23
28
|
" geo-ai-search-optimization scan <project-path> [--json] [--out <file>] [--max-file-size <bytes>] [--max-examples <count>]"
|
|
24
29
|
];
|
|
25
30
|
|
|
26
|
-
async
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async function handleOnboardUrl(args) {
|
|
74
|
-
const inputUrl = args.find((value) => !value.startsWith("-"));
|
|
75
|
-
if (!inputUrl) {
|
|
76
|
-
throw new Error("onboard-url requires a website URL");
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const report = await analyzeWebsiteUrl(inputUrl, {});
|
|
80
|
-
const outputJson = hasFlag(args, "--json");
|
|
81
|
-
const renderedOutput = outputJson
|
|
82
|
-
? `${JSON.stringify(report, null, 2)}\n`
|
|
83
|
-
: `${renderWebsiteOnboardingMarkdown(report)}\n`;
|
|
84
|
-
const outputPath = getFlagValue(args, "--out");
|
|
85
|
-
|
|
86
|
-
if (outputPath) {
|
|
87
|
-
const resolvedOutputPath = await writeWebsiteOnboardingOutput(outputPath, renderedOutput);
|
|
88
|
-
process.stdout.write(`已保存 onboarding 结果:${resolvedOutputPath}\n`);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
process.stdout.write(renderedOutput);
|
|
93
|
-
}
|
|
31
|
+
const passthroughWriteOutput = async (outputPath) => outputPath;
|
|
32
|
+
|
|
33
|
+
const handleDoctor = createStructuredOutputCommandHandler({
|
|
34
|
+
commandLabel: "doctor",
|
|
35
|
+
execute: async () => runDoctor(),
|
|
36
|
+
renderMarkdown: renderDoctorMarkdown,
|
|
37
|
+
writeOutput: passthroughWriteOutput,
|
|
38
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const handleQuickStart = createStructuredOutputCommandHandler({
|
|
42
|
+
commandLabel: "quick start",
|
|
43
|
+
execute: async () => createQuickStartPlan({}),
|
|
44
|
+
renderMarkdown: renderQuickStartMarkdown,
|
|
45
|
+
writeOutput: writeQuickStartOutput,
|
|
46
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const handleInteractiveOnboard = createStructuredOutputCommandHandler({
|
|
50
|
+
commandLabel: "交互式 onboarding",
|
|
51
|
+
execute: async (args) =>
|
|
52
|
+
runInteractiveOnboarding({
|
|
53
|
+
url: getFlagValue(args, "--url"),
|
|
54
|
+
goal: getFlagValue(args, "--goal"),
|
|
55
|
+
existingAssets: getFlagValue(args, "--existing-assets")
|
|
56
|
+
}),
|
|
57
|
+
renderMarkdown: renderInteractiveOnboardingMarkdown,
|
|
58
|
+
writeOutput: writeInteractiveOnboardingOutput,
|
|
59
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const handleOnboardUrl = createStructuredOutputCommandHandler({
|
|
63
|
+
commandLabel: "onboarding",
|
|
64
|
+
execute: async (args) => {
|
|
65
|
+
const inputUrl = args.find((value) => !value.startsWith("-"));
|
|
66
|
+
if (!inputUrl) {
|
|
67
|
+
throw new Error("onboard-url requires a website URL");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return analyzeWebsiteUrl(inputUrl, {});
|
|
71
|
+
},
|
|
72
|
+
renderMarkdown: (report) => `${renderWebsiteOnboardingMarkdown(report)}\n`,
|
|
73
|
+
writeOutput: writeWebsiteOnboardingOutput,
|
|
74
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
75
|
+
});
|
|
94
76
|
|
|
95
77
|
async function handleInitLlms(args) {
|
|
96
78
|
const targetDir = args.find((value) => !value.startsWith("-")) || ".";
|
|
@@ -133,61 +115,48 @@ async function handleInitSchema(args) {
|
|
|
133
115
|
process.stdout.write(`Created ${result.schemaType} schema template at ${result.outputPath}\n`);
|
|
134
116
|
}
|
|
135
117
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const outputJson = hasFlag(args, "--json");
|
|
180
|
-
const renderedOutput = outputJson ? `${JSON.stringify(summary, null, 2)}\n` : renderScanMarkdown(summary);
|
|
181
|
-
const outputPath = getFlagValue(args, "--out");
|
|
182
|
-
|
|
183
|
-
if (outputPath) {
|
|
184
|
-
const resolvedOutputPath = await writeScanOutput(outputPath, renderedOutput);
|
|
185
|
-
process.stdout.write(`已保存扫描结果:${resolvedOutputPath}\n`);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
process.stdout.write(renderedOutput);
|
|
190
|
-
}
|
|
118
|
+
const handleAudit = createStructuredOutputCommandHandler({
|
|
119
|
+
commandLabel: "审计",
|
|
120
|
+
execute: async (args) => {
|
|
121
|
+
const projectPath = args.find((value) => !value.startsWith("-"));
|
|
122
|
+
if (!projectPath) {
|
|
123
|
+
throw new Error("audit requires a project path");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return auditProject(projectPath, {
|
|
127
|
+
maxFileSize: getFlagValue(args, "--max-file-size")
|
|
128
|
+
? parsePositiveInteger(getFlagValue(args, "--max-file-size"), "--max-file-size")
|
|
129
|
+
: undefined,
|
|
130
|
+
maxExamples: getFlagValue(args, "--max-examples")
|
|
131
|
+
? parsePositiveInteger(getFlagValue(args, "--max-examples"), "--max-examples")
|
|
132
|
+
: undefined
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
renderMarkdown: (report) => `${renderAuditMarkdown(report)}\n`,
|
|
136
|
+
writeOutput: writeAuditOutput,
|
|
137
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const handleScan = createStructuredOutputCommandHandler({
|
|
141
|
+
commandLabel: "扫描",
|
|
142
|
+
execute: async (args) => {
|
|
143
|
+
const projectPath = args.find((value) => !value.startsWith("-"));
|
|
144
|
+
if (!projectPath) {
|
|
145
|
+
throw new Error("scan requires a project path");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const maxFileSizeValue = getFlagValue(args, "--max-file-size");
|
|
149
|
+
const maxExamplesValue = getFlagValue(args, "--max-examples");
|
|
150
|
+
|
|
151
|
+
return scanProject(projectPath, {
|
|
152
|
+
maxFileSize: maxFileSizeValue ? parsePositiveInteger(maxFileSizeValue, "--max-file-size") : undefined,
|
|
153
|
+
maxExamples: maxExamplesValue ? parsePositiveInteger(maxExamplesValue, "--max-examples") : undefined
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
renderMarkdown: renderScanMarkdown,
|
|
157
|
+
writeOutput: writeScanOutput,
|
|
158
|
+
getOutputJson: (args) => hasFlag(args, "--json")
|
|
159
|
+
});
|
|
191
160
|
|
|
192
161
|
export const SITE_OPS_COMMAND_HANDLERS = {
|
|
193
162
|
doctor: handleDoctor,
|