@mindfoldhq/trellis 0.6.0-beta.12 → 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.
- package/dist/commands/channel/context.d.ts +16 -0
- package/dist/commands/channel/context.d.ts.map +1 -0
- package/dist/commands/channel/context.js +83 -0
- package/dist/commands/channel/context.js.map +1 -0
- package/dist/commands/channel/create.d.ts +10 -8
- package/dist/commands/channel/create.d.ts.map +1 -1
- package/dist/commands/channel/create.js +22 -97
- package/dist/commands/channel/create.js.map +1 -1
- package/dist/commands/channel/index.d.ts.map +1 -1
- package/dist/commands/channel/index.js +117 -12
- package/dist/commands/channel/index.js.map +1 -1
- package/dist/commands/channel/list.js +14 -16
- package/dist/commands/channel/list.js.map +1 -1
- package/dist/commands/channel/messages.js +8 -10
- package/dist/commands/channel/messages.js.map +1 -1
- package/dist/commands/channel/send.d.ts.map +1 -1
- package/dist/commands/channel/send.js +15 -28
- package/dist/commands/channel/send.js.map +1 -1
- package/dist/commands/channel/store/events.d.ts +28 -64
- package/dist/commands/channel/store/events.d.ts.map +1 -1
- package/dist/commands/channel/store/events.js +27 -48
- package/dist/commands/channel/store/events.js.map +1 -1
- package/dist/commands/channel/store/filter.d.ts +2 -32
- package/dist/commands/channel/store/filter.d.ts.map +1 -1
- package/dist/commands/channel/store/filter.js +1 -62
- package/dist/commands/channel/store/filter.js.map +1 -1
- package/dist/commands/channel/store/schema.d.ts +25 -34
- package/dist/commands/channel/store/schema.d.ts.map +1 -1
- package/dist/commands/channel/store/schema.js +25 -82
- package/dist/commands/channel/store/schema.js.map +1 -1
- package/dist/commands/channel/store/thread-state.d.ts +3 -17
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -1
- package/dist/commands/channel/store/thread-state.js +1 -66
- package/dist/commands/channel/store/thread-state.js.map +1 -1
- package/dist/commands/channel/text-body.d.ts +13 -0
- package/dist/commands/channel/text-body.d.ts.map +1 -0
- package/dist/commands/channel/text-body.js +47 -0
- package/dist/commands/channel/text-body.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +11 -0
- package/dist/commands/channel/threads.d.ts.map +1 -1
- package/dist/commands/channel/threads.js +56 -46
- package/dist/commands/channel/threads.js.map +1 -1
- package/dist/commands/channel/title.d.ts +12 -0
- package/dist/commands/channel/title.d.ts.map +1 -0
- package/dist/commands/channel/title.js +24 -0
- package/dist/commands/channel/title.js.map +1 -0
- package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +1 -2
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +5 -5
- package/dist/utils/task-json.d.ts +9 -42
- package/dist/utils/task-json.d.ts.map +1 -1
- package/dist/utils/task-json.js +8 -45
- package/dist/utils/task-json.js.map +1 -1
- package/package.json +9 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC"}
|
|
@@ -1,36 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
scope: ChannelScope;
|
|
19
|
-
project: string;
|
|
20
|
-
dir: string;
|
|
21
|
-
}
|
|
22
|
-
export interface ChannelMetadata {
|
|
23
|
-
type: ChannelType;
|
|
24
|
-
description?: string;
|
|
25
|
-
linkedContext?: LinkedContextEntry[];
|
|
26
|
-
labels?: string[];
|
|
27
|
-
}
|
|
28
|
-
export declare function parseChannelScope(v: string | undefined): ChannelScope | undefined;
|
|
29
|
-
export declare function parseChannelType(v: string | undefined): ChannelType;
|
|
30
|
-
export declare function parseThreadAction(v: string): ThreadAction;
|
|
31
|
-
export declare function normalizeThreadKey(v: string): string;
|
|
32
|
-
export declare function parseLinkedContext(files: string[] | undefined, raw: string[] | undefined): LinkedContextEntry[] | undefined;
|
|
1
|
+
/**
|
|
2
|
+
* Channel schema re-exports.
|
|
3
|
+
*
|
|
4
|
+
* Canonical source: `@mindfoldhq/trellis-core/channel`. This module is
|
|
5
|
+
* kept as a thin pass-through during the supervisor/wait migration so
|
|
6
|
+
* CLI runtime code (supervisor, spawn, kill, wait) can continue to
|
|
7
|
+
* import from a stable local path while command files migrate to the
|
|
8
|
+
* core public API directly.
|
|
9
|
+
*/
|
|
10
|
+
export { GLOBAL_PROJECT_KEY, CHANNEL_TYPES, THREAD_ACTIONS, parseChannelScope, parseChannelType, parseThreadAction, normalizeThreadKey, asStringArray, asContextEntries, buildContextEntries, } from "@mindfoldhq/trellis-core/channel";
|
|
11
|
+
export type { ChannelScope, ChannelType, ChannelRef, ChannelMetadata, ContextEntry, FileContextEntry, RawContextEntry, ThreadAction, EventOrigin, } from "@mindfoldhq/trellis-core/channel";
|
|
12
|
+
import type { ContextEntry } from "@mindfoldhq/trellis-core/channel";
|
|
13
|
+
/**
|
|
14
|
+
* CSV parser kept colocated with the schema for CLI command files that
|
|
15
|
+
* trim comma-separated label / target lists. Pure helper — does not
|
|
16
|
+
* touch the channel store.
|
|
17
|
+
*/
|
|
33
18
|
export declare function parseCsv(value: string | undefined): string[] | undefined;
|
|
34
|
-
|
|
35
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Legacy alias accepted by CLI flag parsers — old code calls this when
|
|
21
|
+
* processing `--linked-context-file` / `--linked-context-raw`. New code
|
|
22
|
+
* uses {@link buildContextEntries} directly.
|
|
23
|
+
*
|
|
24
|
+
* @deprecated Use buildContextEntries.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseLinkedContext(files: string[] | undefined, raw: string[] | undefined): ContextEntry[] | undefined;
|
|
36
27
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,WAAW,GACZ,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAMxE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,GACxB,YAAY,EAAE,GAAG,SAAS,CAE5B"}
|
|
@@ -1,66 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (v === undefined)
|
|
18
|
-
return undefined;
|
|
19
|
-
if (v !== "project" && v !== "global") {
|
|
20
|
-
throw new Error("Invalid --scope. Must be one of: project, global");
|
|
21
|
-
}
|
|
22
|
-
return v;
|
|
23
|
-
}
|
|
24
|
-
export function parseChannelType(v) {
|
|
25
|
-
if (v === undefined)
|
|
26
|
-
return "chat";
|
|
27
|
-
if (!CHANNEL_TYPES.has(v)) {
|
|
28
|
-
throw new Error("Invalid --type. Must be one of: chat, thread");
|
|
29
|
-
}
|
|
30
|
-
return v;
|
|
31
|
-
}
|
|
32
|
-
export function parseThreadAction(v) {
|
|
33
|
-
if (!THREAD_ACTIONS.has(v)) {
|
|
34
|
-
throw new Error(`Invalid thread action '${v}'. Must be one of: ${[...THREAD_ACTIONS].join(", ")}`);
|
|
35
|
-
}
|
|
36
|
-
return v;
|
|
37
|
-
}
|
|
38
|
-
export function normalizeThreadKey(v) {
|
|
39
|
-
const trimmed = v.trim();
|
|
40
|
-
if (!trimmed)
|
|
41
|
-
throw new Error("Thread key must not be empty");
|
|
42
|
-
if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {
|
|
43
|
-
throw new Error("Thread key may only contain letters, numbers, '.', '_' and '-'");
|
|
44
|
-
}
|
|
45
|
-
return trimmed;
|
|
46
|
-
}
|
|
47
|
-
export function parseLinkedContext(files, raw) {
|
|
48
|
-
const entries = [];
|
|
49
|
-
for (const file of files ?? []) {
|
|
50
|
-
const value = file.trim();
|
|
51
|
-
if (!path.isAbsolute(value)) {
|
|
52
|
-
throw new Error(`--linked-context-file must be absolute: ${file}`);
|
|
53
|
-
}
|
|
54
|
-
entries.push({ type: "file", path: value });
|
|
55
|
-
}
|
|
56
|
-
for (const text of raw ?? []) {
|
|
57
|
-
if (!text.trim()) {
|
|
58
|
-
throw new Error("--linked-context-raw must not be empty");
|
|
59
|
-
}
|
|
60
|
-
entries.push({ type: "raw", text });
|
|
61
|
-
}
|
|
62
|
-
return entries.length > 0 ? entries : undefined;
|
|
63
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Channel schema re-exports.
|
|
3
|
+
*
|
|
4
|
+
* Canonical source: `@mindfoldhq/trellis-core/channel`. This module is
|
|
5
|
+
* kept as a thin pass-through during the supervisor/wait migration so
|
|
6
|
+
* CLI runtime code (supervisor, spawn, kill, wait) can continue to
|
|
7
|
+
* import from a stable local path while command files migrate to the
|
|
8
|
+
* core public API directly.
|
|
9
|
+
*/
|
|
10
|
+
export { GLOBAL_PROJECT_KEY, CHANNEL_TYPES, THREAD_ACTIONS, parseChannelScope, parseChannelType, parseThreadAction, normalizeThreadKey, asStringArray, asContextEntries, buildContextEntries, } from "@mindfoldhq/trellis-core/channel";
|
|
11
|
+
import { buildContextEntries } from "@mindfoldhq/trellis-core/channel";
|
|
12
|
+
/**
|
|
13
|
+
* CSV parser kept colocated with the schema for CLI command files that
|
|
14
|
+
* trim comma-separated label / target lists. Pure helper — does not
|
|
15
|
+
* touch the channel store.
|
|
16
|
+
*/
|
|
64
17
|
export function parseCsv(value) {
|
|
65
18
|
const out = value
|
|
66
19
|
?.split(",")
|
|
@@ -68,24 +21,14 @@ export function parseCsv(value) {
|
|
|
68
21
|
.filter(Boolean);
|
|
69
22
|
return out && out.length > 0 ? out : undefined;
|
|
70
23
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (!entry || typeof entry !== "object")
|
|
81
|
-
return false;
|
|
82
|
-
const candidate = entry;
|
|
83
|
-
if (candidate.type === "file")
|
|
84
|
-
return typeof candidate.path === "string";
|
|
85
|
-
if (candidate.type === "raw")
|
|
86
|
-
return typeof candidate.text === "string";
|
|
87
|
-
return false;
|
|
88
|
-
});
|
|
89
|
-
return entries.length > 0 ? entries : undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Legacy alias accepted by CLI flag parsers — old code calls this when
|
|
26
|
+
* processing `--linked-context-file` / `--linked-context-raw`. New code
|
|
27
|
+
* uses {@link buildContextEntries} directly.
|
|
28
|
+
*
|
|
29
|
+
* @deprecated Use buildContextEntries.
|
|
30
|
+
*/
|
|
31
|
+
export function parseLinkedContext(files, raw) {
|
|
32
|
+
return buildContextEntries(files, raw);
|
|
90
33
|
}
|
|
91
34
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/schema.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAc1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGvE;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAyB;IAChD,MAAM,GAAG,GAAG,KAAK;QACf,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA2B,EAC3B,GAAyB;IAEzB,OAAO,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1,19 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
thread: string;
|
|
5
|
-
title?: string;
|
|
6
|
-
status: string;
|
|
7
|
-
labels: string[];
|
|
8
|
-
assignees: string[];
|
|
9
|
-
description?: string;
|
|
10
|
-
linkedContext?: LinkedContextEntry[];
|
|
11
|
-
summary?: string;
|
|
12
|
-
openedAt?: string;
|
|
13
|
-
updatedAt?: string;
|
|
14
|
-
lastSeq: number;
|
|
15
|
-
comments: number;
|
|
16
|
-
}
|
|
17
|
-
export declare function reduceThreads(events: ChannelEvent[]): ThreadState[];
|
|
1
|
+
export { reduceThreads, buildThreadAliasResolver, collectThreadTimeline, } from "@mindfoldhq/trellis-core/channel";
|
|
2
|
+
export type { ThreadState, ThreadAliasResolver, } from "@mindfoldhq/trellis-core/channel";
|
|
3
|
+
import type { ThreadState } from "@mindfoldhq/trellis-core/channel";
|
|
18
4
|
export declare function formatThreadBoard(states: ThreadState[]): string[];
|
|
19
5
|
//# sourceMappingURL=thread-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-state.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/thread-state.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"thread-state.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/thread-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,WAAW,EACX,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAcjE"}
|
|
@@ -1,31 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { asLinkedContextEntries, asStringArray, } from "./schema.js";
|
|
3
|
-
export function reduceThreads(events) {
|
|
4
|
-
const states = new Map();
|
|
5
|
-
for (const ev of events) {
|
|
6
|
-
if (!isThreadEvent(ev))
|
|
7
|
-
continue;
|
|
8
|
-
const key = ev.thread;
|
|
9
|
-
const current = states.get(key) ??
|
|
10
|
-
{
|
|
11
|
-
thread: key,
|
|
12
|
-
status: "open",
|
|
13
|
-
labels: [],
|
|
14
|
-
assignees: [],
|
|
15
|
-
lastSeq: ev.seq,
|
|
16
|
-
comments: 0,
|
|
17
|
-
};
|
|
18
|
-
if (typeof ev.ts === "string")
|
|
19
|
-
current.updatedAt = ev.ts;
|
|
20
|
-
if (!current.openedAt && typeof ev.ts === "string") {
|
|
21
|
-
current.openedAt = ev.ts;
|
|
22
|
-
}
|
|
23
|
-
current.lastSeq = ev.seq;
|
|
24
|
-
applyThreadAction(current, ev);
|
|
25
|
-
states.set(key, current);
|
|
26
|
-
}
|
|
27
|
-
return [...states.values()].sort((a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? ""));
|
|
28
|
-
}
|
|
1
|
+
export { reduceThreads, buildThreadAliasResolver, collectThreadTimeline, } from "@mindfoldhq/trellis-core/channel";
|
|
29
2
|
export function formatThreadBoard(states) {
|
|
30
3
|
if (states.length === 0)
|
|
31
4
|
return ["(no threads)"];
|
|
@@ -40,42 +13,4 @@ export function formatThreadBoard(states) {
|
|
|
40
13
|
}),
|
|
41
14
|
];
|
|
42
15
|
}
|
|
43
|
-
function applyThreadAction(current, ev) {
|
|
44
|
-
switch (ev.action) {
|
|
45
|
-
case "opened":
|
|
46
|
-
current.status = typeof ev.status === "string" ? ev.status : "open";
|
|
47
|
-
if (typeof ev.title === "string")
|
|
48
|
-
current.title = ev.title;
|
|
49
|
-
if (typeof ev.description === "string") {
|
|
50
|
-
current.description = ev.description;
|
|
51
|
-
}
|
|
52
|
-
current.linkedContext =
|
|
53
|
-
asLinkedContextEntries(ev.linkedContext) ?? current.linkedContext;
|
|
54
|
-
current.labels = asStringArray(ev.labels) ?? current.labels;
|
|
55
|
-
current.assignees = asStringArray(ev.assignees) ?? current.assignees;
|
|
56
|
-
return;
|
|
57
|
-
case "comment":
|
|
58
|
-
current.comments += 1;
|
|
59
|
-
return;
|
|
60
|
-
case "status":
|
|
61
|
-
if (typeof ev.status === "string")
|
|
62
|
-
current.status = ev.status;
|
|
63
|
-
return;
|
|
64
|
-
case "labels":
|
|
65
|
-
current.labels = asStringArray(ev.labels) ?? current.labels;
|
|
66
|
-
return;
|
|
67
|
-
case "assignees":
|
|
68
|
-
current.assignees = asStringArray(ev.assignees) ?? current.assignees;
|
|
69
|
-
return;
|
|
70
|
-
case "summary":
|
|
71
|
-
if (typeof ev.summary === "string")
|
|
72
|
-
current.summary = ev.summary;
|
|
73
|
-
return;
|
|
74
|
-
case "processed":
|
|
75
|
-
current.status = typeof ev.status === "string" ? ev.status : "processed";
|
|
76
|
-
return;
|
|
77
|
-
default:
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
16
|
//# sourceMappingURL=thread-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-state.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/thread-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"thread-state.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/thread-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAS1C,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjD,OAAO;QACL,uBAAuB;QACvB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACtB,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,SAAS,GACb,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBACxB,CAAC,CAAC,cAAc,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC3C,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;QACvF,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ChannelTextBodyOptions {
|
|
2
|
+
text?: string;
|
|
3
|
+
stdin?: boolean;
|
|
4
|
+
textFile?: string;
|
|
5
|
+
}
|
|
6
|
+
interface ResolveChannelTextBodyOptions {
|
|
7
|
+
required: boolean;
|
|
8
|
+
missingMessage: string;
|
|
9
|
+
emptyMessage: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveChannelTextBody(opts: ChannelTextBodyOptions, resolveOpts: ResolveChannelTextBodyOptions): Promise<string | undefined>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=text-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-body.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/text-body.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,6BAA6B;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,sBAAsB,EAC5B,WAAW,EAAE,6BAA6B,GACzC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAU7B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
export async function resolveChannelTextBody(opts, resolveOpts) {
|
|
3
|
+
const raw = await readChannelTextBody(opts);
|
|
4
|
+
if (raw === undefined) {
|
|
5
|
+
if (resolveOpts.required)
|
|
6
|
+
throw new Error(resolveOpts.missingMessage);
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const text = raw.trimEnd();
|
|
10
|
+
if (!text)
|
|
11
|
+
throw new Error(resolveOpts.emptyMessage);
|
|
12
|
+
return text;
|
|
13
|
+
}
|
|
14
|
+
async function readChannelTextBody(opts) {
|
|
15
|
+
if (opts.text !== undefined && opts.text !== "")
|
|
16
|
+
return opts.text;
|
|
17
|
+
if (opts.textFile)
|
|
18
|
+
return fs.readFileSync(opts.textFile, "utf-8");
|
|
19
|
+
if (opts.stdin)
|
|
20
|
+
return await readStdin();
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
async function readStdin() {
|
|
24
|
+
return await new Promise((resolve, reject) => {
|
|
25
|
+
let buf = "";
|
|
26
|
+
const onData = (chunk) => {
|
|
27
|
+
buf += chunk.toString("utf-8");
|
|
28
|
+
};
|
|
29
|
+
const cleanup = () => {
|
|
30
|
+
process.stdin.off("data", onData);
|
|
31
|
+
process.stdin.off("end", onEnd);
|
|
32
|
+
process.stdin.off("error", onError);
|
|
33
|
+
};
|
|
34
|
+
const onEnd = () => {
|
|
35
|
+
cleanup();
|
|
36
|
+
resolve(buf);
|
|
37
|
+
};
|
|
38
|
+
const onError = (err) => {
|
|
39
|
+
cleanup();
|
|
40
|
+
reject(err);
|
|
41
|
+
};
|
|
42
|
+
process.stdin.on("data", onData);
|
|
43
|
+
process.stdin.once("end", onEnd);
|
|
44
|
+
process.stdin.once("error", onError);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=text-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-body.js","sourceRoot":"","sources":["../../../src/commands/channel/text-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAczB,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAA4B,EAC5B,WAA0C;IAE1C,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,IAA4B;IAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,SAAS,EAAE,CAAC;IACzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;YACrC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,GAAU,EAAQ,EAAE;YACnC,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -4,12 +4,18 @@ export interface ThreadPostOptions {
|
|
|
4
4
|
thread?: string;
|
|
5
5
|
title?: string;
|
|
6
6
|
text?: string;
|
|
7
|
+
stdin?: boolean;
|
|
8
|
+
textFile?: string;
|
|
7
9
|
description?: string;
|
|
8
10
|
status?: string;
|
|
9
11
|
labels?: string;
|
|
10
12
|
assignees?: string;
|
|
11
13
|
summary?: string;
|
|
12
14
|
scope?: string;
|
|
15
|
+
/** New canonical flag list. */
|
|
16
|
+
contextFile?: string[];
|
|
17
|
+
contextRaw?: string[];
|
|
18
|
+
/** Legacy aliases accepted while users migrate scripts. */
|
|
13
19
|
linkedContextFile?: string[];
|
|
14
20
|
linkedContextRaw?: string[];
|
|
15
21
|
}
|
|
@@ -22,7 +28,12 @@ export interface ThreadShowOptions {
|
|
|
22
28
|
scope?: string;
|
|
23
29
|
raw?: boolean;
|
|
24
30
|
}
|
|
31
|
+
export interface ThreadRenameOptions {
|
|
32
|
+
as: string;
|
|
33
|
+
scope?: string;
|
|
34
|
+
}
|
|
25
35
|
export declare function channelThreadPost(channelName: string, opts: ThreadPostOptions): Promise<void>;
|
|
26
36
|
export declare function channelThreadsList(channelName: string, opts: ThreadsOptions): Promise<void>;
|
|
27
37
|
export declare function channelThreadShow(channelName: string, threadKey: string, opts: ThreadShowOptions): Promise<void>;
|
|
38
|
+
export declare function channelThreadRename(channelName: string, oldThread: string, newThread: string, opts: ThreadRenameOptions): Promise<void>;
|
|
28
39
|
//# sourceMappingURL=threads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+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;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
|
@@ -1,45 +1,47 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { formatThreadBoard
|
|
1
|
+
import { buildContextEntries, listThreads as coreListThreads, showThread as coreShowThread, postThread as corePostThread, reduceThreads, renameThread as coreRenameThread, } from "@mindfoldhq/trellis-core/channel";
|
|
2
|
+
import { parseChannelScope, parseThreadAction, } from "./store/schema.js";
|
|
3
|
+
import { parseCsv } from "./store/schema.js";
|
|
4
|
+
import { formatThreadBoard } from "./store/thread-state.js";
|
|
5
|
+
import { resolveChannelTextBody } from "./text-body.js";
|
|
5
6
|
export async function channelThreadPost(channelName, opts) {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const metadata = await readChannelMetadata(channelName, ref.project);
|
|
10
|
-
if (metadata.type !== "thread") {
|
|
11
|
-
throw new Error(`Channel '${channelName}' is type '${metadata.type}'. 'post' requires a thread channel.`);
|
|
7
|
+
const parsed = parseThreadAction(opts.action);
|
|
8
|
+
if (parsed === "rename") {
|
|
9
|
+
throw new Error("Use `trellis channel thread rename <channel> <old> <new>` instead of `post rename`.");
|
|
12
10
|
}
|
|
13
|
-
const action =
|
|
14
|
-
const
|
|
15
|
-
const linkedContext = parseLinkedContext(opts.linkedContextFile, opts.linkedContextRaw);
|
|
11
|
+
const action = parsed;
|
|
12
|
+
const context = buildContextEntries([...(opts.contextFile ?? []), ...(opts.linkedContextFile ?? [])], [...(opts.contextRaw ?? []), ...(opts.linkedContextRaw ?? [])]);
|
|
16
13
|
const labels = parseCsv(opts.labels);
|
|
17
14
|
const assignees = parseCsv(opts.assignees);
|
|
18
|
-
const
|
|
19
|
-
|
|
15
|
+
const text = await resolveChannelTextBody(opts, {
|
|
16
|
+
required: false,
|
|
17
|
+
missingMessage: "No text provided (use --text, --stdin, or --text-file)",
|
|
18
|
+
emptyMessage: "Empty thread event text",
|
|
19
|
+
});
|
|
20
|
+
const scope = parseChannelScope(opts.scope);
|
|
21
|
+
const event = await corePostThread({
|
|
22
|
+
channel: channelName,
|
|
20
23
|
by: opts.as,
|
|
21
24
|
action,
|
|
22
|
-
thread,
|
|
25
|
+
thread: opts.thread ?? "",
|
|
26
|
+
...(scope !== undefined ? { scope } : {}),
|
|
23
27
|
...(opts.title ? { title: opts.title } : {}),
|
|
24
|
-
...(
|
|
28
|
+
...(text !== undefined ? { text } : {}),
|
|
25
29
|
...(opts.description ? { description: opts.description } : {}),
|
|
26
30
|
...(opts.status ? { status: opts.status } : {}),
|
|
27
31
|
...(labels ? { labels } : {}),
|
|
28
32
|
...(assignees ? { assignees } : {}),
|
|
29
33
|
...(opts.summary ? { summary: opts.summary } : {}),
|
|
30
|
-
...(
|
|
31
|
-
|
|
34
|
+
...(context ? { context } : {}),
|
|
35
|
+
origin: "cli",
|
|
36
|
+
});
|
|
32
37
|
console.log(JSON.stringify(event));
|
|
33
38
|
}
|
|
34
39
|
export async function channelThreadsList(channelName, opts) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
throw new Error(`Channel '${channelName}' is type '${metadata.type}'. 'threads' requires a thread channel.`);
|
|
41
|
-
}
|
|
42
|
-
const states = reduceThreads(await readChannelEvents(channelName, ref.project)).filter((state) => (opts.status ? state.status === opts.status : true));
|
|
40
|
+
const scope = parseChannelScope(opts.scope);
|
|
41
|
+
const states = (await coreListThreads({
|
|
42
|
+
channel: channelName,
|
|
43
|
+
...(scope !== undefined ? { scope } : {}),
|
|
44
|
+
})).filter((state) => (opts.status ? state.status === opts.status : true));
|
|
43
45
|
if (opts.raw) {
|
|
44
46
|
for (const state of states)
|
|
45
47
|
console.log(JSON.stringify(state));
|
|
@@ -49,22 +51,19 @@ export async function channelThreadsList(channelName, opts) {
|
|
|
49
51
|
console.log(line);
|
|
50
52
|
}
|
|
51
53
|
export async function channelThreadShow(channelName, threadKey, opts) {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
+
const scope = parseChannelScope(opts.scope);
|
|
55
|
+
const events = await coreShowThread({
|
|
56
|
+
channel: channelName,
|
|
57
|
+
thread: threadKey,
|
|
58
|
+
...(scope !== undefined ? { scope } : {}),
|
|
54
59
|
});
|
|
55
|
-
const metadata = await readChannelMetadata(channelName, ref.project);
|
|
56
|
-
if (metadata.type !== "thread") {
|
|
57
|
-
throw new Error(`Channel '${channelName}' is type '${metadata.type}'. 'thread' requires a thread channel.`);
|
|
58
|
-
}
|
|
59
|
-
const thread = normalizeThreadKey(threadKey);
|
|
60
|
-
const events = (await readChannelEvents(channelName, ref.project)).filter((ev) => isThreadEvent(ev) && ev.thread === thread);
|
|
61
60
|
if (opts.raw) {
|
|
62
61
|
for (const ev of events)
|
|
63
62
|
console.log(JSON.stringify(ev));
|
|
64
63
|
return;
|
|
65
64
|
}
|
|
66
65
|
if (events.length === 0) {
|
|
67
|
-
throw new Error(`Thread '${
|
|
66
|
+
throw new Error(`Thread '${threadKey}' not found in channel '${channelName}'`);
|
|
68
67
|
}
|
|
69
68
|
const state = reduceThreads(events)[0];
|
|
70
69
|
console.log(`${state.thread} [${state.status}] ${state.title ?? ""}`.trimEnd());
|
|
@@ -78,19 +77,30 @@ export async function channelThreadShow(channelName, threadKey, opts) {
|
|
|
78
77
|
if (state.summary)
|
|
79
78
|
console.log(`summary: ${state.summary}`);
|
|
80
79
|
for (const ev of events)
|
|
81
|
-
|
|
80
|
+
printTimelineEvent(ev);
|
|
82
81
|
}
|
|
83
|
-
function
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
export async function channelThreadRename(channelName, oldThread, newThread, opts) {
|
|
83
|
+
const scope = parseChannelScope(opts.scope);
|
|
84
|
+
const event = await coreRenameThread({
|
|
85
|
+
channel: channelName,
|
|
86
|
+
by: opts.as,
|
|
87
|
+
thread: oldThread,
|
|
88
|
+
newThread,
|
|
89
|
+
...(scope !== undefined ? { scope } : {}),
|
|
90
|
+
origin: "cli",
|
|
91
|
+
});
|
|
92
|
+
console.log(JSON.stringify(event));
|
|
89
93
|
}
|
|
90
|
-
function
|
|
94
|
+
function printTimelineEvent(ev) {
|
|
91
95
|
const ts = ev.ts.slice(0, 19).replace("T", " ");
|
|
96
|
+
if (ev.kind === "thread") {
|
|
97
|
+
const action = ev.action ?? "?";
|
|
98
|
+
const text = ev.text ? ` ${ev.text}` : "";
|
|
99
|
+
console.log(` ${ts} ${action} by=${ev.by}${text}`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// context event
|
|
92
103
|
const action = ev.action ?? "?";
|
|
93
|
-
|
|
94
|
-
console.log(` ${ts} ${action} by=${ev.by}${text}`);
|
|
104
|
+
console.log(` ${ts} context-${action} by=${ev.by}`);
|
|
95
105
|
}
|
|
96
106
|
//# sourceMappingURL=threads.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"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"}
|