@gobing-ai/knowledge-kit 0.0.13 → 0.0.14

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.
Files changed (109) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/dist/index.js +20 -0
  3. package/package.json +1 -1
  4. package/plugins/generations/content-gen/dist/index.js +20 -0
  5. package/plugins/generations/core-facts-gen/dist/index.js +20 -0
  6. package/plugins/generations/daily-article-gen/dist/index.js +29 -1
  7. package/plugins/generations/daily-article-gen/src/index.ts +13 -1
  8. package/plugins/generations/dailynews-gen/dist/index.js +20 -0
  9. package/plugins/generations/episode-plan-gen/dist/index.js +24 -0
  10. package/plugins/generations/episode-plan-gen/src/index.ts +11 -0
  11. package/plugins/generations/image-gen/dist/index.js +2296 -53
  12. package/plugins/generations/image-gen/src/providers/agnes.ts +110 -0
  13. package/plugins/generations/image-gen/src/providers/azure.ts +153 -0
  14. package/plugins/generations/image-gen/src/providers/codex-cli.ts +170 -0
  15. package/plugins/generations/image-gen/src/providers/dashscope.ts +485 -0
  16. package/plugins/generations/image-gen/src/providers/google.ts +268 -0
  17. package/plugins/generations/image-gen/src/providers/huggingface.ts +59 -0
  18. package/plugins/generations/image-gen/src/providers/jimeng.ts +259 -0
  19. package/plugins/generations/image-gen/src/providers/minimax.ts +171 -0
  20. package/plugins/generations/image-gen/src/providers/openai.ts +319 -0
  21. package/plugins/generations/image-gen/src/providers/openrouter.ts +257 -0
  22. package/plugins/generations/image-gen/src/providers/refs.ts +24 -0
  23. package/plugins/generations/image-gen/src/providers/replicate.ts +279 -0
  24. package/plugins/generations/image-gen/src/providers/seedream.ts +1 -1
  25. package/plugins/generations/image-gen/src/providers/types.ts +52 -51
  26. package/plugins/generations/image-gen/src/providers/zai.ts +237 -0
  27. package/plugins/generations/news-report-gen/dist/index.js +22193 -0
  28. package/plugins/generations/news-report-gen/package.json +17 -0
  29. package/plugins/generations/news-report-gen/plugin.json +7 -0
  30. package/plugins/generations/news-report-gen/src/index.ts +308 -0
  31. package/plugins/generations/news-report-gen/tsconfig.json +4 -0
  32. package/plugins/generations/omni-voice-gen/Makefile +14 -0
  33. package/plugins/generations/omni-voice-gen/README.md +112 -0
  34. package/plugins/generations/omni-voice-gen/bin/omni-voice-gen +2 -0
  35. package/plugins/generations/omni-voice-gen/dist/omni-voice-gen-prr8skpb. +2 -0
  36. package/plugins/generations/omni-voice-gen/dist/omni-voice-gen.js +6 -0
  37. package/plugins/generations/omni-voice-gen/plugin.json +6 -0
  38. package/plugins/generations/omni-voice-gen/profiles.json +12 -0
  39. package/plugins/generations/omni-voice-gen/pyproject.toml +25 -0
  40. package/plugins/generations/omni-voice-gen/scripts/coverage_gate.py +74 -0
  41. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/__init__.py +1 -0
  42. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/__main__.py +39 -0
  43. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/audio.py +190 -0
  44. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/backend.py +150 -0
  45. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/contract.py +76 -0
  46. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/mp3.py +60 -0
  47. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/pipeline.py +289 -0
  48. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/profiles.py +100 -0
  49. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/qc.py +234 -0
  50. package/plugins/generations/omni-voice-gen/src/omni_voice_gen/voicescript.py +352 -0
  51. package/plugins/generations/omni-voice-gen/uv.lock +3510 -0
  52. package/plugins/generations/voice-gen/dist/index.js +30 -2
  53. package/plugins/generations/voice-gen/src/index.ts +16 -1
  54. package/plugins/generations/voice-gen/src/voicebox-client.ts +3 -1
  55. package/plugins/ingestions/aihot-ingest/dist/index.js +20 -0
  56. package/plugins/ingestions/horizon-ingest/dist/index.js +20 -0
  57. package/plugins/ingestions/last30days-ingest/dist/index.js +20 -0
  58. package/plugins/ingestions/web-search/dist/index.js +20 -0
  59. package/plugins/kk/commands/image-extract.md +40 -0
  60. package/plugins/kk/commands/image-generate.md +18 -1
  61. package/plugins/kk/plugin.json +1 -1
  62. package/plugins/kk/skills/image-authoring/SKILL.md +10 -3
  63. package/plugins/kk/skills/image-authoring/references/format-drafting.md +57 -0
  64. package/plugins/kk/skills/image-authoring/references/style-extraction.md +14 -9
  65. package/plugins/kk/workflows/kk-daily-ai-voice.yaml +130 -30
  66. package/plugins/publishings/emdash-pub/dist/index.js +20 -0
  67. package/plugins/publishings/podcast-pub/dist/index.js +57 -3
  68. package/plugins/publishings/podcast-pub/src/index.ts +18 -2
  69. package/plugins/publishings/podcast-pub/src/show-notes.ts +56 -9
  70. package/plugins/publishings/qiita-pub/dist/index.js +20 -0
  71. package/plugins/publishings/surfdash-pub/dist/index.js +96 -6
  72. package/plugins/publishings/surfdash-pub/src/index.ts +109 -9
  73. package/plugins/publishings/zenn-pub/dist/index.js +20 -0
  74. package/plugins/sp/scripts/batch-preflight.mjs +346 -0
  75. package/plugins/sp/scripts/batch-preflight.ts +459 -0
  76. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +615 -0
  77. package/plugins/sp/scripts/daily-summary/daily-summary.ts +846 -0
  78. package/plugins/sp/scripts/daily-summary/logger.ts +28 -0
  79. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +223 -0
  80. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +367 -0
  81. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +132 -0
  82. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +169 -0
  83. package/plugins/sp/scripts/feature-dev-precheck.mjs +171 -0
  84. package/plugins/sp/scripts/feature-dev-precheck.ts +238 -0
  85. package/plugins/sp/scripts/feature-sync-bounded.mjs +285 -0
  86. package/plugins/sp/scripts/feature-sync-bounded.ts +478 -0
  87. package/plugins/sp/scripts/history-anatomy-cache.mjs +902 -0
  88. package/plugins/sp/scripts/history-anatomy-cache.ts +1028 -0
  89. package/plugins/sp/scripts/idea-handoff.mjs +22 -0
  90. package/plugins/sp/scripts/idea-handoff.ts +44 -0
  91. package/plugins/sp/scripts/inline-pipeline-parity-check.ts +185 -0
  92. package/plugins/sp/scripts/inline-run-setup.ts +198 -0
  93. package/plugins/sp/scripts/pr-reviewing.mjs +769 -0
  94. package/plugins/sp/scripts/pr-reviewing.ts +925 -0
  95. package/plugins/sp/scripts/quality-gate.mjs +179 -0
  96. package/plugins/sp/scripts/quality-gate.ts +217 -0
  97. package/plugins/sp/scripts/script-contract-check.ts +319 -0
  98. package/plugins/sp/scripts/stage-registry-adapter.ts +1533 -0
  99. package/plugins/sp/scripts/surface-drift-inventory.ts +929 -0
  100. package/plugins/sp/scripts/task-evidence-precheck.ts +181 -0
  101. package/plugins/sp/scripts/task-size-precheck.ts +175 -0
  102. package/plugins/sp/scripts/transition-shim-check.ts +238 -0
  103. package/plugins/sp/scripts/validate-commands.ts +689 -0
  104. package/plugins/sp/scripts/validate-flag-contracts.ts +878 -0
  105. package/plugins/sp/scripts/verify-answer-lint.ts +530 -0
  106. package/plugins/sp/scripts/workflow-step-profile.mjs +316 -0
  107. package/plugins/sp/scripts/workflow-step-profile.ts +456 -0
  108. package/plugins/sp/scripts/wrapup-steps.mjs +373 -0
  109. package/plugins/sp/scripts/wrapup-steps.ts +466 -0
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "plugins": [
8
8
  {
9
- "version": "0.0.1",
9
+ "version": "0.0.14",
10
10
  "name": "kk",
11
11
  "source": "./plugins/kk",
12
12
  "description": "knowledge-kit — a set of toolkit for knowledge management"
package/dist/index.js CHANGED
@@ -26054,6 +26054,26 @@ var ResultSchema = exports_external.object({
26054
26054
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
26055
26055
  });
26056
26056
  var DocListSchema = exports_external.array(DocSchema);
26057
+ var omniVoiceGenContentSchema = ContentSchema.extend({
26058
+ format: exports_external.literal("audio"),
26059
+ metadata: exports_external.looseObject({
26060
+ generator: exports_external.literal("kk:omni-voice-gen"),
26061
+ audioPath: exports_external.string(),
26062
+ duration: exports_external.number(),
26063
+ segments: exports_external.array(exports_external.looseObject({
26064
+ generationId: exports_external.string(),
26065
+ profile: exports_external.string(),
26066
+ speaker: exports_external.string().optional(),
26067
+ emotion: exports_external.string().optional(),
26068
+ duration: exports_external.number(),
26069
+ verifyRetries: exports_external.number(),
26070
+ transcription: exports_external.string().optional(),
26071
+ loudnessDip: exports_external.boolean().optional()
26072
+ })),
26073
+ mp3Path: exports_external.string().optional(),
26074
+ qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
26075
+ })
26076
+ });
26057
26077
 
26058
26078
  // ../../packages/kk-core/src/kinds.ts
26059
26079
  var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/knowledge-kit",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "description": "An ingest → create → publish content pipeline CLI (Bun).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21847,6 +21847,26 @@ var ResultSchema = exports_external.object({
21847
21847
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21848
21848
  });
21849
21849
  var DocListSchema = exports_external.array(DocSchema);
21850
+ var omniVoiceGenContentSchema = ContentSchema.extend({
21851
+ format: exports_external.literal("audio"),
21852
+ metadata: exports_external.looseObject({
21853
+ generator: exports_external.literal("kk:omni-voice-gen"),
21854
+ audioPath: exports_external.string(),
21855
+ duration: exports_external.number(),
21856
+ segments: exports_external.array(exports_external.looseObject({
21857
+ generationId: exports_external.string(),
21858
+ profile: exports_external.string(),
21859
+ speaker: exports_external.string().optional(),
21860
+ emotion: exports_external.string().optional(),
21861
+ duration: exports_external.number(),
21862
+ verifyRetries: exports_external.number(),
21863
+ transcription: exports_external.string().optional(),
21864
+ loudnessDip: exports_external.boolean().optional()
21865
+ })),
21866
+ mp3Path: exports_external.string().optional(),
21867
+ qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21868
+ })
21869
+ });
21850
21870
 
21851
21871
  // ../../packages/kk-core/src/kinds.ts
21852
21872
  var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
21848
21848
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21849
21849
  });
