geo-ai-search-optimization 1.2.2 → 1.2.3

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
@@ -225,6 +225,24 @@ geo-ai-search-optimization share-pack https://example.com
225
225
  - 给下一位 agent 的交接入口
226
226
  - 建议分享顺序
227
227
 
228
+ ## Export Pack 命令
229
+
230
+ 如果你希望直接导出一整包可外发文件,而不是自己一个个生成,现在可以用 `export-pack`:
231
+
232
+ ```bash
233
+ geo-ai-search-optimization export-pack ./your-site --out-dir ./exports/your-site-pack
234
+ geo-ai-search-optimization export-pack ./your-site --task fix-01 --format json --out-dir ./exports/your-site-json
235
+ geo-ai-search-optimization export-pack https://example.com --out-dir ./exports/example-pack
236
+ ```
237
+
238
+ `export-pack` 会生成:
239
+
240
+ - `pm-brief`
241
+ - `owner-board`
242
+ - `exec-summary`
243
+ - `agent-handoff-bundle`
244
+ - `share-pack`
245
+
228
246
  ## Fix Plan 命令
229
247
 
230
248
  如果你已经跑过 `audit`、`report` 或 `onboard-url`,下一步就可以直接把结果转成 PM 待办清单:
@@ -380,6 +398,7 @@ geo-ai-search-optimization apply-plan ./my-site
380
398
  geo-ai-search-optimization completion-report ./my-site
381
399
  geo-ai-search-optimization handoff-bundle ./my-site
382
400
  geo-ai-search-optimization share-pack ./my-site
401
+ geo-ai-search-optimization export-pack ./my-site --out-dir ./exports/my-site-pack
383
402
  geo-ai-search-optimization exec-summary ./my-site
384
403
  geo-ai-search-optimization fix-plan ./my-site
385
404
  geo-ai-search-optimization owner-board ./my-site
@@ -395,6 +414,13 @@ geo-ai-search-optimization version
395
414
  geo-ai-search-optimization help
396
415
  ```
397
416
 
417
+ ## New in 1.2.3
418
+
419
+ - 新增 `export-pack`
420
+ - 直接生成一组可外发文件,而不是只在终端显示
421
+ - 一次导出 PM、工程、管理层、Agent 四类视图
422
+ - 新增 `geo-ai-search-optimization-export-pack` skill,帮助消费导出结果
423
+
398
424
  ## New in 1.2.2
399
425
 
400
426
  - 新增 `share-pack`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geo-ai-search-optimization",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
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": {
@@ -47,6 +47,7 @@ geo-ai-search-optimization apply-plan ./your-site --out ./reports/apply-plan.md
47
47
  geo-ai-search-optimization completion-report ./your-site --out ./reports/completion-report.md
48
48
  geo-ai-search-optimization handoff-bundle ./your-site --out ./reports/handoff-bundle.md
49
49
  geo-ai-search-optimization share-pack ./your-site --out ./reports/share-pack.md
50
+ geo-ai-search-optimization export-pack ./your-site --out-dir ./exports/your-site-pack
50
51
  geo-ai-search-optimization owner-board ./your-site --out ./reports/owner-board.md
51
52
  geo-ai-search-optimization meeting-pack ./your-site --out ./reports/meeting-pack.md
52
53
  geo-ai-search-optimization pm-brief ./your-site --out ./reports/pm-brief.md
@@ -65,7 +66,8 @@ geo-ai-search-optimization roadmap ./your-site --out ./reports/roadmap.md
65
66
  6. 完成一轮后生成 completion-report
66
67
  7. 需要完整交接包时生成 handoff-bundle
67
68
  8. 需要发给不同角色时生成 share-pack
68
- 9. 重跑 scan / audit / report 验证是否改善
69
+ 9. 需要一整包文件时生成 export-pack
70
+ 10. 重跑 scan / audit / report 验证是否改善
69
71
 
70
72
  ## 推荐节奏
71
73
 
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: geo-ai-search-optimization-export-pack
3
+ description: Export GEO results into a shareable folder structure for different audiences. Use when a PM or agent wants ready-to-send files such as pm-brief, owner-board, exec-summary, and agent handoff bundle generated together.
4
+ ---
5
+
6
+ # GEO Export Pack
7
+
8
+ Use this skill when the user wants one command to generate a folder of GEO deliverables.
9
+
10
+ `GEO = Generative Engine Optimization`
11
+
12
+ ## What it exports
13
+
14
+ - `pm-brief`
15
+ - `owner-board`
16
+ - `exec-summary`
17
+ - `agent-handoff-bundle`
18
+ - `share-pack`
19
+
20
+ ## How to use it
21
+
22
+ - export once
23
+ - send `pm-brief` to PM
24
+ - send `owner-board` to execution teams
25
+ - send `exec-summary` to management
26
+ - send `agent-handoff-bundle` to the next agent
@@ -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 ten layers:
16
+ The package is best explained as eleven layers:
17
17
 
18
18
  1. `onboard-url` / `onboard`: first look
19
19
  2. `scan`: raw signal check
@@ -24,7 +24,8 @@ The package is best explained as ten layers:
24
24
  7. `completion-report`: closeout
25
25
  8. `handoff-bundle`: all-in-one package
26
26
  9. `share-pack`: audience-ready delivery
27
- 10. `pm-brief` / `roadmap`: stakeholder alignment
27
+ 10. `export-pack`: folder export
28
+ 11. `pm-brief` / `roadmap`: stakeholder alignment
28
29
 
29
30
  ## Recommended command order
30
31
 
@@ -47,6 +48,7 @@ npx geo-ai-search-optimization apply-plan ./your-site
47
48
  npx geo-ai-search-optimization completion-report ./your-site
48
49
  npx geo-ai-search-optimization handoff-bundle ./your-site
49
50
  npx geo-ai-search-optimization share-pack ./your-site
51
+ npx geo-ai-search-optimization export-pack ./your-site
50
52
  npx geo-ai-search-optimization owner-board ./your-site
51
53
  npx geo-ai-search-optimization roadmap ./your-site
52
54
  ```
