@blxzer/cursor-trellis 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +13 -13
- package/README.zh-CN.md +1 -1
- package/bin/cstl.js +1 -1
- package/bin/smart-search.js +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +17 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/campaign/canvas-render.d.ts +68 -0
- package/dist/commands/campaign/canvas-render.d.ts.map +1 -0
- package/dist/commands/campaign/canvas-render.js +414 -0
- package/dist/commands/campaign/canvas-render.js.map +1 -0
- package/dist/commands/campaign/compose.d.ts +15 -0
- package/dist/commands/campaign/compose.d.ts.map +1 -0
- package/dist/commands/campaign/compose.js +110 -0
- package/dist/commands/campaign/compose.js.map +1 -0
- package/dist/commands/campaign/index.d.ts +13 -0
- package/dist/commands/campaign/index.d.ts.map +1 -0
- package/dist/commands/campaign/index.js +134 -0
- package/dist/commands/campaign/index.js.map +1 -0
- package/dist/commands/campaign/kind-map.d.ts +6 -0
- package/dist/commands/campaign/kind-map.d.ts.map +1 -0
- package/dist/commands/campaign/kind-map.js +21 -0
- package/dist/commands/campaign/kind-map.js.map +1 -0
- package/dist/commands/campaign/mcp-server.d.ts +6 -0
- package/dist/commands/campaign/mcp-server.d.ts.map +1 -0
- package/dist/commands/campaign/mcp-server.js +167 -0
- package/dist/commands/campaign/mcp-server.js.map +1 -0
- package/dist/commands/campaign/render.d.ts +5 -0
- package/dist/commands/campaign/render.d.ts.map +1 -0
- package/dist/commands/campaign/render.js +103 -0
- package/dist/commands/campaign/render.js.map +1 -0
- package/dist/commands/campaign/trellis-load.d.ts +13 -0
- package/dist/commands/campaign/trellis-load.d.ts.map +1 -0
- package/dist/commands/campaign/trellis-load.js +122 -0
- package/dist/commands/campaign/trellis-load.js.map +1 -0
- package/dist/commands/campaign/types.d.ts +61 -0
- package/dist/commands/campaign/types.d.ts.map +1 -0
- package/dist/commands/campaign/types.js +3 -0
- package/dist/commands/campaign/types.js.map +1 -0
- package/dist/commands/goal/index.d.ts +3 -0
- package/dist/commands/goal/index.d.ts.map +1 -0
- package/dist/commands/goal/index.js +159 -0
- package/dist/commands/goal/index.js.map +1 -0
- package/dist/commands/goal/review.d.ts +6 -0
- package/dist/commands/goal/review.d.ts.map +1 -0
- package/dist/commands/goal/review.js +28 -0
- package/dist/commands/goal/review.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/rpc/client.d.ts +51 -0
- package/dist/commands/rpc/client.d.ts.map +1 -0
- package/dist/commands/rpc/client.js +147 -0
- package/dist/commands/rpc/client.js.map +1 -0
- package/dist/commands/rpc/index.d.ts +10 -0
- package/dist/commands/rpc/index.d.ts.map +1 -0
- package/dist/commands/rpc/index.js +157 -0
- package/dist/commands/rpc/index.js.map +1 -0
- package/dist/commands/rpc/serve.d.ts +23 -0
- package/dist/commands/rpc/serve.d.ts.map +1 -0
- package/dist/commands/rpc/serve.js +60 -0
- package/dist/commands/rpc/serve.js.map +1 -0
- package/dist/commands/rpc/smoke.d.ts +16 -0
- package/dist/commands/rpc/smoke.d.ts.map +1 -0
- package/dist/commands/rpc/smoke.js +92 -0
- package/dist/commands/rpc/smoke.js.map +1 -0
- package/dist/commands/sdk/index.d.ts +9 -0
- package/dist/commands/sdk/index.d.ts.map +1 -0
- package/dist/commands/sdk/index.js +58 -0
- package/dist/commands/sdk/index.js.map +1 -0
- package/dist/commands/sdk/run.d.ts +42 -0
- package/dist/commands/sdk/run.d.ts.map +1 -0
- package/dist/commands/sdk/run.js +220 -0
- package/dist/commands/sdk/run.js.map +1 -0
- package/dist/commands/sdk/status.d.ts +14 -0
- package/dist/commands/sdk/status.d.ts.map +1 -0
- package/dist/commands/sdk/status.js +69 -0
- package/dist/commands/sdk/status.js.map +1 -0
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +13 -1
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/goal/action-packet.d.ts +89 -0
- package/dist/goal/action-packet.d.ts.map +1 -0
- package/dist/goal/action-packet.js +113 -0
- package/dist/goal/action-packet.js.map +1 -0
- package/dist/goal/audit.d.ts +14 -0
- package/dist/goal/audit.d.ts.map +1 -0
- package/dist/goal/audit.js +12 -0
- package/dist/goal/audit.js.map +1 -0
- package/dist/goal/constants.d.ts +26 -0
- package/dist/goal/constants.d.ts.map +1 -0
- package/dist/goal/constants.js +24 -0
- package/dist/goal/constants.js.map +1 -0
- package/dist/goal/paths.d.ts +8 -0
- package/dist/goal/paths.d.ts.map +1 -0
- package/dist/goal/paths.js +36 -0
- package/dist/goal/paths.js.map +1 -0
- package/dist/goal/preflight.d.ts +21 -0
- package/dist/goal/preflight.d.ts.map +1 -0
- package/dist/goal/preflight.js +97 -0
- package/dist/goal/preflight.js.map +1 -0
- package/dist/goal/review-seam.d.ts +44 -0
- package/dist/goal/review-seam.d.ts.map +1 -0
- package/dist/goal/review-seam.js +153 -0
- package/dist/goal/review-seam.js.map +1 -0
- package/dist/goal/reviewer-rules.d.ts +13 -0
- package/dist/goal/reviewer-rules.d.ts.map +1 -0
- package/dist/goal/reviewer-rules.js +153 -0
- package/dist/goal/reviewer-rules.js.map +1 -0
- package/dist/goal/reviewer.d.ts +9 -0
- package/dist/goal/reviewer.d.ts.map +1 -0
- package/dist/goal/reviewer.js +54 -0
- package/dist/goal/reviewer.js.map +1 -0
- package/dist/goal/runtime.d.ts +32 -0
- package/dist/goal/runtime.d.ts.map +1 -0
- package/dist/goal/runtime.js +242 -0
- package/dist/goal/runtime.js.map +1 -0
- package/dist/goal/sdk-client.d.ts +10 -0
- package/dist/goal/sdk-client.d.ts.map +1 -0
- package/dist/goal/sdk-client.js +34 -0
- package/dist/goal/sdk-client.js.map +1 -0
- package/dist/goal/state.d.ts +40 -0
- package/dist/goal/state.d.ts.map +1 -0
- package/dist/goal/state.js +37 -0
- package/dist/goal/state.js.map +1 -0
- package/dist/goal/task-triggers.d.ts +15 -0
- package/dist/goal/task-triggers.d.ts.map +1 -0
- package/dist/goal/task-triggers.js +23 -0
- package/dist/goal/task-triggers.js.map +1 -0
- package/dist/goal/walls.d.ts +12 -0
- package/dist/goal/walls.d.ts.map +1 -0
- package/dist/goal/walls.js +65 -0
- package/dist/goal/walls.js.map +1 -0
- package/dist/goal/worker-prompt.d.ts +13 -0
- package/dist/goal/worker-prompt.d.ts.map +1 -0
- package/dist/goal/worker-prompt.js +41 -0
- package/dist/goal/worker-prompt.js.map +1 -0
- package/dist/goal/worker.d.ts +42 -0
- package/dist/goal/worker.d.ts.map +1 -0
- package/dist/goal/worker.js +180 -0
- package/dist/goal/worker.js.map +1 -0
- package/dist/migrations/manifests/0.3.5.json +9 -0
- package/dist/migrations/manifests/0.3.6.json +9 -0
- package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +35 -29
- package/dist/templates/common/bundled-skills/smart-search-cli/references/cli-contract.md +11 -25
- package/dist/templates/common/commands/continue.md +15 -3
- package/dist/templates/common/skills/check.md +7 -4
- package/dist/templates/cursor/agents/cstl-check.md +1 -0
- package/dist/templates/cursor/fixtures/expected-rules.d.ts.map +1 -1
- package/dist/templates/cursor/fixtures/expected-rules.js +6 -1
- package/dist/templates/cursor/fixtures/expected-rules.js.map +1 -1
- package/dist/templates/cursor/rules/cstl-cursor-modes.mdc +32 -0
- package/dist/templates/cursor/rules/cstl-triage.mdc +2 -4
- package/dist/templates/cursor/rules/retrieval-routing.mdc +26 -7
- package/dist/templates/markdown/agents.md +2 -0
- package/dist/templates/markdown/index.d.ts +3 -0
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +3 -0
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/markdown/spec/guides/cursor-context-injection-guide.md.txt +38 -21
- package/dist/templates/markdown/spec/guides/cursor-native-modes-guide.md.txt +125 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +107 -104
- package/dist/templates/markdown/spec/guides/injection-budget-guide.md.txt +111 -0
- package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +38 -6
- package/dist/templates/markdown/spec/guides/verification-strength-guide.md.txt +184 -0
- package/dist/templates/shared-hooks/session-start.py +10 -0
- package/dist/templates/trellis/config.yaml +18 -0
- package/dist/templates/trellis/index.d.ts +5 -0
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +14 -0
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/common/artifact_locale.py +278 -0
- package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +51 -2
- package/dist/templates/trellis/scripts/common/config.py +39 -0
- package/dist/templates/trellis/scripts/common/injection_budget.py +317 -0
- package/dist/templates/trellis/scripts/common/parent_orchestration.py +500 -5
- package/dist/templates/trellis/scripts/common/retrieval_agent_instructions.py +9 -3
- package/dist/templates/trellis/scripts/common/session_context.py +32 -4
- package/dist/templates/trellis/scripts/common/session_memory.py +26 -0
- package/dist/templates/trellis/scripts/common/subagent_dispatch.py +74 -9
- package/dist/templates/trellis/scripts/common/task_context.py +18 -0
- package/dist/templates/trellis/scripts/common/task_dashboard.py +16 -1
- package/dist/templates/trellis/scripts/common/task_map.py +670 -614
- package/dist/templates/trellis/scripts/common/task_store.py +191 -40
- package/dist/templates/trellis/scripts/common/test_observable_defaults.py +135 -0
- package/dist/templates/trellis/scripts/cursor_retrieval_probe_prompt.md +14 -12
- package/dist/templates/trellis/scripts/generate_dispatch_prompt.py +182 -0
- package/dist/templates/trellis/scripts/injection_budget_probe.py +69 -0
- package/dist/templates/trellis/scripts/retrieval_probe_matrix_template.json +3 -3
- package/dist/templates/trellis/scripts/spec_health_outcomes.py +160 -0
- package/dist/templates/trellis/scripts/task.py +51 -0
- package/dist/templates/trellis/tasks/locale/en/default-prd.md +19 -0
- package/dist/templates/trellis/tasks/locale/zh/default-prd.md +19 -0
- package/dist/templates/trellis/workflow.md +23 -3
- package/dist/utils/codebase-retrieval-router.d.ts.map +1 -1
- package/dist/utils/codebase-retrieval-router.js +14 -0
- package/dist/utils/codebase-retrieval-router.js.map +1 -1
- package/dist/utils/cursor-sdk-gate.d.ts +10 -0
- package/dist/utils/cursor-sdk-gate.d.ts.map +1 -0
- package/dist/utils/cursor-sdk-gate.js +32 -0
- package/dist/utils/cursor-sdk-gate.js.map +1 -0
- package/dist/utils/project-capabilities.d.ts +30 -3
- package/dist/utils/project-capabilities.d.ts.map +1 -1
- package/dist/utils/project-capabilities.js +182 -11
- package/dist/utils/project-capabilities.js.map +1 -1
- package/dist/utils/readiness.d.ts.map +1 -1
- package/dist/utils/readiness.js +26 -0
- package/dist/utils/readiness.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { RPC_PROTOCOL_VERSION, parseRpcAddress, } from "@blxzer/cursor-trellis-core/rpc";
|
|
3
|
+
export const DEFAULT_RPC_URL = "http://127.0.0.1:7843";
|
|
4
|
+
export function resolveRpcUrl(explicit) {
|
|
5
|
+
const fromArg = explicit?.trim();
|
|
6
|
+
if (fromArg)
|
|
7
|
+
return fromArg;
|
|
8
|
+
const fromEnv = process.env.TRELLIS_RPC_URL?.trim();
|
|
9
|
+
if (fromEnv)
|
|
10
|
+
return fromEnv;
|
|
11
|
+
return DEFAULT_RPC_URL;
|
|
12
|
+
}
|
|
13
|
+
export function resolveRpcToken(explicit) {
|
|
14
|
+
const fromArg = explicit?.trim();
|
|
15
|
+
if (fromArg)
|
|
16
|
+
return fromArg;
|
|
17
|
+
const fromEnv = process.env.TRELLIS_RPC_TOKEN?.trim();
|
|
18
|
+
if (fromEnv)
|
|
19
|
+
return fromEnv;
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
/** Parse `kind:id` address strings. */
|
|
23
|
+
export function parseAddressArg(value) {
|
|
24
|
+
const idx = value.indexOf(":");
|
|
25
|
+
if (idx <= 0 || idx === value.length - 1) {
|
|
26
|
+
throw new Error(`Invalid address '${value}'. Expected kind:id (e.g. worker:w1)`);
|
|
27
|
+
}
|
|
28
|
+
return parseRpcAddress({
|
|
29
|
+
kind: value.slice(0, idx),
|
|
30
|
+
id: value.slice(idx + 1),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export function formatAddress(address) {
|
|
34
|
+
return `${address.kind}:${address.id}`;
|
|
35
|
+
}
|
|
36
|
+
function nowIso() {
|
|
37
|
+
return new Date().toISOString();
|
|
38
|
+
}
|
|
39
|
+
export async function postRpc(url, body) {
|
|
40
|
+
const res = await fetch(`${url.replace(/\/$/, "")}/rpc`, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: { "content-type": "application/json" },
|
|
43
|
+
body: JSON.stringify(body),
|
|
44
|
+
});
|
|
45
|
+
const json = (await res.json());
|
|
46
|
+
return json;
|
|
47
|
+
}
|
|
48
|
+
export async function getJson(url, path) {
|
|
49
|
+
const res = await fetch(`${url.replace(/\/$/, "")}${path}`);
|
|
50
|
+
if (!res.ok) {
|
|
51
|
+
throw new Error(`HTTP ${res.status} for ${path}`);
|
|
52
|
+
}
|
|
53
|
+
return res.json();
|
|
54
|
+
}
|
|
55
|
+
export function buildReq(options) {
|
|
56
|
+
const payload = { ...(options.payload ?? {}) };
|
|
57
|
+
if (options.token !== undefined) {
|
|
58
|
+
payload.token = options.token;
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
v: RPC_PROTOCOL_VERSION,
|
|
62
|
+
id: randomUUID(),
|
|
63
|
+
type: "req",
|
|
64
|
+
method: options.method,
|
|
65
|
+
from: options.from,
|
|
66
|
+
...(options.to !== undefined ? { to: options.to } : {}),
|
|
67
|
+
...(options.topic !== undefined ? { topic: options.topic } : {}),
|
|
68
|
+
...(options.campaignId !== undefined
|
|
69
|
+
? { campaignId: options.campaignId }
|
|
70
|
+
: {}),
|
|
71
|
+
...(options.correlationId !== undefined
|
|
72
|
+
? { correlationId: options.correlationId }
|
|
73
|
+
: {}),
|
|
74
|
+
ts: nowIso(),
|
|
75
|
+
payload,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export async function rpcRegister(options) {
|
|
79
|
+
const from = { kind: options.kind, id: options.id };
|
|
80
|
+
return postRpc(options.url, buildReq({
|
|
81
|
+
method: "register",
|
|
82
|
+
from,
|
|
83
|
+
campaignId: options.campaignId ?? null,
|
|
84
|
+
token: options.token,
|
|
85
|
+
payload: {
|
|
86
|
+
kind: options.kind,
|
|
87
|
+
id: options.id,
|
|
88
|
+
...(options.campaignId ? { campaignId: options.campaignId } : {}),
|
|
89
|
+
},
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
export async function rpcSend(options) {
|
|
93
|
+
return postRpc(options.url, buildReq({
|
|
94
|
+
method: "send",
|
|
95
|
+
from: options.from,
|
|
96
|
+
to: options.to,
|
|
97
|
+
token: options.token,
|
|
98
|
+
payload: { body: options.body },
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
export async function rpcSubscribe(options) {
|
|
102
|
+
return postRpc(options.url, buildReq({
|
|
103
|
+
method: "subscribe",
|
|
104
|
+
from: options.from,
|
|
105
|
+
topic: options.topic,
|
|
106
|
+
token: options.token,
|
|
107
|
+
payload: {},
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
export async function rpcPublish(options) {
|
|
111
|
+
return postRpc(options.url, buildReq({
|
|
112
|
+
method: "publish",
|
|
113
|
+
from: options.from,
|
|
114
|
+
topic: options.topic,
|
|
115
|
+
campaignId: options.campaignId ?? null,
|
|
116
|
+
token: options.token,
|
|
117
|
+
payload: { body: options.body },
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
export function parseJsonObject(raw, flag) {
|
|
121
|
+
let parsed;
|
|
122
|
+
try {
|
|
123
|
+
parsed = JSON.parse(raw);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
throw new Error(`${flag} must be valid JSON object`);
|
|
127
|
+
}
|
|
128
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
129
|
+
throw new Error(`${flag} must be a JSON object`);
|
|
130
|
+
}
|
|
131
|
+
return parsed;
|
|
132
|
+
}
|
|
133
|
+
export function printEnvelope(envelope, json) {
|
|
134
|
+
if (json) {
|
|
135
|
+
console.log(JSON.stringify(envelope, null, 2));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (envelope.error) {
|
|
139
|
+
console.error(`RPC error ${envelope.error.code}: ${envelope.error.message}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
console.log(JSON.stringify(envelope.payload, null, 2));
|
|
143
|
+
}
|
|
144
|
+
export function exitForEnvelope(envelope) {
|
|
145
|
+
return envelope.error ? 1 : 0;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/commands/rpc/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Register `cstl rpc` — localhost RPC-FULL CORE control plane.
|
|
4
|
+
* Does not replace durable `channel` event logs. Does not auto-approve HITL gates.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerRpcCommand(program: Command): void;
|
|
7
|
+
export { startRpcServe, runRpcServeCommand, type RpcServeOptions, type RpcServeHandle, } from "./serve.js";
|
|
8
|
+
export { runRpcSmoke, type RpcSmokeResult } from "./smoke.js";
|
|
9
|
+
export { resolveRpcUrl, resolveRpcToken, parseAddressArg, postRpc, rpcRegister, rpcSend, rpcSubscribe, rpcPublish, getJson, } from "./client.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/rpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAuC/D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+LzD;AAED,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,OAAO,EACP,WAAW,EACX,OAAO,EACP,YAAY,EACZ,UAAU,EACV,OAAO,GACR,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { InvalidArgumentError } from "commander";
|
|
2
|
+
import { RPC_ADDRESS_KINDS, } from "@blxzer/cursor-trellis-core/rpc";
|
|
3
|
+
import { exitForEnvelope, getJson, parseAddressArg, parseJsonObject, printEnvelope, resolveRpcToken, resolveRpcUrl, rpcPublish, rpcRegister, rpcSend, rpcSubscribe, } from "./client.js";
|
|
4
|
+
import { runRpcServeCommand } from "./serve.js";
|
|
5
|
+
import { runRpcSmoke } from "./smoke.js";
|
|
6
|
+
function parsePort(value) {
|
|
7
|
+
if (!/^\d+$/.test(value)) {
|
|
8
|
+
throw new InvalidArgumentError(`expected port integer, got '${value}'`);
|
|
9
|
+
}
|
|
10
|
+
return Number(value);
|
|
11
|
+
}
|
|
12
|
+
function parseKind(value) {
|
|
13
|
+
if (!RPC_ADDRESS_KINDS.includes(value)) {
|
|
14
|
+
throw new InvalidArgumentError(`kind must be one of: ${RPC_ADDRESS_KINDS.join(", ")}`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register `cstl rpc` — localhost RPC-FULL CORE control plane.
|
|
20
|
+
* Does not replace durable `channel` event logs. Does not auto-approve HITL gates.
|
|
21
|
+
*/
|
|
22
|
+
export function registerRpcCommand(program) {
|
|
23
|
+
const rpc = program
|
|
24
|
+
.command("rpc")
|
|
25
|
+
.description("Localhost RPC-FULL CORE broker (register/send/push/topics). Non-goals: multi-machine, A2A impl, ops console. Never auto-approves Trellis HITL gates.");
|
|
26
|
+
rpc
|
|
27
|
+
.command("serve")
|
|
28
|
+
.description("Start localhost broker on 127.0.0.1 (HTTP+/WS). Non-goals: multi-machine / A2A / ops console.")
|
|
29
|
+
.option("--host <host>", "loopback host only", "127.0.0.1")
|
|
30
|
+
.option("--port <port>", "listen port (0 = ephemeral)", parsePort, 7843)
|
|
31
|
+
.option("--token <token>", "shared local token (or TRELLIS_RPC_TOKEN)")
|
|
32
|
+
.option("--journal-dir <dir>", "audit journal directory (default: ~/.cstl/rpc)")
|
|
33
|
+
.option("--no-journal", "disable on-disk audit journal")
|
|
34
|
+
.action(async (opts) => {
|
|
35
|
+
const code = await runRpcServeCommand({
|
|
36
|
+
host: opts.host,
|
|
37
|
+
port: opts.port,
|
|
38
|
+
token: resolveRpcToken(opts.token),
|
|
39
|
+
journalDir: opts.journal === false ? null : opts.journalDir,
|
|
40
|
+
});
|
|
41
|
+
process.exitCode = code;
|
|
42
|
+
});
|
|
43
|
+
rpc
|
|
44
|
+
.command("status")
|
|
45
|
+
.description("Fetch broker status snapshot")
|
|
46
|
+
.option("--url <url>", "broker base URL (or TRELLIS_RPC_URL)")
|
|
47
|
+
.option("--json", "print raw JSON")
|
|
48
|
+
.action(async (opts) => {
|
|
49
|
+
const url = resolveRpcUrl(opts.url);
|
|
50
|
+
const status = await getJson(url, "/status");
|
|
51
|
+
console.log(JSON.stringify(status, null, opts.json ? 2 : 2));
|
|
52
|
+
});
|
|
53
|
+
rpc
|
|
54
|
+
.command("register")
|
|
55
|
+
.description("Register a client address with the broker")
|
|
56
|
+
.requiredOption("--kind <kind>", "worker|session|cli|sdk|broker", parseKind)
|
|
57
|
+
.requiredOption("--id <id>", "address id")
|
|
58
|
+
.option("--campaign <id>", "optional campaign id")
|
|
59
|
+
.option("--url <url>", "broker base URL")
|
|
60
|
+
.option("--token <token>", "shared local token")
|
|
61
|
+
.option("--json", "print full envelope JSON")
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
const envelope = await rpcRegister({
|
|
64
|
+
url: resolveRpcUrl(opts.url),
|
|
65
|
+
kind: opts.kind,
|
|
66
|
+
id: opts.id,
|
|
67
|
+
campaignId: opts.campaign,
|
|
68
|
+
token: resolveRpcToken(opts.token),
|
|
69
|
+
});
|
|
70
|
+
printEnvelope(envelope, Boolean(opts.json));
|
|
71
|
+
process.exitCode = exitForEnvelope(envelope);
|
|
72
|
+
});
|
|
73
|
+
rpc
|
|
74
|
+
.command("send")
|
|
75
|
+
.description("Send an addressable one-way message")
|
|
76
|
+
.requiredOption("--from <addr>", "kind:id sender")
|
|
77
|
+
.requiredOption("--to <addr>", "kind:id recipient")
|
|
78
|
+
.option("--body <json>", "JSON object payload", "{}")
|
|
79
|
+
.option("--url <url>", "broker base URL")
|
|
80
|
+
.option("--token <token>", "shared local token")
|
|
81
|
+
.option("--json", "print full envelope JSON")
|
|
82
|
+
.action(async (opts) => {
|
|
83
|
+
const envelope = await rpcSend({
|
|
84
|
+
url: resolveRpcUrl(opts.url),
|
|
85
|
+
from: parseAddressArg(opts.from),
|
|
86
|
+
to: parseAddressArg(opts.to),
|
|
87
|
+
body: parseJsonObject(opts.body, "--body"),
|
|
88
|
+
token: resolveRpcToken(opts.token),
|
|
89
|
+
});
|
|
90
|
+
printEnvelope(envelope, Boolean(opts.json));
|
|
91
|
+
process.exitCode = exitForEnvelope(envelope);
|
|
92
|
+
});
|
|
93
|
+
rpc
|
|
94
|
+
.command("subscribe")
|
|
95
|
+
.description("Subscribe an address to a campaign topic")
|
|
96
|
+
.requiredOption("--from <addr>", "kind:id subscriber")
|
|
97
|
+
.requiredOption("--topic <topic>", "campaign:<id>:broadcast|stage:<sid>")
|
|
98
|
+
.option("--url <url>", "broker base URL")
|
|
99
|
+
.option("--token <token>", "shared local token")
|
|
100
|
+
.option("--json", "print full envelope JSON")
|
|
101
|
+
.action(async (opts) => {
|
|
102
|
+
const envelope = await rpcSubscribe({
|
|
103
|
+
url: resolveRpcUrl(opts.url),
|
|
104
|
+
from: parseAddressArg(opts.from),
|
|
105
|
+
topic: opts.topic,
|
|
106
|
+
token: resolveRpcToken(opts.token),
|
|
107
|
+
});
|
|
108
|
+
printEnvelope(envelope, Boolean(opts.json));
|
|
109
|
+
process.exitCode = exitForEnvelope(envelope);
|
|
110
|
+
});
|
|
111
|
+
rpc
|
|
112
|
+
.command("publish")
|
|
113
|
+
.description("Publish to a campaign topic")
|
|
114
|
+
.requiredOption("--from <addr>", "kind:id publisher")
|
|
115
|
+
.requiredOption("--topic <topic>", "campaign topic")
|
|
116
|
+
.option("--body <json>", "JSON object payload", "{}")
|
|
117
|
+
.option("--campaign <id>", "campaign id stamp")
|
|
118
|
+
.option("--url <url>", "broker base URL")
|
|
119
|
+
.option("--token <token>", "shared local token")
|
|
120
|
+
.option("--json", "print full envelope JSON")
|
|
121
|
+
.action(async (opts) => {
|
|
122
|
+
const envelope = await rpcPublish({
|
|
123
|
+
url: resolveRpcUrl(opts.url),
|
|
124
|
+
from: parseAddressArg(opts.from),
|
|
125
|
+
topic: opts.topic,
|
|
126
|
+
body: parseJsonObject(opts.body, "--body"),
|
|
127
|
+
campaignId: opts.campaign,
|
|
128
|
+
token: resolveRpcToken(opts.token),
|
|
129
|
+
});
|
|
130
|
+
printEnvelope(envelope, Boolean(opts.json));
|
|
131
|
+
process.exitCode = exitForEnvelope(envelope);
|
|
132
|
+
});
|
|
133
|
+
rpc
|
|
134
|
+
.command("smoke")
|
|
135
|
+
.description("Run two-client + topic round-trip against an ephemeral localhost broker")
|
|
136
|
+
.option("--token <token>", "optional shared token for the smoke broker")
|
|
137
|
+
.option("--json", "print machine-readable result")
|
|
138
|
+
.action(async (opts) => {
|
|
139
|
+
const result = await runRpcSmoke({
|
|
140
|
+
token: resolveRpcToken(opts.token),
|
|
141
|
+
});
|
|
142
|
+
if (opts.json) {
|
|
143
|
+
console.log(JSON.stringify(result, null, 2));
|
|
144
|
+
}
|
|
145
|
+
else if (result.ok) {
|
|
146
|
+
console.log(`RPC smoke OK (url=${result.url}, clients=${result.statusClients}, topicDelivered=${result.topicDelivered})`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.error(`RPC smoke FAILED: ${result.errors.join("; ")}`);
|
|
150
|
+
}
|
|
151
|
+
process.exitCode = result.ok ? 0 : 1;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
export { startRpcServe, runRpcServeCommand, } from "./serve.js";
|
|
155
|
+
export { runRpcSmoke } from "./smoke.js";
|
|
156
|
+
export { resolveRpcUrl, resolveRpcToken, parseAddressArg, postRpc, rpcRegister, rpcSend, rpcSubscribe, rpcPublish, getJson, } from "./client.js";
|
|
157
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/rpc/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LocalhostRpcServer, type LocalhostRpcServerInfo } from "@blxzer/cursor-trellis-core/rpc";
|
|
2
|
+
export interface RpcServeOptions {
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
token?: string;
|
|
6
|
+
/** Omit or pass undefined for default `~/.cstl/rpc`; pass `null` to disable. */
|
|
7
|
+
journalDir?: string | null;
|
|
8
|
+
heartbeatTimeoutMs?: number;
|
|
9
|
+
/** When set, return after listen instead of waiting (tests). */
|
|
10
|
+
listenOnly?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface RpcServeHandle {
|
|
13
|
+
server: LocalhostRpcServer;
|
|
14
|
+
info: LocalhostRpcServerInfo;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Start localhost RPC-FULL CORE broker.
|
|
19
|
+
* Non-goals (printed in help): multi-machine, A2A runtime, ops console.
|
|
20
|
+
*/
|
|
21
|
+
export declare function startRpcServe(options?: RpcServeOptions): Promise<RpcServeHandle>;
|
|
22
|
+
export declare function runRpcServeCommand(options?: RpcServeOptions): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/rpc/serve.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA6BzB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { LocalhostRpcServer, } from "@blxzer/cursor-trellis-core/rpc";
|
|
4
|
+
function defaultJournalDir() {
|
|
5
|
+
return path.join(os.homedir(), ".cstl", "rpc");
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Start localhost RPC-FULL CORE broker.
|
|
9
|
+
* Non-goals (printed in help): multi-machine, A2A runtime, ops console.
|
|
10
|
+
*/
|
|
11
|
+
export async function startRpcServe(options = {}) {
|
|
12
|
+
const host = options.host ?? "127.0.0.1";
|
|
13
|
+
const port = options.port ??
|
|
14
|
+
(process.env.TRELLIS_RPC_PORT
|
|
15
|
+
? Number(process.env.TRELLIS_RPC_PORT)
|
|
16
|
+
: 7843);
|
|
17
|
+
if (!Number.isInteger(port) || port < 0) {
|
|
18
|
+
throw new Error(`Invalid RPC port: ${String(port)}`);
|
|
19
|
+
}
|
|
20
|
+
const journalDir = options.journalDir === null
|
|
21
|
+
? undefined
|
|
22
|
+
: (options.journalDir ?? defaultJournalDir());
|
|
23
|
+
const server = new LocalhostRpcServer({
|
|
24
|
+
host,
|
|
25
|
+
port,
|
|
26
|
+
token: options.token,
|
|
27
|
+
...(journalDir !== undefined ? { journalDir } : {}),
|
|
28
|
+
heartbeatTimeoutMs: options.heartbeatTimeoutMs ?? 30_000,
|
|
29
|
+
});
|
|
30
|
+
const info = await server.listen();
|
|
31
|
+
return {
|
|
32
|
+
server,
|
|
33
|
+
info,
|
|
34
|
+
close: () => server.close(),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export async function runRpcServeCommand(options = {}) {
|
|
38
|
+
const handle = await startRpcServe(options);
|
|
39
|
+
console.log("RPC-FULL CORE listening (localhost only)");
|
|
40
|
+
console.log(` url: ${handle.info.url}`);
|
|
41
|
+
console.log(` health: ${handle.info.url}/health`);
|
|
42
|
+
console.log(` rpc: POST ${handle.info.url}/rpc`);
|
|
43
|
+
console.log(` ws: ws://${handle.info.host}:${handle.info.port}/ws`);
|
|
44
|
+
console.log(` events: ${handle.info.url}/events?kind=&id=`);
|
|
45
|
+
console.log("Non-goals: multi-machine, A2A implementation, standalone ops console.");
|
|
46
|
+
console.log("HITL gates are never auto-approved by this broker.");
|
|
47
|
+
if (options.listenOnly) {
|
|
48
|
+
await handle.close();
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
await new Promise((resolve) => {
|
|
52
|
+
const shutdown = () => {
|
|
53
|
+
void handle.close().finally(resolve);
|
|
54
|
+
};
|
|
55
|
+
process.once("SIGINT", shutdown);
|
|
56
|
+
process.once("SIGTERM", shutdown);
|
|
57
|
+
});
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/rpc/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface RpcSmokeResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
url: string;
|
|
4
|
+
sendDelivered: boolean;
|
|
5
|
+
topicDelivered: number;
|
|
6
|
+
statusClients: number;
|
|
7
|
+
errors: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Two-client + campaign topic round-trip against a fresh localhost broker.
|
|
11
|
+
* Used by tests and `cstl rpc smoke`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runRpcSmoke(options?: {
|
|
14
|
+
token?: string;
|
|
15
|
+
}): Promise<RpcSmokeResult>;
|
|
16
|
+
//# sourceMappingURL=smoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke.d.ts","sourceRoot":"","sources":["../../../src/commands/rpc/smoke.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GAAG,OAAO,CAAC,cAAc,CAAC,CAsF/B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { campaignBroadcastTopic } from "@blxzer/cursor-trellis-core/rpc";
|
|
2
|
+
import { getJson, rpcPublish, rpcRegister, rpcSend, rpcSubscribe, } from "./client.js";
|
|
3
|
+
import { startRpcServe } from "./serve.js";
|
|
4
|
+
/**
|
|
5
|
+
* Two-client + campaign topic round-trip against a fresh localhost broker.
|
|
6
|
+
* Used by tests and `cstl rpc smoke`.
|
|
7
|
+
*/
|
|
8
|
+
export async function runRpcSmoke(options = {}) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const handle = await startRpcServe({
|
|
11
|
+
port: 0,
|
|
12
|
+
token: options.token,
|
|
13
|
+
heartbeatTimeoutMs: 0,
|
|
14
|
+
journalDir: null,
|
|
15
|
+
});
|
|
16
|
+
const url = handle.info.url;
|
|
17
|
+
const a = { kind: "cli", id: "smoke-a" };
|
|
18
|
+
const b = { kind: "worker", id: "smoke-b" };
|
|
19
|
+
const topic = campaignBroadcastTopic("smoke-camp");
|
|
20
|
+
try {
|
|
21
|
+
const regA = await rpcRegister({
|
|
22
|
+
url,
|
|
23
|
+
kind: a.kind,
|
|
24
|
+
id: a.id,
|
|
25
|
+
campaignId: "smoke-camp",
|
|
26
|
+
token: options.token,
|
|
27
|
+
});
|
|
28
|
+
const regB = await rpcRegister({
|
|
29
|
+
url,
|
|
30
|
+
kind: b.kind,
|
|
31
|
+
id: b.id,
|
|
32
|
+
token: options.token,
|
|
33
|
+
});
|
|
34
|
+
if (regA.error)
|
|
35
|
+
errors.push(`register A: ${regA.error.message}`);
|
|
36
|
+
if (regB.error)
|
|
37
|
+
errors.push(`register B: ${regB.error.message}`);
|
|
38
|
+
const sent = await rpcSend({
|
|
39
|
+
url,
|
|
40
|
+
from: a,
|
|
41
|
+
to: b,
|
|
42
|
+
body: { hello: "smoke" },
|
|
43
|
+
token: options.token,
|
|
44
|
+
});
|
|
45
|
+
if (sent.error)
|
|
46
|
+
errors.push(`send: ${sent.error.message}`);
|
|
47
|
+
const sub = await rpcSubscribe({
|
|
48
|
+
url,
|
|
49
|
+
from: b,
|
|
50
|
+
topic,
|
|
51
|
+
token: options.token,
|
|
52
|
+
});
|
|
53
|
+
if (sub.error)
|
|
54
|
+
errors.push(`subscribe: ${sub.error.message}`);
|
|
55
|
+
const published = await rpcPublish({
|
|
56
|
+
url,
|
|
57
|
+
from: a,
|
|
58
|
+
topic,
|
|
59
|
+
body: { stage: "ready" },
|
|
60
|
+
campaignId: "smoke-camp",
|
|
61
|
+
token: options.token,
|
|
62
|
+
});
|
|
63
|
+
if (published.error)
|
|
64
|
+
errors.push(`publish: ${published.error.message}`);
|
|
65
|
+
const status = (await getJson(url, "/status"));
|
|
66
|
+
const sendDelivered = sent.payload.delivered === true;
|
|
67
|
+
const topicDelivered = typeof published.payload.delivered === "number"
|
|
68
|
+
? published.payload.delivered
|
|
69
|
+
: 0;
|
|
70
|
+
const statusClients = Array.isArray(status.clients)
|
|
71
|
+
? status.clients.length
|
|
72
|
+
: 0;
|
|
73
|
+
if (topicDelivered < 1)
|
|
74
|
+
errors.push("topic deliver count < 1");
|
|
75
|
+
if (statusClients < 2)
|
|
76
|
+
errors.push("status clients < 2");
|
|
77
|
+
if (!sendDelivered)
|
|
78
|
+
errors.push("send not delivered");
|
|
79
|
+
return {
|
|
80
|
+
ok: errors.length === 0,
|
|
81
|
+
url,
|
|
82
|
+
sendDelivered,
|
|
83
|
+
topicDelivered,
|
|
84
|
+
statusClients,
|
|
85
|
+
errors,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await handle.close();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../../src/commands/rpc/smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Register `cstl sdk` — Trellis↔Cursor SDK RUN path (CAP: safe-task/SDK only).
|
|
4
|
+
* Non-goals: fake IDE chat tab, Parent integrate, MIX UI, broker rewrite.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerSdkCommand(program: Command): void;
|
|
7
|
+
export { runSdkRun, runSdkRunCommand, type SdkRunOptions, type SdkRunResult } from "./run.js";
|
|
8
|
+
export { collectSdkStatus, runSdkStatusCommand, type SdkStatusResult, } from "./status.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0EzD;AAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { resolveRpcToken, resolveRpcUrl } from "../rpc/client.js";
|
|
2
|
+
import { runSdkRunCommand } from "./run.js";
|
|
3
|
+
import { runSdkStatusCommand } from "./status.js";
|
|
4
|
+
/**
|
|
5
|
+
* Register `cstl sdk` — Trellis↔Cursor SDK RUN path (CAP: safe-task/SDK only).
|
|
6
|
+
* Non-goals: fake IDE chat tab, Parent integrate, MIX UI, broker rewrite.
|
|
7
|
+
*/
|
|
8
|
+
export function registerSdkCommand(program) {
|
|
9
|
+
const sdk = program
|
|
10
|
+
.command("sdk")
|
|
11
|
+
.description("Cursor SDK RUN bridge for Trellis (explicit --task; mock/live; RPC kind=sdk). Non-goals: IDE chat tab, Parent integrate, MIX UI.");
|
|
12
|
+
sdk
|
|
13
|
+
.command("status")
|
|
14
|
+
.description("Show whether CURSOR_API_KEY is present and whether cursor-sdk can be enabled (never prints the key)")
|
|
15
|
+
.option("--cwd <dir>", "Project directory to inspect for capabilities.json")
|
|
16
|
+
.option("--json", "Print machine-readable status JSON")
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const code = await runSdkStatusCommand({
|
|
19
|
+
cwd: opts.cwd,
|
|
20
|
+
json: opts.json === true,
|
|
21
|
+
});
|
|
22
|
+
process.exitCode = code;
|
|
23
|
+
});
|
|
24
|
+
sdk
|
|
25
|
+
.command("run")
|
|
26
|
+
.description("Bind an explicit task path, run mock or live Agent.prompt, write dogfood evidence, emit campaign RPC events")
|
|
27
|
+
.requiredOption("--task <path>", "Explicit Trellis task directory (must contain prd.md). Required — SDK has no selected_task.")
|
|
28
|
+
.option("--campaign <id>", "Campaign id for RPC topic (no colon)", "08-01-trellis-intent-multisession")
|
|
29
|
+
.option("--prompt <text>", "Prompt body for the SDK / mock agent")
|
|
30
|
+
.option("--cwd <dir>", "Working directory for live local Agent (default: process.cwd())")
|
|
31
|
+
.option("--live", "Call @cursor/sdk Agent.prompt (requires consent + CURSOR_API_KEY)")
|
|
32
|
+
.option("--mock", "Force mock adapter (default when --live is absent)")
|
|
33
|
+
.option("--rpc-url <url>", "RPC CORE URL (default TRELLIS_RPC_URL or http://127.0.0.1:7843)")
|
|
34
|
+
.option("--token <token>", "RPC token (or TRELLIS_RPC_TOKEN)")
|
|
35
|
+
.option("--no-rpc", "Skip RPC register/publish (still writes dogfood)")
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
if (opts.live && opts.mock) {
|
|
38
|
+
console.error("SDK RUN error: use only one of --live or --mock");
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const mode = opts.live ? "live" : "mock";
|
|
43
|
+
const code = await runSdkRunCommand({
|
|
44
|
+
task: opts.task,
|
|
45
|
+
campaign: opts.campaign ?? "08-01-trellis-intent-multisession",
|
|
46
|
+
mode,
|
|
47
|
+
prompt: opts.prompt,
|
|
48
|
+
cwd: opts.cwd,
|
|
49
|
+
rpcUrl: opts.rpcUrl ? resolveRpcUrl(opts.rpcUrl) : undefined,
|
|
50
|
+
token: resolveRpcToken(opts.token),
|
|
51
|
+
noRpc: opts.rpc === false,
|
|
52
|
+
});
|
|
53
|
+
process.exitCode = code;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export { runSdkRun, runSdkRunCommand } from "./run.js";
|
|
57
|
+
export { collectSdkStatus, runSdkStatusCommand, } from "./status.js";
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sdk/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,kIAAkI,CACnI,CAAC;IAEJ,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,qGAAqG,CACtG;SACA,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;SAC3E,MAAM,CAAC,QAAQ,EAAE,oCAAoC,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC;YACrC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;SACzB,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,6GAA6G,CAC9G;SACA,cAAc,CACb,eAAe,EACf,6FAA6F,CAC9F;SACA,MAAM,CACL,iBAAiB,EACjB,sCAAsC,EACtC,mCAAmC,CACpC;SACA,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,iEAAiE,CAAC;SACxF,MAAM,CAAC,QAAQ,EAAE,mEAAmE,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,iEAAiE,CAAC;SAC5F,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;SAC7D,MAAM,CAAC,UAAU,EAAE,kDAAkD,CAAC;SACtE,MAAM,CACL,KAAK,EAAE,IAUN,EAAE,EAAE;QACH,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAe,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,mCAAmC;YAC9D,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5D,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,KAAK;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CACF,CAAC;AACN,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAyC,MAAM,UAAU,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,aAAa,CAAC"}
|