@robbeverhelst/do 1.386.0 → 1.387.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.
Files changed (2) hide show
  1. package/dist/do.js +586 -83
  2. package/package.json +1 -1
package/dist/do.js CHANGED
@@ -14420,7 +14420,7 @@ var configError = (message) => new CliError("config", message, EXIT.CONFIG);
14420
14420
 
14421
14421
  // src/meta.ts
14422
14422
  var CLI_NAME = "do";
14423
- var VERSION = "1.386.0";
14423
+ var VERSION = "1.387.0";
14424
14424
  var API_PREFIX = "/api/v1";
14425
14425
  var DEFAULT_API_URL = "http://localhost:3001";
14426
14426
 
@@ -18033,7 +18033,8 @@ var habits = pgTable("habits", {
18033
18033
  eventMatch: text("event_match"),
18034
18034
  eventOffset: text("event_offset"),
18035
18035
  durationMinutes: integer2("duration_minutes"),
18036
- activeMonths: integer2("active_months").array()
18036
+ activeMonths: integer2("active_months").array(),
18037
+ checklist: boolean4("checklist").notNull().default(false)
18037
18038
  }, (t) => [
18038
18039
  index("habits_tenant_idx").on(t.tenantId),
18039
18040
  index("habits_tenant_area_idx").on(t.tenantId, t.areaId),
@@ -22025,8 +22026,36 @@ var animalOperations = defineOperations({
22025
22026
  }
22026
22027
  });
22027
22028
 
22028
- // ../../packages/schema/src/contracts/habit-sources.ts
22029
- var habitSourceSchema = _enum2(["manual", "google_fit", "strava", "github"]);
22029
+ // ../../packages/schema/src/db/habit-items.ts
22030
+ var habitItems = pgTable("habit_items", {
22031
+ id: text("id").primaryKey(),
22032
+ tenantId: text("tenant_id").notNull().references(() => tenants.id),
22033
+ habitId: text("habit_id").notNull().references(() => habits.id),
22034
+ title: text("title").notNull(),
22035
+ position: integer2("position").notNull().default(0),
22036
+ byDay: text("by_day").array(),
22037
+ timeOfDay: text("time_of_day"),
22038
+ archivedAt: timestamp("archived_at", { withTimezone: true }),
22039
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
22040
+ }, (t) => [
22041
+ index("habit_items_habit_idx").on(t.tenantId, t.habitId, t.position),
22042
+ check2("habit_items_time_of_day_chk", sql`${t.timeOfDay} IS NULL OR ${t.timeOfDay} IN ('morning', 'midday', 'evening')`)
22043
+ ]);
22044
+ var habitItemTicks = pgTable("habit_item_ticks", {
22045
+ id: text("id").primaryKey(),
22046
+ tenantId: text("tenant_id").notNull().references(() => tenants.id),
22047
+ habitId: text("habit_id").notNull().references(() => habits.id),
22048
+ itemId: text("item_id").notNull().references(() => habitItems.id),
22049
+ day: date5("day", { mode: "string" }).notNull(),
22050
+ tickedAt: timestamp("ticked_at", { withTimezone: true }).notNull().defaultNow(),
22051
+ source: habitEntrySource("source").notNull().default("manual"),
22052
+ userId: text("user_id"),
22053
+ agentId: text("agent_id"),
22054
+ routineRunStepId: text("routine_run_step_id")
22055
+ }, (t) => [
22056
+ uniqueIndex("habit_item_ticks_item_day_uniq").on(t.itemId, t.day),
22057
+ index("habit_item_ticks_habit_day_idx").on(t.tenantId, t.habitId, t.day)
22058
+ ]);
22030
22059
 
22031
22060
  // ../../packages/schema/src/contracts/recurrence.ts
22032
22061
  var recurrenceRuleSchema = createSelectSchema(recurrenceRules, {
@@ -22098,6 +22127,71 @@ var updateOccurrenceInputSchema = createUpdateSchema(occurrences, {
22098
22127
  occurrenceDate: exports_coerce.date().optional()
22099
22128
  }).pick({ occurrenceDate: true, status: true }).strict();
22100
22129
 
22130
+ // ../../packages/schema/src/contracts/habit-items.ts
22131
+ var civilDate = exports_iso.date();
22132
+ var habitItemTimeOfDaySchema = _enum2(["morning", "midday", "evening"]);
22133
+ var itemTitleSchema = string2().trim().min(1).max(120);
22134
+ var itemByDaySchema = array(byDayCodeSchema).min(1).max(7).refine((d) => new Set(d).size === d.length, "each weekday once");
22135
+ var habitItemSchema = createSelectSchema(habitItems, {
22136
+ byDay: array(string2()).nullable(),
22137
+ timeOfDay: string2().nullable(),
22138
+ archivedAt: exports_coerce.date().nullable(),
22139
+ createdAt: exports_coerce.date()
22140
+ });
22141
+ var habitItemTickSchema = createSelectSchema(habitItemTicks, {
22142
+ tickedAt: exports_coerce.date()
22143
+ });
22144
+ var createHabitItemInputSchema = object({
22145
+ id: ulidSchema,
22146
+ title: itemTitleSchema,
22147
+ byDay: itemByDaySchema.nullish(),
22148
+ timeOfDay: habitItemTimeOfDaySchema.nullish(),
22149
+ position: number2().int().min(0).optional()
22150
+ }).strict();
22151
+ var updateHabitItemInputSchema = object({
22152
+ title: itemTitleSchema.optional(),
22153
+ byDay: itemByDaySchema.nullish(),
22154
+ timeOfDay: habitItemTimeOfDaySchema.nullish()
22155
+ }).strict();
22156
+ var reorderHabitItemsInputSchema = object({
22157
+ ids: array(ulidSchema).min(1).max(100).refine((ids) => new Set(ids).size === ids.length, "each item once")
22158
+ }).strict();
22159
+ var habitItemTickInputSchema = object({ date: civilDate.optional() }).strict();
22160
+ var habitTickAllInputSchema = object({
22161
+ date: civilDate.optional(),
22162
+ except: array(ulidSchema).max(100).optional()
22163
+ }).strict();
22164
+ var habitChecklistQuerySchema = object({ date: civilDate.optional() });
22165
+ var habitItemTickedBySchema = object({
22166
+ source: _enum2(habitEntrySource.enumValues),
22167
+ userId: string2().nullable(),
22168
+ agentId: string2().nullable()
22169
+ });
22170
+ var habitChecklistItemSchema = object({
22171
+ id: ulidSchema,
22172
+ title: string2(),
22173
+ position: number2().int(),
22174
+ byDay: array(string2()).nullable(),
22175
+ timeOfDay: habitItemTimeOfDaySchema.nullable(),
22176
+ due: boolean2(),
22177
+ ticked: boolean2(),
22178
+ tickedAt: exports_coerce.date().nullable(),
22179
+ tickedBy: habitItemTickedBySchema.nullable()
22180
+ });
22181
+ var habitChecklistDaySchema = object({
22182
+ habitId: ulidSchema,
22183
+ date: civilDate,
22184
+ items: array(habitChecklistItemSchema),
22185
+ due: number2().int().min(0),
22186
+ ticked: number2().int().min(0),
22187
+ percent: number2().int().min(0).max(100),
22188
+ done: boolean2()
22189
+ });
22190
+ var habitItemListSchema = array(habitItemSchema);
22191
+
22192
+ // ../../packages/schema/src/contracts/habit-sources.ts
22193
+ var habitSourceSchema = _enum2(["manual", "google_fit", "strava", "github"]);
22194
+
22101
22195
  // ../../packages/schema/src/contracts/habits.ts
22102
22196
  var habitSchema = createSelectSchema(habits, {
22103
22197
  source: habitSourceSchema.default("manual"),
@@ -22113,7 +22207,8 @@ var habitSchema = createSelectSchema(habits, {
22113
22207
  eventMatch: string2().nullable().default(null),
22114
22208
  eventOffset: string2().nullable().default(null),
22115
22209
  durationMinutes: number2().int().nullable().default(null),
22116
- activeMonths: array(number2().int()).nullable().default(null)
22210
+ activeMonths: array(number2().int()).nullable().default(null),
22211
+ checklist: boolean2().default(false)
22117
22212
  });
22118
22213
  var habitEntrySchema = createSelectSchema(habitEntries, {
22119
22214
  occurredAt: exports_coerce.date(),
@@ -22181,11 +22276,13 @@ var createHabitInputSchema = createInsertSchema(habits, {
22181
22276
  dayTimes: weekdayTimesSchema.nullish(),
22182
22277
  remind: boolean2().optional(),
22183
22278
  durationMinutes: habitDurationMinutesSchema.nullish(),
22184
- activeMonths: habitActiveMonthsSchema.optional()
22279
+ activeMonths: habitActiveMonthsSchema.optional(),
22280
+ checklist: boolean2().optional()
22185
22281
  }).omit({ tenantId: true, recurrenceRuleId: true, retiredAt: true, ...eventColumns }).extend({
22186
22282
  title: string2().min(1),
22187
22283
  schedule: habitScheduleSchema.optional(),
22188
- displayKind: string2().min(1).nullish()
22284
+ displayKind: string2().min(1).nullish(),
22285
+ items: array(createHabitItemInputSchema).max(100).optional()
22189
22286
  });
22190
22287
  var updateHabitInputSchema = createUpdateSchema(habits, {
22191
22288
  source: habitSourceSchema.optional(),
@@ -22209,6 +22306,7 @@ var updateHabitInputSchema = createUpdateSchema(habits, {
22209
22306
  pausedFrom: true,
22210
22307
  pausedUntil: true,
22211
22308
  retiredAt: true,
22309
+ checklist: true,
22212
22310
  ...eventColumns
22213
22311
  }).extend({
22214
22312
  title: string2().min(1).optional(),
@@ -29676,12 +29774,12 @@ var foodDaySchema = object({
29676
29774
  meals: number2().int(),
29677
29775
  completeness: _enum2(FOOD_DAY_COMPLETENESS_VALUES)
29678
29776
  });
29679
- var civilDate = string2().regex(/^\d{4}-\d{2}-\d{2}$/, "a date is YYYY-MM-DD");
29680
- var foodDateSchema = civilDate;
29777
+ var civilDate2 = string2().regex(/^\d{4}-\d{2}-\d{2}$/, "a date is YYYY-MM-DD");
29778
+ var foodDateSchema = civilDate2;
29681
29779
  var mealLogListQuerySchema = object({ from: exports_coerce.date(), to: exports_coerce.date() }).refine((q) => q.from < q.to, { message: "from must be before to" }).refine((q) => q.to.getTime() - q.from.getTime() <= 92 * 24 * 60 * 60 * 1000, {
29682
29780
  message: "ask for at most 92 days"
29683
29781
  });
29684
- var foodDaysQuerySchema = object({ from: civilDate, to: civilDate }).refine((q) => q.from <= q.to, { message: "from must not be after to" });
29782
+ var foodDaysQuerySchema = object({ from: civilDate2, to: civilDate2 }).refine((q) => q.from <= q.to, { message: "from must not be after to" });
29685
29783
  var FOOD_AFTER_MARK_VALUES = ["tired", "symptom"];
29686
29784
  var plannedMealSchema = object({
29687
29785
  id: string2(),
@@ -29713,7 +29811,7 @@ var foodDayIntakeSchema = object({
29713
29811
  note: string2().nullable()
29714
29812
  });
29715
29813
  var foodDayViewSchema = object({
29716
- date: civilDate,
29814
+ date: civilDate2,
29717
29815
  logs: array(mealLogViewSchema),
29718
29816
  total: foodDaySchema.nullable(),
29719
29817
  planned: array(plannedMealSchema),
@@ -29725,7 +29823,7 @@ var MEAL_AFTER_KIND_VALUES = ["symptom", "episode", "dose", "sleep", "rating"];
29725
29823
  var mealAfterEntrySchema = object({
29726
29824
  kind: _enum2(MEAL_AFTER_KIND_VALUES),
29727
29825
  at: exports_coerce.date().nullable(),
29728
- day: civilDate.nullable(),
29826
+ day: civilDate2.nullable(),
29729
29827
  label: string2(),
29730
29828
  bodyRegion: bodyRegionSchema.nullable(),
29731
29829
  severity: number2().int().nullable(),
@@ -29757,7 +29855,7 @@ var mealContextSchema = object({
29757
29855
  triggerText: string2().nullable()
29758
29856
  }).nullable()
29759
29857
  });
29760
- var foodWeekQuerySchema = object({ start: civilDate.optional() });
29858
+ var foodWeekQuerySchema = object({ start: civilDate2.optional() });
29761
29859
  var foodWeekMealSchema = object({
29762
29860
  id: string2(),
29763
29861
  title: string2(),
@@ -29768,7 +29866,7 @@ var foodWeekMealSchema = object({
29768
29866
  marks: array(_enum2(FOOD_AFTER_MARK_VALUES))
29769
29867
  });
29770
29868
  var foodWeekDaySchema = object({
29771
- day: civilDate,
29869
+ day: civilDate2,
29772
29870
  total: foodDaySchema.nullable(),
29773
29871
  meals: array(foodWeekMealSchema),
29774
29872
  planned: object({ meals: number2().int(), kcal: number2().nullable() }),
@@ -29777,10 +29875,10 @@ var foodWeekDaySchema = object({
29777
29875
  });
29778
29876
  var FOOD_WEEK_READ_MAX = 2000;
29779
29877
  var writeFoodWeekReadInputSchema = object({
29780
- start: civilDate,
29878
+ start: civilDate2,
29781
29879
  body: string2().trim().min(1).max(FOOD_WEEK_READ_MAX)
29782
29880
  }).strict();
29783
- var foodWeekReadQuerySchema = object({ start: civilDate });
29881
+ var foodWeekReadQuerySchema = object({ start: civilDate2 });
29784
29882
  var foodWeekReadSchema = object({
29785
29883
  id: string2(),
29786
29884
  body: string2(),
@@ -29788,14 +29886,14 @@ var foodWeekReadSchema = object({
29788
29886
  updatedAt: exports_coerce.date()
29789
29887
  });
29790
29888
  var foodWeekSchema = object({
29791
- start: civilDate,
29792
- end: civilDate,
29889
+ start: civilDate2,
29890
+ end: civilDate2,
29793
29891
  week: number2().int(),
29794
29892
  days: array(foodWeekDaySchema),
29795
29893
  usualKcal: number2().nullable(),
29796
29894
  weight: object({
29797
- points: array(object({ day: civilDate, value: number2() })),
29798
- trend: array(object({ day: civilDate, value: number2() })),
29895
+ points: array(object({ day: civilDate2, value: number2() })),
29896
+ trend: array(object({ day: civilDate2, value: number2() })),
29799
29897
  latest: number2().nullable(),
29800
29898
  perWeek: number2().nullable(),
29801
29899
  source: metricSourceSchema.nullable()
@@ -29806,7 +29904,7 @@ var foodWeekSchema = object({
29806
29904
  averageProteinG: number2().nullable(),
29807
29905
  dinnersPlanned: number2().int(),
29808
29906
  dinnersAsPlanned: number2().int(),
29809
- dinnersNearBed: array(civilDate),
29907
+ dinnersNearBed: array(civilDate2),
29810
29908
  meals: number2().int(),
29811
29909
  tiredAfter: number2().int(),
29812
29910
  tiredAfterLunch: number2().int()
@@ -29863,13 +29961,13 @@ var foodPatternSideSchema = object({
29863
29961
  mean: number2().nullable()
29864
29962
  });
29865
29963
  var foodPatternWeekSchema = object({
29866
- start: civilDate,
29964
+ start: civilDate2,
29867
29965
  week: number2().int(),
29868
29966
  averageKcal: number2().nullable(),
29869
29967
  weightChange: number2().nullable()
29870
29968
  });
29871
29969
  var foodPatternDaySchema = object({
29872
- day: civilDate,
29970
+ day: civilDate2,
29873
29971
  with: boolean2(),
29874
29972
  hit: boolean2().nullable(),
29875
29973
  value: number2().nullable()
@@ -29897,7 +29995,7 @@ var proposeFoodTrialInputSchema = object({
29897
29995
  question: foodPatternQuestionSchema,
29898
29996
  title: string2().trim().min(1).max(120),
29899
29997
  note: string2().trim().min(1).max(FOOD_TRIAL_NOTE_MAX),
29900
- startsOn: civilDate,
29998
+ startsOn: civilDate2,
29901
29999
  days: number2().int().min(7).max(28).default(14)
29902
30000
  }).strict();
29903
30001
  var foodTrialSchema = object({
@@ -29906,15 +30004,15 @@ var foodTrialSchema = object({
29906
30004
  title: string2(),
29907
30005
  note: string2(),
29908
30006
  state: _enum2(["proposed", "running"]),
29909
- startsOn: civilDate,
29910
- endsOn: civilDate,
30007
+ startsOn: civilDate2,
30008
+ endsOn: civilDate2,
29911
30009
  days: number2().int(),
29912
30010
  day: number2().int().nullable(),
29913
30011
  author: _enum2(["me", "agent"])
29914
30012
  });
29915
30013
  var foodPatternsSchema = object({
29916
- from: civilDate,
29917
- to: civilDate,
30014
+ from: civilDate2,
30015
+ to: civilDate2,
29918
30016
  windowDays: number2().int().positive(),
29919
30017
  loggedDays: number2().int().nonnegative(),
29920
30018
  answers: array(foodPatternAnswerSchema),
@@ -31098,6 +31196,8 @@ var guestOperations = defineOperations({
31098
31196
  });
31099
31197
 
31100
31198
  // ../../packages/schema/src/operations/habits.ts
31199
+ var item = { itemId: "The item's ULID." };
31200
+ var notChecklist = "A habit that isn't a checklist answers 409.";
31101
31201
  var habitListQuery = habitListQuerySchema.extend(paginationQuerySchema.shape);
31102
31202
  var habitOperations = defineOperations({
31103
31203
  list: {
@@ -31411,6 +31511,133 @@ var habitOperations = defineOperations({
31411
31511
  errors: { 404: true },
31412
31512
  webhook: "habit.updated",
31413
31513
  operationId: "undo_habit_check_in"
31514
+ },
31515
+ listItems: {
31516
+ method: "get",
31517
+ path: "/habits/{id}/items",
31518
+ scopes: ["habits:read"],
31519
+ tag: "Habits",
31520
+ summary: "List a checklist habit's items",
31521
+ description: `A checklist habit is one habit made of small items; ticking them fills its day (6 of 9 is 67%). Its live items, in order, each with its weekdays (\`byDay\`, null = every day) and part of the day. ${notChecklist}`,
31522
+ status: 200,
31523
+ response: { description: "The items, in order." },
31524
+ errors: { 404: true, 409: true },
31525
+ operationId: "list_habit_items"
31526
+ },
31527
+ addItem: {
31528
+ method: "post",
31529
+ path: "/habits/{id}/items",
31530
+ scopes: ["habits:write"],
31531
+ tag: "Habits",
31532
+ summary: "Add an item to a checklist habit",
31533
+ description: `Body \`{ id, title, byDay?, timeOfDay?, position? }\`: the item goes last, or at \`position\`. Returns the items. ${notChecklist}`,
31534
+ body: createHabitItemInputSchema,
31535
+ status: 201,
31536
+ response: { description: "The items, in order." },
31537
+ errors: { 400: true, 404: true, 409: true },
31538
+ webhook: "habit.updated",
31539
+ operationId: "add_habit_item"
31540
+ },
31541
+ updateItem: {
31542
+ method: "patch",
31543
+ path: "/habits/{id}/items/{itemId}",
31544
+ pathParams: item,
31545
+ scopes: ["habits:write"],
31546
+ tag: "Habits",
31547
+ summary: "Rename an item or change when it's due",
31548
+ description: `Body \`{ title?, byDay?, timeOfDay? }\`; null clears its weekdays or part of the day. Returns the items. ${notChecklist}`,
31549
+ body: updateHabitItemInputSchema,
31550
+ status: 200,
31551
+ response: { description: "The items, in order." },
31552
+ errors: { 400: true, 404: true, 409: true },
31553
+ webhook: "habit.updated",
31554
+ operationId: "update_habit_item"
31555
+ },
31556
+ reorderItems: {
31557
+ method: "put",
31558
+ path: "/habits/{id}/items/order",
31559
+ scopes: ["habits:write"],
31560
+ tag: "Habits",
31561
+ summary: "Reorder a checklist habit's items",
31562
+ description: `Body \`{ ids }\`: every live item's id, once each, first to last (400 otherwise). Returns the items. ${notChecklist}`,
31563
+ body: reorderHabitItemsInputSchema,
31564
+ status: 200,
31565
+ response: { description: "The items, in order." },
31566
+ errors: { 400: true, 404: true, 409: true },
31567
+ webhook: "habit.updated",
31568
+ operationId: "reorder_habit_items"
31569
+ },
31570
+ archiveItem: {
31571
+ method: "delete",
31572
+ path: "/habits/{id}/items/{itemId}",
31573
+ pathParams: item,
31574
+ scopes: ["habits:write"],
31575
+ tag: "Habits",
31576
+ summary: "Remove an item from a checklist habit",
31577
+ description: `The item is archived, never deleted: the days it was ticked keep their count, and from today it's no longer due. Returns the items left. ${notChecklist}`,
31578
+ status: 200,
31579
+ response: { description: "The items left, in order." },
31580
+ errors: { 404: true, 409: true },
31581
+ webhook: "habit.updated",
31582
+ operationId: "remove_habit_item"
31583
+ },
31584
+ checklist: {
31585
+ method: "get",
31586
+ path: "/habits/{id}/checklist",
31587
+ scopes: ["habits:read"],
31588
+ tag: "Habits",
31589
+ summary: "A checklist habit's day",
31590
+ description: `The day's items (each due or not, ticked or not, when and by whom), how many are due and ticked, the percent (6 of 9 \u2192 67) and \`done\`. \`date\` (YYYY-MM-DD) defaults to today in the member's zone. The habit's own day value is this percent (target 100), so its streak counts a day at 100%. ${notChecklist}`,
31591
+ query: [{ name: "date", description: "The day (YYYY-MM-DD); today when absent." }],
31592
+ querySchema: habitChecklistQuerySchema,
31593
+ status: 200,
31594
+ response: { description: "The checklist on the day." },
31595
+ errors: { 400: true, 404: true, 409: true },
31596
+ operationId: "get_habit_checklist"
31597
+ },
31598
+ tickItem: {
31599
+ method: "post",
31600
+ path: "/habits/{id}/items/{itemId}/tick",
31601
+ pathParams: item,
31602
+ scopes: ["habits:write"],
31603
+ tag: "Habits",
31604
+ summary: "Tick an item",
31605
+ description: `Body \`{ date? }\` (today when absent). Ticking a ticked item changes nothing. An Agent's key ticks it as that Agent's. Returns the day; fires \`habit.updated\`. ${notChecklist}`,
31606
+ body: habitItemTickInputSchema,
31607
+ status: 200,
31608
+ response: { description: "The checklist on the day." },
31609
+ errors: { 400: true, 404: true, 409: true },
31610
+ webhook: "habit.updated",
31611
+ operationId: "tick_habit_item"
31612
+ },
31613
+ untickItem: {
31614
+ method: "post",
31615
+ path: "/habits/{id}/items/{itemId}/untick",
31616
+ pathParams: item,
31617
+ scopes: ["habits:write"],
31618
+ tag: "Habits",
31619
+ summary: "Untick an item",
31620
+ description: `Body \`{ date? }\` (today when absent): undo a tick. Returns the day; fires \`habit.updated\`. ${notChecklist}`,
31621
+ body: habitItemTickInputSchema,
31622
+ status: 200,
31623
+ response: { description: "The checklist on the day." },
31624
+ errors: { 400: true, 404: true, 409: true },
31625
+ webhook: "habit.updated",
31626
+ operationId: "untick_habit_item"
31627
+ },
31628
+ tickAll: {
31629
+ method: "post",
31630
+ path: "/habits/{id}/items/tick-all",
31631
+ scopes: ["habits:write"],
31632
+ tag: "Habits",
31633
+ summary: "Tick every item due",
31634
+ description: `"All": body \`{ date?, except? }\` ticks every item due on the day (today when absent) but the ones in \`except\`, which end up unticked: "all done except the water". Returns the day; fires \`habit.updated\`. ${notChecklist}`,
31635
+ body: habitTickAllInputSchema,
31636
+ status: 200,
31637
+ response: { description: "The checklist on the day." },
31638
+ errors: { 400: true, 404: true, 409: true },
31639
+ webhook: "habit.updated",
31640
+ operationId: "tick_all_habit_items"
31414
31641
  }
31415
31642
  });
31416
31643
 
@@ -35263,13 +35490,13 @@ var mailCampaignOperations = defineOperations({
35263
35490
 
35264
35491
  // ../../packages/schema/src/contracts/meal-plans.ts
35265
35492
  var mealPlanStateSchema = _enum2(MEAL_PLAN_STATES);
35266
- var civilDate2 = string2().regex(/^\d{4}-\d{2}-\d{2}$/, "a date is YYYY-MM-DD");
35493
+ var civilDate3 = string2().regex(/^\d{4}-\d{2}-\d{2}$/, "a date is YYYY-MM-DD");
35267
35494
  var weekMenuFields = {
35268
35495
  state: mealPlanStateSchema.optional(),
35269
35496
  cookUserId: ulidSchema.nullish(),
35270
35497
  company: string2().max(120).nullish(),
35271
35498
  leftoverPortions: number2().int().positive().nullish(),
35272
- leftoverEatBy: civilDate2.nullish(),
35499
+ leftoverEatBy: civilDate3.nullish(),
35273
35500
  leftoverFrozen: boolean2().optional(),
35274
35501
  eaterUserIds: array(ulidSchema).max(50).optional(),
35275
35502
  guests: number2().int().min(0).max(99).optional()
@@ -35333,10 +35560,10 @@ var mealPlanCookResultSchema = object({
35333
35560
  });
35334
35561
  var cookMealPlanInputSchema = object({
35335
35562
  leftoverPortions: number2().int().positive().nullish(),
35336
- leftoverEatBy: civilDate2.nullish()
35563
+ leftoverEatBy: civilDate3.nullish()
35337
35564
  }).strict();
35338
- var mealWeekQuerySchema = object({ start: civilDate2.optional() });
35339
- var acceptMealDraftInputSchema = object({ start: civilDate2 }).strict();
35565
+ var mealWeekQuerySchema = object({ start: civilDate3.optional() });
35566
+ var acceptMealDraftInputSchema = object({ start: civilDate3 }).strict();
35340
35567
  var mealWeekCookSchema = object({
35341
35568
  userId: string2(),
35342
35569
  name: string2(),
@@ -35355,7 +35582,7 @@ var mealWeekSlotSchema = object({
35355
35582
  time: string2().nullable()
35356
35583
  });
35357
35584
  var mealWeekDaySchema = object({
35358
- date: civilDate2,
35585
+ date: civilDate3,
35359
35586
  isToday: boolean2(),
35360
35587
  dinner: mealWeekSlotSchema.nullable(),
35361
35588
  lunch: mealWeekSlotSchema.nullable()
@@ -35364,19 +35591,19 @@ var mealWeekLeftoverSchema = object({
35364
35591
  mealPlanId: ulidSchema,
35365
35592
  title: string2(),
35366
35593
  portions: number2().int(),
35367
- cookedOn: civilDate2,
35368
- eatBy: civilDate2.nullable(),
35594
+ cookedOn: civilDate3,
35595
+ eatBy: civilDate3.nullable(),
35369
35596
  frozen: boolean2()
35370
35597
  });
35371
35598
  var mealWeekDraftDaySchema = object({
35372
- date: civilDate2,
35599
+ date: civilDate3,
35373
35600
  dinner: mealWeekSlotSchema.nullable(),
35374
35601
  why: string2().nullable()
35375
35602
  });
35376
35603
  var mealWeekSchema = object({
35377
35604
  week: number2().int().min(1).max(53),
35378
- start: civilDate2,
35379
- end: civilDate2,
35605
+ start: civilDate3,
35606
+ end: civilDate3,
35380
35607
  days: array(mealWeekDaySchema).length(7),
35381
35608
  summary: object({
35382
35609
  planned: number2().int().min(0),
@@ -41587,9 +41814,9 @@ var todayOperations = defineOperations({
41587
41814
  // ../../packages/schema/src/contracts/waste-calendar.ts
41588
41815
  var WASTE_KIND_VALUES = ["rest", "pmd", "paper", "garden", "glass", "other"];
41589
41816
  var wasteKindSchema = _enum2(WASTE_KIND_VALUES);
41590
- var civilDate3 = exports_iso.date();
41817
+ var civilDate4 = exports_iso.date();
41591
41818
  var wasteCollectionSchema = object({
41592
- date: civilDate3,
41819
+ date: civilDate4,
41593
41820
  kinds: array(wasteKindSchema).min(1),
41594
41821
  movedBy: string2().min(1).optional()
41595
41822
  });
@@ -49829,6 +50056,281 @@ var commands20 = [
49829
50056
  }
49830
50057
  ];
49831
50058
 
50059
+ // src/commands/habit-items.ts
50060
+ var DATE_FLAG = {
50061
+ name: "date",
50062
+ type: "string",
50063
+ description: "The day (YYYY-MM-DD); today in your zone when absent."
50064
+ };
50065
+ var WHEN_FLAGS = [
50066
+ {
50067
+ name: "on",
50068
+ type: "string",
50069
+ description: "Its weekdays, e.g. mo,we,fr; every day when absent."
50070
+ },
50071
+ {
50072
+ name: "part",
50073
+ type: "string",
50074
+ description: "Its part of the day: morning, midday or evening."
50075
+ }
50076
+ ];
50077
+ function itemWhenFromFlags(flags) {
50078
+ const out = {};
50079
+ const on = flagString(flags, "on");
50080
+ if (on !== undefined)
50081
+ out.byDay = on.split(",").map((d) => d.trim().toUpperCase().slice(0, 2)).filter(Boolean);
50082
+ if (flagBool(flags, "every-day"))
50083
+ out.byDay = null;
50084
+ const part = flagString(flags, "part");
50085
+ if (part !== undefined)
50086
+ out.timeOfDay = part === "any" ? null : part.trim().toLowerCase();
50087
+ return out;
50088
+ }
50089
+ function renderChecklist(data, mode) {
50090
+ const parsed = habitChecklistDaySchema.safeParse(data);
50091
+ if (!parsed.success)
50092
+ return renderRecord(data, mode);
50093
+ const day = parsed.data;
50094
+ const lines = day.items.map((i) => {
50095
+ const mark = i.ticked ? paint(mode, "green", "\u2713") : i.due ? "\xB7" : " ";
50096
+ const off = i.due ? "" : paint(mode, "dim", " (not due)");
50097
+ return `${mark} ${i.title}${off} ${paint(mode, "dim", i.id)}`;
50098
+ });
50099
+ lines.push(paint(mode, "dim", `${day.date}: ${day.ticked} of ${day.due}, ${day.percent}%${day.done ? ", done" : ""}`));
50100
+ return lines.join(`
50101
+ `);
50102
+ }
50103
+ function renderItems(data, mode) {
50104
+ const parsed = habitItemListSchema.safeParse(data);
50105
+ if (!parsed.success)
50106
+ return renderRecord(data, mode);
50107
+ if (parsed.data.length === 0)
50108
+ return "No items yet.";
50109
+ return parsed.data.map((i, n) => {
50110
+ const when = [i.byDay?.join(","), i.timeOfDay].filter(Boolean).join(" \xB7 ");
50111
+ return `${n + 1}. ${i.title}${when ? paint(mode, "dim", ` (${when})`) : ""} ${paint(mode, "dim", i.id)}`;
50112
+ }).join(`
50113
+ `);
50114
+ }
50115
+ var habitArg = { name: "id", required: true, description: "The checklist habit's ULID." };
50116
+ var itemArg = { name: "item-id", required: true, description: "The item's ULID." };
50117
+ var NOT_CHECKLIST = "A habit that isn't a checklist answers 409.";
50118
+ var commands21 = [
50119
+ {
50120
+ spec: {
50121
+ path: ["habit", "items"],
50122
+ summary: "List a checklist habit's items, in order.",
50123
+ args: [habitArg],
50124
+ flags: [],
50125
+ scopes: [...habitOperations.listItems.scopes],
50126
+ returns: "HabitItem[]",
50127
+ notes: `${routeOf(habitOperations.listItems)}. A checklist habit is one habit of small items; ticking them fills its day (6 of 9 is 67%). Make one with \`do habits create "<title>" --data '{"checklist":true,"items":[{"id":"<ulid>","title":"Item A"}]}'\`. ${NOT_CHECKLIST}`
50128
+ },
50129
+ run: async ({ args, requireClient }) => ({
50130
+ data: await requireClient().get(pathOf(habitOperations.listItems, { id: requireArg(args, 0, "habit id") })),
50131
+ render: renderItems
50132
+ })
50133
+ },
50134
+ {
50135
+ spec: {
50136
+ path: ["habit", "item", "add"],
50137
+ summary: "Add an item to a checklist habit.",
50138
+ args: [habitArg, { name: "title", required: true, description: "The item's title." }],
50139
+ flags: [
50140
+ ...WHEN_FLAGS,
50141
+ { name: "at", type: "string", description: "Its place, 1 first; last when absent." }
50142
+ ],
50143
+ scopes: [...habitOperations.addItem.scopes],
50144
+ returns: "HabitItem[]",
50145
+ notes: `${routeOf(habitOperations.addItem)}. e.g. \`do habit item add <id> "Morning glass of water" --part morning\`. ${NOT_CHECKLIST}`
50146
+ },
50147
+ run: async ({ args, flags, requireClient }) => {
50148
+ const id = requireArg(args, 0, "habit id");
50149
+ const title = args.slice(1).join(" ").trim();
50150
+ if (!title)
50151
+ throw usageError('habit item add needs a title, e.g. `do habit item add <id> "Item A"`');
50152
+ const at = flagString(flags, "at");
50153
+ const input = parseInput(createHabitItemInputSchema, {
50154
+ id: ulid3(),
50155
+ title,
50156
+ ...itemWhenFromFlags(flags),
50157
+ ...at !== undefined ? { position: Math.max(0, Number(at) - 1) } : {}
50158
+ });
50159
+ return {
50160
+ data: await requireClient().post(pathOf(habitOperations.addItem, { id }), input),
50161
+ render: renderItems
50162
+ };
50163
+ }
50164
+ },
50165
+ {
50166
+ spec: {
50167
+ path: ["habit", "item", "edit"],
50168
+ summary: "Rename an item or change when it's due.",
50169
+ args: [habitArg, itemArg],
50170
+ flags: [
50171
+ { name: "title", type: "string", description: "Its new title." },
50172
+ ...WHEN_FLAGS,
50173
+ { name: "every-day", type: "boolean", description: "Due every day again." }
50174
+ ],
50175
+ scopes: [...habitOperations.updateItem.scopes],
50176
+ returns: "HabitItem[]",
50177
+ notes: `${routeOf(habitOperations.updateItem)}. --part any clears its part of the day. ${NOT_CHECKLIST}`
50178
+ },
50179
+ run: async ({ args, flags, requireClient }) => {
50180
+ const id = requireArg(args, 0, "habit id");
50181
+ const itemId = requireArg(args, 1, "item id");
50182
+ const title = flagString(flags, "title");
50183
+ const input = parseInput(updateHabitItemInputSchema, {
50184
+ ...title !== undefined ? { title } : {},
50185
+ ...itemWhenFromFlags(flags)
50186
+ });
50187
+ if (Object.keys(input).length === 0)
50188
+ throw usageError("nothing to change \u2014 pass --title, --on, --every-day or --part");
50189
+ return {
50190
+ data: await requireClient().patch(pathOf(habitOperations.updateItem, { id, itemId }), input),
50191
+ render: renderItems
50192
+ };
50193
+ }
50194
+ },
50195
+ {
50196
+ spec: {
50197
+ path: ["habit", "item", "order"],
50198
+ summary: "Put a checklist habit's items in a new order.",
50199
+ args: [
50200
+ habitArg,
50201
+ { name: "item-ids", required: true, description: "Every item's ULID, first to last." }
50202
+ ],
50203
+ flags: [],
50204
+ scopes: [...habitOperations.reorderItems.scopes],
50205
+ returns: "HabitItem[]",
50206
+ notes: `${routeOf(habitOperations.reorderItems)}. Name every item on the list once (400 otherwise). ${NOT_CHECKLIST}`
50207
+ },
50208
+ run: async ({ args, requireClient }) => {
50209
+ const id = requireArg(args, 0, "habit id");
50210
+ const input = parseInput(reorderHabitItemsInputSchema, { ids: args.slice(1) });
50211
+ return {
50212
+ data: await requireClient().put(pathOf(habitOperations.reorderItems, { id }), input),
50213
+ render: renderItems
50214
+ };
50215
+ }
50216
+ },
50217
+ {
50218
+ spec: {
50219
+ path: ["habit", "item", "rm"],
50220
+ summary: "Remove an item from a checklist habit (archived; its past ticks keep counting).",
50221
+ args: [habitArg, itemArg],
50222
+ flags: [],
50223
+ scopes: [...habitOperations.archiveItem.scopes],
50224
+ returns: "HabitItem[]",
50225
+ notes: `${routeOf(habitOperations.archiveItem)}. ${NOT_CHECKLIST}`
50226
+ },
50227
+ run: async ({ args, requireClient }) => {
50228
+ const id = requireArg(args, 0, "habit id");
50229
+ const itemId = requireArg(args, 1, "item id");
50230
+ return {
50231
+ data: await requireClient().delete(pathOf(habitOperations.archiveItem, { id, itemId })),
50232
+ render: renderItems
50233
+ };
50234
+ }
50235
+ },
50236
+ {
50237
+ spec: {
50238
+ path: ["habit", "checklist"],
50239
+ summary: "A checklist habit's day: each item due and ticked, and the percent.",
50240
+ args: [habitArg],
50241
+ flags: [DATE_FLAG],
50242
+ scopes: [...habitOperations.checklist.scopes],
50243
+ returns: "HabitChecklistDay",
50244
+ notes: `${routeOf(habitOperations.checklist)}. The habit's day value is this percent (target 100). ${NOT_CHECKLIST}`
50245
+ },
50246
+ run: async ({ args, flags, requireClient }) => {
50247
+ const id = requireArg(args, 0, "habit id");
50248
+ const date = flagString(flags, "date");
50249
+ const q = date ? `?${new URLSearchParams({ date })}` : "";
50250
+ return {
50251
+ data: await requireClient().get(`${pathOf(habitOperations.checklist, { id })}${q}`),
50252
+ render: renderChecklist
50253
+ };
50254
+ }
50255
+ },
50256
+ {
50257
+ spec: {
50258
+ path: ["habit", "tick"],
50259
+ summary: "Tick an item of a checklist habit.",
50260
+ args: [habitArg, itemArg],
50261
+ flags: [DATE_FLAG],
50262
+ scopes: [...habitOperations.tickItem.scopes],
50263
+ returns: "HabitChecklistDay",
50264
+ notes: `${routeOf(habitOperations.tickItem)}. A ticked item stays ticked. An Agent's key ticks it as that Agent's. ${NOT_CHECKLIST}`
50265
+ },
50266
+ run: async ({ args, flags, requireClient }) => {
50267
+ const id = requireArg(args, 0, "habit id");
50268
+ const itemId = requireArg(args, 1, "item id");
50269
+ const input = parseInput(habitItemTickInputSchema, dateOf(flags));
50270
+ return {
50271
+ data: await requireClient().post(pathOf(habitOperations.tickItem, { id, itemId }), input),
50272
+ render: renderChecklist
50273
+ };
50274
+ }
50275
+ },
50276
+ {
50277
+ spec: {
50278
+ path: ["habit", "untick"],
50279
+ summary: "Untick an item of a checklist habit.",
50280
+ args: [habitArg, itemArg],
50281
+ flags: [DATE_FLAG],
50282
+ scopes: [...habitOperations.untickItem.scopes],
50283
+ returns: "HabitChecklistDay",
50284
+ notes: `${routeOf(habitOperations.untickItem)}. ${NOT_CHECKLIST}`
50285
+ },
50286
+ run: async ({ args, flags, requireClient }) => {
50287
+ const id = requireArg(args, 0, "habit id");
50288
+ const itemId = requireArg(args, 1, "item id");
50289
+ const input = parseInput(habitItemTickInputSchema, dateOf(flags));
50290
+ return {
50291
+ data: await requireClient().post(pathOf(habitOperations.untickItem, { id, itemId }), input),
50292
+ render: renderChecklist
50293
+ };
50294
+ }
50295
+ },
50296
+ {
50297
+ spec: {
50298
+ path: ["habit", "tick-all"],
50299
+ summary: 'Tick every item due ("All"), or all but some: "all done except one".',
50300
+ args: [habitArg],
50301
+ flags: [
50302
+ DATE_FLAG,
50303
+ {
50304
+ name: "except",
50305
+ type: "string",
50306
+ description: "Item ULIDs to leave unticked, comma-separated."
50307
+ }
50308
+ ],
50309
+ scopes: [...habitOperations.tickAll.scopes],
50310
+ returns: "HabitChecklistDay",
50311
+ notes: `${routeOf(habitOperations.tickAll)}. The items in --except end up unticked (unticked if they were). Find their ids with \`do habit checklist <id>\`. ${NOT_CHECKLIST}`
50312
+ },
50313
+ run: async ({ args, flags, requireClient }) => {
50314
+ const id = requireArg(args, 0, "habit id");
50315
+ const except = flagString(flags, "except");
50316
+ const input = parseInput(habitTickAllInputSchema, {
50317
+ ...dateOf(flags),
50318
+ ...except ? {
50319
+ except: except.split(",").map((s) => s.trim()).filter(Boolean)
50320
+ } : {}
50321
+ });
50322
+ return {
50323
+ data: await requireClient().post(pathOf(habitOperations.tickAll, { id }), input),
50324
+ render: renderChecklist
50325
+ };
50326
+ }
50327
+ }
50328
+ ];
50329
+ function dateOf(flags) {
50330
+ const date = flagString(flags, "date");
50331
+ return date ? { date } : {};
50332
+ }
50333
+
49832
50334
  // src/commands/habits.ts
49833
50335
  var SCHEDULE_FLAGS = [
49834
50336
  { name: "every-day", type: "boolean", description: "Due every day." },
@@ -49967,7 +50469,7 @@ function seasonFromFlags(flags) {
49967
50469
  const season = flagString(flags, "season");
49968
50470
  return season === undefined ? {} : { activeMonths: seasonFromFlag(season) };
49969
50471
  }
49970
- var commands21 = [
50472
+ var commands22 = [
49971
50473
  {
49972
50474
  spec: {
49973
50475
  path: ["habits", "create"],
@@ -51107,7 +51609,7 @@ function healthRecordHandlers() {
51107
51609
  }
51108
51610
  return out;
51109
51611
  }
51110
- var commands22 = pairCommands(HEALTH_COMMAND_SPECS, {
51612
+ var commands23 = pairCommands(HEALTH_COMMAND_SPECS, {
51111
51613
  ...healthRecordHandlers(),
51112
51614
  "health record": async ({ flags, requireClient }) => {
51113
51615
  const body = parseInput(logHealthInputSchema, readDataFlag(flags));
@@ -51377,7 +51879,7 @@ var commands22 = pairCommands(HEALTH_COMMAND_SPECS, {
51377
51879
  });
51378
51880
 
51379
51881
  // src/commands/house.ts
51380
- var commands23 = [
51882
+ var commands24 = [
51381
51883
  {
51382
51884
  spec: {
51383
51885
  path: ["house"],
@@ -51659,7 +52161,7 @@ function renderSorting(data, _mode) {
51659
52161
  ].join(`
51660
52162
  `);
51661
52163
  }
51662
- var commands24 = [
52164
+ var commands25 = [
51663
52165
  defineCommand({
51664
52166
  operation: inboxOperations.list,
51665
52167
  path: ["inbox"],
@@ -51751,7 +52253,7 @@ var commands24 = [
51751
52253
  ];
51752
52254
 
51753
52255
  // src/commands/incidents.ts
51754
- var commands25 = [
52256
+ var commands26 = [
51755
52257
  {
51756
52258
  spec: {
51757
52259
  path: ["incidents", "open"],
@@ -51980,7 +52482,7 @@ function journalDateArg(args, verb) {
51980
52482
  }
51981
52483
  return date;
51982
52484
  }
51983
- var commands26 = [
52485
+ var commands27 = [
51984
52486
  defineCommand({
51985
52487
  operation: journalOperations.day,
51986
52488
  path: ["journal", "day"],
@@ -52543,7 +53045,7 @@ function renderCreatedKey(data, mode) {
52543
53045
  ].join(`
52544
53046
  `);
52545
53047
  }
52546
- var commands27 = [
53048
+ var commands28 = [
52547
53049
  {
52548
53050
  spec: {
52549
53051
  path: ["keys", "list"],
@@ -52679,7 +53181,7 @@ var KIND_FLAG2 = {
52679
53181
  type: "string",
52680
53182
  description: "The kind of an unknown word (pages, eggs, health, note, or a word taught before); remembered for the Space."
52681
53183
  };
52682
- var commands28 = [
53184
+ var commands29 = [
52683
53185
  {
52684
53186
  spec: {
52685
53187
  path: ["log"],
@@ -52754,7 +53256,7 @@ var commands28 = [
52754
53256
  ];
52755
53257
 
52756
53258
  // src/commands/mail-campaigns.ts
52757
- var commands29 = [
53259
+ var commands30 = [
52758
53260
  {
52759
53261
  spec: {
52760
53262
  path: ["mail-campaigns", "list"],
@@ -53069,7 +53571,7 @@ async function serveMcp(io, target) {
53069
53571
  }
53070
53572
 
53071
53573
  // src/commands/mcp.ts
53072
- var commands30 = [
53574
+ var commands31 = [
53073
53575
  {
53074
53576
  spec: {
53075
53577
  path: ["mcp"],
@@ -53114,7 +53616,7 @@ var commands30 = [
53114
53616
  ];
53115
53617
 
53116
53618
  // src/commands/members.ts
53117
- var commands31 = [
53619
+ var commands32 = [
53118
53620
  {
53119
53621
  spec: {
53120
53622
  path: ["invite", "create"],
@@ -53239,7 +53741,7 @@ var commands31 = [
53239
53741
  ];
53240
53742
 
53241
53743
  // src/commands/metrics.ts
53242
- var commands32 = [
53744
+ var commands33 = [
53243
53745
  {
53244
53746
  spec: {
53245
53747
  path: ["metrics", "list"],
@@ -53367,7 +53869,7 @@ async function setModuleVisibility(args, requireClient, on) {
53367
53869
  render: renderRecord
53368
53870
  };
53369
53871
  }
53370
- var commands33 = [
53872
+ var commands34 = [
53371
53873
  {
53372
53874
  spec: {
53373
53875
  path: ["modules", "list"],
@@ -53596,7 +54098,7 @@ function shareFlag(flags) {
53596
54098
  function localMonth(now) {
53597
54099
  return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}`;
53598
54100
  }
53599
- var commands34 = [
54101
+ var commands35 = [
53600
54102
  defineCommand({
53601
54103
  operation: moneyOperations.listAccounts,
53602
54104
  path: ["money", "accounts"],
@@ -54765,7 +55267,7 @@ var commands34 = [
54765
55267
  ];
54766
55268
 
54767
55269
  // src/commands/notes.ts
54768
- var commands35 = [
55270
+ var commands36 = [
54769
55271
  {
54770
55272
  spec: {
54771
55273
  path: ["notes", "backlinks"],
@@ -54887,7 +55389,7 @@ var commands35 = [
54887
55389
  ];
54888
55390
 
54889
55391
  // src/commands/orca.ts
54890
- var commands36 = [
55392
+ var commands37 = [
54891
55393
  {
54892
55394
  spec: {
54893
55395
  path: ["orca", "list"],
@@ -55253,7 +55755,7 @@ function linkBody(args) {
55253
55755
  return parseInput(familyTreeLinkInputSchema, { kind, a: ref, b: other });
55254
55756
  throw usageError("the kind is parent, child or partner");
55255
55757
  }
55256
- var commands37 = [
55758
+ var commands38 = [
55257
55759
  {
55258
55760
  spec: {
55259
55761
  path: ["people", "propose"],
@@ -55942,7 +56444,7 @@ var commands37 = [
55942
56444
 
55943
56445
  // src/commands/places.ts
55944
56446
  import { readFileSync as readFileSync10 } from "fs";
55945
- var commands38 = [
56447
+ var commands39 = [
55946
56448
  {
55947
56449
  spec: {
55948
56450
  path: ["places", "import"],
@@ -55999,7 +56501,7 @@ async function planDecision({ args, requireClient }, verb) {
55999
56501
  render: renderPlan
56000
56502
  };
56001
56503
  }
56002
- var commands39 = [
56504
+ var commands40 = [
56003
56505
  {
56004
56506
  spec: {
56005
56507
  path: ["plans", "list"],
@@ -56226,7 +56728,7 @@ var commands39 = [
56226
56728
  ];
56227
56729
 
56228
56730
  // src/commands/presets.ts
56229
- var commands40 = [
56731
+ var commands41 = [
56230
56732
  {
56231
56733
  spec: {
56232
56734
  path: ["presets", "list"],
@@ -56323,7 +56825,7 @@ function renderReviewSummary(data, mode) {
56323
56825
  return out.join(`
56324
56826
  `);
56325
56827
  }
56326
- var commands41 = [
56828
+ var commands42 = [
56327
56829
  {
56328
56830
  spec: {
56329
56831
  path: ["progress"],
@@ -56532,7 +57034,7 @@ function renderUpdates(data, mode) {
56532
57034
  return updates.map((u) => updateLine(u, mode)).join(`
56533
57035
  `);
56534
57036
  }
56535
- var commands42 = [
57037
+ var commands43 = [
56536
57038
  defineCommand({
56537
57039
  operation: projectOperations.update,
56538
57040
  path: ["projects", "set"],
@@ -57129,7 +57631,7 @@ var routineCommands = [
57129
57631
  }
57130
57632
  }
57131
57633
  ];
57132
- var commands43 = [
57634
+ var commands44 = [
57133
57635
  ...routineCommands,
57134
57636
  {
57135
57637
  spec: {
@@ -57252,7 +57754,7 @@ var commands43 = [
57252
57754
  ];
57253
57755
 
57254
57756
  // src/commands/rsvp-answers.ts
57255
- var commands44 = [
57757
+ var commands45 = [
57256
57758
  {
57257
57759
  spec: {
57258
57760
  path: ["rsvp-answers", "list"],
@@ -57306,7 +57808,7 @@ var commands44 = [
57306
57808
  ];
57307
57809
 
57308
57810
  // src/commands/rsvp-links.ts
57309
- var commands45 = [
57811
+ var commands46 = [
57310
57812
  {
57311
57813
  spec: {
57312
57814
  path: ["rsvp-links", "list"],
@@ -57402,7 +57904,7 @@ var commands45 = [
57402
57904
  ];
57403
57905
 
57404
57906
  // src/commands/rsvp-questions.ts
57405
- var commands46 = [
57907
+ var commands47 = [
57406
57908
  {
57407
57909
  spec: {
57408
57910
  path: ["rsvp-questions", "presets"],
@@ -57974,7 +58476,7 @@ function sessionFlags(flags) {
57974
58476
  body.occurredOn = on;
57975
58477
  return body;
57976
58478
  }
57977
- var commands47 = [
58479
+ var commands48 = [
57978
58480
  {
57979
58481
  spec: {
57980
58482
  path: ["runs", "change"],
@@ -58291,7 +58793,7 @@ var commands47 = [
58291
58793
  ];
58292
58794
 
58293
58795
  // src/commands/search.ts
58294
- var commands48 = [
58796
+ var commands49 = [
58295
58797
  {
58296
58798
  spec: {
58297
58799
  path: ["search"],
@@ -58324,7 +58826,7 @@ var commands48 = [
58324
58826
  ];
58325
58827
 
58326
58828
  // src/commands/seating-proposals.ts
58327
- var commands49 = [
58829
+ var commands50 = [
58328
58830
  {
58329
58831
  spec: {
58330
58832
  path: ["seating-proposals", "list"],
@@ -58411,7 +58913,7 @@ var commands49 = [
58411
58913
  ];
58412
58914
 
58413
58915
  // src/commands/sensors.ts
58414
- var commands50 = [
58916
+ var commands51 = [
58415
58917
  {
58416
58918
  spec: {
58417
58919
  path: ["sensors", "status"],
@@ -58571,7 +59073,7 @@ var commands50 = [
58571
59073
  ];
58572
59074
 
58573
59075
  // src/commands/settings.ts
58574
- var commands51 = [
59076
+ var commands52 = [
58575
59077
  {
58576
59078
  spec: {
58577
59079
  path: ["settings", "get"],
@@ -58605,7 +59107,7 @@ var commands51 = [
58605
59107
  ];
58606
59108
 
58607
59109
  // src/commands/sharing.ts
58608
- var commands52 = [
59110
+ var commands53 = [
58609
59111
  {
58610
59112
  spec: {
58611
59113
  path: ["share"],
@@ -58738,7 +59240,7 @@ var commands52 = [
58738
59240
  ];
58739
59241
 
58740
59242
  // src/commands/space.ts
58741
- var commands53 = [
59243
+ var commands54 = [
58742
59244
  {
58743
59245
  spec: {
58744
59246
  path: ["space", "address"],
@@ -58794,7 +59296,7 @@ var commands53 = [
58794
59296
  ];
58795
59297
 
58796
59298
  // src/commands/tap-tags.ts
58797
- var commands54 = [
59299
+ var commands55 = [
58798
59300
  {
58799
59301
  spec: {
58800
59302
  path: ["tap-tags", "tap"],
@@ -58822,7 +59324,7 @@ var BY = {
58822
59324
  type: "string",
58823
59325
  description: "The blocking task's ref (DO-147) or ULID."
58824
59326
  };
58825
- var commands55 = [
59327
+ var commands56 = [
58826
59328
  defineCommand({
58827
59329
  operation: taskBlockOperations.addBlocker,
58828
59330
  path: ["tasks", "block"],
@@ -58888,7 +59390,7 @@ function renderSeries(data, mode) {
58888
59390
  }).join(`
58889
59391
  `);
58890
59392
  }
58891
- var commands56 = [
59393
+ var commands57 = [
58892
59394
  defineCommand({
58893
59395
  operation: taskSeriesOperations.make,
58894
59396
  path: ["tasks", "make-series"],
@@ -59043,7 +59545,7 @@ function repeatFromFlags(flags) {
59043
59545
  out.anchor = "from_completion";
59044
59546
  return out;
59045
59547
  }
59046
- var commands57 = [
59548
+ var commands58 = [
59047
59549
  {
59048
59550
  spec: {
59049
59551
  path: ["capture"],
@@ -59501,7 +60003,7 @@ var commands57 = [
59501
60003
  ];
59502
60004
 
59503
60005
  // src/commands/time-blocks.ts
59504
- var commands58 = [
60006
+ var commands59 = [
59505
60007
  {
59506
60008
  spec: {
59507
60009
  path: ["time-blocks", "record"],
@@ -59693,7 +60195,7 @@ function renderLandedCounts(data, mode) {
59693
60195
  return out.join(`
59694
60196
  `);
59695
60197
  }
59696
- var commands59 = [
60198
+ var commands60 = [
59697
60199
  {
59698
60200
  spec: {
59699
60201
  path: ["today"],
@@ -60065,7 +60567,7 @@ function renderViews(data, mode) {
60065
60567
  function renderView(data, mode) {
60066
60568
  return renderViews([data], mode);
60067
60569
  }
60068
- var commands60 = [
60570
+ var commands61 = [
60069
60571
  defineCommand({
60070
60572
  operation: workViewOperations.list,
60071
60573
  path: ["views", "list"],
@@ -60184,7 +60686,7 @@ var commands60 = [
60184
60686
  ];
60185
60687
 
60186
60688
  // src/commands/worktree-links.ts
60187
- var commands61 = [
60689
+ var commands62 = [
60188
60690
  {
60189
60691
  spec: {
60190
60692
  path: ["worktree-links", "list"],
@@ -60351,7 +60853,8 @@ var FEATURE_COMMANDS = [
60351
60853
  ...commands58,
60352
60854
  ...commands59,
60353
60855
  ...commands60,
60354
- ...commands61
60856
+ ...commands61,
60857
+ ...commands62
60355
60858
  ];
60356
60859
 
60357
60860
  // src/registry.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbeverhelst/do",
3
- "version": "1.386.0",
3
+ "version": "1.387.0",
4
4
  "private": false,
5
5
  "description": "do — the agent-drivable CLI over the public /api/v1 surface",
6
6
  "homepage": "https://github.com/robbeverhelst/do/tree/main/apps/cli",