21850
21850
  var DocListSchema = exports_external.array(DocSchema);
21851
+ var omniVoiceGenContentSchema = ContentSchema.extend({
21852
+ format: exports_external.literal("audio"),
21853
+ metadata: exports_external.looseObject({
21854
+ generator: exports_external.literal("kk:omni-voice-gen"),
21855
+ audioPath: exports_external.string(),
21856
+ duration: exports_external.number(),
21857
+ segments: exports_external.array(exports_external.looseObject({
21858
+ generationId: exports_external.string(),
21859
+ profile: exports_external.string(),
21860
+ speaker: exports_external.string().optional(),
21861
+ emotion: exports_external.string().optional(),
21862
+ duration: exports_external.number(),
21863
+ verifyRetries: exports_external.number(),
21864
+ transcription: exports_external.string().optional(),
21865
+ loudnessDip: exports_external.boolean().optional()
21866
+ })),
21867
+ mp3Path: exports_external.string().optional(),
21868
+ qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21869
+ })
21870
+ });
21851
21871
 
21852
21872
  // ../../packages/kk-core/src/kinds.ts
21853
21873
  var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
21848
21848
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21849
21849
  });
21850
21850
  var DocListSchema = exports_external.array(DocSchema);
21851
+ var omniVoiceGenContentSchema = ContentSchema.extend({
21852
+ format: exports_external.literal("audio"),
21853
+ metadata: exports_external.looseObject({
21854
+ generator: exports_external.literal("kk:omni-voice-gen"),
21855
+ audioPath: exports_external.string(),
21856
+ duration: exports_external.number(),
21857
+ segments: exports_external.array(exports_external.looseObject({
21858
+ generationId: exports_external.string(),
21859
+ profile: exports_external.string(),
21860
+ speaker: exports_external.string().optional(),
21861
+ emotion: exports_external.string().optional(),
21862
+ duration: exports_external.number(),
21863
+ verifyRetries: exports_external.number(),
21864
+ transcription: exports_external.string().optional(),
21865
+ loudnessDip: exports_external.boolean().optional()
21866
+ })),
21867
+ mp3Path: exports_external.string().optional(),
21868
+ qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21869
+ })
21870
+ });
21851
21871
 
