@mindfoldhq/trellis 0.6.0-beta.11 → 0.6.0-beta.13

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 (91) hide show
  1. package/dist/commands/channel/context.d.ts +16 -0
  2. package/dist/commands/channel/context.d.ts.map +1 -0
  3. package/dist/commands/channel/context.js +83 -0
  4. package/dist/commands/channel/context.js.map +1 -0
  5. package/dist/commands/channel/create.d.ts +15 -8
  6. package/dist/commands/channel/create.d.ts.map +1 -1
  7. package/dist/commands/channel/create.js +26 -97
  8. package/dist/commands/channel/create.js.map +1 -1
  9. package/dist/commands/channel/index.d.ts.map +1 -1
  10. package/dist/commands/channel/index.js +195 -9
  11. package/dist/commands/channel/index.js.map +1 -1
  12. package/dist/commands/channel/kill.d.ts +1 -0
  13. package/dist/commands/channel/kill.d.ts.map +1 -1
  14. package/dist/commands/channel/kill.js +16 -13
  15. package/dist/commands/channel/kill.js.map +1 -1
  16. package/dist/commands/channel/list.d.ts +1 -0
  17. package/dist/commands/channel/list.d.ts.map +1 -1
  18. package/dist/commands/channel/list.js +27 -17
  19. package/dist/commands/channel/list.js.map +1 -1
  20. package/dist/commands/channel/messages.d.ts +3 -0
  21. package/dist/commands/channel/messages.d.ts.map +1 -1
  22. package/dist/commands/channel/messages.js +86 -58
  23. package/dist/commands/channel/messages.js.map +1 -1
  24. package/dist/commands/channel/rm.d.ts +2 -0
  25. package/dist/commands/channel/rm.d.ts.map +1 -1
  26. package/dist/commands/channel/rm.js +15 -5
  27. package/dist/commands/channel/rm.js.map +1 -1
  28. package/dist/commands/channel/run.js +1 -1
  29. package/dist/commands/channel/run.js.map +1 -1
  30. package/dist/commands/channel/send.d.ts +2 -0
  31. package/dist/commands/channel/send.d.ts.map +1 -1
  32. package/dist/commands/channel/send.js +18 -32
  33. package/dist/commands/channel/send.js.map +1 -1
  34. package/dist/commands/channel/spawn.d.ts +1 -0
  35. package/dist/commands/channel/spawn.d.ts.map +1 -1
  36. package/dist/commands/channel/spawn.js +14 -11
  37. package/dist/commands/channel/spawn.js.map +1 -1
  38. package/dist/commands/channel/store/events.d.ts +33 -14
  39. package/dist/commands/channel/store/events.d.ts.map +1 -1
  40. package/dist/commands/channel/store/events.js +56 -33
  41. package/dist/commands/channel/store/events.js.map +1 -1
  42. package/dist/commands/channel/store/filter.d.ts +3 -0
  43. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  44. package/dist/commands/channel/store/filter.js +2 -0
  45. package/dist/commands/channel/store/filter.js.map +1 -0
  46. package/dist/commands/channel/store/paths.d.ts +7 -0
  47. package/dist/commands/channel/store/paths.d.ts.map +1 -1
  48. package/dist/commands/channel/store/paths.js +76 -17
  49. package/dist/commands/channel/store/paths.js.map +1 -1
  50. package/dist/commands/channel/store/schema.d.ts +27 -0
  51. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  52. package/dist/commands/channel/store/schema.js +34 -0
  53. package/dist/commands/channel/store/schema.js.map +1 -0
  54. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  55. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  56. package/dist/commands/channel/store/thread-state.js +16 -0
  57. package/dist/commands/channel/store/thread-state.js.map +1 -0
  58. package/dist/commands/channel/store/watch.d.ts +4 -21
  59. package/dist/commands/channel/store/watch.d.ts.map +1 -1
  60. package/dist/commands/channel/store/watch.js +8 -54
  61. package/dist/commands/channel/store/watch.js.map +1 -1
  62. package/dist/commands/channel/supervisor.d.ts +1 -1
  63. package/dist/commands/channel/supervisor.d.ts.map +1 -1
  64. package/dist/commands/channel/supervisor.js +11 -10
  65. package/dist/commands/channel/supervisor.js.map +1 -1
  66. package/dist/commands/channel/text-body.d.ts +13 -0
  67. package/dist/commands/channel/text-body.d.ts.map +1 -0
  68. package/dist/commands/channel/text-body.js +47 -0
  69. package/dist/commands/channel/text-body.js.map +1 -0
  70. package/dist/commands/channel/threads.d.ts +39 -0
  71. package/dist/commands/channel/threads.d.ts.map +1 -0
  72. package/dist/commands/channel/threads.js +106 -0
  73. package/dist/commands/channel/threads.js.map +1 -0
  74. package/dist/commands/channel/title.d.ts +12 -0
  75. package/dist/commands/channel/title.d.ts.map +1 -0
  76. package/dist/commands/channel/title.js +24 -0
  77. package/dist/commands/channel/title.js.map +1 -0
  78. package/dist/commands/channel/wait.d.ts +3 -0
  79. package/dist/commands/channel/wait.d.ts.map +1 -1
  80. package/dist/commands/channel/wait.js +9 -8
  81. package/dist/commands/channel/wait.js.map +1 -1
  82. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  83. package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
  84. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +127 -9
  85. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +62 -0
  86. package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
  87. package/dist/utils/task-json.d.ts +9 -42
  88. package/dist/utils/task-json.d.ts.map +1 -1
  89. package/dist/utils/task-json.js +8 -45
  90. package/dist/utils/task-json.js.map +1 -1
  91. package/package.json +9 -8
