@hasna/todos 0.15.32 → 0.15.34

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/registry.js CHANGED
@@ -4177,6 +4177,7 @@ __export(exports_config, {
4177
4177
  TODOS_STORAGE_FALLBACK_ENV: () => TODOS_STORAGE_FALLBACK_ENV,
4178
4178
  TODOS_STORAGE_ENV: () => TODOS_STORAGE_ENV,
4179
4179
  STORAGE_TABLES: () => STORAGE_TABLES,
4180
+ REMOVED_STORAGE_MODE_ENV_KEYS: () => REMOVED_STORAGE_MODE_ENV_KEYS,
4180
4181
  CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV: () => CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV,
4181
4182
  CANONICAL_TODOS_RDS_DATABASE: () => CANONICAL_TODOS_RDS_DATABASE,
4182
4183
  CANONICAL_TODOS_RDS_CLUSTER_ENV: () => CANONICAL_TODOS_RDS_CLUSTER_ENV
@@ -4238,25 +4239,36 @@ function assertTodosRemoteStorageConfig(config) {
4238
4239
  if (!isTodosPostgresBackend(config))
4239
4240
  return;
4240
4241
  if (!config.database?.url) {
4241
- throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${TODOS_STORAGE_ENV.mode}=${config.mode}`);
4242
+ throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when the postgresql backend is selected`);
4242
4243
  }
4243
4244
  }
4244
4245
  function parseStorageBackend(value) {
4245
4246
  const normalized = clean(value)?.toLowerCase();
4246
4247
  if (!normalized)
4247
4248
  return "sqlite";
4248
- if (normalized === "sqlite" || normalized === "postgres")
4249
- return normalized;
4250
- const legacy = LEGACY_BACKEND_TOKENS[normalized];
4251
- if (legacy)
4252
- return legacy;
4253
- throw new Error(`${TODOS_STORAGE_ENV.mode} must be sqlite or postgres (legacy values local and remote are accepted)`);
4249
+ if (normalized === "sqlite")
4250
+ return "sqlite";
4251
+ if (normalized === "postgres" || normalized === "postgresql")
4252
+ return "postgres";
4253
+ if (["local", "remote", "cloud", "hybrid", "self_hosted"].includes(normalized)) {
4254
+ throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} selects the backend. Deployment modes no longer exist: ` + `delete the storage-mode variable and set ${TODOS_STORAGE_ENV.databaseUrl} to select the ` + `postgresql backend, or leave it unset for sqlite.`);
4255
+ }
4256
+ throw new Error(`Storage backend must be sqlite or postgres`);
4254
4257
  }
4255
4258
  function parseStorageMode(value) {
4256
4259
  return parseStorageBackend(value);
4257
4260
  }
4258
4261
  function getTodosStorageBackend(env = process.env) {
4259
- return parseStorageBackend(readStorageEnv(env, "mode").value);
4262
+ for (const key of REMOVED_STORAGE_MODE_ENV_KEYS) {
4263
+ if (Object.hasOwn(env, key) && env[key] !== undefined) {
4264
+ throw new Error(`${key} was removed. Deployment modes no longer exist: delete the storage-mode variable. ` + `Set ${TODOS_STORAGE_ENV.databaseUrl} to select the postgresql backend, ` + `or leave it unset for sqlite.`);
4265
+ }
4266
+ }
4267
+ if (!getTodosStorageDatabaseUrl(env))
4268
+ return "sqlite";
4269
+ if (isTodosShadowEnabled(env))
4270
+ return "sqlite";
4271
+ return "postgres";
4260
4272
  }
4261
4273
  function getTodosStorageMode(env = process.env) {
4262
4274
  return getTodosStorageBackend(env);
@@ -4330,7 +4342,7 @@ function parsePositiveInteger(value, fallback) {
4330
4342
  }
4331
4343
  return parsed;
4332
4344
  }
4333
- 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;
4345
+ var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, REMOVED_STORAGE_MODE_ENV_KEYS, 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";
4334
4346
  var init_config = __esm(() => {
4335
4347
  TODOS_STORAGE_TABLES = [
4336
4348
  "todos_sync_records",
@@ -4338,7 +4350,6 @@ var init_config = __esm(() => {
4338
4350
  ];
4339
4351
  STORAGE_TABLES = TODOS_STORAGE_TABLES;
4340
4352
  TODOS_STORAGE_ENV = {
4341
- mode: "HASNA_TODOS_STORAGE_MODE",
4342
4353
  shadow: "HASNA_TODOS_SHADOW",
4343
4354
  databaseUrl: "HASNA_TODOS_DATABASE_URL",
4344
4355
  databaseSsl: "HASNA_TODOS_DATABASE_SSL",
@@ -4355,7 +4366,6 @@ var init_config = __esm(() => {
4355
4366
  syncDryRun: "HASNA_TODOS_SYNC_DRY_RUN"
4356
4367
  };
4357
4368
  TODOS_STORAGE_FALLBACK_ENV = {
4358
- mode: "TODOS_STORAGE_MODE",
4359
4369
  shadow: "TODOS_SHADOW",
4360
4370
  databaseUrl: "TODOS_DATABASE_URL",
4361
4371
  databaseSsl: "TODOS_DATABASE_SSL",
@@ -4371,14 +4381,12 @@ var init_config = __esm(() => {
4371
4381
  syncBatchSize: "TODOS_SYNC_BATCH_SIZE",
4372
4382
  syncDryRun: "TODOS_SYNC_DRY_RUN"
4373
4383
  };
4374
- LEGACY_BACKEND_TOKENS = {
4375
- local: "sqlite",
4376
- remote: "postgres",
4377
- postgresql: "postgres",
4378
- hybrid: "postgres",
4379
- self_hosted: "postgres",
4380
- cloud: "postgres"
4381
- };
4384
+ REMOVED_STORAGE_MODE_ENV_KEYS = [
4385
+ "HASNA_TODOS_STORAGE_MODE",
4386
+ "HASNA_TODOS_MODE",
4387
+ "TODOS_STORAGE_MODE",
4388
+ "TODOS_MODE"
4389
+ ];
4382
4390
  });
4383
4391
 
4384
4392
  // src/storage/shadow-outbox-schema.ts
@@ -7227,8 +7235,8 @@ var init_secret_redaction = __esm(() => {
7227
7235
  SECRET_REDACTION_SCHEMA = ["todos", "secret_redaction", "v1"].join(".");
7228
7236
  DEFAULT_PATTERNS = [
7229
7237
  { name: "openai_sk", pattern: /\bsk-[a-zA-Z0-9]{10,}\b/g },
7230
- { name: "github_pat", pattern: /\bghp_[a-zA-Z0-9]{20,}\b/g },
7231
- { name: "github_oauth", pattern: /\bgho_[a-zA-Z0-9]{20,}\b/g },
7238
+ { name: "github_pat", pattern: /\bgh[p]_[a-zA-Z0-9]{20,}\b/g },
7239
+ { name: "github_oauth", pattern: /\bgh[o]_[a-zA-Z0-9]{20,}\b/g },
7232
7240
  { name: "aws_access_key", pattern: /\bAKIA[0-9A-Z]{16}\b/g },
7233
7241
  { name: "bearer_token", pattern: /\bBearer\s+[a-zA-Z0-9\-._~+/]+=*\b/gi },
7234
7242
  { name: "jwt", pattern: /\beyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\b/g },
@@ -7240,7 +7248,7 @@ var init_secret_redaction = __esm(() => {
7240
7248
  /example\.com/i,
7241
7249
  /your-api-key-here/i,
7242
7250
  /sk-test/i,
7243
- /ghp_xxx/i
7251
+ /gh[p]_xxx/i
7244
7252
  ];
7245
7253
  customRedactors = [];
7246
7254
  });
@@ -12720,7 +12728,7 @@ var init_tasks = __esm(() => {
12720
12728
  // package.json
12721
12729
  var package_default = {
12722
12730
  name: "@hasna/todos",
12723
- version: "0.15.32",
12731
+ version: "0.15.34",
12724
12732
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12725
12733
  type: "module",
12726
12734
  main: "dist/index.js",
@@ -12794,9 +12802,7 @@ var package_default = {
12794
12802
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
12795
12803
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12796
12804
  "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12797
- "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts scripts/attested-container-compatibility-vector.test.ts",
12798
- "emit:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts emit",
12799
- "verify:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts verify",
12805
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12800
12806
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12801
12807
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12802
12808
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.15.32",
3
+ "packageVersion": "0.15.34",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "1d458a0ef6acb9e821cba89b3b7cf1ae316781d7",
6
- "gitTree": "c8bbdfbedab0c0af164640532aaaebc102441968",
7
- "sourceTreeSha256": "defc279f0e698221d01999e646dfa52f5012c930cfa97fb20a596c936ad21060",
8
- "generatedAt": "2026-08-12T17:50:57.000Z"
5
+ "gitCommit": "1e6a7cf5727c4e29cc48d4fabad68602a1bdb183",
6
+ "gitTree": "2a0facd155af45e5d46ced7ae193643b223ff4e5",
7
+ "sourceTreeSha256": "e735d06856448b5f3f5903fa141b5201c768077e6531fb7761ab65b5f54a1b8a",
8
+ "generatedAt": "2026-08-15T18:18:40.000Z"
9
9
  }