21852
21872
  // ../../packages/kk-core/src/kinds.ts
21853
21873
  var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
@@ -21970,13 +21990,21 @@ function renderDailyArticle(docs, date6) {
21970
21990
  ${items}
21971
21991
  `;
21972
21992
  }
21993
+ var AI_NEWS_TAG = "ai-news";
21994
+ function tagsFor(docs) {
21995
+ const existing = docs.flatMap((d) => {
21996
+ const meta3 = d.metadata;
21997
+ return Array.isArray(meta3?.tags) ? meta3.tags.filter((t) => typeof t === "string") : [];
21998
+ });
21999
+ return [AI_NEWS_TAG, ...existing.filter((t) => t !== AI_NEWS_TAG)];
22000
+ }
21973
22001
  function docsToContent(docs, date6) {
21974
22002
  return ContentSchema.parse({
21975
22003
  title: `\u6BCF\u65E5 AI \u8D44\u8BAF \u2014 ${date6}`,
21976
22004
  body: renderDailyArticle(docs, date6),
21977
22005
  format: "markdown",
21978
22006
  references: docs.filter((d) => d.sourceUri).map((d) => ({ url: d.sourceUri, title: d.title, cite: d.id })),
21979
- metadata: { generator: "kk:daily-article", date: date6, doc_count: docs.length }
22007
+ metadata: { generator: "kk:daily-article", date: date6, doc_count: docs.length, tags: tagsFor(docs) }
21980
22008
  });
21981
22009
  }
21982
22010
  async function processGeneratorIO(inputPath, outputPath) {
@@ -42,6 +42,18 @@ export function renderDailyArticle(docs: Doc[], date: string): string {
42
42
  return `# 每日 AI 资讯 — ${date}\n\n本期共 ${docs.length} 条新闻,均附可点击来源链接。\n\n${items}\n`;
43
43
  }
