@geoly-ai/social-hub-cli 0.3.18 → 0.3.19
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/CHANGELOG.md +14 -0
- package/dist/cmd-manifest.json +2 -2
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -7
- package/dist/index.js.map +1 -1
- package/dist/scrape-output.test.d.ts +2 -0
- package/dist/scrape-output.test.d.ts.map +1 -0
- package/dist/scrape-output.test.js +58 -0
- package/dist/scrape-output.test.js.map +1 -0
- package/package.json +2 -2
- package/skills/manifest.json +1 -1
- package/skills/reddit-content-writing/SKILL.md +1 -1
- package/skills/reddit-content-writing/references/phase4-execution-table.md +24 -3
- package/skills/reddit-content-writing/references/phase4-writing.md +123 -3
- package/skills/reddit-content-writing/references/post-writing-templates.md +14 -6
- package/skills/reddit-delivery-check/SKILL.md +1 -0
- package/skills/reddit-delivery-check/references/phase5-delivery.md +7 -1
- package/skills/reddit-matrix.lock.json +8 -8
- package/skills/reddit-phase-brief/SKILL.md +25 -9
- package/skills/reddit-phase-brief/references/brand-SKU-PGC-rules.md +223 -36
- package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +364 -18
- package/skills/reddit-phase-planning/SKILL.md +13 -0
- package/skills/reddit-phase-planning/references/phase4-execution-table.md +16 -2
- package/skills/reddit-phase-planning/references/phase4-planning.md +74 -15
- package/skills/reddit-phase-planning/references/scheduling-decision-procedure.md +386 -0
- package/skills/reddit-phase-research/SKILL.md +7 -1
- package/skills/reddit-phase-research/references/phase01-research.md +93 -29
- package/skills/reddit-strategy-orchestrator/SKILL.md +120 -18
- package/skills/reddit-strategy-shared/SKILL.md +4 -2
- package/skills/reddit-strategy-shared/references/content-diversity-contract.md +19 -3
- package/skills/reddit-strategy-shared/references/context-contract.md +45 -11
- package/skills/reddit-strategy-shared/references/evidence-policy.md +139 -0
- package/skills/reddit-strategy-shared/references/handoff-schemas.md +16 -1
- package/skills/reddit-strategy-shared/references/path-conventions.md +26 -4
- package/skills/reddit-strategy-shared/references/prerequisites/README.md +57 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-master-canvas-agent-prompt-template.md → archive/reddit-master-canvas-agent-prompt-template.md} +7 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-sop-v2-universal.md → archive/reddit-sop-v2-universal.md} +7 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-prerequisites-read.md → archive/reddit-strategy-prerequisites-read.md} +7 -0
- package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-reuse-playbook.md → archive/reddit-strategy-reuse-playbook.md} +7 -0
- package/skills/reddit-strategy-shared/references/subreddit-research-profile.md +514 -0
- package/skills/reddit-strategy-shared/references/version-manifest.md +29 -2
- package/skills/reddit-voc-volume/matrix-contract.md +16 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ All notable changes to `@geoly-ai/social-hub-cli` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
Release workflow: `pnpm release:cli` → `pnpm publish:cli`.
|
|
6
6
|
|
|
7
|
+
## [0.3.19] - 2026-08-14
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- classify outcomes instead of reporting 2xx login pages as success
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- align AUTHZ_POLICY_VERSION with package version
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- rebuild reddit matrix SOP around evidence and decision gates
|
|
20
|
+
|
|
7
21
|
## [0.3.18] - 2026-08-13
|
|
8
22
|
|
|
9
23
|
### Added
|
package/dist/cmd-manifest.json
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -22,5 +22,29 @@ export declare function orchestrateVocAcquire(client: VocAcquireClient, params:
|
|
|
22
22
|
exitCode: 0 | 1 | 2;
|
|
23
23
|
output: Record<string, unknown>;
|
|
24
24
|
}>;
|
|
25
|
+
/**
|
|
26
|
+
* 业务失败(HTTP 200 + ok:false)的人类可读摘要:抓到了页面,但**不是正文**。
|
|
27
|
+
* 结论(outcome) + 阶段 + provider request id 全部打出来,别再让人对着通用错误猜。
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatScrapeFailure(res: {
|
|
30
|
+
outcome: string;
|
|
31
|
+
finalUrl?: string;
|
|
32
|
+
targetStatusCode?: number | null;
|
|
33
|
+
failureStage?: string | null;
|
|
34
|
+
providerRequestId?: string | null;
|
|
35
|
+
requestId?: string | null;
|
|
36
|
+
attempts?: number;
|
|
37
|
+
retryAfterMs?: number | null;
|
|
38
|
+
classifierVersion?: string;
|
|
39
|
+
classificationEvidence?: Array<{
|
|
40
|
+
ruleId: string;
|
|
41
|
+
signal: string;
|
|
42
|
+
}>;
|
|
43
|
+
}): string;
|
|
44
|
+
/**
|
|
45
|
+
* 技术层失败(429/502/504 等)的摘要:把 provider typed code / 失败阶段 /
|
|
46
|
+
* request id 从 `details` 里挖出来,取代以前的「Scrape service returned HTTP 500」。
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatScrapeError(e: unknown): string;
|
|
25
49
|
export { program };
|
|
26
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA8+E9B,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,IAAI,CAOf;AAg+BD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE,CAAC;AAQF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAkJnE;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA8+E9B,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,IAAI,CAOf;AAg+BD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE,CAAC;AAQF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAkJnE;AAyqBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE,GAAG,MAAM,CAiBT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAyCpD;AAgyDD,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3272,6 +3272,56 @@ intel
|
|
|
3272
3272
|
const scrapeCmd = program
|
|
3273
3273
|
.command("scrape")
|
|
3274
3274
|
.description("通用网页抓取(Reddit .json 直连 / HTML 经 Firecrawl)");
|
|
3275
|
+
/**
|
|
3276
|
+
* 业务失败(HTTP 200 + ok:false)的人类可读摘要:抓到了页面,但**不是正文**。
|
|
3277
|
+
* 结论(outcome) + 阶段 + provider request id 全部打出来,别再让人对着通用错误猜。
|
|
3278
|
+
*/
|
|
3279
|
+
export function formatScrapeFailure(res) {
|
|
3280
|
+
const evidence = (res.classificationEvidence ?? [])
|
|
3281
|
+
.map((e) => `${e.ruleId}(${e.signal})`)
|
|
3282
|
+
.join(", ");
|
|
3283
|
+
const parts = [
|
|
3284
|
+
`scrape 未取得正文:outcome=${res.outcome}`,
|
|
3285
|
+
`targetStatus=${res.targetStatusCode ?? "null"}`,
|
|
3286
|
+
`finalUrl=${res.finalUrl ?? "null"}`,
|
|
3287
|
+
`stage=${res.failureStage ?? "null"}`,
|
|
3288
|
+
`attempts=${res.attempts ?? 1}`,
|
|
3289
|
+
];
|
|
3290
|
+
if (res.retryAfterMs != null)
|
|
3291
|
+
parts.push(`retryAfterMs=${res.retryAfterMs}`);
|
|
3292
|
+
parts.push(`requestId=${res.requestId ?? "null"}`);
|
|
3293
|
+
parts.push(`providerRequestId=${res.providerRequestId ?? "null"}`);
|
|
3294
|
+
if (res.classifierVersion)
|
|
3295
|
+
parts.push(`classifier=${res.classifierVersion}`);
|
|
3296
|
+
if (evidence)
|
|
3297
|
+
parts.push(`evidence=[${evidence}]`);
|
|
3298
|
+
return parts.join(" ");
|
|
3299
|
+
}
|
|
3300
|
+
/**
|
|
3301
|
+
* 技术层失败(429/502/504 等)的摘要:把 provider typed code / 失败阶段 /
|
|
3302
|
+
* request id 从 `details` 里挖出来,取代以前的「Scrape service returned HTTP 500」。
|
|
3303
|
+
*/
|
|
3304
|
+
export function formatScrapeError(e) {
|
|
3305
|
+
const err = e;
|
|
3306
|
+
const base = err?.message ?? String(e);
|
|
3307
|
+
const d = err?.details;
|
|
3308
|
+
if (!d?.outcome)
|
|
3309
|
+
return base;
|
|
3310
|
+
const p = d.diagnostics?.provider ?? {};
|
|
3311
|
+
const x = d.diagnostics?.execution ?? {};
|
|
3312
|
+
return [
|
|
3313
|
+
base,
|
|
3314
|
+
`code=${err.code ?? "null"}`,
|
|
3315
|
+
`outcome=${d.outcome}`,
|
|
3316
|
+
`stage=${x.failureStage ?? "null"}`,
|
|
3317
|
+
`providerStatus=${p.providerStatusCode ?? "null"}`,
|
|
3318
|
+
`providerErrorCode=${p.providerErrorCode ?? "null"}`,
|
|
3319
|
+
`providerRequestId=${p.providerRequestId ?? "null"}`,
|
|
3320
|
+
`providerScrapeId=${p.providerScrapeId ?? "null"}`,
|
|
3321
|
+
`attempts=${x.attemptCount ?? 1}`,
|
|
3322
|
+
...(x.retryAfterMs != null ? [`retryAfterMs=${x.retryAfterMs}`] : []),
|
|
3323
|
+
].join(" ");
|
|
3324
|
+
}
|
|
3275
3325
|
scrapeCmd
|
|
3276
3326
|
.command("url <url>")
|
|
3277
3327
|
.description("POST /v1/system/scrape —— 抓取任意网页(Reddit .json 或 HTML)")
|
|
@@ -3285,13 +3335,25 @@ scrapeCmd
|
|
|
3285
3335
|
.map((s) => s.trim())
|
|
3286
3336
|
.filter(Boolean)
|
|
3287
3337
|
: undefined;
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3338
|
+
try {
|
|
3339
|
+
const res = await requireClient().scrapeUrl({
|
|
3340
|
+
url,
|
|
3341
|
+
formats,
|
|
3342
|
+
mode: opts.redditJson ? "reddit-json" : undefined,
|
|
3343
|
+
timeoutMs: opts.timeout ? Number(opts.timeout) : undefined,
|
|
3344
|
+
});
|
|
3345
|
+
console.log(JSON.stringify(res, null, 2));
|
|
3346
|
+
if (!res.ok) {
|
|
3347
|
+
// 业务失败(2xx 登录墙/验证码/空正文/目标站限流…):HTTP 是 200,但**不是正文**。
|
|
3348
|
+
// 退出码必须非零,否则 shell/agent 会把「抓到登录页」当成抓取成功。
|
|
3349
|
+
console.error(formatScrapeFailure(res));
|
|
3350
|
+
process.exit(2);
|
|
3351
|
+
}
|
|
3352
|
+
}
|
|
3353
|
+
catch (e) {
|
|
3354
|
+
console.error(formatScrapeError(e));
|
|
3355
|
+
process.exit(1);
|
|
3356
|
+
}
|
|
3295
3357
|
});
|
|
3296
3358
|
scrapeCmd
|
|
3297
3359
|
.command("status")
|