@kb-labs/steward-entry 0.1.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.
Files changed (90) hide show
  1. package/README.md +5 -0
  2. package/dist/commands/commitment-add.d.ts +15 -0
  3. package/dist/commands/commitment-add.js +53 -0
  4. package/dist/commands/commitment-add.js.map +1 -0
  5. package/dist/commands/commitment-done.d.ts +10 -0
  6. package/dist/commands/commitment-done.js +43 -0
  7. package/dist/commands/commitment-done.js.map +1 -0
  8. package/dist/commands/commitment-drop.d.ts +11 -0
  9. package/dist/commands/commitment-drop.js +43 -0
  10. package/dist/commands/commitment-drop.js.map +1 -0
  11. package/dist/commands/commitment-list.d.ts +13 -0
  12. package/dist/commands/commitment-list.js +37 -0
  13. package/dist/commands/commitment-list.js.map +1 -0
  14. package/dist/commands/commitment-snooze.d.ts +12 -0
  15. package/dist/commands/commitment-snooze.js +54 -0
  16. package/dist/commands/commitment-snooze.js.map +1 -0
  17. package/dist/commands/company-add.d.ts +11 -0
  18. package/dist/commands/company-add.js +34 -0
  19. package/dist/commands/company-add.js.map +1 -0
  20. package/dist/commands/company-list.d.ts +10 -0
  21. package/dist/commands/company-list.js +32 -0
  22. package/dist/commands/company-list.js.map +1 -0
  23. package/dist/commands/event-add.d.ts +14 -0
  24. package/dist/commands/event-add.js +46 -0
  25. package/dist/commands/event-add.js.map +1 -0
  26. package/dist/commands/event-list.d.ts +13 -0
  27. package/dist/commands/event-list.js +38 -0
  28. package/dist/commands/event-list.js.map +1 -0
  29. package/dist/commands/member-add.d.ts +15 -0
  30. package/dist/commands/member-add.js +50 -0
  31. package/dist/commands/member-add.js.map +1 -0
  32. package/dist/commands/member-list.d.ts +10 -0
  33. package/dist/commands/member-list.js +37 -0
  34. package/dist/commands/member-list.js.map +1 -0
  35. package/dist/commands/person-add.d.ts +16 -0
  36. package/dist/commands/person-add.js +52 -0
  37. package/dist/commands/person-add.js.map +1 -0
  38. package/dist/commands/person-get.d.ts +10 -0
  39. package/dist/commands/person-get.js +43 -0
  40. package/dist/commands/person-get.js.map +1 -0
  41. package/dist/commands/person-list.d.ts +10 -0
  42. package/dist/commands/person-list.js +32 -0
  43. package/dist/commands/person-list.js.map +1 -0
  44. package/dist/commands/person-update.d.ts +13 -0
  45. package/dist/commands/person-update.js +53 -0
  46. package/dist/commands/person-update.js.map +1 -0
  47. package/dist/commands/project-add.d.ts +13 -0
  48. package/dist/commands/project-add.js +38 -0
  49. package/dist/commands/project-add.js.map +1 -0
  50. package/dist/commands/project-get.d.ts +10 -0
  51. package/dist/commands/project-get.js +43 -0
  52. package/dist/commands/project-get.js.map +1 -0
  53. package/dist/commands/project-list.d.ts +11 -0
  54. package/dist/commands/project-list.js +34 -0
  55. package/dist/commands/project-list.js.map +1 -0
  56. package/dist/commands/project-update.d.ts +12 -0
  57. package/dist/commands/project-update.js +47 -0
  58. package/dist/commands/project-update.js.map +1 -0
  59. package/dist/commands/resource-add.d.ts +14 -0
  60. package/dist/commands/resource-add.js +44 -0
  61. package/dist/commands/resource-add.js.map +1 -0
  62. package/dist/commands/resource-list.d.ts +10 -0
  63. package/dist/commands/resource-list.js +37 -0
  64. package/dist/commands/resource-list.js.map +1 -0
  65. package/dist/commands/review.d.ts +10 -0
  66. package/dist/commands/review.js +35 -0
  67. package/dist/commands/review.js.map +1 -0
  68. package/dist/commands/topic-add.d.ts +12 -0
  69. package/dist/commands/topic-add.js +44 -0
  70. package/dist/commands/topic-add.js.map +1 -0
  71. package/dist/commands/topic-list.d.ts +10 -0
  72. package/dist/commands/topic-list.js +32 -0
  73. package/dist/commands/topic-list.js.map +1 -0
  74. package/dist/commands/who.d.ts +11 -0
  75. package/dist/commands/who.js +42 -0
  76. package/dist/commands/who.js.map +1 -0
  77. package/dist/index.d.ts +2 -0
  78. package/dist/index.js +406 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/jobs/daily-review.d.ts +11 -0
  81. package/dist/jobs/daily-review.js +47 -0
  82. package/dist/jobs/daily-review.js.map +1 -0
  83. package/dist/jobs/export-backup.d.ts +13 -0
  84. package/dist/jobs/export-backup.js +32 -0
  85. package/dist/jobs/export-backup.js.map +1 -0
  86. package/dist/manifest.d.ts +490 -0
  87. package/dist/manifest.js +406 -0
  88. package/dist/manifest.js.map +1 -0
  89. package/dist/manifest.json +728 -0
  90. package/package.json +55 -0