44
44
 
45
+ /** Single-source daily tag: stamped on every Content this generator emits (task 0119). */
46
+ const AI_NEWS_TAG = 'ai-news';
47
+
48
+ /** Merge existing item tags (deduped) with the mandatory `ai-news` tag, first position. */
49
+ function tagsFor(docs: Doc[]): string[] {
50
+ const existing = docs.flatMap((d) => {
51
+ const meta = d.metadata as Record<string, unknown> | undefined;
52
+ return Array.isArray(meta?.tags) ? meta.tags.filter((t): t is string => typeof t === 'string') : [];
53
+ });
54
+ return [AI_NEWS_TAG, ...existing.filter((t) => t !== AI_NEWS_TAG)];
55
+ }
56
+
45
57
  /** Build the article Content from a merged Doc[]. */
46
58
  export function docsToContent(docs: Doc[], date: string): Content {
47
59
  return ContentSchema.parse({
@@ -49,7 +61,7 @@ export function docsToContent(docs: Doc[], date: string): Content {
49
61
  body: renderDailyArticle(docs, date),
50
62
  format: 'markdown',
51
63
  references: docs.filter((d) => d.sourceUri).map((d) => ({ url: d.sourceUri, title: d.title, cite: d.id })),
52
- metadata: { generator: 'kk:daily-article', date, doc_count: docs.length },
64
+ metadata: { generator: 'kk:daily-article', date, doc_count: docs.length, tags: tagsFor(docs) },
53
65
  });
54
66
  }
55
67
 
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
21848
21848
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21849
21849
  });
21850
21850
  var DocListSchema = exports_external.array(DocSchema);
