@hasna/todos 0.13.1 → 0.13.3
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/README.md +80 -15
- package/dist/cli/cloud-router.d.ts +78 -12
- package/dist/cli/cloud-router.d.ts.map +1 -1
- package/dist/cli/commands/config-serve-commands.d.ts.map +1 -1
- package/dist/cli/commands/query-commands.d.ts.map +1 -1
- package/dist/cli/commands/task-commands.d.ts.map +1 -1
- package/dist/cli/doctor-integrity.d.ts +106 -0
- package/dist/cli/doctor-integrity.d.ts.map +1 -0
- package/dist/cli/helpers.d.ts +2 -2
- package/dist/cli/index.js +1748 -1012
- package/dist/cli/stage-a.d.ts.map +1 -1
- package/dist/contracts.js +137 -39
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/findings.d.ts +1 -0
- package/dist/db/findings.d.ts.map +1 -1
- package/dist/db/integrity.d.ts +20 -0
- package/dist/db/integrity.d.ts.map +1 -0
- package/dist/db/task-crud.d.ts.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +592 -147
- package/dist/lib/context-packs.d.ts +1 -0
- package/dist/lib/context-packs.d.ts.map +1 -1
- package/dist/lib/dependency-graph.d.ts +19 -11
- package/dist/lib/dependency-graph.d.ts.map +1 -1
- package/dist/lib/doctor.d.ts +20 -0
- package/dist/lib/doctor.d.ts.map +1 -1
- package/dist/lib/integrity.d.ts +215 -0
- package/dist/lib/integrity.d.ts.map +1 -0
- package/dist/lib/native-storage-status.d.ts +2 -2
- package/dist/lib/native-storage-status.d.ts.map +1 -1
- package/dist/lib/redaction.d.ts.map +1 -1
- package/dist/lib/release-compatibility.d.ts.map +1 -1
- package/dist/lib/task-dedupe.d.ts +15 -0
- package/dist/lib/task-dedupe.d.ts.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +544 -97
- package/dist/mcp.js +8 -4
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +144 -39
- package/dist/release-provenance.json +5 -5
- package/dist/sdk/types.d.ts +42 -0
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/v1.generated.d.ts +1 -0
- package/dist/sdk/v1.generated.d.ts.map +1 -1
- package/dist/server/cloud.d.ts +8 -1
- package/dist/server/cloud.d.ts.map +1 -1
- package/dist/server/index.js +585 -118
- package/dist/server/openapi.d.ts +12 -0
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/port.d.ts +52 -0
- package/dist/server/port.d.ts.map +1 -0
- package/dist/server/serve.d.ts.map +1 -1
- package/dist/server/v1.d.ts.map +1 -1
- package/dist/storage/config.d.ts +23 -5
- package/dist/storage/config.d.ts.map +1 -1
- package/dist/storage/factory.d.ts +9 -3
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/hybrid.d.ts +7 -0
- package/dist/storage/hybrid.d.ts.map +1 -1
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/interfaces.d.ts +43 -8
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/local-sqlite.d.ts.map +1 -1
- package/dist/storage/postgres-adapter.d.ts.map +1 -1
- package/dist/storage.d.ts +3 -3
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +619 -256
- package/dist/testing.d.ts +79 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +107 -0
- package/dist/types/index.d.ts +27 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +8 -4
package/dist/mcp.js
CHANGED
|
@@ -41,7 +41,7 @@ var __require = import.meta.require;
|
|
|
41
41
|
// package.json
|
|
42
42
|
var package_default = {
|
|
43
43
|
name: "@hasna/todos",
|
|
44
|
-
version: "0.13.
|
|
44
|
+
version: "0.13.3",
|
|
45
45
|
description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
|
|
46
46
|
type: "module",
|
|
47
47
|
main: "dist/index.js",
|
|
@@ -75,6 +75,10 @@ var package_default = {
|
|
|
75
75
|
"./storage": {
|
|
76
76
|
types: "./dist/storage.d.ts",
|
|
77
77
|
import: "./dist/storage.js"
|
|
78
|
+
},
|
|
79
|
+
"./testing": {
|
|
80
|
+
types: "./dist/testing.d.ts",
|
|
81
|
+
import: "./dist/testing.js"
|
|
78
82
|
}
|
|
79
83
|
},
|
|
80
84
|
workspaces: [
|
|
@@ -87,13 +91,13 @@ var package_default = {
|
|
|
87
91
|
"README.md"
|
|
88
92
|
],
|
|
89
93
|
scripts: {
|
|
90
|
-
build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
|
|
91
|
-
"build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
|
|
94
|
+
build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
|
|
95
|
+
"build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
|
|
92
96
|
migrate: "bun run src/server/index.ts migrate",
|
|
93
97
|
"backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
|
|
94
98
|
"generate:sdk": "bun run scripts/generate-sdk.ts",
|
|
95
99
|
"build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
|
|
96
|
-
typecheck: "tsc --noEmit",
|
|
100
|
+
typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
|
|
97
101
|
test: "bun test",
|
|
98
102
|
"test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
|
|
99
103
|
"dev:cli": "bun run src/cli/index.tsx",
|
package/dist/registry.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface TodosPackageSource {
|
|
|
12
12
|
version: string;
|
|
13
13
|
}
|
|
14
14
|
export interface TodosPackageExportContract {
|
|
15
|
-
subpath: "." | "./sdk" | "./mcp" | "./registry" | "./contracts" | "./storage";
|
|
15
|
+
subpath: "." | "./sdk" | "./mcp" | "./registry" | "./contracts" | "./storage" | "./testing";
|
|
16
16
|
import: string;
|
|
17
17
|
types: string;
|
|
18
18
|
description: string;
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,YAAY,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,sBAAsB,CAAC;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,0BAA0B,EAkD7D,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAc3F;AAED,eAAO,MAAM,cAAc,eAEzB,CAAC"}
|
package/dist/registry.js
CHANGED
|
@@ -3424,7 +3424,10 @@ var init_machines = __esm(() => {
|
|
|
3424
3424
|
});
|
|
3425
3425
|
|
|
3426
3426
|
// src/types/index.ts
|
|
3427
|
-
|
|
3427
|
+
function isBlockingDependencyStatus(status) {
|
|
3428
|
+
return status !== "completed" && status !== "cancelled";
|
|
3429
|
+
}
|
|
3430
|
+
var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, TaskReferenceAmbiguousError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
|
|
3428
3431
|
var init_types = __esm(() => {
|
|
3429
3432
|
TASK_STATUSES = [
|
|
3430
3433
|
"pending",
|
|
@@ -3464,6 +3467,22 @@ var init_types = __esm(() => {
|
|
|
3464
3467
|
this.name = "TaskNotFoundError";
|
|
3465
3468
|
}
|
|
3466
3469
|
};
|
|
3470
|
+
TaskReferenceAmbiguousError = class TaskReferenceAmbiguousError extends Error {
|
|
3471
|
+
reference;
|
|
3472
|
+
static code = "TASK_REFERENCE_AMBIGUOUS";
|
|
3473
|
+
candidateTaskIds;
|
|
3474
|
+
candidateProjectIds;
|
|
3475
|
+
constructor(reference, candidates) {
|
|
3476
|
+
const candidateTaskIds = [...new Set(candidates.map((candidate) => candidate.task_id))].sort();
|
|
3477
|
+
const candidateProjectIds = [...new Set(candidates.map((candidate) => candidate.project_id).filter((projectId) => typeof projectId === "string" && projectId.length > 0))].sort();
|
|
3478
|
+
const projectList = candidateProjectIds.length > 0 ? candidateProjectIds.join(", ") : "(unscoped)";
|
|
3479
|
+
super(`Task reference is ambiguous: "${reference}". Candidate project IDs: ${projectList}. ` + "Use a full task UUID.");
|
|
3480
|
+
this.reference = reference;
|
|
3481
|
+
this.name = "TaskReferenceAmbiguousError";
|
|
3482
|
+
this.candidateTaskIds = candidateTaskIds;
|
|
3483
|
+
this.candidateProjectIds = candidateProjectIds;
|
|
3484
|
+
}
|
|
3485
|
+
};
|
|
3467
3486
|
ProjectNotFoundError = class ProjectNotFoundError extends Error {
|
|
3468
3487
|
projectId;
|
|
3469
3488
|
static code = "PROJECT_NOT_FOUND";
|
|
@@ -3755,15 +3774,18 @@ var init_identity_mapping = __esm(() => {
|
|
|
3755
3774
|
var exports_config = {};
|
|
3756
3775
|
__export(exports_config, {
|
|
3757
3776
|
parseStorageMode: () => parseStorageMode,
|
|
3777
|
+
parseStorageBackend: () => parseStorageBackend,
|
|
3758
3778
|
loadTodosStorageConfig: () => loadTodosStorageConfig,
|
|
3759
3779
|
loadStorageConfig: () => loadStorageConfig,
|
|
3760
3780
|
isTodosShadowEnabled: () => isTodosShadowEnabled,
|
|
3761
3781
|
isTodosRemoteStorageEnabled: () => isTodosRemoteStorageEnabled,
|
|
3782
|
+
isTodosPostgresBackend: () => isTodosPostgresBackend,
|
|
3762
3783
|
getTodosStorageShadowEnvName: () => getTodosStorageShadowEnvName,
|
|
3763
3784
|
getTodosStorageMode: () => getTodosStorageMode,
|
|
3764
3785
|
getTodosStorageEnvName: () => getTodosStorageEnvName,
|
|
3765
3786
|
getTodosStorageDatabaseUrl: () => getTodosStorageDatabaseUrl,
|
|
3766
3787
|
getTodosStorageDatabaseEnv: () => getTodosStorageDatabaseEnv,
|
|
3788
|
+
getTodosStorageBackend: () => getTodosStorageBackend,
|
|
3767
3789
|
getStorageMode: () => getStorageMode,
|
|
3768
3790
|
getStorageDatabaseUrl: () => getStorageDatabaseUrl,
|
|
3769
3791
|
getStorageDatabaseEnv: () => getStorageDatabaseEnv,
|
|
@@ -3788,7 +3810,7 @@ function getCanonicalTodosRdsConfig(env = process.env) {
|
|
|
3788
3810
|
};
|
|
3789
3811
|
}
|
|
3790
3812
|
function loadTodosStorageConfig(env = process.env) {
|
|
3791
|
-
const mode =
|
|
3813
|
+
const mode = getTodosStorageBackend(env);
|
|
3792
3814
|
const databaseUrl = getTodosStorageDatabaseUrl(env);
|
|
3793
3815
|
const bucket = readStorageEnv(env, "s3Bucket").value;
|
|
3794
3816
|
const prefix = readStorageEnv(env, "s3Prefix").value ?? "todos/";
|
|
@@ -3825,29 +3847,41 @@ function loadTodosStorageConfig(env = process.env) {
|
|
|
3825
3847
|
function loadStorageConfig(env = process.env) {
|
|
3826
3848
|
return loadTodosStorageConfig(env);
|
|
3827
3849
|
}
|
|
3850
|
+
function isTodosPostgresBackend(config) {
|
|
3851
|
+
return config.mode === "postgres";
|
|
3852
|
+
}
|
|
3828
3853
|
function isTodosRemoteStorageEnabled(config) {
|
|
3829
|
-
return config
|
|
3854
|
+
return isTodosPostgresBackend(config);
|
|
3830
3855
|
}
|
|
3831
3856
|
function assertTodosRemoteStorageConfig(config) {
|
|
3832
|
-
if (!
|
|
3857
|
+
if (!isTodosPostgresBackend(config))
|
|
3833
3858
|
return;
|
|
3834
3859
|
if (!config.database?.url) {
|
|
3835
3860
|
throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${TODOS_STORAGE_ENV.mode}=${config.mode}`);
|
|
3836
3861
|
}
|
|
3837
3862
|
}
|
|
3838
|
-
function
|
|
3863
|
+
function parseStorageBackend(value) {
|
|
3839
3864
|
const normalized = clean(value)?.toLowerCase();
|
|
3840
3865
|
if (!normalized)
|
|
3841
|
-
return "
|
|
3842
|
-
if (normalized === "
|
|
3866
|
+
return "sqlite";
|
|
3867
|
+
if (normalized === "sqlite" || normalized === "postgres")
|
|
3843
3868
|
return normalized;
|
|
3844
|
-
|
|
3869
|
+
const legacy = LEGACY_BACKEND_TOKENS[normalized];
|
|
3870
|
+
if (legacy)
|
|
3871
|
+
return legacy;
|
|
3872
|
+
throw new Error(`${TODOS_STORAGE_ENV.mode} must be sqlite or postgres (legacy values local and remote are accepted)`);
|
|
3873
|
+
}
|
|
3874
|
+
function parseStorageMode(value) {
|
|
3875
|
+
return parseStorageBackend(value);
|
|
3876
|
+
}
|
|
3877
|
+
function getTodosStorageBackend(env = process.env) {
|
|
3878
|
+
return parseStorageBackend(readStorageEnv(env, "mode").value);
|
|
3845
3879
|
}
|
|
3846
3880
|
function getTodosStorageMode(env = process.env) {
|
|
3847
|
-
return
|
|
3881
|
+
return getTodosStorageBackend(env);
|
|
3848
3882
|
}
|
|
3849
3883
|
function getStorageMode(env = process.env) {
|
|
3850
|
-
return
|
|
3884
|
+
return getTodosStorageBackend(env);
|
|
3851
3885
|
}
|
|
3852
3886
|
function isTodosShadowEnabled(env = process.env) {
|
|
3853
3887
|
return parseBoolean(readStorageEnv(env, "shadow").value, false);
|
|
@@ -3858,8 +3892,8 @@ function getTodosStorageShadowEnvName(env = process.env) {
|
|
|
3858
3892
|
function assertTodosShadowConfig(config, env = process.env) {
|
|
3859
3893
|
if (!isTodosShadowEnabled(env))
|
|
3860
3894
|
return;
|
|
3861
|
-
if (config.mode !== "
|
|
3862
|
-
throw new Error(`${readStorageEnv(env, "shadow").name} shadow mirror requires
|
|
3895
|
+
if (config.mode !== "sqlite") {
|
|
3896
|
+
throw new Error(`${readStorageEnv(env, "shadow").name} shadow mirror requires the sqlite backend (got ${config.mode})`);
|
|
3863
3897
|
}
|
|
3864
3898
|
if (!config.database?.url) {
|
|
3865
3899
|
throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${readStorageEnv(env, "shadow").name} is enabled`);
|
|
@@ -3915,7 +3949,7 @@ function parsePositiveInteger(value, fallback) {
|
|
|
3915
3949
|
}
|
|
3916
3950
|
return parsed;
|
|
3917
3951
|
}
|
|
3918
|
-
var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER_ENV = "HASNA_TODOS_RDS_CLUSTER", CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV = "HASNA_TODOS_RDS_RUNTIME_PATH", CANONICAL_TODOS_RDS_DATABASE = "todos";
|
|
3952
|
+
var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER_ENV = "HASNA_TODOS_RDS_CLUSTER", CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV = "HASNA_TODOS_RDS_RUNTIME_PATH", CANONICAL_TODOS_RDS_DATABASE = "todos", LEGACY_BACKEND_TOKENS;
|
|
3919
3953
|
var init_config = __esm(() => {
|
|
3920
3954
|
TODOS_STORAGE_TABLES = [
|
|
3921
3955
|
"todos_sync_records",
|
|
@@ -3956,6 +3990,14 @@ var init_config = __esm(() => {
|
|
|
3956
3990
|
syncBatchSize: "TODOS_SYNC_BATCH_SIZE",
|
|
3957
3991
|
syncDryRun: "TODOS_SYNC_DRY_RUN"
|
|
3958
3992
|
};
|
|
3993
|
+
LEGACY_BACKEND_TOKENS = {
|
|
3994
|
+
local: "sqlite",
|
|
3995
|
+
remote: "postgres",
|
|
3996
|
+
postgresql: "postgres",
|
|
3997
|
+
hybrid: "postgres",
|
|
3998
|
+
self_hosted: "postgres",
|
|
3999
|
+
cloud: "postgres"
|
|
4000
|
+
};
|
|
3959
4001
|
});
|
|
3960
4002
|
|
|
3961
4003
|
// src/storage/shadow-outbox-schema.ts
|
|
@@ -4089,6 +4131,30 @@ function findGitRoot(startDir) {
|
|
|
4089
4131
|
}
|
|
4090
4132
|
return null;
|
|
4091
4133
|
}
|
|
4134
|
+
function getGlobalDbPath() {
|
|
4135
|
+
const home = process.env["HOME"] || process.env["USERPROFILE"] || "~";
|
|
4136
|
+
return join(home, ".hasna", "todos", "todos.db");
|
|
4137
|
+
}
|
|
4138
|
+
function hasExplicitProjectArg(args = process.argv.slice(2)) {
|
|
4139
|
+
return args.some((arg) => arg === "--project" || arg.startsWith("--project="));
|
|
4140
|
+
}
|
|
4141
|
+
function getCliCommand(args = process.argv.slice(2)) {
|
|
4142
|
+
const globalOptionsWithValues = new Set(["--project", "--agent", "--session"]);
|
|
4143
|
+
for (let index = 0;index < args.length; index += 1) {
|
|
4144
|
+
const arg = args[index];
|
|
4145
|
+
if (globalOptionsWithValues.has(arg)) {
|
|
4146
|
+
index += 1;
|
|
4147
|
+
continue;
|
|
4148
|
+
}
|
|
4149
|
+
if (arg.startsWith("-"))
|
|
4150
|
+
continue;
|
|
4151
|
+
return arg;
|
|
4152
|
+
}
|
|
4153
|
+
return null;
|
|
4154
|
+
}
|
|
4155
|
+
function canCreateScopedProjectDb(args = process.argv.slice(2)) {
|
|
4156
|
+
return getCliCommand(args) === "project-bootstrap" && !args.some((arg) => arg === "--dry-run" || arg.startsWith("--dry-run="));
|
|
4157
|
+
}
|
|
4092
4158
|
function getDbPath() {
|
|
4093
4159
|
if (process.env["HASNA_TODOS_DB_PATH"]) {
|
|
4094
4160
|
return process.env["HASNA_TODOS_DB_PATH"];
|
|
@@ -4096,18 +4162,19 @@ function getDbPath() {
|
|
|
4096
4162
|
if (process.env["TODOS_DB_PATH"]) {
|
|
4097
4163
|
return process.env["TODOS_DB_PATH"];
|
|
4098
4164
|
}
|
|
4165
|
+
if (hasExplicitProjectArg())
|
|
4166
|
+
return getGlobalDbPath();
|
|
4099
4167
|
const cwd = process.cwd();
|
|
4100
4168
|
const nearest = findNearestProjectDb(cwd);
|
|
4101
4169
|
if (nearest)
|
|
4102
4170
|
return nearest;
|
|
4103
4171
|
if (process.env["TODOS_DB_SCOPE"] === "project") {
|
|
4104
4172
|
const gitRoot = findGitRoot(cwd);
|
|
4105
|
-
if (gitRoot) {
|
|
4173
|
+
if (gitRoot && canCreateScopedProjectDb()) {
|
|
4106
4174
|
return join(gitRoot, ".hasna", "todos", "todos.db");
|
|
4107
4175
|
}
|
|
4108
4176
|
}
|
|
4109
|
-
|
|
4110
|
-
return join(home, ".hasna", "todos", "todos.db");
|
|
4177
|
+
return getGlobalDbPath();
|
|
4111
4178
|
}
|
|
4112
4179
|
function getDatabasePath() {
|
|
4113
4180
|
return getDbPath();
|
|
@@ -4123,8 +4190,8 @@ function ensureDir(filePath) {
|
|
|
4123
4190
|
function openDatabase(path) {
|
|
4124
4191
|
ensureDir(path);
|
|
4125
4192
|
const db = new Database(path);
|
|
4126
|
-
db.run("PRAGMA journal_mode = WAL");
|
|
4127
4193
|
db.run("PRAGMA busy_timeout = 5000");
|
|
4194
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
4128
4195
|
db.run("PRAGMA foreign_keys = ON");
|
|
4129
4196
|
runMigrations(db);
|
|
4130
4197
|
ensureAgentIdentitySchema(db);
|
|
@@ -4210,10 +4277,13 @@ function resolvePartialId(db, table, partialId) {
|
|
|
4210
4277
|
return null;
|
|
4211
4278
|
}
|
|
4212
4279
|
if (table === "tasks") {
|
|
4213
|
-
const shortIdRows = db.query("SELECT id FROM tasks WHERE short_id = ?").all(partialId);
|
|
4280
|
+
const shortIdRows = db.query("SELECT id, project_id FROM tasks WHERE LOWER(short_id) = LOWER(?) ORDER BY project_id, id").all(partialId);
|
|
4214
4281
|
if (shortIdRows.length === 1) {
|
|
4215
4282
|
return shortIdRows[0].id;
|
|
4216
4283
|
}
|
|
4284
|
+
if (shortIdRows.length > 1) {
|
|
4285
|
+
throw new TaskReferenceAmbiguousError(partialId, shortIdRows.map((row) => ({ task_id: row.id, project_id: row.project_id })));
|
|
4286
|
+
}
|
|
4217
4287
|
}
|
|
4218
4288
|
if (table === "task_lists") {
|
|
4219
4289
|
const slugRow = db.query("SELECT id FROM task_lists WHERE slug = ?").get(partialId);
|
|
@@ -4955,11 +5025,15 @@ function secretPatterns() {
|
|
|
4955
5025
|
return [...customPatterns(), ...DEFAULT_SECRET_PATTERNS];
|
|
4956
5026
|
}
|
|
4957
5027
|
function isRedactionPlaceholderMatch(match) {
|
|
4958
|
-
const placeholder = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
|
|
4959
5028
|
const trimmed = match.trim();
|
|
4960
|
-
return new RegExp(`^${
|
|
5029
|
+
return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(trimmed) || new RegExp(`=\\s*['"]?${REDACTION_PLACEHOLDER}['"]?$`).test(trimmed);
|
|
5030
|
+
}
|
|
5031
|
+
function isRedactionPlaceholderKey(key) {
|
|
5032
|
+
return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(key.trim());
|
|
4961
5033
|
}
|
|
4962
5034
|
function isSecretKey(key) {
|
|
5035
|
+
if (isRedactionPlaceholderKey(key))
|
|
5036
|
+
return false;
|
|
4963
5037
|
if (NON_SECRET_USAGE_KEYS.has(key.toLowerCase()))
|
|
4964
5038
|
return false;
|
|
4965
5039
|
if (DEFAULT_SECRET_KEY_PATTERN.test(key))
|
|
@@ -5020,7 +5094,7 @@ function upsertSecretSafetyConfig(input) {
|
|
|
5020
5094
|
saveConfig({ ...config, secret_safety: next });
|
|
5021
5095
|
return next;
|
|
5022
5096
|
}
|
|
5023
|
-
var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
|
|
5097
|
+
var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS, REDACTION_PLACEHOLDER;
|
|
5024
5098
|
var init_redaction = __esm(() => {
|
|
5025
5099
|
init_config2();
|
|
5026
5100
|
DEFAULT_SECRET_PATTERNS = [
|
|
@@ -5044,6 +5118,7 @@ var init_redaction = __esm(() => {
|
|
|
5044
5118
|
"completion_tokens",
|
|
5045
5119
|
"cost_tokens"
|
|
5046
5120
|
]);
|
|
5121
|
+
REDACTION_PLACEHOLDER = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
|
|
5047
5122
|
});
|
|
5048
5123
|
|
|
5049
5124
|
// src/lib/workspace-trust.ts
|
|
@@ -6683,7 +6758,7 @@ function scanTextForSecrets(text, options = {}) {
|
|
|
6683
6758
|
};
|
|
6684
6759
|
}
|
|
6685
6760
|
function redactText(text, options = {}) {
|
|
6686
|
-
const placeholder = options.placeholder ??
|
|
6761
|
+
const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER2;
|
|
6687
6762
|
let out = text;
|
|
6688
6763
|
for (const { pattern, allowlist_ok } of DEFAULT_PATTERNS) {
|
|
6689
6764
|
out = out.replace(new RegExp(pattern.source, pattern.flags), (match) => {
|
|
@@ -6744,7 +6819,7 @@ function redactExportRecord(record) {
|
|
|
6744
6819
|
function getDefaultSecretPatterns() {
|
|
6745
6820
|
return DEFAULT_PATTERNS.map((p) => ({ name: p.name, source: p.pattern.source }));
|
|
6746
6821
|
}
|
|
6747
|
-
var SECRET_REDACTION_SCHEMA,
|
|
6822
|
+
var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER2 = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
|
|
6748
6823
|
var init_secret_redaction = __esm(() => {
|
|
6749
6824
|
init_redaction();
|
|
6750
6825
|
SECRET_REDACTION_SCHEMA = ["todos", "secret_redaction", "v1"].join(".");
|
|
@@ -8801,10 +8876,11 @@ function getTaskWithRelations(id, db) {
|
|
|
8801
8876
|
JOIN task_dependencies td ON td.depends_on = t.id
|
|
8802
8877
|
WHERE td.task_id = ?`).all(id);
|
|
8803
8878
|
const dependencies = depRows.map(rowToTask);
|
|
8804
|
-
const
|
|
8879
|
+
const blocked_by = dependencies.filter((dep) => isBlockingDependencyStatus(dep.status));
|
|
8880
|
+
const blocksRows = d.query(`SELECT t.* FROM tasks t
|
|
8805
8881
|
JOIN task_dependencies td ON td.task_id = t.id
|
|
8806
8882
|
WHERE td.depends_on = ?`).all(id);
|
|
8807
|
-
const
|
|
8883
|
+
const blocks = blocksRows.map(rowToTask);
|
|
8808
8884
|
const comments = d.query("SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at").all(id);
|
|
8809
8885
|
const parent = task.parent_id ? getTask(task.parent_id, d) : null;
|
|
8810
8886
|
const checklist = getChecklist(id, d);
|
|
@@ -8813,6 +8889,7 @@ function getTaskWithRelations(id, db) {
|
|
|
8813
8889
|
subtasks,
|
|
8814
8890
|
dependencies,
|
|
8815
8891
|
blocked_by,
|
|
8892
|
+
blocks,
|
|
8816
8893
|
comments,
|
|
8817
8894
|
parent,
|
|
8818
8895
|
checklist
|
|
@@ -11823,7 +11900,7 @@ var init_tasks = __esm(() => {
|
|
|
11823
11900
|
// package.json
|
|
11824
11901
|
var package_default = {
|
|
11825
11902
|
name: "@hasna/todos",
|
|
11826
|
-
version: "0.13.
|
|
11903
|
+
version: "0.13.3",
|
|
11827
11904
|
description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
|
|
11828
11905
|
type: "module",
|
|
11829
11906
|
main: "dist/index.js",
|
|
@@ -11857,6 +11934,10 @@ var package_default = {
|
|
|
11857
11934
|
"./storage": {
|
|
11858
11935
|
types: "./dist/storage.d.ts",
|
|
11859
11936
|
import: "./dist/storage.js"
|
|
11937
|
+
},
|
|
11938
|
+
"./testing": {
|
|
11939
|
+
types: "./dist/testing.d.ts",
|
|
11940
|
+
import: "./dist/testing.js"
|
|
11860
11941
|
}
|
|
11861
11942
|
},
|
|
11862
11943
|
workspaces: [
|
|
@@ -11869,13 +11950,13 @@ var package_default = {
|
|
|
11869
11950
|
"README.md"
|
|
11870
11951
|
],
|
|
11871
11952
|
scripts: {
|
|
11872
|
-
build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
|
|
11873
|
-
"build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
|
|
11953
|
+
build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
|
|
11954
|
+
"build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
|
|
11874
11955
|
migrate: "bun run src/server/index.ts migrate",
|
|
11875
11956
|
"backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
|
|
11876
11957
|
"generate:sdk": "bun run scripts/generate-sdk.ts",
|
|
11877
11958
|
"build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
|
|
11878
|
-
typecheck: "tsc --noEmit",
|
|
11959
|
+
typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
|
|
11879
11960
|
test: "bun test",
|
|
11880
11961
|
"test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
|
|
11881
11962
|
"dev:cli": "bun run src/cli/index.tsx",
|
|
@@ -17617,11 +17698,12 @@ var DEFAULT_LIMITS = {
|
|
|
17617
17698
|
verification_limit: 10,
|
|
17618
17699
|
run_limit: 3,
|
|
17619
17700
|
dependency_limit: 12,
|
|
17620
|
-
plan_task_limit:
|
|
17701
|
+
plan_task_limit: 24,
|
|
17621
17702
|
max_text_chars: 6000,
|
|
17622
17703
|
summary_char_limit: 480,
|
|
17623
17704
|
stale_after_hours: 72
|
|
17624
17705
|
};
|
|
17706
|
+
var MAX_CONTEXT_TASKS = 24;
|
|
17625
17707
|
var ALL_CONTEXT_SECTIONS = [
|
|
17626
17708
|
"project",
|
|
17627
17709
|
"plan",
|
|
@@ -17654,7 +17736,7 @@ function limits(input) {
|
|
|
17654
17736
|
verification_limit: clamp(input.verification_limit, DEFAULT_LIMITS.verification_limit, 100),
|
|
17655
17737
|
run_limit: clamp(input.run_limit, DEFAULT_LIMITS.run_limit, 20),
|
|
17656
17738
|
dependency_limit: clamp(input.dependency_limit, DEFAULT_LIMITS.dependency_limit, 100),
|
|
17657
|
-
plan_task_limit: clamp(input.plan_task_limit, DEFAULT_LIMITS.plan_task_limit,
|
|
17739
|
+
plan_task_limit: clamp(input.plan_task_limit, DEFAULT_LIMITS.plan_task_limit, MAX_CONTEXT_TASKS),
|
|
17658
17740
|
max_text_chars: clamp(input.max_text_chars, DEFAULT_LIMITS.max_text_chars, 50000),
|
|
17659
17741
|
summary_char_limit: clamp(input.summary_char_limit, DEFAULT_LIMITS.summary_char_limit, 4000),
|
|
17660
17742
|
stale_after_hours: clamp(input.stale_after_hours, DEFAULT_LIMITS.stale_after_hours, 24 * 365)
|
|
@@ -17677,6 +17759,13 @@ function taskSummary(task2) {
|
|
|
17677
17759
|
priority: task2.priority
|
|
17678
17760
|
};
|
|
17679
17761
|
}
|
|
17762
|
+
function latestPlanTasks(planId, limit, db) {
|
|
17763
|
+
const rows = db.query(`SELECT * FROM tasks
|
|
17764
|
+
WHERE plan_id = ? AND archived_at IS NULL
|
|
17765
|
+
ORDER BY updated_at DESC, created_at DESC, id ASC
|
|
17766
|
+
LIMIT ?`).all(planId, limit);
|
|
17767
|
+
return rows.map(rowToTask);
|
|
17768
|
+
}
|
|
17680
17769
|
function acceptanceCriteria(task2, maxText) {
|
|
17681
17770
|
const metadata = task2.metadata || {};
|
|
17682
17771
|
const raw = metadata["acceptance_criteria"] ?? metadata["acceptanceCriteria"] ?? metadata["criteria"];
|
|
@@ -17774,7 +17863,7 @@ function summarizeSection(pack, section, maxChars) {
|
|
|
17774
17863
|
return "No plan was attached.";
|
|
17775
17864
|
return summarizeStrings([
|
|
17776
17865
|
`Plan ${pack.plan.name} is ${pack.plan.status}`,
|
|
17777
|
-
`${pack.plan.tasks.length} listed plan
|
|
17866
|
+
`${pack.plan.tasks.length} of ${pack.plan.total_tasks} plan tasks listed; ${pack.plan.omitted_tasks} omitted`,
|
|
17778
17867
|
...pack.plan.tasks.slice(0, 4).map((task2) => `${task2.status} ${task2.short_id || task2.id.slice(0, 8)} ${task2.title}`)
|
|
17779
17868
|
], maxChars);
|
|
17780
17869
|
}
|
|
@@ -17924,7 +18013,8 @@ function createAgentContextPack(input, db) {
|
|
|
17924
18013
|
const limit = limits(input);
|
|
17925
18014
|
const project = task2.project_id ? getProject(task2.project_id, d) : null;
|
|
17926
18015
|
const plan = task2.plan_id ? getPlan(task2.plan_id, d) : null;
|
|
17927
|
-
const planTasks = task2.plan_id ?
|
|
18016
|
+
const planTasks = task2.plan_id ? latestPlanTasks(task2.plan_id, limit.plan_task_limit, d) : [];
|
|
18017
|
+
const totalPlanTasks = task2.plan_id ? countTasks({ plan_id: task2.plan_id }, d) : 0;
|
|
17928
18018
|
const upstream = getTaskDependencies(task2.id, d).map((dep) => taskSummary(getTask(dep.depends_on, d))).filter((item) => Boolean(item));
|
|
17929
18019
|
const downstream = getTaskDependents(task2.id, d).map((dep) => taskSummary(getTask(dep.task_id, d))).filter((item) => Boolean(item));
|
|
17930
18020
|
const comments = listComments(task2.id, d);
|
|
@@ -17967,6 +18057,9 @@ function createAgentContextPack(input, db) {
|
|
|
17967
18057
|
warnings.push(`${runs.length - selectedRuns.length} older runs omitted`);
|
|
17968
18058
|
if (fileMap.size > relevantFiles.length)
|
|
17969
18059
|
warnings.push(`${fileMap.size - relevantFiles.length} relevant files omitted`);
|
|
18060
|
+
if (totalPlanTasks > planTasks.length && plan) {
|
|
18061
|
+
warnings.push(`${totalPlanTasks - planTasks.length} plan tasks omitted (${totalPlanTasks} total); load more on demand with "todos plans --show ${plan.id}" and inspect task details with "todos show <task-id>" or "todos context-pack <task-id>"`);
|
|
18062
|
+
}
|
|
17970
18063
|
const contextTask = {
|
|
17971
18064
|
id: task2.id,
|
|
17972
18065
|
short_id: task2.short_id,
|
|
@@ -17998,8 +18091,9 @@ function createAgentContextPack(input, db) {
|
|
|
17998
18091
|
description: truncate2(plan.description, limit.max_text_chars),
|
|
17999
18092
|
status: plan.status,
|
|
18000
18093
|
agent_id: plan.agent_id,
|
|
18001
|
-
tasks: planTasks.
|
|
18002
|
-
|
|
18094
|
+
tasks: planTasks.map(taskSummary).filter((item) => Boolean(item)),
|
|
18095
|
+
total_tasks: totalPlanTasks,
|
|
18096
|
+
omitted_tasks: Math.max(0, totalPlanTasks - planTasks.length)
|
|
18003
18097
|
} : null,
|
|
18004
18098
|
acceptance_criteria: acceptanceCriteria(task2, limit.max_text_chars),
|
|
18005
18099
|
dependencies: {
|
|
@@ -18109,6 +18203,8 @@ ${pack.task.description}` : null,
|
|
|
18109
18203
|
"## Project And Plan",
|
|
18110
18204
|
pack.project ? `- Project: ${pack.project.name} (${pack.project.path})` : "- Project: none",
|
|
18111
18205
|
pack.plan ? `- Plan: ${pack.plan.name} (${pack.plan.status})` : "- Plan: none",
|
|
18206
|
+
pack.plan ? `- Plan tasks: ${pack.plan.tasks.length} shown of ${pack.plan.total_tasks} total (${pack.plan.omitted_tasks} omitted)` : null,
|
|
18207
|
+
pack.plan && pack.plan.omitted_tasks > 0 ? `- Load more on demand: \`todos plans --show ${pack.plan.id}\`; inspect one task with \`todos show <task-id>\` or \`todos context-pack <task-id>\`.` : null,
|
|
18112
18208
|
pack.plan && pack.plan.tasks.length > 0 ? bullet(pack.plan.tasks.map((task2) => `${task2.status} ${task2.short_id || task2.id.slice(0, 8)} ${task2.title}`)) : null,
|
|
18113
18209
|
"",
|
|
18114
18210
|
"## Acceptance Criteria",
|
|
@@ -19777,7 +19873,7 @@ function createReleaseCompatibilityReport(options = {}) {
|
|
|
19777
19873
|
"todos --help",
|
|
19778
19874
|
"todos-mcp --help",
|
|
19779
19875
|
"todos-serve --help",
|
|
19780
|
-
"todos doctor"
|
|
19876
|
+
"todos doctor --no-fail-on-findings"
|
|
19781
19877
|
],
|
|
19782
19878
|
smoke_tests: [
|
|
19783
19879
|
"command -v todos",
|
|
@@ -19785,7 +19881,7 @@ function createReleaseCompatibilityReport(options = {}) {
|
|
|
19785
19881
|
"command -v todos-serve",
|
|
19786
19882
|
"todos --version",
|
|
19787
19883
|
"todos --help",
|
|
19788
|
-
"todos doctor"
|
|
19884
|
+
"todos doctor --no-fail-on-findings"
|
|
19789
19885
|
],
|
|
19790
19886
|
rollback: [
|
|
19791
19887
|
"npm view @hasna/todos versions --json",
|
|
@@ -20279,12 +20375,11 @@ ${task2.description || ""}`.split(/\r?\n/);
|
|
|
20279
20375
|
function normalizeStackLocation(value) {
|
|
20280
20376
|
return value.replace(/:\d+(?::\d+)?/g, "").replace(/^file:\/\//, "").toLowerCase().trim();
|
|
20281
20377
|
}
|
|
20282
|
-
function
|
|
20378
|
+
function fingerprintContent(task2) {
|
|
20283
20379
|
const body = task2.description || "";
|
|
20284
20380
|
const text = `${task2.title}
|
|
20285
20381
|
${body}`;
|
|
20286
20382
|
return {
|
|
20287
|
-
task: task2,
|
|
20288
20383
|
title: normalizeText(task2.title),
|
|
20289
20384
|
body: normalizeText(body),
|
|
20290
20385
|
text: normalizeText(text),
|
|
@@ -20293,6 +20388,9 @@ ${body}`;
|
|
|
20293
20388
|
stackKeys: stackKeysFor(task2)
|
|
20294
20389
|
};
|
|
20295
20390
|
}
|
|
20391
|
+
function fingerprint(task2) {
|
|
20392
|
+
return { task: task2, ...fingerprintContent(task2) };
|
|
20393
|
+
}
|
|
20296
20394
|
function intersects(left, right) {
|
|
20297
20395
|
for (const value of left)
|
|
20298
20396
|
if (right.has(value))
|
|
@@ -23479,6 +23577,13 @@ var TODOS_PACKAGE_EXPORTS = [
|
|
|
23479
23577
|
types: "./dist/storage.d.ts",
|
|
23480
23578
|
description: "Storage and service adapter contracts for local SQLite implementations.",
|
|
23481
23579
|
stability: "stable"
|
|
23580
|
+
},
|
|
23581
|
+
{
|
|
23582
|
+
subpath: "./testing",
|
|
23583
|
+
import: "./dist/testing.js",
|
|
23584
|
+
types: "./dist/testing.d.ts",
|
|
23585
|
+
description: "Test-store isolation helpers that keep a consumer's test suite off a shared todos store.",
|
|
23586
|
+
stability: "stable"
|
|
23482
23587
|
}
|
|
23483
23588
|
];
|
|
23484
23589
|
function source8(version) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"packageName": "@hasna/todos",
|
|
3
|
-
"packageVersion": "0.13.
|
|
3
|
+
"packageVersion": "0.13.3",
|
|
4
4
|
"repository": "https://github.com/hasna/todos.git",
|
|
5
|
-
"gitCommit": "
|
|
6
|
-
"gitTree": "
|
|
7
|
-
"sourceTreeSha256": "
|
|
8
|
-
"generatedAt": "2026-07-
|
|
5
|
+
"gitCommit": "5ee2938484e763925ecd109c3d7ce0879c5b5079",
|
|
6
|
+
"gitTree": "473dc6bc3dbe3181c2770c0a8632dbc78fd1fa76",
|
|
7
|
+
"sourceTreeSha256": "a5cc55e3dc4e8f8e2c670110d1b93a72fa3e0cc56424a2393ffb83321bbc2871",
|
|
8
|
+
"generatedAt": "2026-07-30T14:34:36.000Z"
|
|
9
9
|
}
|
package/dist/sdk/types.d.ts
CHANGED
|
@@ -148,7 +148,18 @@ export interface DoctorIssue {
|
|
|
148
148
|
repairable?: boolean;
|
|
149
149
|
}
|
|
150
150
|
export interface DoctorResponse {
|
|
151
|
+
/**
|
|
152
|
+
* False when an error-severity check failed, a referential-integrity condition
|
|
153
|
+
* has matching rows, OR a condition could not be measured. It is NOT a
|
|
154
|
+
* "the request succeeded" flag.
|
|
155
|
+
*/
|
|
151
156
|
ok: boolean;
|
|
157
|
+
/** Status the `doctor` process RETURNS (0 clean, 1 findings, 2 incomplete). */
|
|
158
|
+
exit_code?: 0 | 1 | 2;
|
|
159
|
+
/** Status the reported rows IMPLY, ignoring `--no-fail-on-findings`. */
|
|
160
|
+
verdict_exit_code?: 0 | 1 | 2;
|
|
161
|
+
/** False when the findings gate was opted out of, making `exit_code` 0 regardless. */
|
|
162
|
+
fail_on_findings?: boolean;
|
|
152
163
|
dry_run?: boolean;
|
|
153
164
|
database_path?: string;
|
|
154
165
|
migration?: {
|
|
@@ -173,6 +184,37 @@ export interface DoctorResponse {
|
|
|
173
184
|
infos: number;
|
|
174
185
|
repairable: number;
|
|
175
186
|
applied: number;
|
|
187
|
+
integrity_findings?: number;
|
|
188
|
+
integrity_rows?: number;
|
|
189
|
+
integrity_unverified?: number;
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Per-condition referential-integrity breakdown (`todos.integrity.v1`). A
|
|
193
|
+
* condition with `count: null` was NOT measured — it is never a zero.
|
|
194
|
+
*/
|
|
195
|
+
integrity?: {
|
|
196
|
+
schema_version: string;
|
|
197
|
+
generated_at: string;
|
|
198
|
+
source: string;
|
|
199
|
+
conditions: Array<{
|
|
200
|
+
id: string;
|
|
201
|
+
count: number | null;
|
|
202
|
+
open_count: number | null;
|
|
203
|
+
severity: "warn" | "error" | null;
|
|
204
|
+
verified: boolean;
|
|
205
|
+
unverified_reason?: string;
|
|
206
|
+
message: string;
|
|
207
|
+
impact: string;
|
|
208
|
+
}>;
|
|
209
|
+
summary: {
|
|
210
|
+
ok: boolean;
|
|
211
|
+
findings: number;
|
|
212
|
+
rows: number;
|
|
213
|
+
errors: number;
|
|
214
|
+
warnings: number;
|
|
215
|
+
unverified: number;
|
|
216
|
+
complete: boolean;
|
|
217
|
+
};
|
|
176
218
|
};
|
|
177
219
|
}
|
|
178
220
|
export interface SSEEvent {
|
package/dist/sdk/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":"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"}
|