@blxzer/cursor-trellis 0.3.4 → 0.3.5

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 (95) hide show
  1. package/README.md +0 -13
  2. package/README.zh-CN.md +1 -1
  3. package/bin/cstl.js +1 -1
  4. package/bin/smart-search.js +1 -1
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +14 -2
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/commands/campaign/canvas-render.d.ts +68 -0
  9. package/dist/commands/campaign/canvas-render.d.ts.map +1 -0
  10. package/dist/commands/campaign/canvas-render.js +414 -0
  11. package/dist/commands/campaign/canvas-render.js.map +1 -0
  12. package/dist/commands/campaign/compose.d.ts +15 -0
  13. package/dist/commands/campaign/compose.d.ts.map +1 -0
  14. package/dist/commands/campaign/compose.js +110 -0
  15. package/dist/commands/campaign/compose.js.map +1 -0
  16. package/dist/commands/campaign/index.d.ts +13 -0
  17. package/dist/commands/campaign/index.d.ts.map +1 -0
  18. package/dist/commands/campaign/index.js +134 -0
  19. package/dist/commands/campaign/index.js.map +1 -0
  20. package/dist/commands/campaign/kind-map.d.ts +6 -0
  21. package/dist/commands/campaign/kind-map.d.ts.map +1 -0
  22. package/dist/commands/campaign/kind-map.js +21 -0
  23. package/dist/commands/campaign/kind-map.js.map +1 -0
  24. package/dist/commands/campaign/mcp-server.d.ts +6 -0
  25. package/dist/commands/campaign/mcp-server.d.ts.map +1 -0
  26. package/dist/commands/campaign/mcp-server.js +167 -0
  27. package/dist/commands/campaign/mcp-server.js.map +1 -0
  28. package/dist/commands/campaign/render.d.ts +5 -0
  29. package/dist/commands/campaign/render.d.ts.map +1 -0
  30. package/dist/commands/campaign/render.js +103 -0
  31. package/dist/commands/campaign/render.js.map +1 -0
  32. package/dist/commands/campaign/trellis-load.d.ts +13 -0
  33. package/dist/commands/campaign/trellis-load.d.ts.map +1 -0
  34. package/dist/commands/campaign/trellis-load.js +122 -0
  35. package/dist/commands/campaign/trellis-load.js.map +1 -0
  36. package/dist/commands/campaign/types.d.ts +61 -0
  37. package/dist/commands/campaign/types.d.ts.map +1 -0
  38. package/dist/commands/campaign/types.js +3 -0
  39. package/dist/commands/campaign/types.js.map +1 -0
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +11 -1
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/rpc/client.d.ts +51 -0
  44. package/dist/commands/rpc/client.d.ts.map +1 -0
  45. package/dist/commands/rpc/client.js +147 -0
  46. package/dist/commands/rpc/client.js.map +1 -0
  47. package/dist/commands/rpc/index.d.ts +10 -0
  48. package/dist/commands/rpc/index.d.ts.map +1 -0
  49. package/dist/commands/rpc/index.js +157 -0
  50. package/dist/commands/rpc/index.js.map +1 -0
  51. package/dist/commands/rpc/serve.d.ts +23 -0
  52. package/dist/commands/rpc/serve.d.ts.map +1 -0
  53. package/dist/commands/rpc/serve.js +60 -0
  54. package/dist/commands/rpc/serve.js.map +1 -0
  55. package/dist/commands/rpc/smoke.d.ts +16 -0
  56. package/dist/commands/rpc/smoke.d.ts.map +1 -0
  57. package/dist/commands/rpc/smoke.js +92 -0
  58. package/dist/commands/rpc/smoke.js.map +1 -0
  59. package/dist/commands/sdk/index.d.ts +9 -0
  60. package/dist/commands/sdk/index.d.ts.map +1 -0
  61. package/dist/commands/sdk/index.js +58 -0
  62. package/dist/commands/sdk/index.js.map +1 -0
  63. package/dist/commands/sdk/run.d.ts +42 -0
  64. package/dist/commands/sdk/run.d.ts.map +1 -0
  65. package/dist/commands/sdk/run.js +245 -0
  66. package/dist/commands/sdk/run.js.map +1 -0
  67. package/dist/commands/sdk/status.d.ts +14 -0
  68. package/dist/commands/sdk/status.d.ts.map +1 -0
  69. package/dist/commands/sdk/status.js +69 -0
  70. package/dist/commands/sdk/status.js.map +1 -0
  71. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +35 -29
  72. package/dist/templates/common/bundled-skills/smart-search-cli/references/cli-contract.md +11 -25
  73. package/dist/templates/cursor/rules/retrieval-routing.mdc +1 -1
  74. package/dist/templates/markdown/agents.md +2 -0
  75. package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +14 -0
  76. package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +14 -0
  77. package/dist/templates/trellis/scripts/common/parent_orchestration.py +341 -2
  78. package/dist/templates/trellis/scripts/common/task_map.py +638 -614
  79. package/dist/templates/trellis/scripts/common/task_store.py +47 -1
  80. package/dist/templates/trellis/scripts/task.py +32 -0
  81. package/dist/utils/codebase-retrieval-router.d.ts.map +1 -1
  82. package/dist/utils/codebase-retrieval-router.js +14 -0
  83. package/dist/utils/codebase-retrieval-router.js.map +1 -1
  84. package/dist/utils/cursor-sdk-gate.d.ts +10 -0
  85. package/dist/utils/cursor-sdk-gate.d.ts.map +1 -0
  86. package/dist/utils/cursor-sdk-gate.js +32 -0
  87. package/dist/utils/cursor-sdk-gate.js.map +1 -0
  88. package/dist/utils/project-capabilities.d.ts +30 -3
  89. package/dist/utils/project-capabilities.d.ts.map +1 -1
  90. package/dist/utils/project-capabilities.js +182 -11
  91. package/dist/utils/project-capabilities.js.map +1 -1
  92. package/dist/utils/readiness.d.ts.map +1 -1
  93. package/dist/utils/readiness.js +26 -0
  94. package/dist/utils/readiness.js.map +1 -1
  95. package/package.json +4 -3