21851
+ var omniVoiceGenContentSchema = ContentSchema.extend({
21852
+ format: exports_external.literal("audio"),
21853
+ metadata: exports_external.looseObject({
21854
+ generator: exports_external.literal("kk:omni-voice-gen"),
21855
+ audioPath: exports_external.string(),
21856
+ duration: exports_external.number(),
21857
+ segments: exports_external.array(exports_external.looseObject({
21858
+ generationId: exports_external.string(),
21859
+ profile: exports_external.string(),
21860
+ speaker: exports_external.string().optional(),
21861
+ emotion: exports_external.string().optional(),
21862
+ duration: exports_external.number(),
21863
+ verifyRetries: exports_external.number(),
21864
+ transcription: exports_external.string().optional(),
21865
+ loudnessDip: exports_external.boolean().optional()
21866
+ })),
21867
+ mp3Path: exports_external.string().optional(),
21868
+ qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21869
+ })
21870
+ });
21851
21871
 
21852
21872
  // ../../packages/kk-core/src/kinds.ts
21853
21873
  var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
@@ -21848,6 +21848,26 @@ var ResultSchema = exports_external.object({
21848
21848
  metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21849
21849
  });
21850
21850
  var DocListSchema = exports_external.array(DocSchema);
21851
+ var omniVoiceGenContentSchema = ContentSchema.extend({
21852
+ format: exports_external.literal("audio"),
21853
+ metadata: exports_external.looseObject({
21854
+ generator: exports_external.literal("kk:omni-voice-gen"),
21855
+ audioPath: exports_external.string(),
21856
+ duration: exports_external.number(),
21857
+ segments: exports_external.array(exports_external.looseObject({
21858
+ generationId: exports_external.string(),
21859
+ profile: exports_external.string(),
21860
+ speaker: exports_external.string().optional(),
21861
+ emotion: exports_external.string().optional(),
21862
+ duration: exports_external.number(),
21863
+ verifyRetries: exports_external.number(),
21864
+ transcription: exports_external.string().optional(),
21865
+ loudnessDip: exports_external.boolean().optional()
21866
+ })),
21867
+ mp3Path: exports_external.string().optional(),
21868
+ qc: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
21869
+ })
21870
+ });
21851
21871
 
21852
21872
  // ../../packages/kk-core/src/kinds.ts
21853
21873
  var PLUGIN_KINDS = ["ingestion", "generator", "publish"];
@@ -22256,11 +22276,15 @@ function planEpisode(docs, options) {
22256
22276
  return selected.map((r) => {
22257
22277
  const meta3 = asRecord(r.doc.metadata);
22258
22278
  const ascii = asciiRatio(r.doc.title ?? "");
22279
+ const brief = (r.doc.body ?? "").trim().split(/(?<=[\u3002\uFF01\uFF1F])\s*/).slice(0, 2).join("");
22280
+ const published = docTimestamp(r.doc);
22259
22281
  return {
22260
22282
  ...r.doc,
22261
22283
  metadata: {
22262
22284
  ...meta3,
22263
22285
  planScore: r.score,
22286
+ ...brief.length > 0 ? { brief } : {},
22287
+ ...published !== null ? { publishAt: new Date(published).toISOString() } : {},
22264
22288
  ...ascii > 0.5 ? { needsTranslation: true } : {},
22265
22289
  ...r.mergedFrom.length > 0 ? { mergedFrom: r.mergedFrom } : {}
22266
22290
  }
@@ -442,11 +442,22 @@ export function planEpisode(docs: Doc[], options: PlanOptions): Doc[] {
442
442
  return selected.map((r) => {
443
443
  const meta = asRecord(r.doc.metadata);
444
444
  const ascii = asciiRatio(r.doc.title ?? '');
445
+ // Task 0118: 1–2-sentence briefing (first two 。!?-terminated sentences of the
446
+ // cleaned body) + best-effort publish timestamp ride the plan metadata so the
447
+ // podcast show-notes brief/timeline render stays deterministic, no LLM.
448
+ const brief = (r.doc.body ?? '')
449
+ .trim()
450
+ .split(/(?<=[。!?])\s*/)
451
+ .slice(0, 2)
452
+ .join('');
453
+ const published = docTimestamp(r.doc);
445
454
  return {
446
455
  ...r.doc,
447
456
  metadata: {
448
457
  ...meta,
449
458
  planScore: r.score,
459
+ ...(brief.length > 0 ? { brief } : {}),
460
+ ...(published !== null ? { publishAt: new Date(published).toISOString() } : {}),
450
461
  ...(ascii > 0.5 ? { needsTranslation: true } : {}),
451
462
  ...(r.mergedFrom.length > 0 ? { mergedFrom: r.mergedFrom } : {}),
452
463
  },