mainflow 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/facts.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as WORK_STATUS, C as SESSION_STATUS, D as TASK_REQUIRED_SECTIONS, E as SURVEY_SECTION, O as TASK_SECTIONS, Q as GRANT_TARGET_FORMS, T as SURVEY_LINES, X as GRANT_ACTIONS, Z as GRANT_FORMS, _ as MERGE_STATES, a as DECISION_SECTIONS, c as FINDING_SECTIONS, d as ID_PATTERNS, f as ISSUE_SECTIONS, g as MAINLINE_STATUS, h as MAINLINE_SECTIONS, i as DECISION_BASES, k as UNTIL_FORMS, l as FINDING_STATUS, m as LINK_RELS, n as CLOSED_STATUS, o as DECISION_STATUS, p as ISSUE_STATUS, r as DECIDERS, s as DEFAULT_CATEGORIES, t as CHECKLIST_REF, u as FORMAT_VERSION, v as PRIORITIES, w as SLUG, x as SERVES_REF } from "./dist-IdbnCDqM.js";
1
+ import { A as SURVEY_SECTION, D as SESSION_STATUS, M as TASK_SECTIONS, N as UNTIL_FORMS, O as SLUG, P as WORK_STATUS, S as PRIORITIES, T as SERVES_REF, _ as LINK_RELS, a as DECISION_SECTIONS, b as MAINLINE_STATUS, c as DEFAULT_ROLE, d as FORMAT_VERSION, f as GROUP_SECTIONS, g as ISSUE_STATUS, h as ISSUE_SECTIONS, i as DECISION_BASES, j as TASK_REQUIRED_SECTIONS, k as SURVEY_LINES, l as FINDING_SECTIONS, m as ID_PATTERNS, n as CLOSED_STATUS, nt as GRANT_FORMS, o as DECISION_STATUS, p as GROUP_STATUS, r as DECIDERS, rt as GRANT_TARGET_FORMS, s as DEFAULT_CATEGORIES, t as CHECKLIST_REF, tt as GRANT_ACTIONS, u as FINDING_STATUS, v as MAINLINE_ROLES, x as MERGE_STATES, y as MAINLINE_SECTIONS } from "./dist-BdvWGTsb.js";
2
2
  import { a as LABEL_ROLES, i as FINDING_SEVERITIES, n as FINDING_CLASSES, r as FINDING_FIELDS, t as FINDINGS_FENCE } from "./retro-formats-ECy0gGOL.js";
3
3
  //#region src/facts.ts
