@hasna/todos 0.13.12 → 0.14.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/cli/commands/agent-commands.d.ts +39 -0
- package/dist/cli/commands/agent-commands.d.ts.map +1 -1
- package/dist/cli/commands/dispatch.d.ts.map +1 -1
- package/dist/cli/commands/project-commands.d.ts.map +1 -1
- package/dist/cli/commands/task-commands.d.ts.map +1 -1
- package/dist/cli/helpers.d.ts +64 -2
- package/dist/cli/helpers.d.ts.map +1 -1
- package/dist/cli/index.js +369 -58
- package/dist/contracts.js +11 -5
- package/dist/db/task-crud.d.ts.map +1 -1
- package/dist/index.js +16 -9
- package/dist/lib/enum-vocabulary.d.ts +72 -0
- package/dist/lib/enum-vocabulary.d.ts.map +1 -0
- package/dist/lib/saved-search-views.d.ts +12 -1
- package/dist/lib/saved-search-views.d.ts.map +1 -1
- package/dist/mcp/index.js +217 -27
- package/dist/mcp/tools/agents.d.ts.map +1 -1
- package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/registry.js +11 -5
- package/dist/release-provenance.json +5 -5
- package/dist/sdk/v1.generated.d.ts +2 -2
- package/dist/sdk/v1.generated.d.ts.map +1 -1
- package/dist/server/index.js +217 -27
- package/dist/server/openapi.d.ts +58 -0
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/v1.d.ts.map +1 -1
- package/dist/storage.js +12 -4
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/contracts.js
CHANGED
|
@@ -3430,6 +3430,9 @@ var init_machines = __esm(() => {
|
|
|
3430
3430
|
function isBlockingDependencyStatus(status) {
|
|
3431
3431
|
return status !== "completed" && status !== "cancelled";
|
|
3432
3432
|
}
|
|
3433
|
+
function isTerminalStatus(status) {
|
|
3434
|
+
return status === "completed" || status === "failed" || status === "cancelled";
|
|
3435
|
+
}
|
|
3433
3436
|
var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, TaskNotStartableError, TaskReferenceAmbiguousError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
|
|
3434
3437
|
var init_types = __esm(() => {
|
|
3435
3438
|
TASK_STATUSES = [
|
|
@@ -9286,11 +9289,13 @@ function updateTask(id, input, db) {
|
|
|
9286
9289
|
}
|
|
9287
9290
|
sets.push("status = ?");
|
|
9288
9291
|
params.push(input.status);
|
|
9292
|
+
if (isTerminalStatus(input.status)) {
|
|
9293
|
+
sets.push("locked_by = NULL");
|
|
9294
|
+
sets.push("locked_at = NULL");
|
|
9295
|
+
}
|
|
9289
9296
|
if (input.status === "completed") {
|
|
9290
9297
|
sets.push("completed_at = ?");
|
|
9291
9298
|
params.push(completionTimestamp);
|
|
9292
|
-
sets.push("locked_by = NULL");
|
|
9293
|
-
sets.push("locked_at = NULL");
|
|
9294
9299
|
} else if (task.status === "completed" && input.completed_at === undefined) {
|
|
9295
9300
|
sets.push("completed_at = NULL");
|
|
9296
9301
|
}
|
|
@@ -9414,6 +9419,7 @@ function updateTask(id, input, db) {
|
|
|
9414
9419
|
logTaskChange(id, "approve", "approved_by", null, input.approved_by, agentId, d);
|
|
9415
9420
|
const reopened = input.status !== undefined && input.status !== "completed" && task.status === "completed" && input.completed_at === undefined;
|
|
9416
9421
|
const completedNow = input.status === "completed";
|
|
9422
|
+
const terminalNow = input.status !== undefined && isTerminalStatus(input.status);
|
|
9417
9423
|
const updatedTask = {
|
|
9418
9424
|
...task,
|
|
9419
9425
|
...Object.fromEntries(Object.entries(input).filter(([, v]) => v !== undefined)),
|
|
@@ -9421,8 +9427,8 @@ function updateTask(id, input, db) {
|
|
|
9421
9427
|
metadata: input.metadata ?? task.metadata,
|
|
9422
9428
|
version: task.version + 1,
|
|
9423
9429
|
updated_at: timestamp2,
|
|
9424
|
-
locked_by:
|
|
9425
|
-
locked_at:
|
|
9430
|
+
locked_by: terminalNow ? null : task.locked_by,
|
|
9431
|
+
locked_at: terminalNow ? null : task.locked_at,
|
|
9426
9432
|
completed_at: completedNow ? completionTimestamp : reopened ? null : input.completed_at !== undefined ? input.completed_at : task.completed_at,
|
|
9427
9433
|
sla_minutes: input.sla_minutes !== undefined ? input.sla_minutes : task.sla_minutes,
|
|
9428
9434
|
actual_minutes: input.actual_minutes ?? task.actual_minutes,
|
|
@@ -12025,7 +12031,7 @@ var init_tasks = __esm(() => {
|
|
|
12025
12031
|
// package.json
|
|
12026
12032
|
var package_default = {
|
|
12027
12033
|
name: "@hasna/todos",
|
|
12028
|
-
version: "0.
|
|
12034
|
+
version: "0.14.0",
|
|
12029
12035
|
description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
|
|
12030
12036
|
type: "module",
|
|
12031
12037
|
main: "dist/index.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../src/db/task-crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,IAAI,EACJ,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../src/db/task-crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,IAAI,EACJ,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAY5F,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAS5C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAMjF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGlF;AAwCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAwFtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAK9D;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,iBAAiB,GAAG,IAAI,CA4D1B;AAQD,wBAAgB,SAAS,CAAC,MAAM,GAAE,UAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CA0JxE;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,GAAG,IAAI,CAKb;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,EACnC,EAAE,CAAC,EAAE,QAAQ,GACZ,6BAA6B,CAmD/B;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CA0HnG;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CA8PN;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAY7D"}
|
package/dist/index.js
CHANGED
|
@@ -3430,6 +3430,9 @@ var init_machines = __esm(() => {
|
|
|
3430
3430
|
function isBlockingDependencyStatus(status) {
|
|
3431
3431
|
return status !== "completed" && status !== "cancelled";
|
|
3432
3432
|
}
|
|
3433
|
+
function isTerminalStatus(status) {
|
|
3434
|
+
return status === "completed" || status === "failed" || status === "cancelled";
|
|
3435
|
+
}
|
|
3433
3436
|
var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, TaskNotStartableError, TaskReferenceAmbiguousError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
|
|
3434
3437
|
var init_types = __esm(() => {
|
|
3435
3438
|
TASK_STATUSES = [
|
|
@@ -9286,11 +9289,13 @@ function updateTask(id, input, db) {
|
|
|
9286
9289
|
}
|
|
9287
9290
|
sets.push("status = ?");
|
|
9288
9291
|
params.push(input.status);
|
|
9292
|
+
if (isTerminalStatus(input.status)) {
|
|
9293
|
+
sets.push("locked_by = NULL");
|
|
9294
|
+
sets.push("locked_at = NULL");
|
|
9295
|
+
}
|
|
9289
9296
|
if (input.status === "completed") {
|
|
9290
9297
|
sets.push("completed_at = ?");
|
|
9291
9298
|
params.push(completionTimestamp);
|
|
9292
|
-
sets.push("locked_by = NULL");
|
|
9293
|
-
sets.push("locked_at = NULL");
|
|
9294
9299
|
} else if (task.status === "completed" && input.completed_at === undefined) {
|
|
9295
9300
|
sets.push("completed_at = NULL");
|
|
9296
9301
|
}
|
|
@@ -9414,6 +9419,7 @@ function updateTask(id, input, db) {
|
|
|
9414
9419
|
logTaskChange(id, "approve", "approved_by", null, input.approved_by, agentId, d);
|
|
9415
9420
|
const reopened = input.status !== undefined && input.status !== "completed" && task.status === "completed" && input.completed_at === undefined;
|
|
9416
9421
|
const completedNow = input.status === "completed";
|
|
9422
|
+
const terminalNow = input.status !== undefined && isTerminalStatus(input.status);
|
|
9417
9423
|
const updatedTask = {
|
|
9418
9424
|
...task,
|
|
9419
9425
|
...Object.fromEntries(Object.entries(input).filter(([, v]) => v !== undefined)),
|
|
@@ -9421,8 +9427,8 @@ function updateTask(id, input, db) {
|
|
|
9421
9427
|
metadata: input.metadata ?? task.metadata,
|
|
9422
9428
|
version: task.version + 1,
|
|
9423
9429
|
updated_at: timestamp2,
|
|
9424
|
-
locked_by:
|
|
9425
|
-
locked_at:
|
|
9430
|
+
locked_by: terminalNow ? null : task.locked_by,
|
|
9431
|
+
locked_at: terminalNow ? null : task.locked_at,
|
|
9426
9432
|
completed_at: completedNow ? completionTimestamp : reopened ? null : input.completed_at !== undefined ? input.completed_at : task.completed_at,
|
|
9427
9433
|
sla_minutes: input.sla_minutes !== undefined ? input.sla_minutes : task.sla_minutes,
|
|
9428
9434
|
actual_minutes: input.actual_minutes ?? task.actual_minutes,
|
|
@@ -12138,7 +12144,7 @@ var init_dispatches = __esm(() => {
|
|
|
12138
12144
|
// package.json
|
|
12139
12145
|
var package_default = {
|
|
12140
12146
|
name: "@hasna/todos",
|
|
12141
|
-
version: "0.
|
|
12147
|
+
version: "0.14.0",
|
|
12142
12148
|
description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
|
|
12143
12149
|
type: "module",
|
|
12144
12150
|
main: "dist/index.js",
|
|
@@ -26735,9 +26741,11 @@ async function updateTask2(id, input, store) {
|
|
|
26735
26741
|
throw new Error(`Task ${id} version conflict: expected ${existing.version}, got ${input.version}`);
|
|
26736
26742
|
}
|
|
26737
26743
|
const reopened = existing.status === "completed" && input.status !== undefined && input.status !== "completed" && input.completed_at === undefined;
|
|
26744
|
+
const terminalNow = input.status !== undefined && isTerminalStatus(input.status);
|
|
26738
26745
|
const task2 = {
|
|
26739
26746
|
...existing,
|
|
26740
26747
|
...definedPatch(input),
|
|
26748
|
+
...terminalNow ? { locked_by: null, locked_at: null } : {},
|
|
26741
26749
|
version: existing.version + 1,
|
|
26742
26750
|
updated_at: new Date().toISOString(),
|
|
26743
26751
|
tags: input.tags ?? existing.tags,
|
|
@@ -48156,6 +48164,7 @@ function queryTasksByLocalFields(query, db) {
|
|
|
48156
48164
|
}
|
|
48157
48165
|
|
|
48158
48166
|
// src/lib/saved-search-views.ts
|
|
48167
|
+
var SAVED_SEARCH_SCOPES = ["all", "tasks", "projects", "plans", "runs", "comments"];
|
|
48159
48168
|
function parseFilters(value) {
|
|
48160
48169
|
if (!value)
|
|
48161
48170
|
return {};
|
|
@@ -48174,10 +48183,8 @@ function rowToSavedSearchView(row) {
|
|
|
48174
48183
|
};
|
|
48175
48184
|
}
|
|
48176
48185
|
function normalizeScope(scope) {
|
|
48177
|
-
|
|
48178
|
-
|
|
48179
|
-
}
|
|
48180
|
-
return "tasks";
|
|
48186
|
+
const candidate = (scope ?? "").trim().toLowerCase();
|
|
48187
|
+
return SAVED_SEARCH_SCOPES.includes(candidate) ? candidate : "tasks";
|
|
48181
48188
|
}
|
|
48182
48189
|
function normalizeName3(name) {
|
|
48183
48190
|
const normalized = name.trim();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closed-vocabulary (enum) value validation for CLI flags and API query params.
|
|
3
|
+
*
|
|
4
|
+
* Why this module exists
|
|
5
|
+
* ----------------------
|
|
6
|
+
* An unrecognised enum value used to flow straight into the storage filter, where
|
|
7
|
+
* it matched no rows. The command then printed "No tasks found." and exited 0 — a
|
|
8
|
+
* silent empty result set that reads as "there is no work here". `todos list
|
|
9
|
+
* --status open` (`open` is not in the vocabulary) reported zero tasks on a project
|
|
10
|
+
* that had 27, and that empty set was relayed to a human as fact.
|
|
11
|
+
*
|
|
12
|
+
* The rule this module enforces: an out-of-vocabulary value is an ERROR, never an
|
|
13
|
+
* empty result. Callers surface it non-zero (CLI) or as HTTP 400 (API).
|
|
14
|
+
*
|
|
15
|
+
* The vocabulary is ALWAYS supplied by the caller from the single exported source
|
|
16
|
+
* of truth (`TASK_STATUSES`, `TASK_PRIORITIES`, `PLAN_STATUSES`, `DISPATCH_STATUSES`
|
|
17
|
+
* in src/types/index.ts, or a subsystem's own exported constant). Nothing in this
|
|
18
|
+
* file re-types a vocabulary, so a value added to a constant is accepted here with
|
|
19
|
+
* no further edit.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Vocabulary members plausibly meant by `value`, nearest first.
|
|
23
|
+
*
|
|
24
|
+
* Deliberately conservative: a substring/prefix relation, or an edit distance
|
|
25
|
+
* within a third of the word's length. A wrong suggestion is worse than none,
|
|
26
|
+
* because the error already lists every valid value.
|
|
27
|
+
*/
|
|
28
|
+
export declare function suggestVocabularyMatches(value: string, vocabulary: readonly string[], limit?: number): string[];
|
|
29
|
+
export interface EnumVocabularySpec<T extends string> {
|
|
30
|
+
/** Flag or query-param name as the user typed it, e.g. "--status" or "status". */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
/** The single source of truth for this vocabulary. Never re-typed locally. */
|
|
33
|
+
readonly vocabulary: readonly T[];
|
|
34
|
+
/**
|
|
35
|
+
* Canonicalizer applied per element before the membership check — this is where
|
|
36
|
+
* documented aliases (`done` -> `completed`) and case folding live. Must be a
|
|
37
|
+
* pure string mapping; a value it does not recognise is returned unchanged so it
|
|
38
|
+
* still fails the membership check rather than being silently rewritten.
|
|
39
|
+
*/
|
|
40
|
+
readonly normalize?: (value: string) => string;
|
|
41
|
+
/**
|
|
42
|
+
* Remediation text for inputs that are NOT vocabulary members but that operators
|
|
43
|
+
* plausibly type, keyed by the normalized input. These are not accepted values —
|
|
44
|
+
* they only make the rejection actionable (e.g. `all` -> point at `--all`).
|
|
45
|
+
*/
|
|
46
|
+
readonly hints?: Readonly<Record<string, string>>;
|
|
47
|
+
/** Whether a comma-separated list is accepted. Defaults to true. */
|
|
48
|
+
readonly allowList?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export type EnumVocabularyResult<T extends string> = {
|
|
51
|
+
readonly ok: true;
|
|
52
|
+
readonly values: T[];
|
|
53
|
+
} | {
|
|
54
|
+
readonly ok: false;
|
|
55
|
+
readonly message: string;
|
|
56
|
+
readonly invalid: string[];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Split, canonicalize and validate a raw flag/query value against its vocabulary.
|
|
60
|
+
*
|
|
61
|
+
* Every element of a comma-separated list is validated: a single bad element fails
|
|
62
|
+
* the whole value rather than being dropped, because dropping it produced a result
|
|
63
|
+
* set that looked authoritative but silently ignored part of what was asked for.
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveEnumVocabulary<T extends string>(raw: string, spec: EnumVocabularySpec<T>): EnumVocabularyResult<T>;
|
|
66
|
+
/**
|
|
67
|
+
* Collapse a validated list back to the shape the storage filter expects: a bare
|
|
68
|
+
* string for a single value, an array for a real list. Keeps the emitted SQL/query
|
|
69
|
+
* identical to what single-value callers produced before validation was added.
|
|
70
|
+
*/
|
|
71
|
+
export declare function collapseEnumValues<T extends string>(values: T[]): T | T[];
|
|
72
|
+
//# sourceMappingURL=enum-vocabulary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-vocabulary.d.ts","sourceRoot":"","sources":["../../src/lib/enum-vocabulary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAsBH;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,KAAK,SAAI,GACR,MAAM,EAAE,CAuBV;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,IAC7C;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,EACpD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC1B,oBAAoB,CAAC,CAAC,CAAC,CAiDzB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAEzE"}
|
|
@@ -2,7 +2,12 @@ import type { Database } from "bun:sqlite";
|
|
|
2
2
|
import type { Plan, Project, Task, TaskComment, TaskPriority } from "../types/index.js";
|
|
3
3
|
import type { TaskRun } from "../db/task-runs.js";
|
|
4
4
|
import { type LocalTaskFieldQuery } from "./local-fields.js";
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* The single source of truth for search scopes. Both the type and `normalizeScope`
|
|
7
|
+
* derive from it, so `--scope` validation cannot drift from what the union allows.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SAVED_SEARCH_SCOPES: readonly ["all", "tasks", "projects", "plans", "runs", "comments"];
|
|
10
|
+
export type SavedSearchScope = (typeof SAVED_SEARCH_SCOPES)[number];
|
|
6
11
|
export interface SavedSearchFilters {
|
|
7
12
|
query?: string;
|
|
8
13
|
project_id?: string;
|
|
@@ -50,6 +55,12 @@ export interface SaveSearchViewInput {
|
|
|
50
55
|
scope?: SavedSearchScope;
|
|
51
56
|
filters?: SavedSearchFilters;
|
|
52
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Coerce a stored/incoming scope to a member of `SAVED_SEARCH_SCOPES`, defaulting
|
|
60
|
+
* to "tasks". The default keeps persisted views readable if a scope is ever
|
|
61
|
+
* retired; it is NOT a substitute for validating user input, which the CLI does
|
|
62
|
+
* up front so a mistyped `--scope` fails loudly instead of silently searching tasks.
|
|
63
|
+
*/
|
|
53
64
|
export declare function normalizeScope(scope: string | undefined | null): SavedSearchScope;
|
|
54
65
|
export declare function runSavedSearch(filters?: SavedSearchFilters, scope?: SavedSearchScope, db?: Database): SavedSearchRunResult;
|
|
55
66
|
export declare function saveSearchView(input: SaveSearchViewInput, db?: Database): SavedSearchView;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saved-search-views.d.ts","sourceRoot":"","sources":["../../src/lib/saved-search-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAc,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGtF,
|
|
1
|
+
{"version":3,"file":"saved-search-views.d.ts","sourceRoot":"","sources":["../../src/lib/saved-search-views.ts"],"names":[],"mappings":"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"}
|