@@ -64,6 +66,7 @@ npx geo-ai-search-optimization roadmap ./your-site
64
66
  - `completion-report`: summarize what the agent finished, residual risks, and next-round work
65
67
  - `handoff-bundle`: combine handoff, execution, and closeout into one artifact
66
68
  - `share-pack`: prepare role-specific shareable outputs for PM, engineering, management, and agents
69
+ - `export-pack`: generate a folder with multiple ready-to-send files
67
70
  - `owner-board`: group tasks by PM / engineering / SEO / content
68
71
  - `pm-brief`: prepare a PM summary for meetings and prioritization
69
72
  - `roadmap`: turn tasks into a 2-week / 4-week execution sequence
@@ -80,6 +83,7 @@ When explaining the tool to a user:
80
83
  - if the user wants a closeout summary after one round, move them to `completion-report`
81
84
  - if the user wants one consolidated artifact, move them to `handoff-bundle`
82
85
  - if the user wants something ready to forward to multiple audiences, move them to `share-pack`
86
+ - if the user wants actual files on disk for each audience, move them to `export-pack`
83
87
  - if the user already has a report, move them to `fix-plan`, `owner-board`, or `roadmap`
84
88
 
85
89
  Read [references/usage-patterns.md](references/usage-patterns.md) when you need response patterns and command selection examples.
@@ -103,6 +103,14 @@ Recommend:
103
103
  npx geo-ai-search-optimization share-pack ./your-site