4
4
  const COMMAND_SPECS = {
@@ -96,7 +96,7 @@ const COMMAND_SPECS = {
96
96
  },
97
97
  "action set": {
98
98
  usage: "action set <a|session#a> [--status] [--reason --waiting-for --until] [--text] [--serves] [--before <a>] [--note <text>] [--session <session>]",
99
- summary: "Change, reorder or finish an action; --status blocked needs --reason, and leaving blocked clears it. --status doing reminds like action add. A handed-off action keeps its note",
99
+ summary: "Change, reorder or finish an action; --status blocked needs --reason, and leaving blocked clears it. --status doing reminds like action add and moves a planning mainline it serves to active. A handed-off action keeps its note",
100
100
  args: 1,
101
101
  needsHub: true
102
102
  },
@@ -114,8 +114,8 @@ const COMMAND_SPECS = {
114
114
  needsHub: false
115
115
  },
116
116
  "new mainline": {
117
- usage: "new mainline <slug> --title <title>",
118
- summary: "Create mainline.md with the next id and the section template; write the rest in the file",
117
+ usage: "new mainline <slug> --title <title> [--group <w>] [--role plan|impl] [--priority P0|P1|P2|P3]",
118
+ summary: "Create mainline.md with the next id and the section template; write the rest in the file. --group puts it in an existing group; --role plan makes it the mainline that splits the work, coordinates it and makes the final check (without --role it is an impl mainline)",
119
119
  args: 1,
120
120
  needsHub: true
121
121
  },
@@ -132,8 +132,8 @@ const COMMAND_SPECS = {
132
132
  needsHub: true
133
133
  },
134
134
  "new issue": {
135
- usage: "new issue <slug> --title <title> [--origin <ref>] [--labels a,b]",
136
- summary: "Create an issue file for a follow-up that must outlive its mainline",
135
+ usage: "new issue <slug> --title <title> [--origin <ref>] [--labels a,b] [--group <w>] [--priority P0|P1|P2|P3]",
136
+ summary: "Create an issue file for a follow-up that must outlive its mainline; --group puts it with the work it is taken up with",
137
137
  args: 1,
138
138
  needsHub: true
139
139
  },
@@ -143,9 +143,27 @@ const COMMAND_SPECS = {
143
143
  args: 1,
144
144
  needsHub: true
145
145
  },
146
+ "new group": {
147
+ usage: "new group <slug> --title <title> [--priority P0|P1|P2|P3] [--trigger <when>] [--origin <ref>] [--labels a,b]",
148
+ summary: "Create a group file for mainlines and issues taken up together, apart from dependencies; --trigger says when, e.g. \"量測修正時\". Members join with --group on new mainline, new issue, mainline set or issue set",
149
+ args: 1,
150
+ needsHub: true
151
+ },
152
+ "group set": {
153
+ usage: "group set <w> [--status open|done] [--priority P0|P1|P2|P3] [--trigger <when>] [--title <title>]",
154
+ summary: "Change a group's status, priority, trigger or title; an empty --trigger \"\" removes it. Relations between groups go in links in the file",
155
+ args: 1,
156
+ needsHub: true
157
+ },
158
+ "group list": {
159
+ usage: "group list [--all]",
160
+ summary: "List open groups by priority with their trigger and members, plan mainlines first (--all includes done groups)",
161
+ args: 0,
162
+ needsHub: true
163
+ },
146
164
  "mainline set": {
147
- usage: "mainline set <m> --status <status>",
148
- summary: "Change status; done needs every criterion met and no proposed decision",
165
+ usage: "mainline set <m> [--status <status>] [--group <w|none>] [--role plan|impl] [--priority P0|P1|P2|P3]",
166
+ summary: "Change status, group, role or priority; done needs every criterion met and no proposed decision. A planning mainline becomes active by itself when work on it starts, so use --status for paused, done and dropped. --group none leaves the group",
149
167
  args: 1,
150
168
  needsHub: true
151
169
  },
@@ -187,7 +205,7 @@ const COMMAND_SPECS = {
187
205
  },
188
206
  "task set": {
189
207
  usage: "task set <m/t> [--status] [--reason --waiting-for --signal] [--repo] [--branch --worktree --base --merge]",
190
- summary: "Change status, repository or branch state; --status blocked needs --reason",
208
+ summary: "Change status, repository or branch state; --status blocked needs --reason. --status doing also moves a planning mainline to active",
191
209
  args: 1,
192
210
  needsHub: true
193
211
  },
@@ -205,7 +223,7 @@ const COMMAND_SPECS = {
205
223
  },
206
224
  "item check": {
207
225
  usage: "item check <m/t#c> --evidence <evidence>",
208
- summary: "Check an item with evidence",
226
+ summary: "Check an item with evidence; also moves a planning mainline to active",
209
227
  args: 1,
210
228
  needsHub: true
211
229
  },
@@ -263,6 +281,12 @@ const COMMAND_SPECS = {
263
281
  args: 1,
264
282
  needsHub: true
265
283
  },
284
+ "issue set": {
285
+ usage: "issue set <i> [--group <w|none>] [--priority P0|P1|P2|P3]",
286
+ summary: "Put an issue in a group, or take it out with --group none, and change its priority",
287
+ args: 1,
288
+ needsHub: true
289
+ },
266
290
  "issue list": {
267
291
  usage: "issue list [--all]",
268
292
  summary: "List open and planned issues (--all includes closed)",
@@ -306,7 +330,7 @@ const COMMAND_SPECS = {
306
330
  needsHub: true
307
331
  },
308
332
  "section append": {
309
- usage: "section append <m|m/t|m/d|i|f> <heading> <text>",
333
+ usage: "section append <m|m/t|m/d|i|f|w> <heading> <text>",
310
334
  summary: "Add text at the end of a section of a document's body, such as a line under a task's 紀錄; two appends keep both, in order. The text is taken as written, even when it starts with \"-\"; a list line follows the list directly, other text comes after a blank line",
311
335
  args: 3,
312
336
  literalLast: true,
@@ -393,6 +417,10 @@ const OPTIONS = {
393
417
  affects: { type: "string" },
394
418
  origin: { type: "string" },
395
419
  labels: { type: "string" },
420
+ group: { type: "string" },
421
+ role: { type: "string" },
422
+ priority: { type: "string" },
423
+ trigger: { type: "string" },
396
424
  target: { type: "string" },
397
425
  op: { type: "string" },
398
426
  result: { type: "string" },
@@ -430,6 +458,7 @@ const STATUSES = {
430
458
  decision: DECISION_STATUS,
431
459
  issue: ISSUE_STATUS,
432
460
  finding: FINDING_STATUS,
461
+ group: GROUP_STATUS,
433
462
  session: SESSION_STATUS,
434
463
  merge: MERGE_STATES,
435
464
  decider: DECIDERS,
@@ -472,6 +501,11 @@ const REFERENCES = [
472
501
  format: "f{NNN}",
473
502
  example: "f001"
474
503
  },
504
+ {
505
+ target: "group",
506
+ format: "w{NNN}",
507
+ example: "w001"
508
+ },
475
509
  {
476
510
  target: "another hub",
477
511
  format: "{hub}:{reference}",
@@ -529,6 +563,7 @@ const LAYOUT = {
529
563
  task: ".mainflow/mainlines/m{NNN}-{slug}/tasks/t{NNN}-{slug}/task.md",
530
564
  issue: ".mainflow/issues/i{NNN}-{slug}.md",
531
565
  finding: ".mainflow/findings/f{NNN}-{slug}.md",
566
+ group: ".mainflow/groups/w{NNN}-{slug}.md",
532
567
  ops: ".mainflow/ops/{YYYY-MM}.log",
533
568
  sessions: ".mainflow/local/sessions/{sessionId}.yaml"
534
569
  };
@@ -540,6 +575,15 @@ const CLASSIFICATION = {
540
575
  priorities: PRIORITIES,
541
576
  defaultPriority: "P2"
542
577
  };
578
+ /**
579
+ * What a mainline is for: a plan mainline sizes the work, splits it into impl mainlines, coordinates them and makes
580
+ * the final check; an impl mainline carries a piece out. Without a role a mainline is `default`. A group needs no plan
581
+ * mainline: whether to open one, and how many impl mainlines, follows from how big the work is.
582
+ */
583
+ const ROLES = {
584
+ values: MAINLINE_ROLES,
585
+ default: DEFAULT_ROLE
586
+ };
543
587
  /** Body sections each document is created with; the task sections in `taskRequired` must be filled while it is open. */
544
588
  const SECTIONS = {
545
589
  mainline: MAINLINE_SECTIONS,
@@ -547,7 +591,8 @@ const SECTIONS = {
547
591
  taskRequired: TASK_REQUIRED_SECTIONS,
548
592
  decision: DECISION_SECTIONS,
549
593
  issue: ISSUE_SECTIONS,
550
- finding: FINDING_SECTIONS
594
+ finding: FINDING_SECTIONS,
595
+ group: GROUP_SECTIONS
551
596
  };
552
597
  /**
553
598
  * The mainline section that records what was checked before tasks were written, one `- {label}:{text}`
@@ -609,6 +654,8 @@ const LIST_ITEM = [
609
654
  const FIELDS = {
610
655
  mainline: [
611
656
  ...shared(...EVERY),
657
+ field("group", false, "所屬的組 w{NNN},一條主脈絡最多一組;組和依賴無關"),
658
+ field("role", false, "plan 是拆分顆粒、整合調度與最終確認的規劃型,impl 是執行的實作型;沒填視為 impl"),
612
659
  field("due", false, "預計完成的日期"),
613
660
  field("archivedAt", false, "封存的日期,和狀態分開"),
614
661
  field("criteria", true, "解決條件清單,每條的欄位見 criterion"),
@@ -643,6 +690,7 @@ const FIELDS = {
643
690
  ],
644
691
  issue: [
645
692
  ...shared(...EVERY),
693
+ field("group", false, "所屬的組 w{NNN},一筆待辦最多一組;同組的待辦在同一個時機一起做"),
646
694
  field("order", false, "待辦之間的順序"),
647
695
  field("due", false, "預計完成的日期"),
648
696
  field("plannedIn", false, "排進的任務,planned 時必填"),
@@ -654,6 +702,7 @@ const FIELDS = {
654
702
  field("reviewAfter", false, "到這天要重新確認它還成立"),
655
703
  field("archivedAt", false, "封存的日期,和狀態分開")
656
704
  ],
705
+ group: [...shared(...EVERY), field("trigger", false, "什麼時機做這組的事,一句話,例如「量測修正時」")],
657
706
  criterion: LIST_ITEM,
658
707
  checklistItem: [...LIST_ITEM, field("serves", false, "這個項目推進的解決條件,r{NNN} 清單")],
659
708
  grant: [
@@ -674,9 +723,9 @@ const FIELDS = {
674
723
  ],
675
724
  link: [
676
725
  field("rel", true, "關係類型:depends-on、relates、split-from,反向由讀者推出"),
677
- field("to", true, "對方的參照,不能在同一條主脈絡內;其他 hub 的加 {hub}: 前綴"),
726
+ field("to", true, "對方的參照,不能在同一條主脈絡內,也可以是組 w{NNN};其他 hub 的加 {hub}: 前綴"),
678
727
  field("note", false, "一句話說明這個關係")
679
728
  ]
680
729
  };
681
730
  //#endregion
682
- export { CHECKLIST_REF, CLASSIFICATION, CLOSED_STATUSES, COMMAND_SPECS, FIELDS, FORMAT_VERSION, GRANTS, ID_PATTERNS, LAYOUT, LINKS, OPTIONS, REFERENCES, RETRO_FORMATS, SECTIONS, SERVES_REF, SLUG, STATUSES, SURVEY, UNTIL };
731
+ export { CHECKLIST_REF, CLASSIFICATION, CLOSED_STATUSES, COMMAND_SPECS, FIELDS, FORMAT_VERSION, GRANTS, ID_PATTERNS, LAYOUT, LINKS, OPTIONS, REFERENCES, RETRO_FORMATS, ROLES, SECTIONS, SERVES_REF, SLUG, STATUSES, SURVEY, UNTIL };
@@ -1,4 +1,4 @@
1
- import "./index-ihgXABQc.js";
1
+ import "./index-DgYB5u1f.js";
2
2
  //#region ../schema/dist/grants.d.ts
3
3
  /** An operation about to run, resolved to what a grant is written against. */
4
4
  type GrantRequest = {
@@ -1,4 +1,4 @@
1
- import { Z as GRANT_FORMS } from "./dist-IdbnCDqM.js";
1
+ import { nt as GRANT_FORMS } from "./dist-BdvWGTsb.js";
2
2
  import { closeSync, constants, fstatSync, openSync, readFileSync, realpathSync } from "node:fs";
3
3
  import { isAbsolute, join, relative, resolve } from "node:path";
4
4
  import { spawnSync } from "node:child_process";
package/dist/hooks.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { a as Decision, d as OpsEntry, g as Task, i as ChecklistItem, l as Issue, m as Session, n as ActionBlock, s as Finding, t as Action, u as Mainline } from "./index-ihgXABQc.js";
1
+ import { _ as Task, a as Decision, c as Group, d as Mainline, f as OpsEntry, h as Session, i as ChecklistItem, n as ActionBlock, s as Finding, t as Action, u as Issue } from "./index-DgYB5u1f.js";
2
2
  import { z } from "zod";
3
3
  //#region ../core/dist/ids/allocators.d.ts
4
4
  /** The letters ids start with. */
5
- type IdPrefix = 'm' | 't' | 'd' | 'i' | 'f' | 'c' | 'r' | 'a';
5
+ type IdPrefix = 'm' | 't' | 'd' | 'i' | 'f' | 'w' | 'c' | 'r' | 'a';
6
6
  /** One id an operation needs. */
7
7
  interface IdRequest {
8
8
  prefix: IdPrefix;
@@ -121,17 +121,31 @@ declare function addHub(hub: HubReader, input: {
121
121
  interface MainlineInput {
122
122
  slug: string;
123
123
  title: string;
124
+ /** A group of this hub the mainline belongs to */
125
+ group?: string;
126
+ /** plan or impl; without one the mainline is an impl one */
127
+ role?: string;
128
+ priority?: string;
124
129
  }
125
130
  declare function createMainline(hub: HubReader, input: MainlineInput, ctx: OpContext): OpResult<{
126
131
  id: string;
127
132
  dir: string;
128
133
  }>;
129
- /** Move a mainline to another status; done is refused while criteria are open or decisions are proposed. */
130
- declare function setMainlineStatus(hub: HubReader, input: {
134
+ /** What `mainline set` changes; at least one. */
135
+ interface MainlinePatch {
131
136
  id: string;
132
- status: string;
137
+ status?: string;
138
+ /** A group of this hub, or `none` (null) to leave every group */
139
+ group?: string | null;
140
+ role?: string;
141
+ priority?: string;
133
142
  expectedVersion?: string;
134
- }, ctx: OpContext): OpResult<Mainline>;
143
+ }
144
+ /**
145
+ * Change a mainline's status, group, role or priority. Done is refused while criteria are open or decisions are
146
+ * proposed; the other fields change without conditions, in the same write.
147
+ */
148
+ declare function setMainline(hub: HubReader, input: MainlinePatch, ctx: OpContext): OpResult<Mainline>;
135
149
  /** Rename a mainline. References use its ID, so they keep resolving and show the new title. */
136
150
  declare function setMainlineTitle(hub: HubReader, input: {
137
151
  id: string;
@@ -272,10 +286,24 @@ interface HubItemInput {
272
286
  origin?: string;
273
287
  labels?: string[];
274
288
  }
275
- declare function createIssue(hub: HubReader, input: HubItemInput, ctx: OpContext): OpResult<{
289
+ declare function createIssue(hub: HubReader, input: HubItemInput & {
290
+ group?: string;
291
+ priority?: string;
292
+ }, ctx: OpContext): OpResult<{
276
293
  id: string;
277
294
  file: string;
278
295
  }>;
296
+ /** What `issue set` changes: the group the issue is taken up with and its priority; at least one. */
297
+ interface IssuePatch {
298
+ /** A group of this hub, or `none` (null) to leave every group */
299
+ group?: string | null;
300
+ priority?: string;
301
+ }
302
+ declare function setIssue(hub: HubReader, input: {
303
+ id: string;
304
+ patch: IssuePatch;
305
+ expectedVersion?: string;
306
+ }): OpResult<Issue>;
279
307
  /** Schedule an issue into the task that will carry it out. */
280
308
  declare function planIssue(hub: HubReader, input: {
281
309
  id: string;
@@ -312,6 +340,29 @@ declare function setFindingArchived(hub: HubReader, input: {
312
340
  archived: boolean;
313
341
  expectedVersion?: string;
314
342
  }, ctx: OpContext): OpResult<Finding>;
343
+ /**
344
+ * A group gathers mainlines and issues that are taken up together, apart from what depends on what. Its members name
345
+ * it in their own `group`, so creating a group writes only the group's file.
346
+ */
347
+ declare function createGroup(hub: HubReader, input: HubItemInput & {
348
+ priority?: string;
349
+ trigger?: string;
350
+ }, ctx: OpContext): OpResult<{
351
+ id: string;
352
+ file: string;
353
+ }>;
354
+ /** What `group set` changes; at least one. An empty trigger removes it. */
355
+ interface GroupPatch {
356
+ status?: string;
357
+ priority?: string;
358
+ trigger?: string;
359
+ title?: string;
360
+ }
361
+ declare function setGroup(hub: HubReader, input: {
362
+ id: string;
363
+ patch: GroupPatch;
364
+ expectedVersion?: string;
365
+ }, ctx: OpContext): OpResult<Group>;
315
366
  /** Append one external operation to ops/{YYYY-MM}.log; the log is never rewritten. `at` defaults to the context's time. */
316
367
  declare function appendOps(hub: HubReader, input: Omit<OpsEntry, 'at'> & {
317
368
  at?: string;
@@ -431,7 +482,7 @@ declare function updateAction(hub: HubReader, input: {
431
482
  * (`item check` and `item uncheck` send `item.check`, with done true or false). The operations no command sends
432
483
  * are listed in COMMANDLESS_OPERATIONS with who sends them.
433
484
  */
434
- declare const OPERATION_NAMES: readonly ['repo.add', 'hub.add', 'mainline.new', 'mainline.set', 'mainline.title', 'mainline.archive', 'criterion.add', 'criterion.check', 'criterion.set', 'task.new', 'task.set', 'item.add', 'item.check', 'item.drop', 'item.undrop', 'decision.new', 'decision.accept', 'decision.supersede', 'issue.new', 'issue.plan', 'issue.close', 'issue.reopen', 'issue.archive', 'finding.new', 'finding.set', 'finding.archive', 'ops.add', 'section.append', 'session.start', 'session.ensure', 'session.handoff', 'session.info', 'session.reminder', 'session.set', 'session.settle', 'session.archive', 'action.add', 'action.set', 'file.remove'];
485
+ declare const OPERATION_NAMES: readonly ['repo.add', 'hub.add', 'mainline.new', 'mainline.set', 'mainline.title', 'mainline.archive', 'criterion.add', 'criterion.check', 'criterion.set', 'task.new', 'task.set', 'item.add', 'item.check', 'item.drop', 'item.undrop', 'decision.new', 'decision.accept', 'decision.supersede', 'issue.new', 'issue.set', 'issue.plan', 'issue.close', 'issue.reopen', 'issue.archive', 'finding.new', 'finding.set', 'finding.archive', 'group.new', 'group.set', 'ops.add', 'section.append', 'session.start', 'session.ensure', 'session.handoff', 'session.info', 'session.reminder', 'session.set', 'session.settle', 'session.archive', 'action.add', 'action.set', 'file.remove'];
435
486
  type OperationName = (typeof OPERATION_NAMES)[number];
436
487
  //#endregion
437
488
  //#region ../core/dist/ops/operations.d.ts
@@ -445,7 +496,7 @@ declare const OPERATIONS: {
445
496
  readonly 'repo.add': typeof addRepo;
446
497
  readonly 'hub.add': typeof addHub;
447
498
  readonly 'mainline.new': typeof createMainline;
448
- readonly 'mainline.set': typeof setMainlineStatus;
499
+ readonly 'mainline.set': typeof setMainline;
449
500
  readonly 'mainline.title': typeof setMainlineTitle;
450
501
  readonly 'mainline.archive': typeof setMainlineArchived;
451
502
  readonly 'criterion.add': typeof addCriterion;
@@ -461,6 +512,7 @@ declare const OPERATIONS: {
461
512
  readonly 'decision.accept': typeof acceptDecision;
462
513
  readonly 'decision.supersede': typeof supersedeDecision;
463
514
  readonly 'issue.new': typeof createIssue;
515
+ readonly 'issue.set': typeof setIssue;
464
516
  readonly 'issue.plan': typeof planIssue;
465
517
  readonly 'issue.close': typeof closeIssue;
466
518
  readonly 'issue.reopen': typeof reopenIssue;
@@ -468,6 +520,8 @@ declare const OPERATIONS: {
468
520
  readonly 'finding.new': typeof createFinding;
469
521
  readonly 'finding.set': typeof setFindingStatus;
470
522
  readonly 'finding.archive': typeof setFindingArchived;
523
+ readonly 'group.new': typeof createGroup;
524
+ readonly 'group.set': typeof setGroup;
471
525
  readonly 'ops.add': typeof appendOps;
472
526
  readonly 'section.append': typeof appendSection;
473
527
  readonly 'session.start': typeof startSession;
package/dist/hooks.js CHANGED
@@ -1,6 +1,6 @@
1
- import { $ as describeRequest, j as configSchema } from "./dist-IdbnCDqM.js";
2
- import { D as endsWithMarker, E as decorateReply, H as loadHub, J as readYaml, O as headerLine, S as readSession, T as matchGrants, V as HubError, b as turnReminder, dt as findHubRoot, ft as worktreesOf, i as hostName, k as mayDecorate, mt as DATA_DIR, ut as currentBranch, w as grantScope, x as loadSessions, y as sessionBriefing } from "./host-79T-_NMu.js";
3
- import { n as hubWriter, r as writtenLines } from "./operation--fJnUqvA.js";
1
+ import { F as configSchema, it as describeRequest } from "./dist-BdvWGTsb.js";
2
+ import { A as mayDecorate, C as readSession, D as decorateReply, E as matchGrants, H as HubError, O as endsWithMarker, S as loadSessions, T as grantScope, W as loadHub, Z as readYaml, _t as DATA_DIR, b as sessionBriefing, ht as worktreesOf, i as hostName, k as headerLine, mt as findHubRoot, pt as currentBranch, x as turnReminder } from "./host-bnHYIwuY.js";
3
+ import { n as hubWriter, r as writtenLines } from "./operation-DVcJgKM9.js";
4
4
  import { resolveFixed, scanCommand, scopedCwd } from "./grant-commands.js";
5
5
  import { appendFileSync, existsSync, readFileSync } from "node:fs";
6
6
  import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";