@@ -0,0 +1,15 @@
1
+ import { getJson } from "../rpc/client.js";
2
+ import type { CampaignParentSnapshot, CampaignStatusSnapshot } from "./types.js";
3
+ export type TrellisLoader = (parentDir: string) => Promise<CampaignParentSnapshot>;
4
+ export type RpcStatusFetcher = (url: string) => Promise<unknown>;
5
+ export interface ComposeCampaignStatusOptions {
6
+ parentDir: string;
7
+ rpcUrl?: string;
8
+ rpcTimeoutMs?: number;
9
+ loadTrellis?: TrellisLoader;
10
+ fetchRpcStatus?: RpcStatusFetcher;
11
+ }
12
+ export declare function composeCampaignStatus(options: ComposeCampaignStatusOptions): Promise<CampaignStatusSnapshot>;
13
+ /** Re-export for tests that want getJson-shaped helpers. */
14
+ export { getJson };
15
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/commands/campaign/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiB,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EACV,sBAAsB,EAGtB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAQpB,MAAM,MAAM,aAAa,GAAG,CAC1B,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAErC,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEjE,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,cAAc,CAAC,EAAE,gBAAgB,CAAC;CACnC;AA4ED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAuCjC;AAED,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { getJson, resolveRpcUrl } from "../rpc/client.js";
2
+ import { capLabelForKind } from "./kind-map.js";
3
+ import { loadTrellisParentSnapshot } from "./trellis-load.js";
4
+ const DEFAULT_NOTES = [
5
+ "Read-only observation. HITL gates remain task.py / human.",
6
+ "capLabel is advisory; Task ≠ Agent window (CAP MATRIX).",
7
+ "Refresh Canvas: cstl campaign canvas --parent <parent-task-dir>.",
8
+ ];
9
+ function nowIso() {
10
+ return new Date().toISOString();
11
+ }
12
+ function mapRpcClients(raw) {
13
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
14
+ return { clients: [], topics: [] };
15
+ }
16
+ const o = raw;
17
+ const clientsRaw = Array.isArray(o.clients) ? o.clients : [];
18
+ const clients = [];
19
+ for (const item of clientsRaw) {
20
+ if (!item || typeof item !== "object")
21
+ continue;
22
+ const c = item;
23
+ const address = c.address && typeof c.address === "object"
24
+ ? c.address
25
+ : null;
26
+ const kind = typeof address?.kind === "string"
27
+ ? address.kind
28
+ : typeof c.kind === "string"
29
+ ? c.kind
30
+ : "unknown";
31
+ const id = typeof address?.id === "string"
32
+ ? address.id
33
+ : typeof c.id === "string"
34
+ ? c.id
35
+ : "?";
36
+ clients.push({
37
+ kind,
38
+ id,
39
+ capLabel: capLabelForKind(kind),
40
+ ...(typeof c.campaignId === "string" ? { campaignId: c.campaignId } : {}),
41
+ ...(typeof c.lastSeenAt === "string" ? { lastSeenAt: c.lastSeenAt } : {}),
42
+ });
43
+ }
44
+ const topics = Array.isArray(o.topics)
45
+ ? o.topics.filter((t) => typeof t === "string")
46
+ : [];
47
+ return {
48
+ protocolVersion: typeof o.protocolVersion === "number" ? o.protocolVersion : undefined,
49
+ clients,
50
+ topics,
51
+ auditCount: typeof o.auditCount === "number" ? o.auditCount : undefined,
52
+ };
53
+ }
54
+ async function defaultFetchRpcStatus(url, timeoutMs) {
55
+ const controller = new AbortController();
56
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
57
+ try {
58
+ const res = await fetch(`${url.replace(/\/$/, "")}/status`, {
59
+ signal: controller.signal,
60
+ });
61
+ if (!res.ok) {
62
+ throw new Error(`HTTP ${res.status} for /status`);
63
+ }
64
+ return res.json();
65
+ }
66
+ finally {
67
+ clearTimeout(timer);
68
+ }
69
+ }
70
+ export async function composeCampaignStatus(options) {
71
+ const loadTrellis = options.loadTrellis ?? loadTrellisParentSnapshot;
72
+ const parent = await loadTrellis(options.parentDir);
73
+ const url = resolveRpcUrl(options.rpcUrl);
74
+ const timeoutMs = options.rpcTimeoutMs ?? 1500;
75
+ let rpc;
76
+ try {
77
+ const fetchRpc = options.fetchRpcStatus ??
78
+ ((u) => defaultFetchRpcStatus(u, timeoutMs));
79
+ const raw = await fetchRpc(url);
80
+ const mapped = mapRpcClients(raw);
81
+ rpc = {
82
+ url,
83
+ reachable: true,
84
+ protocolVersion: mapped.protocolVersion,
85
+ clients: mapped.clients,
86
+ topics: mapped.topics,
87
+ auditCount: mapped.auditCount,
88
+ error: null,
89
+ };
90
+ }
91
+ catch (error) {
92
+ rpc = {
93
+ url,
94
+ reachable: false,
95
+ clients: [],
96
+ topics: [],
97
+ error: error instanceof Error ? error.message : String(error),
98
+ };
99
+ }
100
+ return {
101
+ v: 1,
102
+ generatedAt: nowIso(),
103
+ parent,
104
+ rpc,
105
+ notes: [...DEFAULT_NOTES],
106
+ };
107
+ }
108
+ /** Re-export for tests that want getJson-shaped helpers. */
109
+ export { getJson };
110
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/commands/campaign/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAQ9D,MAAM,aAAa,GAAG;IACpB,2DAA2D;IAC3D,yDAAyD;IACzD,kEAAkE;CACnE,CAAC;AAgBF,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IAMjC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,MAAM,OAAO,GACX,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;YACxC,CAAC,CAAE,CAAC,CAAC,OAAmC;YACxC,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,IAAI,GACR,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ;YAC/B,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAC1B,CAAC,CAAC,CAAC,CAAC,IAAI;gBACR,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,EAAE,GACN,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ;YAC7B,CAAC,CAAC,OAAO,CAAC,EAAE;YACZ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;gBACxB,CAAC,CAAC,CAAC,CAAC,EAAE;gBACN,CAAC,CAAC,GAAG,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,EAAE;YACF,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACpC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,eAAe,EACb,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;QACvE,OAAO;QACP,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAAW,EACX,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE;YAC1D,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAqC;IAErC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;IAE/C,IAAI,GAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GACZ,OAAO,CAAC,cAAc;YACtB,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,GAAG;YACJ,GAAG;YACH,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,GAAG;YACJ,GAAG;YACH,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,WAAW,EAAE,MAAM,EAAE;QACrB,MAAM;QACN,GAAG;QACH,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type Command } from "commander";
2
+ export { composeCampaignStatus } from "./compose.js";
3
+ export { capLabelForKind } from "./kind-map.js";
4
+ export { defaultCanvasPath, evaluateCanvasWritePath, isUnderCanvasDir, looksLikeCursorCanvasesPath, renderCampaignCanvasTsx, resolveCanvasesDir, softMatchCanvasesDir, tryOpenCanvasFile, writeCampaignCanvas, } from "./canvas-render.js";
5
+ export { renderCampaignStatusMarkdown, writeCampaignPanel, } from "./render.js";
6
+ export { loadTrellisParentSnapshot } from "./trellis-load.js";
7
+ export type { CampaignStatusSnapshot } from "./types.js";
8
+ /**
9
+ * Register `cstl campaign` — Cursor MIX observation (CMD + MCP).
10
+ * Read-only; never auto-approves Trellis HITL gates.
11
+ */
12
+ export declare function registerCampaignCommand(program: Command): void;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/campaign/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,2BAA2B,EAC3B,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAYzD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+J9D"}
@@ -0,0 +1,134 @@
1
+ import path from "node:path";
2
+ import { resolveRpcUrl } from "../rpc/client.js";
3
+ import { defaultCanvasPath, defaultCanvasUsesWorkspaceFallback, evaluateCanvasWritePath, resolveCanvasesDir, resolveHarnessForCanvas, shouldAutoOpenCanvas, tryOpenCanvasFile, writeCampaignCanvas, } from "./canvas-render.js";
4
+ import { composeCampaignStatus } from "./compose.js";
5
+ import { runCampaignMcpServer } from "./mcp-server.js";
6
+ import { defaultPanelPath, renderCampaignStatusMarkdown, writeCampaignPanel, } from "./render.js";
7
+ export { composeCampaignStatus } from "./compose.js";
8
+ export { capLabelForKind } from "./kind-map.js";
9
+ export { defaultCanvasPath, evaluateCanvasWritePath, isUnderCanvasDir, looksLikeCursorCanvasesPath, renderCampaignCanvasTsx, resolveCanvasesDir, softMatchCanvasesDir, tryOpenCanvasFile, writeCampaignCanvas, } from "./canvas-render.js";
10
+ export { renderCampaignStatusMarkdown, writeCampaignPanel, } from "./render.js";
11
+ export { loadTrellisParentSnapshot } from "./trellis-load.js";
12
+ function resolveParentDir(explicit) {
13
+ const fromArg = explicit?.trim();
14
+ if (fromArg)
15
+ return path.resolve(fromArg);
16
+ const fromEnv = process.env.TRELLIS_CAMPAIGN_PARENT?.trim();
17
+ if (fromEnv)
18
+ return path.resolve(fromEnv);
19
+ throw new Error("Missing parent task directory. Pass --parent <dir> or set TRELLIS_CAMPAIGN_PARENT.");
20
+ }
21
+ /**
22
+ * Register `cstl campaign` — Cursor MIX observation (CMD + MCP).
23
+ * Read-only; never auto-approves Trellis HITL gates.
24
+ */
25
+ export function registerCampaignCommand(program) {
26
+ const campaign = program
27
+ .command("campaign")
28
+ .description("Campaign observation MIX (CMD + MCP + Canvas). Trellis task-map + optional RPC status. Read-only; no HITL bypass.");
29
+ campaign
30
+ .command("status")
31
+ .description("Compose campaign status (Trellis parent-status + RPC /status when reachable)")
32
+ .option("--parent <dir>", "Parent task directory (or TRELLIS_CAMPAIGN_PARENT)")
33
+ .option("--url <url>", "RPC broker base URL (or TRELLIS_RPC_URL)")
34
+ .option("--json", "Print JSON snapshot")
35
+ .option("--panel", "Write Markdown panel and print absolute path for open_resource")
36
+ .option("--panel-out <path>", "Panel output path (implies --panel)")
37
+ .action(async (opts) => {
38
+ try {
39
+ const parentDir = resolveParentDir(opts.parent);
40
+ const snapshot = await composeCampaignStatus({
41
+ parentDir,
42
+ rpcUrl: opts.url,
43
+ });
44
+ const panelOut = opts.panelOut?.trim();
45
+ const wantPanel = opts.panel === true || Boolean(panelOut);
46
+ if (wantPanel) {
47
+ const out = panelOut ?? defaultPanelPath(snapshot, parentDir);
48
+ const abs = writeCampaignPanel(snapshot, out);
49
+ console.log(abs);
50
+ }
51
+ if (opts.json) {
52
+ console.log(JSON.stringify(snapshot, null, 2));
53
+ }
54
+ else if (!wantPanel) {
55
+ console.log(renderCampaignStatusMarkdown(snapshot));
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error(error instanceof Error ? error.message : String(error));
60
+ process.exitCode = 1;
61
+ }
62
+ });
63
+ campaign
64
+ .command("mcp")
65
+ .description("Stdio MCP server exposing tool campaign_status (read-only). Configure as trellis-campaign in .cursor/mcp.json.")
66
+ .option("--parent <dir>", "Default parent (sets TRELLIS_CAMPAIGN_PARENT)")
67
+ .option("--url <url>", "Default RPC URL (sets TRELLIS_RPC_URL for process)")
68
+ .action(async (opts) => {
69
+ if (opts.parent?.trim()) {
70
+ process.env.TRELLIS_CAMPAIGN_PARENT = path.resolve(opts.parent.trim());
71
+ }
72
+ if (opts.url?.trim()) {
73
+ process.env.TRELLIS_RPC_URL = resolveRpcUrl(opts.url);
74
+ }
75
+ await runCampaignMcpServer();
76
+ });
77
+ campaign
78
+ .command("canvas")
79
+ .description("Write a Cursor Canvas (.canvas.tsx) with embedded campaign snapshot; print absolute path")
80
+ .option("--parent <dir>", "Parent task directory (or TRELLIS_CAMPAIGN_PARENT)")
81
+ .option("--url <url>", "RPC broker base URL (or TRELLIS_RPC_URL)")
82
+ .option("--out <path>", "Canvas output path (default: Cursor projects/.../canvases/campaign-<id>.canvas.tsx)")
83
+ .option("-q, --quiet", "Suppress stderr hints/warnings and skip auto-open (stdout still prints the absolute path)")
84
+ .option("--no-open", "Do not launch Cursor after writing the canvas file (auto-open is on by default)")
85
+ .action(async (opts) => {
86
+ try {
87
+ const parentDir = resolveParentDir(opts.parent);
88
+ const snapshot = await composeCampaignStatus({
89
+ parentDir,
90
+ rpcUrl: opts.url,
91
+ });
92
+ const explicitOut = opts.out?.trim();
93
+ const out = explicitOut || defaultCanvasPath(snapshot, parentDir);
94
+ const usedWorkspaceFallback = !explicitOut && defaultCanvasUsesWorkspaceFallback(parentDir);
95
+ const abs = writeCampaignCanvas(snapshot, out);
96
+ const canvasDir = resolveCanvasesDir(resolveHarnessForCanvas(parentDir));
97
+ const evaluation = evaluateCanvasWritePath(abs, canvasDir, {
98
+ usedWorkspaceFallback,
99
+ });
100
+ // stdout: absolute path only (script-friendly)
101
+ console.log(abs);
102
+ if (!opts.quiet) {
103
+ for (const warning of evaluation.warnings) {
104
+ console.warn(warning);
105
+ }
106
+ for (const hint of evaluation.hints) {
107
+ console.warn(`Hint: ${hint}`);
108
+ }
109
+ }
110
+ // Commander: --no-open ⇒ open:false; absent ⇒ undefined (default open).
111
+ if (shouldAutoOpenCanvas({
112
+ noOpen: opts.open === false,
113
+ quiet: opts.quiet === true,
114
+ })) {
115
+ const openResult = tryOpenCanvasFile(abs);
116
+ if (!opts.quiet) {
117
+ if (openResult.ok) {
118
+ console.warn(`Hint: opened canvas file via Cursor CLI (${openResult.detail}). ` +
119
+ "If the tab shows source only, use Open as Canvas / reopen from the canvases path.");
120
+ }
121
+ else {
122
+ console.warn(`⚠ Warning: could not auto-open Canvas (${openResult.detail}). ` +
123
+ "Open the printed path in Cursor Canvas view manually.");
124
+ }
125
+ }
126
+ }
127
+ }
128
+ catch (error) {
129
+ console.error(error instanceof Error ? error.message : String(error));
130
+ process.exitCode = 1;
131
+ }
132
+ });
133
+ }
134
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/campaign/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Map RPC address.kind → CAP-oriented label.
3
+ * Advisory only — Task ≠ Agent window (CAP MATRIX).
4
+ */
5
+ export declare function capLabelForKind(kind: string): string;
6
+ //# sourceMappingURL=kind-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind-map.d.ts","sourceRoot":"","sources":["../../../src/commands/campaign/kind-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAepD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Map RPC address.kind → CAP-oriented label.
3
+ * Advisory only — Task ≠ Agent window (CAP MATRIX).
4
+ */
5
+ export function capLabelForKind(kind) {
6
+ switch (kind) {
7
+ case "worker":
8
+ return "Task";
9
+ case "session":
10
+ return "window";
11
+ case "sdk":
12
+ return "SDK";
13
+ case "cli":
14
+ return "CLI";
15
+ case "broker":
16
+ return "broker";
17
+ default:
18
+ return "unknown";
19
+ }
20
+ }
21
+ //# sourceMappingURL=kind-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind-map.js","sourceRoot":"","sources":["../../../src/commands/campaign/kind-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Run MCP stdio server (newline-delimited JSON-RPC, SDK dialect).
3
+ * Blocks until stdin closes.
4
+ */
5
+ export declare function runCampaignMcpServer(): Promise<void>;
6
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../../src/commands/campaign/mcp-server.ts"],"names":[],"mappings":"AAoKA;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmC1D"}
@@ -0,0 +1,167 @@
1
+ import { composeCampaignStatus } from "./compose.js";
2
+ /**
3
+ * MCP stdio framing used by @modelcontextprotocol/sdk (and Cursor host):
4
+ * one JSON-RPC message per line (NDJSON). Not LSP Content-Length.
5
+ */
6
+ function writeMessage(message) {
7
+ process.stdout.write(`${JSON.stringify(message)}\n`);
8
+ }
9
+ function ok(id, result) {
10
+ writeMessage({ jsonrpc: "2.0", id: id ?? null, result });
11
+ }
12
+ function err(id, code, message) {
13
+ writeMessage({
14
+ jsonrpc: "2.0",
15
+ id: id ?? null,
16
+ error: { code, message },
17
+ });
18
+ }
19
+ const TOOL_NAME = "campaign_status";
20
+ function toolList() {
21
+ return {
22
+ tools: [
23
+ {
24
+ name: TOOL_NAME,
25
+ description: "Read-only Trellis campaign status (task-map stages/children + optional RPC broker clients/topics). Never approves HITL gates.",
26
+ inputSchema: {
27
+ type: "object",
28
+ properties: {
29
+ parent: {
30
+ type: "string",
31
+ description: "Parent task directory (default: TRELLIS_CAMPAIGN_PARENT env)",
32
+ },
33
+ rpcUrl: {
34
+ type: "string",
35
+ description: "RPC broker base URL (default TRELLIS_RPC_URL)",
36
+ },
37
+ },
38
+ additionalProperties: false,
39
+ },
40
+ },
41
+ ],
42
+ };
43
+ }
44
+ async function callCampaignStatus(params) {
45
+ const p = params && typeof params === "object"
46
+ ? params
47
+ : {};
48
+ const args = p.arguments && typeof p.arguments === "object"
49
+ ? p.arguments
50
+ : p;
51
+ const parent = (typeof args.parent === "string" && args.parent.trim()) ||
52
+ process.env.TRELLIS_CAMPAIGN_PARENT?.trim();
53
+ if (!parent) {
54
+ throw new Error("campaign_status requires parent path or TRELLIS_CAMPAIGN_PARENT");
55
+ }
56
+ const rpcUrl = typeof args.rpcUrl === "string" && args.rpcUrl.trim()
57
+ ? args.rpcUrl.trim()
58
+ : undefined;
59
+ const snapshot = await composeCampaignStatus({ parentDir: parent, rpcUrl });
60
+ return JSON.stringify(snapshot, null, 2);
61
+ }
62
+ function negotiatedProtocolVersion(params) {
63
+ const p = params && typeof params === "object"
64
+ ? params
65
+ : {};
66
+ const requested = typeof p.protocolVersion === "string" ? p.protocolVersion.trim() : "";
67
+ return requested || "2024-11-05";
68
+ }
69
+ async function handleRequest(msg) {
70
+ const method = msg.method ?? "";
71
+ const id = msg.id ?? null;
72
+ if (method === "initialize") {
73
+ ok(id, {
74
+ protocolVersion: negotiatedProtocolVersion(msg.params),
75
+ capabilities: {
76
+ tools: {},
77
+ },
78
+ serverInfo: { name: "trellis-campaign", version: "0.1.0" },
79
+ });
80
+ return;
81
+ }
82
+ if (method === "notifications/initialized" || method === "initialized") {
83
+ return;
84
+ }
85
+ if (method === "ping") {
86
+ ok(id, {});
87
+ return;
88
+ }
89
+ if (method === "tools/list") {
90
+ ok(id, toolList());
91
+ return;
92
+ }
93
+ if (method === "resources/list") {
94
+ ok(id, { resources: [] });
95
+ return;
96
+ }
97
+ if (method === "prompts/list") {
98
+ ok(id, { prompts: [] });
99
+ return;
100
+ }
101
+ if (method === "tools/call") {
102
+ try {
103
+ const params = msg.params;
104
+ const name = typeof params?.name === "string" ? params.name : "";
105
+ if (name !== TOOL_NAME) {
106
+ err(id, -32601, `Unknown tool: ${name}`);
107
+ return;
108
+ }
109
+ const text = await callCampaignStatus(params);
110
+ ok(id, {
111
+ content: [{ type: "text", text }],
112
+ isError: false,
113
+ });
114
+ }
115
+ catch (error) {
116
+ const message = error instanceof Error ? error.message : String(error);
117
+ ok(id, {
118
+ content: [{ type: "text", text: message }],
119
+ isError: true,
120
+ });
121
+ }
122
+ return;
123
+ }
124
+ if (id !== undefined && id !== null) {
125
+ err(id, -32601, `Method not found: ${method}`);
126
+ }
127
+ }
128
+ /**
129
+ * Run MCP stdio server (newline-delimited JSON-RPC, SDK dialect).
130
+ * Blocks until stdin closes.
131
+ */
132
+ export async function runCampaignMcpServer() {
133
+ let buffer = "";
134
+ let chain = Promise.resolve();
135
+ const processLines = async () => {
136
+ while (true) {
137
+ const index = buffer.indexOf("\n");
138
+ if (index === -1)
139
+ return;
140
+ const line = buffer.slice(0, index).replace(/\r$/, "").trim();
141
+ buffer = buffer.slice(index + 1);
142
+ if (!line)
143
+ continue;
144
+ let msg;
145
+ try {
146
+ msg = JSON.parse(line);
147
+ }
148
+ catch {
149
+ continue;
150
+ }
151
+ await handleRequest(msg);
152
+ }
153
+ };
154
+ if (typeof process.stdin.resume === "function") {
155
+ process.stdin.resume();
156
+ }
157
+ process.stdin.setEncoding("utf8");
158
+ process.stdin.on("data", (chunk) => {
159
+ buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
160
+ chain = chain.then(() => processLines()).catch(() => undefined);
161
+ });
162
+ await new Promise((resolve) => {
163
+ process.stdin.on("end", () => resolve());
164
+ process.stdin.on("close", () => resolve());
165
+ });
166
+ }
167
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../../src/commands/campaign/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CampaignStatusSnapshot } from "./types.js";
2
+ export declare function renderCampaignStatusMarkdown(snapshot: CampaignStatusSnapshot): string;
3
+ export declare function defaultPanelPath(snapshot: CampaignStatusSnapshot, parentDir: string): string;
4
+ export declare function writeCampaignPanel(snapshot: CampaignStatusSnapshot, outPath: string): string;
5
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/commands/campaign/render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,sBAAsB,GAC/B,MAAM,CAmGR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,MAAM,GAChB,MAAM,CAOR;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,CAKR"}
@@ -0,0 +1,103 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { findHarnessRoot } from "./trellis-load.js";
4
+ export function renderCampaignStatusMarkdown(snapshot) {
5
+ const lines = [
6
+ `# Campaign status — \`${snapshot.parent.id}\``,
7
+ "",
8
+ `- Generated: \`${snapshot.generatedAt}\``,
9
+ `- Parent path: \`${snapshot.parent.path}\``,
10
+ `- contract_epoch: ${snapshot.parent.contractEpoch ?? "?"}`,
11
+ `- execution_topology: ${snapshot.parent.executionTopology ?? "?"}`,
12
+ `- merge_limit: ${snapshot.parent.mergeLimit ?? "?"}`,
13
+ "",
14
+ "## Notes",
15
+ "",
16
+ ...snapshot.notes.map((n) => `- ${n}`),
17
+ "",
18
+ "## Stages (Trellis)",
19
+ "",
20
+ ];
21
+ if (snapshot.parent.stages.length === 0) {
22
+ lines.push("(no stages)");
23
+ lines.push("");
24
+ }
25
+ else {
26
+ for (const stage of snapshot.parent.stages) {
27
+ const title = stage.title ? ` — ${stage.title}` : "";
28
+ lines.push(`### \`${stage.id}\`${title}`);
29
+ for (const unit of stage.units) {
30
+ const blocked = unit.readiness === "blocked" && unit.blockedBy.length > 0
31
+ ? ` — blocked (${unit.blockedBy.join(", ")})`
32
+ : "";
33
+ lines.push(`- \`${unit.id}\` — \`${unit.state}\` — ${unit.readiness}${blocked}`);
34
+ }
35
+ lines.push("");
36
+ }
37
+ }
38
+ lines.push("## Children", "");
39
+ for (const child of snapshot.parent.children) {
40
+ lines.push(`### \`${child.id}\` — \`${child.state}\``);
41
+ if (child.dependsOn.length) {
42
+ lines.push(`- depends_on: ${child.dependsOn.join(", ")}`);
43
+ }
44
+ if (child.ref)
45
+ lines.push(`- ref: ${child.ref}`);
46
+ if (child.evidence)
47
+ lines.push(`- evidence: ${child.evidence}`);
48
+ lines.push("");
49
+ }
50
+ lines.push("## RPC broker", "");
51
+ lines.push(`- URL: \`${snapshot.rpc.url}\``);
52
+ lines.push(`- reachable: **${snapshot.rpc.reachable}**`);
53
+ if (snapshot.rpc.protocolVersion !== undefined) {
54
+ lines.push(`- protocolVersion: ${snapshot.rpc.protocolVersion}`);
55
+ }
56
+ if (snapshot.rpc.error) {
57
+ lines.push(`- error: \`${snapshot.rpc.error}\``);
58
+ }
59
+ lines.push("");
60
+ if (snapshot.rpc.clients.length === 0) {
61
+ lines.push("(no registered clients)");
62
+ lines.push("");
63
+ }
64
+ else {
65
+ lines.push("| kind | id | capLabel | campaignId | lastSeenAt |");
66
+ lines.push("| --- | --- | --- | --- | --- |");
67
+ for (const c of snapshot.rpc.clients) {
68
+ lines.push(`| \`${c.kind}\` | \`${c.id}\` | **${c.capLabel}** | ${c.campaignId ?? "—"} | ${c.lastSeenAt ?? "—"} |`);
69
+ }
70
+ lines.push("");
71
+ }
72
+ if (snapshot.rpc.topics.length > 0) {
73
+ lines.push("### Topics");
74
+ lines.push("");
75
+ for (const t of snapshot.rpc.topics) {
76
+ lines.push(`- \`${t}\``);
77
+ }
78
+ lines.push("");
79
+ }
80
+ lines.push("## Suggested Parent commands", "");
81
+ lines.push("```bash");
82
+ lines.push(`python ./.cstl/scripts/task.py parent-status ${snapshot.parent.path}`);
83
+ lines.push(`python ./.cstl/scripts/task.py publish-pack ${snapshot.parent.path}`);
84
+ lines.push("```");
85
+ lines.push("");
86
+ lines.push("Open this file in Cursor via `open_resource` (cursor-app-control MCP).");
87
+ lines.push("");
88
+ return lines.join("\n");
89
+ }
90
+ export function defaultPanelPath(snapshot, parentDir) {
91
+ const harness = findHarnessRoot(parentDir) ?? findHarnessRoot(process.cwd());
92
+ const base = harness
93
+ ? path.join(harness, ".cstl", "workspace", "campaign-status")
94
+ : path.join(process.cwd(), ".cstl", "workspace", "campaign-status");
95
+ return path.join(base, `campaign-status-${snapshot.parent.id}.md`);
96
+ }
97
+ export function writeCampaignPanel(snapshot, outPath) {
98
+ const abs = path.resolve(outPath);
99
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
100
+ fs.writeFileSync(abs, renderCampaignStatusMarkdown(snapshot), "utf8");
101
+ return abs;
102
+ }
103
+ //# sourceMappingURL=render.js.map