104
104
  ```
105
105
 
106
+ ## If the user says "我想直接导出一整包文件"
107
+
108
+ Recommend:
109
+
110
+ ```bash
111
+ npx geo-ai-search-optimization export-pack ./your-site --out-dir ./exports/your-site-pack
112
+ ```
113
+
106
114
  ## If the user says "我要开会同步"
107
115
 
108
116
  Recommend:
package/src/cli.js CHANGED
@@ -17,6 +17,7 @@ import { createLlmsTxt } from "./llms-txt.js";
17
17
  import { auditProject, renderAuditMarkdown, writeAuditOutput } from "./audit.js";
18
18
  import { createFixPlan, renderFixPlanMarkdown, writeFixPlanOutput } from "./fix-plan.js";
19
19
  import { createExecSummary, renderExecSummaryMarkdown, writeExecSummaryOutput } from "./exec-summary.js";
20
+ import { renderExportPackMarkdown, writeExportPack } from "./export-pack.js";
20
21
  import { createOwnerBoard, renderOwnerBoardMarkdown, writeOwnerBoardOutput } from "./owner-board.js";
21
22
  import { createMeetingPack, renderMeetingPackMarkdown, writeMeetingPackOutput } from "./meeting-pack.js";
22
23
  import { createPmBrief, renderPmBriefMarkdown, writePmBriefOutput } from "./pm-brief.js";
@@ -66,6 +67,7 @@ function printHelp() {
66
67
  " geo-ai-search-optimization completion-report <input> [--format <markdown|json>] [--out <file>]",
67
68
  " geo-ai-search-optimization handoff-bundle <input> [--task <id>] [--format <markdown|json>] [--out <file>]",
68
69
  " geo-ai-search-optimization share-pack <input> [--task <id>] [--format <markdown|json>] [--out <file>]",
70
+ " geo-ai-search-optimization export-pack <input> [--task <id>] [--format <markdown|json>] [--out-dir <dir>]",
69
71
  " geo-ai-search-optimization exec-summary <input> [--format <markdown|json>] [--out <file>]",
70
72
  " geo-ai-search-optimization fix-plan <input> [--format <markdown|json>] [--out <file>]",
71
73
  " geo-ai-search-optimization owner-board <input> [--format <markdown|json>] [--out <file>]",
@@ -473,6 +475,21 @@ async function handleSharePack(args) {
473
475
  process.stdout.write(renderedOutput);
474
476
  }
475
477
 
478
+ async function handleExportPack(args) {
479
+ const input = args.find((value) => !value.startsWith("-"));
480
+ if (!input) {
481
+ throw new Error("export-pack 需要一个输入值,可以是项目路径、网站网址或已导出的 JSON 工件");
482
+ }
483
+
484
+ const pack = await writeExportPack(input, {
485
+ format: getFlagValue(args, "--format"),
486
+ taskId: getFlagValue(args, "--task"),
487
+ outputDir: getFlagValue(args, "--out-dir")
488
+ });
489
+
490
+ process.stdout.write(renderExportPackMarkdown(pack));
491
+ }
492
+
476
493
  async function handleExecSummary(args) {
477
494
  const input = args.find((value) => !value.startsWith("-"));
478
495
  if (!input) {
@@ -671,6 +688,11 @@ export async function runCli(args = []) {
671
688
  return;
672
689
  }
673
690
 
691
+ if (command === "export-pack") {
692
+ await handleExportPack(rest);
693
+ return;
694
+ }
695
+
674
696
  if (command === "exec-summary") {
675
697
  await handleExecSummary(rest);
676
698
  return;
@@ -0,0 +1,111 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { createExecSummary, renderExecSummaryMarkdown } from "./exec-summary.js";
4
+ import { createHandoffBundle, renderHandoffBundleMarkdown } from "./handoff-bundle.js";
5
+ import { createOwnerBoard, renderOwnerBoardMarkdown } from "./owner-board.js";
6
+ import { createPmBrief, renderPmBriefMarkdown } from "./pm-brief.js";
7
+ import { createSharePack, renderSharePackMarkdown } from "./share-pack.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(`不支持的 export-pack 格式:${format}。可选值:${Array.from(VALID_FORMATS).join(", ")}`);
15
+ }
16
+ return resolved;
17
+ }
18
+
19
+ function sanitizeSegment(value) {
20
+ return String(value)
21
+ .replace(/[^a-z0-9-_]+/gi, "-")
22
+ .replace(/^-+|-+$/g, "")
23
+ .toLowerCase();
24
+ }
25
+
26
+ function buildBaseName(sourceType, source) {
27
+ if (sourceType === "url") {
28
+ try {
29
+ const hostname = new URL(source).hostname || "website";
30
+ return sanitizeSegment(hostname) || "website";
31
+ } catch {
32
+ return "website";
33
+ }
34
+ }
35
+
36
+ return sanitizeSegment(path.basename(source)) || "site";
37
+ }
38
+
39
+ function getExtension(format) {
40
+ return format === "json" ? "json" : "md";
41
+ }
42
+
43
+ function renderByFormat(payload, renderMarkdown, format) {
44
+ return format === "json" ? `${JSON.stringify(payload, null, 2)}\n` : renderMarkdown(payload);
45
+ }
46
+
47
+ export async function createExportPack(input, options = {}) {
48
+ const format = normalizeFormat(options.format);
49
+ const taskId = options.taskId || null;
50
+ const [sharePack, pmBrief, ownerBoard, execSummary, handoffBundle] = await Promise.all([
51
+ createSharePack(input, { format: "json", taskId }),
52
+ createPmBrief(input, { format: "json" }),
53
+ createOwnerBoard(input, { format: "json" }),
54
+ createExecSummary(input, { format: "json" }),
55
+ createHandoffBundle(input, { format: "json", taskId })
56
+ ]);
57
+
58
+ const baseName = buildBaseName(sharePack.sourceType, sharePack.source);
59
+ const extension = getExtension(format);
60
+ const outputDir = path.resolve(options.outputDir || `./exports/${baseName}-geo-pack`);
61
+
62
+ const files = [
63
+ { key: "share_pack", filename: `share-pack.${extension}`, content: renderByFormat(sharePack, renderSharePackMarkdown, format) },
64
+ { key: "pm", filename: `pm-brief.${extension}`, content: renderByFormat(pmBrief, renderPmBriefMarkdown, format) },
65
+ { key: "engineering", filename: `owner-board.${extension}`, content: renderByFormat(ownerBoard, renderOwnerBoardMarkdown, format) },
66
+ { key: "exec", filename: `exec-summary.${extension}`, content: renderByFormat(execSummary, renderExecSummaryMarkdown, format) },
67
+ { key: "agent", filename: `agent-handoff-bundle.${extension}`, content: renderByFormat(handoffBundle, renderHandoffBundleMarkdown, format) }
68
+ ];
69
+
70
+ return {
71
+ kind: "geo-export-pack",
72
+ source: sharePack.source,
73
+ sourceType: sharePack.sourceType,
74
+ format,
75
+ outputDir,
76
+ files
77
+ };
78
+ }
79
+
80
+ export async function writeExportPack(input, options = {}) {
81
+ const pack = await createExportPack(input, options);
82
+ await fs.mkdir(pack.outputDir, { recursive: true });
83
+
84
+ const writtenFiles = [];
85
+ for (const file of pack.files) {
86
+ const targetPath = path.join(pack.outputDir, file.filename);
87
+ await fs.writeFile(targetPath, file.content, "utf8");
88
+ writtenFiles.push({ ...file, path: targetPath });
89
+ }
90
+
91
+ return { ...pack, files: writtenFiles };
92
+ }
93
+
94
+ export function renderExportPackMarkdown(pack) {
95
+ const lines = [
96
+ "# GEO Export Pack",
97
+ "",
98
+ `- 输入来源:\`${pack.source}\``,
99
+ `- 来源类型:\`${pack.sourceType}\``,
100
+ `- 导出目录:\`${pack.outputDir}\``,
101
+ "",
102
+ "## 导出文件",
103
+ ""
104
+ ];
105
+
106
+ for (const file of pack.files) {
107
+ lines.push(`- ${file.key}:\`${file.path || path.join(pack.outputDir, file.filename)}\``);
108
+ }
109
+
110
+ return `${lines.join("\n")}\n`;
111
+ }
package/src/index.js CHANGED
@@ -15,6 +15,7 @@ export { runCli } from "./cli.js";
15
15
  export { runDoctor, renderDoctorMarkdown } from "./doctor.js";