package/dist/index.js ADDED
@@ -0,0 +1,406 @@
1
+ import { defineJob, combinePermissions, kbPlatformPreset } from '@kb-labs/sdk';
2
+ import { getDailyReview, exportSnapshot } from '@kb-labs/steward-core';
3
+
4
+ // src/manifest.ts
5
+ function renderMarkdown(review) {
6
+ const backupLine = review.lastBackupDaysAgo === null ? "**last backup: never**" : `**last backup: ${review.lastBackupDaysAgo}d ago**`;
7
+ const lines = [
8
+ `# Steward daily review \u2014 ${new Date(review.generatedAt).toISOString().slice(0, 10)}`,
9
+ "",
10
+ backupLine,
11
+ "",
12
+ `## Stale commitments (${review.staleCommitments.length})`,
13
+ ...review.staleCommitments.map((c) => `- ${c.text} (${c.id})`),
14
+ "",
15
+ `## Upcoming (${review.upcomingCommitments.length})`,
16
+ ...review.upcomingCommitments.map((c) => `- ${c.text} \u2014 ${c.remindAt ? new Date(c.remindAt).toISOString().slice(0, 10) : "?"}`),
17
+ "",
18
+ `## Active projects (${review.activeProjects.length})`,
19
+ ...review.activeProjects.map((p) => `- ${p.name}`)
20
+ ];
21
+ return lines.join("\n") + "\n";
22
+ }
23
+ var job = defineJob({
24
+ id: "daily-review",
25
+ schedule: "1d",
26
+ describe: "Generates the daily review artifact",
27
+ handler: async (_input, ctx) => {
28
+ try {
29
+ const review = await getDailyReview();
30
+ const dateKey = new Date(review.generatedAt).toISOString().slice(0, 10);
31
+ await ctx.platform.artifacts?.write(`reviews/${dateKey}.md`, renderMarkdown(review), {
32
+ contentType: "text/markdown"
33
+ });
34
+ ctx.platform.logger?.debug?.("steward:daily-review generated", { staleCount: review.staleCommitments.length });
35
+ return { ok: true, staleCount: review.staleCommitments.length };
36
+ } catch (err) {
37
+ ctx.platform.logger?.error?.("steward:daily-review failed", err instanceof Error ? err : new Error(String(err)));
38
+ throw err;
39
+ }
40
+ }
41
+ });
42
+ var cronDecl = job.toManifest("./jobs/daily-review.js#default");
43
+ job.handler;
44
+ var job2 = defineJob({
45
+ id: "export-backup",
46
+ schedule: "1d",
47
+ describe: "Snapshots all collections for the private-repo backup",
48
+ handler: async (_input, ctx) => {
49
+ try {
50
+ const snapshot = await exportSnapshot();
51
+ const dateKey = new Date(snapshot.exportedAt).toISOString().slice(0, 10);
52
+ await ctx.platform.artifacts?.write(`exports/${dateKey}.json`, snapshot, {
53
+ contentType: "application/json"
54
+ });
55
+ const counts = Object.fromEntries(
56
+ Object.entries(snapshot.collections).map(([k, v]) => [k, v.length])
57
+ );
58
+ ctx.platform.logger?.debug?.("steward:export-backup generated", { counts });
59
+ return { ok: true, counts };
60
+ } catch (err) {
61
+ ctx.platform.logger?.error?.("steward:export-backup failed", err instanceof Error ? err : new Error(String(err)));
62
+ throw err;
63
+ }
64
+ }
65
+ });
66
+ var cronDecl2 = job2.toManifest("./jobs/export-backup.js#default");
67
+ job2.handler;
68
+
69
+ // src/manifest.ts
70
+ var JSON_FLAG = { name: "json", type: "boolean", description: "Emit JSON instead of text" };
71
+ var permissions = combinePermissions().with(kbPlatformPreset).withPlatform({
72
+ database: {
73
+ document: {
74
+ collections: [
75
+ "projects",
76
+ "resources",
77
+ "people",
78
+ "companies",
79
+ "project_members",
80
+ "commitments",
81
+ "events",
82
+ "topics"
83
+ ]
84
+ }
85
+ }
86
+ }).build();
87
+ var manifest = {
88
+ schema: "kb.plugin/3",
89
+ id: "@kb-labs/steward",
90
+ version: "0.1.0",
91
+ display: {
92
+ name: "Steward",
93
+ description: "Personal PM/CRM tool-layer for AI agents: projects, people, commitments, and routing across dozens of parallel projects.",
94
+ tags: ["pm", "crm", "agents", "productivity"]
95
+ },
96
+ platform: {
97
+ requires: ["documentDatabase"]
98
+ },
99
+ cli: {
100
+ groupMeta: [{ name: "steward", description: "Personal PM/CRM for AI agents" }],
101
+ commands: [
102
+ // ── Project ──────────────────────────────────────────────────────
103
+ {
104
+ path: "steward project add",
105
+ describe: "Create a new project",
106
+ handler: "./commands/project-add.js#default",
107
+ flags: [
108
+ { name: "name", type: "string", description: "Project name", required: true },
109
+ {
110
+ name: "status",
111
+ type: "string",
112
+ description: "active | paused | archived",
113
+ default: "active"
114
+ },
115
+ { name: "description", type: "string", description: "Free-text description" },
116
+ JSON_FLAG
117
+ ],
118
+ examples: [
119
+ 'kb steward project add --name="Acme API" --description="Payments backend"'
120
+ ]
121
+ },
122
+ {
123
+ path: "steward project get",
124
+ describe: "Get a project card: status, resources, and members",
125
+ handler: "./commands/project-get.js#default",
126
+ flags: [JSON_FLAG],
127
+ examples: ['kb steward project get "Acme API"', "kb steward project get prj_01H..."]
128
+ },
129
+ {
130
+ path: "steward project list",
131
+ describe: "List projects, optionally filtered by status",
132
+ handler: "./commands/project-list.js#default",
133
+ flags: [
134
+ { name: "status", type: "string", description: "active | paused | archived" },
135
+ JSON_FLAG
136
+ ],
137
+ examples: ["kb steward project list", "kb steward project list --status=active"]
138
+ },
139
+ {
140
+ path: "steward project update",
141
+ describe: "Update a project's status or description",
142
+ handler: "./commands/project-update.js#default",
143
+ flags: [
144
+ { name: "status", type: "string", description: "active | paused | archived" },
145
+ { name: "description", type: "string", description: "New description" },
146
+ JSON_FLAG
147
+ ],
148
+ examples: ["kb steward project update prj_01H... --status=paused"]
149
+ },
150
+ // ── Resource ─────────────────────────────────────────────────────
151
+ {
152
+ path: "steward resource add",
153
+ describe: "Attach a resource to a project (repo, stand, dashboard, doc, ...)",
154
+ handler: "./commands/resource-add.js#default",
155
+ flags: [
156
+ { name: "type", type: "string", description: "Free-form kind, e.g. repo, dev-stand, dashboard", required: true },
157
+ { name: "label", type: "string", description: "Human-readable label", required: true },
158
+ { name: "url", type: "string", description: "External link, if any" },
159
+ { name: "content", type: "string", description: "Stored markdown content, if any" },
160
+ JSON_FLAG
161
+ ],
162
+ examples: [
163
+ "kb steward resource add prj_01H... --type=repo --url=https://github.com/acme/api"
164
+ ]
165
+ },
166
+ {
167
+ path: "steward resource list",
168
+ describe: "List resources attached to a project",
169
+ handler: "./commands/resource-list.js#default",
170
+ flags: [JSON_FLAG],
171
+ examples: ["kb steward resource list prj_01H..."]
172
+ },
173
+ // ── Person / Company / Member ────────────────────────────────────
174
+ {
175
+ path: "steward person add",
176
+ describe: "Add a contact. Returns a possibleDuplicates warning, not an error, on a name match",
177
+ handler: "./commands/person-add.js#default",
178
+ flags: [
179
+ { name: "name", type: "string", description: "Full name", required: true },
180
+ { name: "topics", type: "string", description: "Comma-separated global competencies" },
181
+ { name: "company", type: "string", description: "Company id" },
182
+ JSON_FLAG
183
+ ],
184
+ examples: ['kb steward person add --name="Ivanov" --topics=frontend,architecture']
185
+ },
186
+ {
187
+ path: "steward person update",
188
+ describe: "Update a contact's name, topics, or company",
189
+ handler: "./commands/person-update.js#default",
190
+ flags: [
191
+ { name: "name", type: "string", description: "New name" },
192
+ { name: "topics", type: "string", description: "Comma-separated global competencies (replaces existing)" },
193
+ { name: "company", type: "string", description: "Company id" },
194
+ JSON_FLAG
195
+ ],
196
+ examples: ["kb steward person update per_01H... --topics=frontend,backend"]
197
+ },
198
+ {
199
+ path: "steward person get",
200
+ describe: "Get a contact by id or exact name",
201
+ handler: "./commands/person-get.js#default",
202
+ flags: [JSON_FLAG],
203
+ examples: ['kb steward person get "Ivanov"']
204
+ },
205
+ {
206
+ path: "steward person list",
207
+ describe: "List every known contact",
208
+ handler: "./commands/person-list.js#default",
209
+ flags: [JSON_FLAG],
210
+ examples: ["kb steward person list"]
211
+ },
212
+ {
213
+ path: "steward company add",
214
+ describe: "Add a company (thin \u2014 just a name to link people to)",
215
+ handler: "./commands/company-add.js#default",
216
+ flags: [
217
+ { name: "name", type: "string", description: "Company name", required: true },
218
+ JSON_FLAG
219
+ ],
220
+ examples: ['kb steward company add --name="Acme Corp"']
221
+ },
222
+ {
223
+ path: "steward company list",
224
+ describe: "List companies",
225
+ handler: "./commands/company-list.js#default",
226
+ flags: [JSON_FLAG],
227
+ examples: ["kb steward company list"]
228
+ },
229
+ {
230
+ path: "steward member add",
231
+ describe: "Link a person to a project with a role and fallback priority",
232
+ handler: "./commands/member-add.js#default",
233
+ flags: [
234
+ { name: "person", type: "string", description: "Person id", required: true },
235
+ { name: "project", type: "string", description: "Project id", required: true },
236
+ { name: "role", type: "string", description: "Role in this project", required: true },
237
+ { name: "topics", type: "string", description: "Comma-separated project-scoped competencies" },
238
+ { name: "priority", type: "number", description: "Lower = contacted first", default: 0 },
239
+ JSON_FLAG
240
+ ],
241
+ examples: ["kb steward member add --person=per_01H... --project=prj_01H... --role=lead --priority=0"]
242
+ },
243
+ {
244
+ path: "steward member list",
245
+ describe: "List members of a project, ordered by fallback priority",
246
+ handler: "./commands/member-list.js#default",
247
+ flags: [JSON_FLAG],
248
+ examples: ["kb steward member list prj_01H..."]
249
+ },
250
+ // ── Routing ──────────────────────────────────────────────────────
251
+ {
252
+ path: "steward who",
253
+ describe: "Find who to contact about a topic. With --project, project-scoped members take priority (fallback chain); otherwise matches global competencies across every contact",
254
+ handler: "./commands/who.js#default",
255
+ flags: [
256
+ { name: "project", type: "string", description: "Prefer members of this project" },
257
+ JSON_FLAG
258
+ ],
259
+ examples: ['kb steward who "frontend" --project=prj_01H...', 'kb steward who "grafana"']
260
+ },
261
+ // ── Commitment ───────────────────────────────────────────────────
262
+ {
263
+ path: "steward commitment add",
264
+ describe: "Record a promise made to a person, with an optional soft reminder date",
265
+ handler: "./commands/commitment-add.js#default",
266
+ flags: [
267
+ { name: "text", type: "string", description: "What was promised", required: true },
268
+ { name: "person", type: "string", description: "Person id" },
269
+ { name: "project", type: "string", description: "Project id" },
270
+ { name: "remind-at", type: "string", description: "ISO date/time for the reminder" },
271
+ { name: "stale-after-days", type: "number", description: "Days of silence before it counts as stale", default: 14 },
272
+ JSON_FLAG
273
+ ],
274
+ examples: ['kb steward commitment add --text="Send X" --person=per_01H... --remind-at=2026-09-01']
275
+ },
276
+ {
277
+ path: "steward commitment list",
278
+ describe: "List commitments, optionally only the stale (overdue, unsnoozed) ones",
279
+ handler: "./commands/commitment-list.js#default",
280
+ flags: [
281
+ { name: "status", type: "string", description: "open | done | dropped" },
282
+ { name: "project", type: "string", description: "Project id" },
283
+ { name: "stale-only", type: "boolean", description: "Only overdue, unsnoozed, open commitments" },
284
+ JSON_FLAG
285
+ ],
286
+ examples: ["kb steward commitment list --stale-only"]
287
+ },
288
+ {
289
+ path: "steward commitment done",
290
+ describe: "Mark a commitment fulfilled",
291
+ handler: "./commands/commitment-done.js#default",
292
+ flags: [JSON_FLAG],
293
+ examples: ["kb steward commitment done cmt_01H..."]
294
+ },
295
+ {
296
+ path: "steward commitment drop",
297
+ describe: "Cancel a commitment \u2014 reason is required and recorded in history",
298
+ handler: "./commands/commitment-drop.js#default",
299
+ flags: [
300
+ { name: "reason", type: "string", description: "Why it was dropped", required: true },
301
+ JSON_FLAG
302
+ ],
303
+ examples: ['kb steward commitment drop cmt_01H... --reason="No longer relevant"']
304
+ },
305
+ {
306
+ path: "steward commitment snooze",
307
+ describe: "Postpone a commitment's reminder without cancelling it",
308
+ handler: "./commands/commitment-snooze.js#default",
309
+ flags: [
310
+ { name: "until", type: "string", description: "ISO date/time to snooze until", required: true },
311
+ { name: "reason", type: "string", description: "Why it was postponed" },
312
+ JSON_FLAG
313
+ ],
314
+ examples: ['kb steward commitment snooze cmt_01H... --until=2026-09-15 --reason="Waiting on client"']
315
+ },
316
+ // ── Event ────────────────────────────────────────────────────────
317
+ {
318
+ path: "steward event add",
319
+ describe: "Record a manual note against a project, person, or commitment \u2014 the primary tool for backfill import",
320
+ handler: "./commands/event-add.js#default",
321
+ flags: [
322
+ { name: "subject-type", type: "string", description: "project | person | commitment | company | resource", required: true },
323
+ { name: "subject-id", type: "string", description: "Id of the subject", required: true },
324
+ { name: "text", type: "string", description: "Note text" },
325
+ { name: "kind", type: "string", description: "Event kind", default: "note" },
326
+ JSON_FLAG
327
+ ],
328
+ examples: ['kb steward event add --subject-type=person --subject-id=per_01H... --text="Talked at the conference"']
329
+ },
330
+ {
331
+ path: "steward event list",
332
+ describe: 'Read the history log for a subject \u2014 "what happened with X"',
333
+ handler: "./commands/event-list.js#default",
334
+ flags: [
335
+ { name: "subject-type", type: "string", description: "project | person | commitment | company | resource" },
336
+ { name: "subject-id", type: "string", description: "Id of the subject" },
337
+ { name: "kind", type: "string", description: "Filter by event kind" },
338
+ JSON_FLAG
339
+ ],
340
+ examples: ["kb steward event list --subject-type=project --subject-id=prj_01H..."]
341
+ },
342
+ // ── Topic ────────────────────────────────────────────────────────
343
+ {
344
+ path: "steward topic add",
345
+ describe: "Register a topic with aliases in the routing dictionary \u2014 do this deliberately, not automatically",
346
+ handler: "./commands/topic-add.js#default",
347
+ flags: [
348
+ { name: "name", type: "string", description: "Canonical topic name", required: true },
349
+ { name: "aliases", type: "string", description: "Comma-separated aliases" },
350
+ JSON_FLAG
351
+ ],
352
+ examples: ["kb steward topic add --name=frontend --aliases=\u0444\u0440\u043E\u043D\u0442,\u0444\u0440\u043E\u043D\u0442\u0435\u043D\u0434,front-end"]
353
+ },
354
+ {
355
+ path: "steward topic list",
356
+ describe: "List the topic dictionary",
357
+ handler: "./commands/topic-list.js#default",
358
+ flags: [JSON_FLAG],
359
+ examples: ["kb steward topic list"]
360
+ },
361
+ // ── Review ───────────────────────────────────────────────────────
362
+ {
363
+ path: "steward review",
364
+ describe: "Daily summary: stale commitments, upcoming reminders, active projects, and days since the last successful backup",
365
+ handler: "./commands/review.js#default",
366
+ flags: [JSON_FLAG],
367
+ examples: ["kb steward review"]
368
+ }
369
+ ]
370
+ },
371
+ cron: {
372
+ schedules: [cronDecl, cronDecl2]
373
+ },
374
+ jobs: {
375
+ handlers: [
376
+ {
377
+ id: "daily-review",
378
+ describe: "Writes .kb/steward/reviews/<date>.md",
379
+ handler: "./jobs/daily-review.js#default"
380
+ },
381
+ {
382
+ id: "export-backup",
383
+ describe: "Writes .kb/steward/exports/<date>.json \u2014 git commit/push happens at the workflow level",
384
+ handler: "./jobs/export-backup.js#default"
385
+ }
386
+ ]
387
+ },
388
+ artifacts: [
389
+ {
390
+ id: "steward.review.md",
391
+ pathTemplate: ".kb/steward/reviews/{date}.md",
392
+ description: "Daily review \u2014 stale commitments, upcoming reminders, backup health."
393
+ },
394
+ {
395
+ id: "steward.export.json",
396
+ pathTemplate: ".kb/steward/exports/{date}.json",
397
+ description: "Daily snapshot of every collection, for the private-repo backup."
398
+ }
399
+ ]
400
+ };
401
+ var withPermissions = { ...manifest, permissions };
402
+ var manifest_default = withPermissions;
403
+
404
+ export { manifest_default as manifest };
405
+ //# sourceMappingURL=index.js.map
406
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/jobs/daily-review.ts","../src/jobs/export-backup.ts","../src/manifest.ts"],"names":["job","defineJob","cronDecl"],"mappings":"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","file":"index.js","sourcesContent":["import { defineJob, type JobInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getDailyReview, type DailyReview } from '@kb-labs/steward-core';\n\nfunction renderMarkdown(review: DailyReview): string {\n const backupLine =\n review.lastBackupDaysAgo === null\n ? '**last backup: never**'\n : `**last backup: ${review.lastBackupDaysAgo}d ago**`;\n\n const lines = [\n `# Steward daily review — ${new Date(review.generatedAt).toISOString().slice(0, 10)}`,\n '',\n backupLine,\n '',\n `## Stale commitments (${review.staleCommitments.length})`,\n ...review.staleCommitments.map((c) => `- ${c.text} (${c.id})`),\n '',\n `## Upcoming (${review.upcomingCommitments.length})`,\n ...review.upcomingCommitments.map((c) => `- ${c.text} — ${c.remindAt ? new Date(c.remindAt).toISOString().slice(0, 10) : '?'}`),\n '',\n `## Active projects (${review.activeProjects.length})`,\n ...review.activeProjects.map((p) => `- ${p.name}`),\n ];\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Cron-scheduled job — see ADR-0001 §\"Артефакты и фоновые джобы\". Writes the\n * `steward.review.md` artifact declared in the manifest; delivery/notification\n * is the platform's responsibility, not this plugin's.\n */\nconst job = defineJob({\n id: 'daily-review',\n schedule: '1d',\n describe: 'Generates the daily review artifact',\n handler: async (_input: JobInput, ctx: PluginContextV3) => {\n try {\n const review = await getDailyReview();\n const dateKey = new Date(review.generatedAt).toISOString().slice(0, 10);\n await ctx.platform.artifacts?.write(`reviews/${dateKey}.md`, renderMarkdown(review), {\n contentType: 'text/markdown',\n });\n ctx.platform.logger?.debug?.('steward:daily-review generated', { staleCount: review.staleCommitments.length });\n return { ok: true, staleCount: review.staleCommitments.length };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:daily-review failed', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n },\n});\n\nexport const cronDecl = job.toManifest('./jobs/daily-review.js#default');\nexport default job.handler;\n","import { defineJob, type JobInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { exportSnapshot } from '@kb-labs/steward-core';\n\n/**\n * Cron-scheduled job — see ADR-0001 §Бэкапы. Writes the `steward.export.json`\n * artifact declared in the manifest. Committing/pushing it to the private\n * backup repo happens at the workflow/git level (existing github plugin /\n * git commands), not inside this handler — deliberately out of scope here.\n */\nconst job = defineJob({\n id: 'export-backup',\n schedule: '1d',\n describe: 'Snapshots all collections for the private-repo backup',\n handler: async (_input: JobInput, ctx: PluginContextV3) => {\n try {\n const snapshot = await exportSnapshot();\n const dateKey = new Date(snapshot.exportedAt).toISOString().slice(0, 10);\n await ctx.platform.artifacts?.write(`exports/${dateKey}.json`, snapshot, {\n contentType: 'application/json',\n });\n const counts = Object.fromEntries(\n Object.entries(snapshot.collections).map(([k, v]) => [k, v.length]),\n );\n ctx.platform.logger?.debug?.('steward:export-backup generated', { counts });\n return { ok: true, counts };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:export-backup failed', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n },\n});\n\nexport const cronDecl = job.toManifest('./jobs/export-backup.js#default');\nexport default job.handler;\n","/**\n * V3 plugin manifest for steward — personal PM/CRM tool-layer for AI agents.\n * See docs/adr/0001-steward-design.md for the full design.\n *\n * The platform generates MCP tools for agents from `cli.commands` below, so\n * `describe`/`examples` double as the prompt an agent reads to pick a tool —\n * write them for a model, not just a human at a terminal.\n */\nimport { combinePermissions, kbPlatformPreset } from '@kb-labs/sdk';\nimport { cronDecl as dailyReviewCron } from './jobs/daily-review.js';\nimport { cronDecl as exportBackupCron } from './jobs/export-backup.js';\n\nconst JSON_FLAG = { name: 'json', type: 'boolean', description: 'Emit JSON instead of text' } as const;\n\nconst permissions = combinePermissions()\n .with(kbPlatformPreset)\n .withPlatform({\n database: {\n document: {\n collections: [\n 'projects',\n 'resources',\n 'people',\n 'companies',\n 'project_members',\n 'commitments',\n 'events',\n 'topics',\n ],\n },\n },\n })\n .build();\n\nconst manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/steward',\n version: '0.1.0',\n display: {\n name: 'Steward',\n description:\n 'Personal PM/CRM tool-layer for AI agents: projects, people, commitments, and routing across dozens of parallel projects.',\n tags: ['pm', 'crm', 'agents', 'productivity'],\n },\n platform: {\n requires: ['documentDatabase'],\n },\n cli: {\n groupMeta: [{ name: 'steward', description: 'Personal PM/CRM for AI agents' }],\n commands: [\n // ── Project ──────────────────────────────────────────────────────\n {\n path: 'steward project add',\n describe: 'Create a new project',\n handler: './commands/project-add.js#default',\n flags: [\n { name: 'name', type: 'string', description: 'Project name', required: true },\n {\n name: 'status',\n type: 'string',\n description: 'active | paused | archived',\n default: 'active',\n },\n { name: 'description', type: 'string', description: 'Free-text description' },\n JSON_FLAG,\n ],\n examples: [\n 'kb steward project add --name=\"Acme API\" --description=\"Payments backend\"',\n ],\n },\n {\n path: 'steward project get',\n describe: 'Get a project card: status, resources, and members',\n handler: './commands/project-get.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward project get \"Acme API\"', 'kb steward project get prj_01H...'],\n },\n {\n path: 'steward project list',\n describe: 'List projects, optionally filtered by status',\n handler: './commands/project-list.js#default',\n flags: [\n { name: 'status', type: 'string', description: 'active | paused | archived' },\n JSON_FLAG,\n ],\n examples: ['kb steward project list', 'kb steward project list --status=active'],\n },\n {\n path: 'steward project update',\n describe: 'Update a project\\'s status or description',\n handler: './commands/project-update.js#default',\n flags: [\n { name: 'status', type: 'string', description: 'active | paused | archived' },\n { name: 'description', type: 'string', description: 'New description' },\n JSON_FLAG,\n ],\n examples: ['kb steward project update prj_01H... --status=paused'],\n },\n // ── Resource ─────────────────────────────────────────────────────\n {\n path: 'steward resource add',\n describe: 'Attach a resource to a project (repo, stand, dashboard, doc, ...)',\n handler: './commands/resource-add.js#default',\n flags: [\n { name: 'type', type: 'string', description: 'Free-form kind, e.g. repo, dev-stand, dashboard', required: true },\n { name: 'label', type: 'string', description: 'Human-readable label', required: true },\n { name: 'url', type: 'string', description: 'External link, if any' },\n { name: 'content', type: 'string', description: 'Stored markdown content, if any' },\n JSON_FLAG,\n ],\n examples: [\n 'kb steward resource add prj_01H... --type=repo --url=https://github.com/acme/api',\n ],\n },\n {\n path: 'steward resource list',\n describe: 'List resources attached to a project',\n handler: './commands/resource-list.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward resource list prj_01H...'],\n },\n // ── Person / Company / Member ────────────────────────────────────\n {\n path: 'steward person add',\n describe: 'Add a contact. Returns a possibleDuplicates warning, not an error, on a name match',\n handler: './commands/person-add.js#default',\n flags: [\n { name: 'name', type: 'string', description: 'Full name', required: true },\n { name: 'topics', type: 'string', description: 'Comma-separated global competencies' },\n { name: 'company', type: 'string', description: 'Company id' },\n JSON_FLAG,\n ],\n examples: ['kb steward person add --name=\"Ivanov\" --topics=frontend,architecture'],\n },\n {\n path: 'steward person update',\n describe: 'Update a contact\\'s name, topics, or company',\n handler: './commands/person-update.js#default',\n flags: [\n { name: 'name', type: 'string', description: 'New name' },\n { name: 'topics', type: 'string', description: 'Comma-separated global competencies (replaces existing)' },\n { name: 'company', type: 'string', description: 'Company id' },\n JSON_FLAG,\n ],\n examples: ['kb steward person update per_01H... --topics=frontend,backend'],\n },\n {\n path: 'steward person get',\n describe: 'Get a contact by id or exact name',\n handler: './commands/person-get.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward person get \"Ivanov\"'],\n },\n {\n path: 'steward person list',\n describe: 'List every known contact',\n handler: './commands/person-list.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward person list'],\n },\n {\n path: 'steward company add',\n describe: 'Add a company (thin — just a name to link people to)',\n handler: './commands/company-add.js#default',\n flags: [\n { name: 'name', type: 'string', description: 'Company name', required: true },\n JSON_FLAG,\n ],\n examples: ['kb steward company add --name=\"Acme Corp\"'],\n },\n {\n path: 'steward company list',\n describe: 'List companies',\n handler: './commands/company-list.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward company list'],\n },\n {\n path: 'steward member add',\n describe: 'Link a person to a project with a role and fallback priority',\n handler: './commands/member-add.js#default',\n flags: [\n { name: 'person', type: 'string', description: 'Person id', required: true },\n { name: 'project', type: 'string', description: 'Project id', required: true },\n { name: 'role', type: 'string', description: 'Role in this project', required: true },\n { name: 'topics', type: 'string', description: 'Comma-separated project-scoped competencies' },\n { name: 'priority', type: 'number', description: 'Lower = contacted first', default: 0 },\n JSON_FLAG,\n ],\n examples: ['kb steward member add --person=per_01H... --project=prj_01H... --role=lead --priority=0'],\n },\n {\n path: 'steward member list',\n describe: 'List members of a project, ordered by fallback priority',\n handler: './commands/member-list.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward member list prj_01H...'],\n },\n // ── Routing ──────────────────────────────────────────────────────\n {\n path: 'steward who',\n describe:\n 'Find who to contact about a topic. With --project, project-scoped members take priority (fallback chain); otherwise matches global competencies across every contact',\n handler: './commands/who.js#default',\n flags: [\n { name: 'project', type: 'string', description: 'Prefer members of this project' },\n JSON_FLAG,\n ],\n examples: ['kb steward who \"frontend\" --project=prj_01H...', 'kb steward who \"grafana\"'],\n },\n // ── Commitment ───────────────────────────────────────────────────\n {\n path: 'steward commitment add',\n describe: 'Record a promise made to a person, with an optional soft reminder date',\n handler: './commands/commitment-add.js#default',\n flags: [\n { name: 'text', type: 'string', description: 'What was promised', required: true },\n { name: 'person', type: 'string', description: 'Person id' },\n { name: 'project', type: 'string', description: 'Project id' },\n { name: 'remind-at', type: 'string', description: 'ISO date/time for the reminder' },\n { name: 'stale-after-days', type: 'number', description: 'Days of silence before it counts as stale', default: 14 },\n JSON_FLAG,\n ],\n examples: ['kb steward commitment add --text=\"Send X\" --person=per_01H... --remind-at=2026-09-01'],\n },\n {\n path: 'steward commitment list',\n describe: 'List commitments, optionally only the stale (overdue, unsnoozed) ones',\n handler: './commands/commitment-list.js#default',\n flags: [\n { name: 'status', type: 'string', description: 'open | done | dropped' },\n { name: 'project', type: 'string', description: 'Project id' },\n { name: 'stale-only', type: 'boolean', description: 'Only overdue, unsnoozed, open commitments' },\n JSON_FLAG,\n ],\n examples: ['kb steward commitment list --stale-only'],\n },\n {\n path: 'steward commitment done',\n describe: 'Mark a commitment fulfilled',\n handler: './commands/commitment-done.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward commitment done cmt_01H...'],\n },\n {\n path: 'steward commitment drop',\n describe: 'Cancel a commitment — reason is required and recorded in history',\n handler: './commands/commitment-drop.js#default',\n flags: [\n { name: 'reason', type: 'string', description: 'Why it was dropped', required: true },\n JSON_FLAG,\n ],\n examples: ['kb steward commitment drop cmt_01H... --reason=\"No longer relevant\"'],\n },\n {\n path: 'steward commitment snooze',\n describe: 'Postpone a commitment\\'s reminder without cancelling it',\n handler: './commands/commitment-snooze.js#default',\n flags: [\n { name: 'until', type: 'string', description: 'ISO date/time to snooze until', required: true },\n { name: 'reason', type: 'string', description: 'Why it was postponed' },\n JSON_FLAG,\n ],\n examples: ['kb steward commitment snooze cmt_01H... --until=2026-09-15 --reason=\"Waiting on client\"'],\n },\n // ── Event ────────────────────────────────────────────────────────\n {\n path: 'steward event add',\n describe: 'Record a manual note against a project, person, or commitment — the primary tool for backfill import',\n handler: './commands/event-add.js#default',\n flags: [\n { name: 'subject-type', type: 'string', description: 'project | person | commitment | company | resource', required: true },\n { name: 'subject-id', type: 'string', description: 'Id of the subject', required: true },\n { name: 'text', type: 'string', description: 'Note text' },\n { name: 'kind', type: 'string', description: 'Event kind', default: 'note' },\n JSON_FLAG,\n ],\n examples: ['kb steward event add --subject-type=person --subject-id=per_01H... --text=\"Talked at the conference\"'],\n },\n {\n path: 'steward event list',\n describe: 'Read the history log for a subject — \"what happened with X\"',\n handler: './commands/event-list.js#default',\n flags: [\n { name: 'subject-type', type: 'string', description: 'project | person | commitment | company | resource' },\n { name: 'subject-id', type: 'string', description: 'Id of the subject' },\n { name: 'kind', type: 'string', description: 'Filter by event kind' },\n JSON_FLAG,\n ],\n examples: ['kb steward event list --subject-type=project --subject-id=prj_01H...'],\n },\n // ── Topic ────────────────────────────────────────────────────────\n {\n path: 'steward topic add',\n describe: 'Register a topic with aliases in the routing dictionary — do this deliberately, not automatically',\n handler: './commands/topic-add.js#default',\n flags: [\n { name: 'name', type: 'string', description: 'Canonical topic name', required: true },\n { name: 'aliases', type: 'string', description: 'Comma-separated aliases' },\n JSON_FLAG,\n ],\n examples: ['kb steward topic add --name=frontend --aliases=фронт,фронтенд,front-end'],\n },\n {\n path: 'steward topic list',\n describe: 'List the topic dictionary',\n handler: './commands/topic-list.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward topic list'],\n },\n // ── Review ───────────────────────────────────────────────────────\n {\n path: 'steward review',\n describe:\n 'Daily summary: stale commitments, upcoming reminders, active projects, and days since the last successful backup',\n handler: './commands/review.js#default',\n flags: [JSON_FLAG],\n examples: ['kb steward review'],\n },\n ],\n },\n cron: {\n schedules: [dailyReviewCron, exportBackupCron],\n },\n jobs: {\n handlers: [\n {\n id: 'daily-review',\n describe: 'Writes .kb/steward/reviews/<date>.md',\n handler: './jobs/daily-review.js#default',\n },\n {\n id: 'export-backup',\n describe: 'Writes .kb/steward/exports/<date>.json — git commit/push happens at the workflow level',\n handler: './jobs/export-backup.js#default',\n },\n ],\n },\n artifacts: [\n {\n id: 'steward.review.md',\n pathTemplate: '.kb/steward/reviews/{date}.md',\n description: 'Daily review — stale commitments, upcoming reminders, backup health.',\n },\n {\n id: 'steward.export.json',\n pathTemplate: '.kb/steward/exports/{date}.json',\n description: 'Daily snapshot of every collection, for the private-repo backup.',\n },\n ],\n} as const;\n\nconst withPermissions: typeof manifest & { permissions: unknown } = { ...manifest, permissions };\n\nexport default withPermissions;\n"]}
@@ -0,0 +1,11 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_plugin_contracts from '@kb-labs/plugin-contracts';
3
+ import { JobInput } from '@kb-labs/sdk';
4
+
5
+ declare const cronDecl: _kb_labs_plugin_contracts.CronDecl;
6
+ declare const _default: _kb_labs_shared_command_kit.JobHandler<JobInput, {
7
+ ok: boolean;
8
+ staleCount: number;
9
+ }>;
10
+
11
+ export { cronDecl, _default as default };
@@ -0,0 +1,47 @@
1
+ import { defineJob } from '@kb-labs/sdk';
2
+ import { getDailyReview } from '@kb-labs/steward-core';
3
+
4
+ // src/jobs/daily-review.ts
5
+ function renderMarkdown(review) {
6
+ const backupLine = review.lastBackupDaysAgo === null ? "**last backup: never**" : `**last backup: ${review.lastBackupDaysAgo}d ago**`;
7
+ const lines = [
8
+ `# Steward daily review \u2014 ${new Date(review.generatedAt).toISOString().slice(0, 10)}`,
9
+ "",
10
+ backupLine,
11
+ "",
12
+ `## Stale commitments (${review.staleCommitments.length})`,
13
+ ...review.staleCommitments.map((c) => `- ${c.text} (${c.id})`),
14
+ "",
15
+ `## Upcoming (${review.upcomingCommitments.length})`,
16
+ ...review.upcomingCommitments.map((c) => `- ${c.text} \u2014 ${c.remindAt ? new Date(c.remindAt).toISOString().slice(0, 10) : "?"}`),
17
+ "",
18
+ `## Active projects (${review.activeProjects.length})`,
19
+ ...review.activeProjects.map((p) => `- ${p.name}`)
20
+ ];
21
+ return lines.join("\n") + "\n";
22
+ }
23
+ var job = defineJob({
24
+ id: "daily-review",
25
+ schedule: "1d",
26
+ describe: "Generates the daily review artifact",
27
+ handler: async (_input, ctx) => {
28
+ try {
29
+ const review = await getDailyReview();
30
+ const dateKey = new Date(review.generatedAt).toISOString().slice(0, 10);
31
+ await ctx.platform.artifacts?.write(`reviews/${dateKey}.md`, renderMarkdown(review), {
32
+ contentType: "text/markdown"
33
+ });
34
+ ctx.platform.logger?.debug?.("steward:daily-review generated", { staleCount: review.staleCommitments.length });
35
+ return { ok: true, staleCount: review.staleCommitments.length };
36
+ } catch (err) {
37
+ ctx.platform.logger?.error?.("steward:daily-review failed", err instanceof Error ? err : new Error(String(err)));
38
+ throw err;
39
+ }
40
+ }
41
+ });
42
+ var cronDecl = job.toManifest("./jobs/daily-review.js#default");
43
+ var daily_review_default = job.handler;
44
+
45
+ export { cronDecl, daily_review_default as default };
46
+ //# sourceMappingURL=daily-review.js.map
47
+ //# sourceMappingURL=daily-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/jobs/daily-review.ts"],"names":[],"mappings":"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","file":"daily-review.js","sourcesContent":["import { defineJob, type JobInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getDailyReview, type DailyReview } from '@kb-labs/steward-core';\n\nfunction renderMarkdown(review: DailyReview): string {\n const backupLine =\n review.lastBackupDaysAgo === null\n ? '**last backup: never**'\n : `**last backup: ${review.lastBackupDaysAgo}d ago**`;\n\n const lines = [\n `# Steward daily review — ${new Date(review.generatedAt).toISOString().slice(0, 10)}`,\n '',\n backupLine,\n '',\n `## Stale commitments (${review.staleCommitments.length})`,\n ...review.staleCommitments.map((c) => `- ${c.text} (${c.id})`),\n '',\n `## Upcoming (${review.upcomingCommitments.length})`,\n ...review.upcomingCommitments.map((c) => `- ${c.text} — ${c.remindAt ? new Date(c.remindAt).toISOString().slice(0, 10) : '?'}`),\n '',\n `## Active projects (${review.activeProjects.length})`,\n ...review.activeProjects.map((p) => `- ${p.name}`),\n ];\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Cron-scheduled job — see ADR-0001 §\"Артефакты и фоновые джобы\". Writes the\n * `steward.review.md` artifact declared in the manifest; delivery/notification\n * is the platform's responsibility, not this plugin's.\n */\nconst job = defineJob({\n id: 'daily-review',\n schedule: '1d',\n describe: 'Generates the daily review artifact',\n handler: async (_input: JobInput, ctx: PluginContextV3) => {\n try {\n const review = await getDailyReview();\n const dateKey = new Date(review.generatedAt).toISOString().slice(0, 10);\n await ctx.platform.artifacts?.write(`reviews/${dateKey}.md`, renderMarkdown(review), {\n contentType: 'text/markdown',\n });\n ctx.platform.logger?.debug?.('steward:daily-review generated', { staleCount: review.staleCommitments.length });\n return { ok: true, staleCount: review.staleCommitments.length };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:daily-review failed', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n },\n});\n\nexport const cronDecl = job.toManifest('./jobs/daily-review.js#default');\nexport default job.handler;\n"]}
@@ -0,0 +1,13 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_plugin_contracts from '@kb-labs/plugin-contracts';
3
+ import { JobInput } from '@kb-labs/sdk';
4
+
5
+ declare const cronDecl: _kb_labs_plugin_contracts.CronDecl;
6
+ declare const _default: _kb_labs_shared_command_kit.JobHandler<JobInput, {
7
+ ok: boolean;
8
+ counts: {
9
+ [k: string]: number;
10
+ };
11
+ }>;
12
+
13
+ export { cronDecl, _default as default };
@@ -0,0 +1,32 @@
1
+ import { defineJob } from '@kb-labs/sdk';
2
+ import { exportSnapshot } from '@kb-labs/steward-core';
3
+
4
+ // src/jobs/export-backup.ts
5
+ var job = defineJob({
6
+ id: "export-backup",
7
+ schedule: "1d",
8
+ describe: "Snapshots all collections for the private-repo backup",
9
+ handler: async (_input, ctx) => {
10
+ try {
11
+ const snapshot = await exportSnapshot();
12
+ const dateKey = new Date(snapshot.exportedAt).toISOString().slice(0, 10);
13
+ await ctx.platform.artifacts?.write(`exports/${dateKey}.json`, snapshot, {
14
+ contentType: "application/json"
15
+ });
16
+ const counts = Object.fromEntries(
17
+ Object.entries(snapshot.collections).map(([k, v]) => [k, v.length])
18
+ );
19
+ ctx.platform.logger?.debug?.("steward:export-backup generated", { counts });
20
+ return { ok: true, counts };
21
+ } catch (err) {
22
+ ctx.platform.logger?.error?.("steward:export-backup failed", err instanceof Error ? err : new Error(String(err)));
23
+ throw err;
24
+ }
25
+ }
26
+ });
27
+ var cronDecl = job.toManifest("./jobs/export-backup.js#default");
28
+ var export_backup_default = job.handler;
29
+
30
+ export { cronDecl, export_backup_default as default };
31
+ //# sourceMappingURL=export-backup.js.map
32
+ //# sourceMappingURL=export-backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/jobs/export-backup.ts"],"names":[],"mappings":";;;;AASA,IAAM,MAAM,SAAA,CAAU;AAAA,EACpB,EAAA,EAAI,eAAA;AAAA,EACJ,QAAA,EAAU,IAAA;AAAA,EACV,QAAA,EAAU,uDAAA;AAAA,EACV,OAAA,EAAS,OAAO,MAAA,EAAkB,GAAA,KAAyB;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,EAAe;AACtC,MAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,QAAA,CAAS,UAAU,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACvE,MAAA,MAAM,IAAI,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA,QAAA,EAAW,OAAO,SAAS,QAAA,EAAU;AAAA,QACvE,WAAA,EAAa;AAAA,OACd,CAAA;AACD,MAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AAAA,QACpB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,WAAW,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAA,CAAE,MAAM,CAAC;AAAA,OACpE;AACA,MAAA,GAAA,CAAI,SAAS,MAAA,EAAQ,KAAA,GAAQ,iCAAA,EAAmC,EAAE,QAAQ,CAAA;AAC1E,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,8BAAA,EAAgC,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAChH,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AACF,CAAC,CAAA;AAEM,IAAM,QAAA,GAAW,GAAA,CAAI,UAAA,CAAW,iCAAiC;AACxE,IAAO,wBAAQ,GAAA,CAAI","file":"export-backup.js","sourcesContent":["import { defineJob, type JobInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { exportSnapshot } from '@kb-labs/steward-core';\n\n/**\n * Cron-scheduled job — see ADR-0001 §Бэкапы. Writes the `steward.export.json`\n * artifact declared in the manifest. Committing/pushing it to the private\n * backup repo happens at the workflow/git level (existing github plugin /\n * git commands), not inside this handler — deliberately out of scope here.\n */\nconst job = defineJob({\n id: 'export-backup',\n schedule: '1d',\n describe: 'Snapshots all collections for the private-repo backup',\n handler: async (_input: JobInput, ctx: PluginContextV3) => {\n try {\n const snapshot = await exportSnapshot();\n const dateKey = new Date(snapshot.exportedAt).toISOString().slice(0, 10);\n await ctx.platform.artifacts?.write(`exports/${dateKey}.json`, snapshot, {\n contentType: 'application/json',\n });\n const counts = Object.fromEntries(\n Object.entries(snapshot.collections).map(([k, v]) => [k, v.length]),\n );\n ctx.platform.logger?.debug?.('steward:export-backup generated', { counts });\n return { ok: true, counts };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:export-backup failed', err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n },\n});\n\nexport const cronDecl = job.toManifest('./jobs/export-backup.js#default');\nexport default job.handler;\n"]}