@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.
- package/dist/do.js +586 -83
- 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.
|
|
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/
|
|
22029
|
-
var
|
|
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
|
|
29680
|
-
var foodDateSchema =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
29878
|
+
start: civilDate2,
|
|
29781
29879
|
body: string2().trim().min(1).max(FOOD_WEEK_READ_MAX)
|
|
29782
29880
|
}).strict();
|
|
29783
|
-
var foodWeekReadQuerySchema = object({ start:
|
|
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:
|
|
29792
|
-
end:
|
|
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:
|
|
29798
|
-
trend: array(object({ day:
|
|
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(
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
29910
|
-
endsOn:
|
|
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:
|
|
29917
|
-
to:
|
|
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
|
|
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:
|
|
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:
|
|
35563
|
+
leftoverEatBy: civilDate3.nullish()
|
|
35337
35564
|
}).strict();
|
|
35338
|
-
var mealWeekQuerySchema = object({ start:
|
|
35339
|
-
var acceptMealDraftInputSchema = object({ start:
|
|
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:
|
|
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:
|
|
35368
|
-
eatBy:
|
|
35594
|
+
cookedOn: civilDate3,
|
|
35595
|
+
eatBy: civilDate3.nullable(),
|
|
35369
35596
|
frozen: boolean2()
|
|
35370
35597
|
});
|
|
35371
35598
|
var mealWeekDraftDaySchema = object({
|
|
35372
|
-
date:
|
|
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:
|
|
35379
|
-
end:
|
|
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
|
|
41817
|
+
var civilDate4 = exports_iso.date();
|
|
41591
41818
|
var wasteCollectionSchema = object({
|
|
41592
|
-
date:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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