16
16
  export { createLlmsTxt } from "./llms-txt.js";
17
17
  export { createExecSummary, renderExecSummaryMarkdown, writeExecSummaryOutput } from "./exec-summary.js";
18
+ export { createExportPack, renderExportPackMarkdown, writeExportPack } from "./export-pack.js";
18
19
  export { createMeetingPack, renderMeetingPackMarkdown, writeMeetingPackOutput } from "./meeting-pack.js";
19
20
  export { createOwnerBoard, renderOwnerBoardMarkdown, writeOwnerBoardOutput } from "./owner-board.js";
20
21
  export { createPmBrief, renderPmBriefMarkdown, writePmBriefOutput } from "./pm-brief.js";
@@ -62,7 +62,8 @@ function buildSteps() {
62
62
  "geo-ai-search-optimization apply-plan ./your-site --out ./reports/apply-plan.md",
63
63
  "geo-ai-search-optimization completion-report ./your-site --out ./reports/completion-report.md",
64
64
  "geo-ai-search-optimization handoff-bundle ./your-site --out ./reports/handoff-bundle.md",
65
- "geo-ai-search-optimization share-pack ./your-site --out ./reports/share-pack.md"
65
+ "geo-ai-search-optimization share-pack ./your-site --out ./reports/share-pack.md",
66
+ "geo-ai-search-optimization export-pack ./your-site --out-dir ./exports/your-site-pack"
66
67
  ]
67
68
  },
68
69
  {