@@ -0,0 +1,16 @@
1
+ export interface ContextMutateCliOptions {
2
+ as?: string;
3
+ scope?: string;
4
+ thread?: string;
5
+ file?: string[];
6
+ raw?: string[];
7
+ }
8
+ export interface ContextListCliOptions {
9
+ scope?: string;
10
+ thread?: string;
11
+ raw?: boolean;
12
+ }
13
+ export declare function channelContextAdd(channelName: string, opts: ContextMutateCliOptions): Promise<void>;
14
+ export declare function channelContextDelete(channelName: string, opts: ContextMutateCliOptions): Promise<void>;
15
+ export declare function channelContextList(channelName: string, opts: ContextListCliOptions): Promise<void>;
16
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/context.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -0,0 +1,83 @@
1
+ import { addChannelContext, addThreadContext, buildContextEntries, deleteChannelContext, deleteThreadContext, listChannelContext, listThreadContext, } from "@mindfoldhq/trellis-core/channel";
2
+ import { parseChannelScope } from "./store/schema.js";
3
+ export async function channelContextAdd(channelName, opts) {
4
+ const context = buildContextEntries(opts.file, opts.raw);
5
+ if (!context) {
6
+ throw new Error("Provide at least one --file <abs-path> or --raw <text>");
7
+ }
8
+ const scope = parseChannelScope(opts.scope);
9
+ const event = opts.thread
10
+ ? await addThreadContext({
11
+ channel: channelName,
12
+ by: opts.as ?? "main",
13
+ thread: opts.thread,
14
+ context,
15
+ ...(scope !== undefined ? { scope } : {}),
16
+ origin: "cli",
17
+ })
18
+ : await addChannelContext({
19
+ channel: channelName,
20
+ by: opts.as ?? "main",
21
+ context,
22
+ ...(scope !== undefined ? { scope } : {}),
23
+ origin: "cli",
24
+ });
25
+ console.log(JSON.stringify(event));
26
+ }
27
+ export async function channelContextDelete(channelName, opts) {
28
+ const context = buildContextEntries(opts.file, opts.raw);
29
+ if (!context) {
30
+ throw new Error("Provide at least one --file <abs-path> or --raw <text>");
31
+ }
32
+ const scope = parseChannelScope(opts.scope);
33
+ const event = opts.thread
34
+ ? await deleteThreadContext({
35
+ channel: channelName,
36
+ by: opts.as ?? "main",
37
+ thread: opts.thread,
38
+ context,
39
+ ...(scope !== undefined ? { scope } : {}),
40
+ origin: "cli",
41
+ })
42
+ : await deleteChannelContext({
43
+ channel: channelName,
44
+ by: opts.as ?? "main",
45
+ context,
46
+ ...(scope !== undefined ? { scope } : {}),
47
+ origin: "cli",
48
+ });
49
+ console.log(JSON.stringify(event));
50
+ }
51
+ export async function channelContextList(channelName, opts) {
52
+ const scope = parseChannelScope(opts.scope);
53
+ const entries = opts.thread
54
+ ? await listThreadContext({
55
+ channel: channelName,
56
+ thread: opts.thread,
57
+ ...(scope !== undefined ? { scope } : {}),
58
+ })
59
+ : await listChannelContext({
60
+ channel: channelName,
61
+ ...(scope !== undefined ? { scope } : {}),
62
+ });
63
+ if (opts.raw) {
64
+ for (const entry of entries)
65
+ console.log(JSON.stringify(entry));
66
+ return;
67
+ }
68
+ if (entries.length === 0) {
69
+ console.log("(no context)");
70
+ return;
71
+ }
72
+ for (const entry of entries) {
73
+ if (entry.type === "file") {
74
+ console.log(`file ${entry.path}`);
75
+ }
76
+ else {
77
+ const oneLine = entry.text.replace(/\s+/g, " ").trim();
78
+ const display = oneLine.length > 200 ? `${oneLine.slice(0, 200)}…` : oneLine;
79
+ console.log(`raw ${display}`);
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/channel/context.ts"],"names":[],"mappings":"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"}
@@ -3,17 +3,24 @@ export interface CreateOptions {
3
3
  project?: string;
4
4
  labels?: string;
5
5
  cwd?: string;
6
+ scope?: string;
7
+ type?: string;
8
+ description?: string;
9
+ /** New canonical flag list. */
10
+ contextFile?: string[];
11
+ contextRaw?: string[];
12
+ /** Legacy aliases accepted while users migrate scripts. */
13
+ linkedContextFile?: string[];
14
+ linkedContextRaw?: string[];
6
15
  by?: string;
7
16
  force?: boolean;
8
- /** Mark this channel as ephemeral — `channel list` hides it by default
9
- * and `channel prune --ephemeral` will remove it. The channel
10
- * otherwise behaves identically (events.jsonl, workers, replay are
11
- * all the same); the flag is purely a lifecycle hint. */
12
17
  ephemeral?: boolean;
13
- /** What created this channel (e.g. `"run"` for `channel run`-spawned
14
- * ones, undefined for manual `channel create`). Lets consumers
15
- * distinguish "auto-cleanup-able one-shot" from "user marked
16
- * ephemeral on purpose". */
18
+ /**
19
+ * Optional mode marker for callers like `channel run` that produce
20
+ * one-shot channels. Stored as `meta.trellis.createMode` so the
21
+ * channel event keeps an `origin: "cli"` write entrypoint while still
22
+ * exposing the mode for downstream consumers.
23
+ */
17
24
  origin?: string;
18
25
  }
19
26
  export declare function createChannel(name: string, opts: CreateOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;8DAG0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;iCAG6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -1,110 +1,39 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { appendEvent } from "./store/events.js";
4
- import { channelDir, currentProjectKey, ensureBucketMarker, eventsPath, } from "./store/paths.js";
1
+ import { buildContextEntries, createChannel as coreCreateChannel, resolveChannelRef, } from "@mindfoldhq/trellis-core/channel";
2
+ import { parseChannelScope, parseChannelType, parseCsv, } from "./store/schema.js";
5
3
  export async function createChannel(name, opts) {
6
- const events = eventsPath(name);
7
- const dir = channelDir(name);
8
- if (fs.existsSync(events) && !opts.force) {
9
- throw new Error(`Channel '${name}' already exists at ${dir}. Use --force to overwrite.`);
10
- }
11
- if (opts.force && fs.existsSync(dir)) {
12
- await forceCleanChannel(name);
13
- }
14
- // Stamp the project bucket so future migrations and `listProjects`
15
- // recognise it (project key derives from the cwd at create time).
16
- ensureBucketMarker(currentProjectKey());
17
- const cwd = opts.cwd ?? process.cwd();
18
- const labels = opts.labels
19
- ? opts.labels
20
- .split(",")
21
- .map((l) => l.trim())
22
- .filter((l) => l.length > 0)
23
- : undefined;
24
- await appendEvent(name, {
25
- kind: "create",
4
+ const scope = parseChannelScope(opts.scope) ?? "project";
5
+ const channelType = parseChannelType(opts.type);
6
+ const context = buildContextEntries([...(opts.contextFile ?? []), ...(opts.linkedContextFile ?? [])], [...(opts.contextRaw ?? []), ...(opts.linkedContextRaw ?? [])]);
7
+ const labels = parseCsv(opts.labels);
8
+ const createMode = opts.origin;
9
+ const event = await coreCreateChannel({
10
+ channel: name,
26
11
  by: opts.by ?? "main",
27
- cwd,
12
+ scope,
13
+ type: channelType,
14
+ ...(opts.cwd ? { cwd: opts.cwd } : {}),
28
15
  ...(opts.task ? { task: opts.task } : {}),
29
16
  ...(opts.project ? { project: opts.project } : {}),
30
17
  ...(labels ? { labels } : {}),
18
+ ...(opts.description ? { description: opts.description } : {}),
19
+ ...(context ? { context } : {}),
31
20
  ...(opts.ephemeral ? { ephemeral: true } : {}),
32
- ...(opts.origin ? { origin: opts.origin } : {}),
21
+ ...(opts.force ? { force: true } : {}),
22
+ origin: "cli",
23
+ ...(createMode ? { meta: { trellis: { createMode } } } : {}),
33
24
  });
34
- console.log(`Created channel '${name}' at ${dir}`);
25
+ console.log(`Created channel '${name}' (${channelType}) at ${channelDirFromEvent(name, event.scope, opts.cwd)}`);
35
26
  if (opts.ephemeral) {
36
27
  process.stderr.write("ephemeral channel is hidden from `channel list`; use `channel list --all` or `channel prune --ephemeral`\n");
37
28
  }
38
29
  }
39
- /**
40
- * Full cleanup for `--force`: kill any live worker processes and remove
41
- * every per-worker file (pid / config / log / session-id / thread-id /
42
- * spawnlock), the channel lock, and events.jsonl. Leaves a clean directory
43
- * for the new create.
44
- *
45
- * SECURITY: only operates within `~/.trellis/channels/<name>/`. Resolves
46
- * `name` to an absolute path and refuses to descend outside that root.
47
- */
48
- async function forceCleanChannel(name) {
49
- const dir = channelDir(name);
50
- // Kill any live workers first (signal supervisor by pid; on failure,
51
- // still proceed — the worst case is an orphan process which won't see
52
- // the new channel anyway because pid files will be gone).
53
- let entries;
54
- try {
55
- entries = fs.readdirSync(dir);
56
- }
57
- catch {
58
- return; // nothing to clean
59
- }
60
- for (const f of entries) {
61
- if (!f.endsWith(".pid"))
62
- continue;
63
- const pidFile = path.join(dir, f);
64
- let pid = 0;
65
- try {
66
- pid = Number(fs.readFileSync(pidFile, "utf-8").trim());
67
- }
68
- catch {
69
- continue;
70
- }
71
- if (pid && pidAlive(pid)) {
72
- try {
73
- process.kill(pid, "SIGTERM");
74
- // Best-effort grace: poll up to 1.5s for it to exit.
75
- const deadline = Date.now() + 1500;
76
- while (pidAlive(pid) && Date.now() < deadline) {
77
- await sleep(50);
78
- }
79
- if (pidAlive(pid))
80
- process.kill(pid, "SIGKILL");
81
- }
82
- catch {
83
- // already dead
84
- }
85
- }
86
- }
87
- // Now remove the whole channel directory. The channel-level lock file,
88
- // worker pid/config/log/session-id/thread-id/spawnlock are all under
89
- // this root. `rmSync(recursive)` handles them in one go.
90
- try {
91
- fs.rmSync(dir, { recursive: true, force: true });
92
- }
93
- catch (err) {
94
- process.stderr.write(`[channel create --force] warning: failed to fully clean ${dir}: ${err instanceof Error ? err.message : err}\n`);
95
- }
96
- // appendEvent will recreate the directory via ensureChannelDir.
97
- }
98
- function pidAlive(pid) {
99
- try {
100
- process.kill(pid, 0);
101
- return true;
102
- }
103
- catch {
104
- return false;
105
- }
106
- }
107
- function sleep(ms) {
108
- return new Promise((r) => setTimeout(r, ms));
30
+ function channelDirFromEvent(name, scope, cwd) {
31
+ const ref = resolveChannelRef({
32
+ channel: name,
33
+ scope,
34
+ forCreate: true,
35
+ ...(cwd !== undefined ? { cwd } : {}),
36
+ });
37
+ return ref.dir;
109
38
  }
110
39
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/channel/create.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAugB7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAq0B7D"}