@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
@@ -0,0 +1,47 @@
1
+ import { defineCommand, validationError, handleError } from '@kb-labs/sdk';
2
+ import { updateProject } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/project-update.ts
5
+ var project_update_default = defineCommand({
6
+ id: "steward:project.update",
7
+ description: "Update a project's status or description",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const [id] = input.argv;
11
+ const { status, description, json } = input.flags;
12
+ if (!id) {
13
+ validationError(ctx, "id is required", "Usage: kb steward project update <id> [--status] [--description]", json);
14
+ return { ok: false, error: "INVALID_ARGS", result: null };
15
+ }
16
+ try {
17
+ const project = await updateProject({
18
+ id,
19
+ status,
20
+ description
21
+ });
22
+ if (!project) {
23
+ if (json) {
24
+ ctx.ui?.json?.({ ok: false, error: { code: "NOT_FOUND", message: `No project "${id}"` } });
25
+ } else {
26
+ ctx.ui?.error?.(`No project "${id}"`);
27
+ }
28
+ return { ok: false, error: "NOT_FOUND", result: null };
29
+ }
30
+ if (json) {
31
+ ctx.ui?.json?.({ ok: true, result: project });
32
+ } else {
33
+ ctx.ui?.info?.(`Updated "${project.name}" \u2192 [${project.status}]`);
34
+ }
35
+ return { ok: true, result: project };
36
+ } catch (err) {
37
+ ctx.platform.logger?.error?.("steward:project.update failed", err instanceof Error ? err : new Error(String(err)));
38
+ handleError(ctx, err, json);
39
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
40
+ }
41
+ }
42
+ }
43
+ });
44
+
45
+ export { project_update_default as default };
46
+ //# sourceMappingURL=project-update.js.map
47
+ //# sourceMappingURL=project-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/project-update.ts"],"names":[],"mappings":";;;;AAKA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,wBAAA;AAAA,EACJ,WAAA,EAAa,0CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,CAAC,EAAE,CAAA,GAAI,KAAA,CAAM,IAAA;AACnB,MAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,IAAA,KAAS,KAAA,CAAM,KAAA;AAC5C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,eAAA,CAAgB,GAAA,EAAK,gBAAA,EAAkB,kEAAA,EAAoE,IAAI,CAAA;AAC/G,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,QAAQ,IAAA,EAAK;AAAA,MAC1D;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc;AAAA,UAClC,EAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,IAAI,IAAA,EAAM;AAAC,YAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAA,IAAO,CAAA;AAAA,UAAE,CAAA,MACjG;AAAC,YAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,UAAE;AAC5C,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,QAAQ,IAAA,EAAK;AAAA,QACvD;AAEA,QAAA,IAAI,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,QAAE,CAAA,MACpD;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAQ,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QAAE;AACxE,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAQ;AAAA,MACrC,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,+BAAA,EAAiC,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACjH,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"project-update.js","sourcesContent":["import { defineCommand, handleError, validationError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { updateProject } from '@kb-labs/steward-core';\n\ntype Flags = { status?: string; description?: string; json?: boolean };\n\nexport default defineCommand({\n id: 'steward:project.update',\n description: \"Update a project's status or description\",\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const [id] = input.argv;\n const { status, description, json } = input.flags;\n if (!id) {\n validationError(ctx, 'id is required', 'Usage: kb steward project update <id> [--status] [--description]', json);\n return { ok: false, error: 'INVALID_ARGS', result: null };\n }\n\n try {\n const project = await updateProject({\n id,\n status: status as 'active' | 'paused' | 'archived' | undefined,\n description,\n });\n if (!project) {\n if (json) {ctx.ui?.json?.({ ok: false, error: { code: 'NOT_FOUND', message: `No project \"${id}\"` } });}\n else {ctx.ui?.error?.(`No project \"${id}\"`);}\n return { ok: false, error: 'NOT_FOUND', result: null };\n }\n\n if (json) {ctx.ui?.json?.({ ok: true, result: project });}\n else {ctx.ui?.info?.(`Updated \"${project.name}\" → [${project.status}]`);}\n return { ok: true, result: project };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:project.update failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,14 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_steward_contracts from '@kb-labs/steward-contracts';
3
+ import { CLIInput } from '@kb-labs/sdk';
4
+
5
+ type Flags = {
6
+ type?: string;
7
+ label?: string;
8
+ url?: string;
9
+ content?: string;
10
+ json?: boolean;
11
+ };
12
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<Flags>, _kb_labs_steward_contracts.Resource>;
13
+
14
+ export { _default as default };
@@ -0,0 +1,44 @@
1
+ import { defineCommand, validationError, handleError } from '@kb-labs/sdk';
2
+ import { addResource } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/resource-add.ts
5
+ var resource_add_default = defineCommand({
6
+ id: "steward:resource.add",
7
+ description: "Attach a resource to a project (repo, stand, dashboard, doc, ...)",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const [projectId] = input.argv;
11
+ const { type, label, url, content, json } = input.flags;
12
+ if (!projectId || !type?.trim() || !label?.trim()) {
13
+ validationError(
14
+ ctx,
15
+ "projectId, --type, and --label are required",
16
+ "Usage: kb steward resource add <projectId> --type=... --label=... [--url=] [--content=]",
17
+ json
18
+ );
19
+ return { ok: false, error: "INVALID_ARGS", result: null };
20
+ }
21
+ if (!url && !content) {
22
+ validationError(ctx, "at least one of --url/--content must be set", void 0, json);
23
+ return { ok: false, error: "INVALID_ARGS", result: null };
24
+ }
25
+ try {
26
+ const resource = await addResource({ projectId, type, label, url, content });
27
+ if (json) {
28
+ ctx.ui?.json?.({ ok: true, result: resource });
29
+ } else {
30
+ ctx.ui?.info?.(`Added resource "${resource.label}" (${resource.type}) to project ${projectId}`);
31
+ }
32
+ return { ok: true, result: resource };
33
+ } catch (err) {
34
+ ctx.platform.logger?.error?.("steward:resource.add failed", err instanceof Error ? err : new Error(String(err)));
35
+ handleError(ctx, err, json);
36
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
37
+ }
38
+ }
39
+ }
40
+ });
41
+
42
+ export { resource_add_default as default };
43
+ //# sourceMappingURL=resource-add.js.map
44
+ //# sourceMappingURL=resource-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/resource-add.ts"],"names":[],"mappings":";;;;AAKA,IAAO,uBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,sBAAA;AAAA,EACJ,WAAA,EAAa,mEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,KAAA,CAAM,IAAA;AAC1B,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAK,OAAA,EAAS,IAAA,KAAS,KAAA,CAAM,KAAA;AAClD,MAAA,IAAI,CAAC,aAAa,CAAC,IAAA,EAAM,MAAK,IAAK,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AACjD,QAAA,eAAA;AAAA,UACE,GAAA;AAAA,UACA,6CAAA;AAAA,UACA,yFAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,QAAQ,IAAA,EAAK;AAAA,MAC1D;AACA,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,EAAS;AACpB,QAAA,eAAA,CAAgB,GAAA,EAAK,6CAAA,EAA+C,MAAA,EAAW,IAAI,CAAA;AACnF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,QAAQ,IAAA,EAAK;AAAA,MAC1D;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,CAAA;AAC3E,QAAA,IAAI,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AAAA,QAAE,CAAA,MACrD;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAA,gBAAA,EAAmB,QAAA,CAAS,KAAK,MAAM,QAAA,CAAS,IAAI,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AAAA,QAAE;AACtG,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAS;AAAA,MACtC,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,6BAAA,EAA+B,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC/G,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"resource-add.js","sourcesContent":["import { defineCommand, handleError, validationError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { addResource } from '@kb-labs/steward-core';\n\ntype Flags = { type?: string; label?: string; url?: string; content?: string; json?: boolean };\n\nexport default defineCommand({\n id: 'steward:resource.add',\n description: 'Attach a resource to a project (repo, stand, dashboard, doc, ...)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const [projectId] = input.argv;\n const { type, label, url, content, json } = input.flags;\n if (!projectId || !type?.trim() || !label?.trim()) {\n validationError(\n ctx,\n 'projectId, --type, and --label are required',\n 'Usage: kb steward resource add <projectId> --type=... --label=... [--url=] [--content=]',\n json,\n );\n return { ok: false, error: 'INVALID_ARGS', result: null };\n }\n if (!url && !content) {\n validationError(ctx, 'at least one of --url/--content must be set', undefined, json);\n return { ok: false, error: 'INVALID_ARGS', result: null };\n }\n\n try {\n const resource = await addResource({ projectId, type, label, url, content });\n if (json) {ctx.ui?.json?.({ ok: true, result: resource });}\n else {ctx.ui?.info?.(`Added resource \"${resource.label}\" (${resource.type}) to project ${projectId}`);}\n return { ok: true, result: resource };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:resource.add failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_steward_contracts from '@kb-labs/steward-contracts';
3
+ import { CLIInput } from '@kb-labs/sdk';
4
+
5
+ type Flags = {
6
+ json?: boolean;
7
+ };
8
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<Flags>, _kb_labs_steward_contracts.Resource[]>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,37 @@
1
+ import { defineCommand, validationError, handleError } from '@kb-labs/sdk';
2
+ import { listResources } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/resource-list.ts
5
+ var resource_list_default = defineCommand({
6
+ id: "steward:resource.list",
7
+ description: "List resources attached to a project",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const [projectId] = input.argv;
11
+ const { json } = input.flags;
12
+ if (!projectId) {
13
+ validationError(ctx, "projectId is required", "Usage: kb steward resource list <projectId>", json);
14
+ return { ok: false, error: "INVALID_ARGS", result: null };
15
+ }
16
+ try {
17
+ const resources = await listResources(projectId);
18
+ if (json) {
19
+ ctx.ui?.json?.({ ok: true, result: resources });
20
+ } else if (resources.length === 0) {
21
+ ctx.ui?.info?.("No resources yet.");
22
+ } else {
23
+ ctx.ui?.chain?.(resources.map((r) => ({ title: `${r.label} (${r.type})`, sections: [{ items: [r.url ?? "(no url)"] }] })));
24
+ }
25
+ return { ok: true, result: resources };
26
+ } catch (err) {
27
+ ctx.platform.logger?.error?.("steward:resource.list failed", err instanceof Error ? err : new Error(String(err)));
28
+ handleError(ctx, err, json);
29
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
30
+ }
31
+ }
32
+ }
33
+ });
34
+
35
+ export { resource_list_default as default };
36
+ //# sourceMappingURL=resource-list.js.map
37
+ //# sourceMappingURL=resource-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/resource-list.ts"],"names":[],"mappings":";;;;AAKA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,uBAAA;AAAA,EACJ,WAAA,EAAa,sCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,KAAA,CAAM,IAAA;AAC1B,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,KAAA,CAAM,KAAA;AACvB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,eAAA,CAAgB,GAAA,EAAK,uBAAA,EAAyB,6CAAA,EAA+C,IAAI,CAAA;AACjG,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,QAAQ,IAAA,EAAK;AAAA,MAC1D;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,SAAS,CAAA;AAC/C,QAAA,IAAI,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,WAAW,CAAA;AAAA,QAAE,CAAA,MAAA,IAClD,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,mBAAmB,CAAA;AAAA,QAAE,CAAA,MACjE;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,CAAA,EAAK,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,CAAC,CAAA,CAAE,GAAA,IAAO,UAAU,CAAA,EAAG,CAAA,EAAE,CAAE,CAAC,CAAA;AAAA,QAAE;AACjI,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAU;AAAA,MACvC,SAAS,GAAA,EAAK;AACZ,QAAA,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,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"resource-list.js","sourcesContent":["import { defineCommand, handleError, validationError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { listResources } from '@kb-labs/steward-core';\n\ntype Flags = { json?: boolean };\n\nexport default defineCommand({\n id: 'steward:resource.list',\n description: 'List resources attached to a project',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const [projectId] = input.argv;\n const { json } = input.flags;\n if (!projectId) {\n validationError(ctx, 'projectId is required', 'Usage: kb steward resource list <projectId>', json);\n return { ok: false, error: 'INVALID_ARGS', result: null };\n }\n\n try {\n const resources = await listResources(projectId);\n if (json) {ctx.ui?.json?.({ ok: true, result: resources });}\n else if (resources.length === 0) {ctx.ui?.info?.('No resources yet.');}\n else {ctx.ui?.chain?.(resources.map((r) => ({ title: `${r.label} (${r.type})`, sections: [{ items: [r.url ?? '(no url)'] }] })));}\n return { ok: true, result: resources };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:resource.list failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_steward_core from '@kb-labs/steward-core';
3
+ import { CLIInput } from '@kb-labs/sdk';
4
+
5
+ type Flags = {
6
+ json?: boolean;
7
+ };
8
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<Flags>, _kb_labs_steward_core.DailyReview>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,35 @@
1
+ import { defineCommand, handleError } from '@kb-labs/sdk';
2
+ import { getDailyReview } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/review.ts
5
+ var review_default = defineCommand({
6
+ id: "steward:review",
7
+ description: "Daily summary: stale commitments, upcoming reminders, active projects, and days since the last successful backup",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const { json } = input.flags;
11
+ try {
12
+ const review = await getDailyReview();
13
+ if (json) {
14
+ ctx.ui?.json?.({ ok: true, result: review });
15
+ } else {
16
+ const backupLine = review.lastBackupDaysAgo === null ? "last backup: never" : `last backup: ${review.lastBackupDaysAgo}d ago`;
17
+ ctx.ui?.info?.(backupLine);
18
+ ctx.ui?.info?.(`${review.staleCommitments.length} stale commitment(s), ${review.upcomingCommitments.length} upcoming, ${review.activeProjects.length} active project(s)`);
19
+ if (review.staleCommitments.length > 0) {
20
+ ctx.ui?.chain?.(review.staleCommitments.map((c) => ({ title: `[stale] ${c.text}`, sections: [{ items: [c.id] }] })));
21
+ }
22
+ }
23
+ return { ok: true, result: review };
24
+ } catch (err) {
25
+ ctx.platform.logger?.error?.("steward:review failed", err instanceof Error ? err : new Error(String(err)));
26
+ handleError(ctx, err, json);
27
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
28
+ }
29
+ }
30
+ }
31
+ });
32
+
33
+ export { review_default as default };
34
+ //# sourceMappingURL=review.js.map
35
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/review.ts"],"names":[],"mappings":";;;;AAKA,IAAO,iBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EACE,kHAAA;AAAA,EAEF,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,KAAA,CAAM,KAAA;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,MAAM,aACJ,MAAA,CAAO,iBAAA,KAAsB,OACzB,oBAAA,GACA,CAAA,aAAA,EAAgB,OAAO,iBAAiB,CAAA,KAAA,CAAA;AAC9C,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,UAAU,CAAA;AACzB,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,iBAAiB,MAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,mBAAA,CAAoB,MAAM,CAAA,WAAA,EAAc,MAAA,CAAO,cAAA,CAAe,MAAM,CAAA,kBAAA,CAAoB,CAAA;AACxK,UAAA,IAAI,MAAA,CAAO,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACtC,YAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,IAAI,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,CAAC,CAAA,CAAE,EAAE,CAAA,EAAG,CAAA,EAAE,CAAE,CAAC,CAAA;AAAA,UACrH;AAAA,QACF;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO;AAAA,MACpC,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,uBAAA,EAAyB,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACzG,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"review.js","sourcesContent":["import { defineCommand, handleError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getDailyReview } from '@kb-labs/steward-core';\n\ntype Flags = { json?: boolean };\n\nexport default defineCommand({\n id: 'steward:review',\n description:\n 'Daily summary: stale commitments, upcoming reminders, active projects, and days since the last successful backup',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const { json } = input.flags;\n try {\n const review = await getDailyReview();\n if (json) {\n ctx.ui?.json?.({ ok: true, result: review });\n } else {\n const backupLine =\n review.lastBackupDaysAgo === null\n ? 'last backup: never'\n : `last backup: ${review.lastBackupDaysAgo}d ago`;\n ctx.ui?.info?.(backupLine);\n ctx.ui?.info?.(`${review.staleCommitments.length} stale commitment(s), ${review.upcomingCommitments.length} upcoming, ${review.activeProjects.length} active project(s)`);\n if (review.staleCommitments.length > 0) {\n ctx.ui?.chain?.(review.staleCommitments.map((c) => ({ title: `[stale] ${c.text}`, sections: [{ items: [c.id] }] })));\n }\n }\n return { ok: true, result: review };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:review failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,12 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_steward_contracts from '@kb-labs/steward-contracts';
3
+ import { CLIInput } from '@kb-labs/sdk';
4
+
5
+ type Flags = {
6
+ name?: string;
7
+ aliases?: string;
8
+ json?: boolean;
9
+ };
10
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<Flags>, _kb_labs_steward_contracts.Topic>;
11
+
12
+ export { _default as default };
@@ -0,0 +1,44 @@
1
+ import { defineCommand, validationError, handleError } from '@kb-labs/sdk';
2
+ import { addTopic } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/topic-add.ts
5
+
6
+ // src/utils/flags.ts
7
+ function parseList(csv) {
8
+ if (csv === void 0) {
9
+ return void 0;
10
+ }
11
+ return csv.split(",").map((s) => s.trim()).filter(Boolean);
12
+ }
13
+
14
+ // src/commands/topic-add.ts
15
+ var topic_add_default = defineCommand({
16
+ id: "steward:topic.add",
17
+ description: "Register a topic with aliases in the routing dictionary \u2014 do this deliberately, not automatically",
18
+ handler: {
19
+ async execute(ctx, input) {
20
+ const { name, aliases, json } = input.flags;
21
+ if (!name?.trim()) {
22
+ validationError(ctx, "--name is required", void 0, json);
23
+ return { ok: false, error: "INVALID_ARGS", result: null };
24
+ }
25
+ try {
26
+ const topic = await addTopic({ name, aliases: parseList(aliases) ?? [] });
27
+ if (json) {
28
+ ctx.ui?.json?.({ ok: true, result: topic });
29
+ } else {
30
+ ctx.ui?.info?.(`Registered topic "${topic.name}" (aliases: ${topic.aliases.join(", ") || "none"})`);
31
+ }
32
+ return { ok: true, result: topic };
33
+ } catch (err) {
34
+ ctx.platform.logger?.error?.("steward:topic.add failed", err instanceof Error ? err : new Error(String(err)));
35
+ handleError(ctx, err, json);
36
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
37
+ }
38
+ }
39
+ }
40
+ });
41
+
42
+ export { topic_add_default as default };
43
+ //# sourceMappingURL=topic-add.js.map
44
+ //# sourceMappingURL=topic-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/flags.ts","../../src/commands/topic-add.ts"],"names":[],"mappings":";;;;;;AACO,SAAS,UAAU,GAAA,EAAoC;AAC5D,EAAA,IAAI,QAAQ,MAAA,EAAW;AAAC,IAAA,OAAO,MAAA;AAAA,EAAU;AACzC,EAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB;;;ACDA,IAAO,oBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,mBAAA;AAAA,EACJ,WAAA,EAAa,wGAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,KAAS,KAAA,CAAM,KAAA;AACtC,MAAA,IAAI,CAAC,IAAA,EAAM,IAAA,EAAK,EAAG;AACjB,QAAA,eAAA,CAAgB,GAAA,EAAK,oBAAA,EAAsB,MAAA,EAAW,IAAI,CAAA;AAC1D,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,QAAQ,IAAA,EAAK;AAAA,MAC1D;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA,IAAK,EAAC,EAAG,CAAA;AACxE,QAAA,IAAI,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,QAAE,CAAA,MAClD;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAA,kBAAA,EAAqB,KAAA,CAAM,IAAI,CAAA,YAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QAAE;AAC1G,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,MACnC,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,0BAAA,EAA4B,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5G,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"topic-add.js","sourcesContent":["/** Parses a `--flag=a,b,c` value into a trimmed string list. */\nexport function parseList(csv?: string): string[] | undefined {\n if (csv === undefined) {return undefined;}\n return csv\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Parses an ISO date/time flag into epoch milliseconds. Throws on garbage input. */\nexport function parseDate(value: string): number {\n const ms = Date.parse(value);\n if (Number.isNaN(ms)) {\n throw new Error(`Invalid date: \"${value}\" — expected ISO 8601 (e.g. 2026-09-01)`);\n }\n return ms;\n}\n","import { defineCommand, handleError, validationError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { addTopic } from '@kb-labs/steward-core';\nimport { parseList } from '../utils/flags.js';\n\ntype Flags = { name?: string; aliases?: string; json?: boolean };\n\nexport default defineCommand({\n id: 'steward:topic.add',\n description: 'Register a topic with aliases in the routing dictionary — do this deliberately, not automatically',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const { name, aliases, json } = input.flags;\n if (!name?.trim()) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'INVALID_ARGS', result: null };\n }\n\n try {\n const topic = await addTopic({ name, aliases: parseList(aliases) ?? [] });\n if (json) {ctx.ui?.json?.({ ok: true, result: topic });}\n else {ctx.ui?.info?.(`Registered topic \"${topic.name}\" (aliases: ${topic.aliases.join(', ') || 'none'})`);}\n return { ok: true, result: topic };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:topic.add failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_steward_contracts from '@kb-labs/steward-contracts';
3
+ import { CLIInput } from '@kb-labs/sdk';
4
+
5
+ type Flags = {
6
+ json?: boolean;
7
+ };
8
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<Flags>, _kb_labs_steward_contracts.Topic[]>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,32 @@
1
+ import { defineCommand, handleError } from '@kb-labs/sdk';
2
+ import { listTopics } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/topic-list.ts
5
+ var topic_list_default = defineCommand({
6
+ id: "steward:topic.list",
7
+ description: "List the topic dictionary",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const { json } = input.flags;
11
+ try {
12
+ const topics = await listTopics();
13
+ if (json) {
14
+ ctx.ui?.json?.({ ok: true, result: topics });
15
+ } else if (topics.length === 0) {
16
+ ctx.ui?.info?.("No topics registered yet.");
17
+ } else {
18
+ ctx.ui?.chain?.(topics.map((t) => ({ title: t.name, sections: [{ items: [t.aliases.join(", ") || "(no aliases)"] }] })));
19
+ }
20
+ return { ok: true, result: topics };
21
+ } catch (err) {
22
+ ctx.platform.logger?.error?.("steward:topic.list failed", err instanceof Error ? err : new Error(String(err)));
23
+ handleError(ctx, err, json);
24
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
25
+ }
26
+ }
27
+ }
28
+ });
29
+
30
+ export { topic_list_default as default };
31
+ //# sourceMappingURL=topic-list.js.map
32
+ //# sourceMappingURL=topic-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/topic-list.ts"],"names":[],"mappings":";;;;AAKA,IAAO,qBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,oBAAA;AAAA,EACJ,WAAA,EAAa,2BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,KAAA,CAAM,KAAA;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,QAAA,IAAI,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,QAAE,CAAA,MAAA,IAC/C,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,2BAA2B,CAAA;AAAA,QAAE,CAAA,MACtE;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,cAAc,CAAA,EAAG,CAAA,EAAE,CAAE,CAAC,CAAA;AAAA,QAAE;AAC/H,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO;AAAA,MACpC,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,2BAAA,EAA6B,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC7G,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"topic-list.js","sourcesContent":["import { defineCommand, handleError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { listTopics } from '@kb-labs/steward-core';\n\ntype Flags = { json?: boolean };\n\nexport default defineCommand({\n id: 'steward:topic.list',\n description: 'List the topic dictionary',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const { json } = input.flags;\n try {\n const topics = await listTopics();\n if (json) {ctx.ui?.json?.({ ok: true, result: topics });}\n else if (topics.length === 0) {ctx.ui?.info?.('No topics registered yet.');}\n else {ctx.ui?.chain?.(topics.map((t) => ({ title: t.name, sections: [{ items: [t.aliases.join(', ') || '(no aliases)'] }] })));}\n return { ok: true, result: topics };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:topic.list failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,11 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import * as _kb_labs_steward_core from '@kb-labs/steward-core';
3
+ import { CLIInput } from '@kb-labs/sdk';
4
+
5
+ type Flags = {
6
+ project?: string;
7
+ json?: boolean;
8
+ };
9
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<Flags>, _kb_labs_steward_core.ContactCandidate[]>;
10
+
11
+ export { _default as default };
@@ -0,0 +1,42 @@
1
+ import { defineCommand, validationError, handleError } from '@kb-labs/sdk';
2
+ import { whoToContact } from '@kb-labs/steward-core';
3
+
4
+ // src/commands/who.ts
5
+ var who_default = defineCommand({
6
+ id: "steward:who",
7
+ description: "Find who to contact about a topic, with project-scoped priority and a global fallback",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const [topic] = input.argv;
11
+ const { project, json } = input.flags;
12
+ if (!topic?.trim()) {
13
+ validationError(ctx, "topic is required", "Usage: kb steward who <topic> [--project=]", json);
14
+ return { ok: false, error: "INVALID_ARGS", result: null };
15
+ }
16
+ try {
17
+ const candidates = await whoToContact({ topic, projectId: project });
18
+ if (json) {
19
+ ctx.ui?.json?.({ ok: true, result: candidates });
20
+ } else if (candidates.length === 0) {
21
+ ctx.ui?.info?.(`Nobody found for "${topic}".`);
22
+ } else {
23
+ ctx.ui?.chain?.(
24
+ candidates.map((c, i) => ({
25
+ title: `${i + 1}. ${c.person.name} (${c.source}${c.priority !== void 0 ? `, priority ${c.priority}` : ""})`,
26
+ sections: [{ items: [c.person.contacts.map((ct) => `${ct.channel}:${ct.value}`).join(", ") || "(no contacts)"] }]
27
+ }))
28
+ );
29
+ }
30
+ return { ok: true, result: candidates };
31
+ } catch (err) {
32
+ ctx.platform.logger?.error?.("steward:who failed", err instanceof Error ? err : new Error(String(err)));
33
+ handleError(ctx, err, json);
34
+ return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };
35
+ }
36
+ }
37
+ }
38
+ });
39
+
40
+ export { who_default as default };
41
+ //# sourceMappingURL=who.js.map
42
+ //# sourceMappingURL=who.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/who.ts"],"names":[],"mappings":";;;;AAKA,IAAO,cAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,aAAA;AAAA,EACJ,WAAA,EAAa,uFAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwB;AAC1D,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,KAAA,CAAM,IAAA;AACtB,MAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,KAAA,CAAM,KAAA;AAChC,MAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,QAAA,eAAA,CAAgB,GAAA,EAAK,mBAAA,EAAqB,4CAAA,EAA8C,IAAI,CAAA;AAC5F,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAA,EAAgB,QAAQ,IAAA,EAAK;AAAA,MAC1D;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,aAAa,MAAM,YAAA,CAAa,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,CAAA;AACnE,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,YAAY,CAAA;AAAA,QACjD,CAAA,MAAA,IAAW,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAClC,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAA,kBAAA,EAAqB,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,QAC/C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA;AAAA,YACN,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,cACxB,OAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,IAAI,CAAA,EAAA,EAAK,EAAE,MAAM,CAAA,EAAG,EAAE,QAAA,KAAa,KAAA,CAAA,GAAY,cAAc,CAAA,CAAE,QAAQ,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,cAC3G,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,CAAC,EAAE,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,CAAA,EAAG,GAAG,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,eAAe,CAAA,EAAG;AAAA,aAClH,CAAE;AAAA,WACJ;AAAA,QACF;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAW;AAAA,MACxC,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,KAAA,GAAQ,oBAAA,EAAsB,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACtG,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,IAAI,CAAA;AAC1B,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5F;AAAA,IACF;AAAA;AAEJ,CAAC","file":"who.js","sourcesContent":["import { defineCommand, handleError, validationError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { whoToContact } from '@kb-labs/steward-core';\n\ntype Flags = { project?: string; json?: boolean };\n\nexport default defineCommand({\n id: 'steward:who',\n description: 'Find who to contact about a topic, with project-scoped priority and a global fallback',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<Flags>) {\n const [topic] = input.argv;\n const { project, json } = input.flags;\n if (!topic?.trim()) {\n validationError(ctx, 'topic is required', 'Usage: kb steward who <topic> [--project=]', json);\n return { ok: false, error: 'INVALID_ARGS', result: null };\n }\n\n try {\n const candidates = await whoToContact({ topic, projectId: project });\n if (json) {\n ctx.ui?.json?.({ ok: true, result: candidates });\n } else if (candidates.length === 0) {\n ctx.ui?.info?.(`Nobody found for \"${topic}\".`);\n } else {\n ctx.ui?.chain?.(\n candidates.map((c, i) => ({\n title: `${i + 1}. ${c.person.name} (${c.source}${c.priority !== undefined ? `, priority ${c.priority}` : ''})`,\n sections: [{ items: [c.person.contacts.map((ct) => `${ct.channel}:${ct.value}`).join(', ') || '(no contacts)'] }],\n })),\n );\n }\n return { ok: true, result: candidates };\n } catch (err) {\n ctx.platform.logger?.error?.('steward:who failed', err instanceof Error ? err : new Error(String(err)));\n handleError(ctx, err, json);\n return { ok: false, error: err instanceof Error ? err.message : String(err), result: null };\n }\n },\n },\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export { default as manifest } from './manifest.js';
2
+ import '@kb-labs/plugin-contracts';