@hasna/todos 0.15.24 → 0.15.26

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/contracts.js CHANGED
@@ -12658,7 +12658,7 @@ var init_tasks = __esm(() => {
12658
12658
  // package.json
12659
12659
  var package_default = {
12660
12660
  name: "@hasna/todos",
12661
- version: "0.15.24",
12661
+ version: "0.15.26",
12662
12662
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12663
12663
  type: "module",
12664
12664
  main: "dist/index.js",
@@ -12707,7 +12707,8 @@ var package_default = {
12707
12707
  }
12708
12708
  },
12709
12709
  workspaces: [
12710
- "dashboard"
12710
+ "dashboard",
12711
+ "ai"
12711
12712
  ],
12712
12713
  files: [
12713
12714
  "dist",
@@ -12730,6 +12731,8 @@ var package_default = {
12730
12731
  "dev:serve": "bun run src/server/index.ts",
12731
12732
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
12732
12733
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12734
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12735
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12733
12736
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12734
12737
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12735
12738
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -12776,12 +12779,14 @@ var package_default = {
12776
12779
  zod: "^3.24.2"
12777
12780
  },
12778
12781
  overrides: {
12782
+ ajv: "8.20.0",
12779
12783
  "fast-uri": "3.1.2"
12780
12784
  },
12781
12785
  devDependencies: {
12782
12786
  "@types/bun": "^1.2.4",
12783
12787
  "@types/react": "^18.3.18",
12784
12788
  "bun-types": "1.3.9",
12789
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
12785
12790
  typescript: "^5.7.3"
12786
12791
  }
12787
12792
  };
package/dist/index.js CHANGED
@@ -12771,7 +12771,7 @@ var init_dispatches = __esm(() => {
12771
12771
  // package.json
12772
12772
  var package_default = {
12773
12773
  name: "@hasna/todos",
12774
- version: "0.15.24",
12774
+ version: "0.15.26",
12775
12775
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12776
12776
  type: "module",
12777
12777
  main: "dist/index.js",
@@ -12820,7 +12820,8 @@ var package_default = {
12820
12820
  }
12821
12821
  },
12822
12822
  workspaces: [
12823
- "dashboard"
12823
+ "dashboard",
12824
+ "ai"
12824
12825
  ],
12825
12826
  files: [
12826
12827
  "dist",
@@ -12843,6 +12844,8 @@ var package_default = {
12843
12844
  "dev:serve": "bun run src/server/index.ts",
12844
12845
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
12845
12846
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12847
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12848
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12846
12849
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12847
12850
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12848
12851
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -12889,12 +12892,14 @@ var package_default = {
12889
12892
  zod: "^3.24.2"
12890
12893
  },
12891
12894
  overrides: {
12895
+ ajv: "8.20.0",
12892
12896
  "fast-uri": "3.1.2"
12893
12897
  },
12894
12898
  devDependencies: {
12895
12899
  "@types/bun": "^1.2.4",
12896
12900
  "@types/react": "^18.3.18",
12897
12901
  "bun-types": "1.3.9",
12902
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
12898
12903
  typescript: "^5.7.3"
12899
12904
  }
12900
12905
  };
@@ -40423,6 +40428,12 @@ function parseTodosTaskManifestBindingLookup(input) {
40423
40428
  return parsed.data;
40424
40429
  }
40425
40430
 
40431
+ // src/task-manifest/plan-slug.ts
40432
+ function taskManifestPlanSlug(manifest, planId) {
40433
+ const base = normalizeSlug(manifest.plan.key) || normalizeSlug(manifest.plan.name) || "plan";
40434
+ return `${base}-${planId}`;
40435
+ }
40436
+
40426
40437
  // src/task-manifest/backend.ts
40427
40438
  var UUID_PATTERN2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
40428
40439
  function validateTaskManifestBindingLookupRows(rows, tenantId, planId) {
@@ -40773,7 +40784,7 @@ class SqliteTodosTaskManifestBackend {
40773
40784
  }
40774
40785
  }
40775
40786
  this.db.query(`INSERT INTO plans (id, project_id, name, description, status, task_list_id, slug, created_at, updated_at)
40776
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.graph.plan_id, manifest.project_id, manifest.plan.name, manifest.plan.description ?? null, manifest.plan.status ?? "active", manifest.task_list_id ?? null, null, input.now, input.now);
40787
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.graph.plan_id, manifest.project_id, manifest.plan.name, manifest.plan.description ?? null, manifest.plan.status ?? "active", manifest.task_list_id ?? null, taskManifestPlanSlug(manifest, input.graph.plan_id), input.now, input.now);
40777
40788
  fault(faults, "after_plan_write");
40778
40789
  for (const task3 of manifest.tasks) {
40779
40790
  const taskId = input.graph.task_ids[task3.key];
@@ -40996,7 +41007,7 @@ class SqliteTodosTaskManifestBackend {
40996
41007
  throw new TodosTaskManifestError("TODOS_TASK_MANIFEST_COMPENSATION_REFUSED", "Compensation refused: graph changed since apply", { actualReadback });
40997
41008
  }
40998
41009
  const plan = this.db.query("SELECT project_id, name, description, status, task_list_id, slug FROM plans WHERE id = ? LIMIT 1").get(applyResult.graph.plan_id);
40999
- if (!plan || plan["project_id"] !== manifest.project_id || plan["name"] !== manifest.plan.name || plan["description"] !== (manifest.plan.description ?? null) || plan["status"] !== (manifest.plan.status ?? "active") || plan["task_list_id"] !== (manifest.task_list_id ?? null) || plan["slug"] !== null) {
41010
+ if (!plan || plan["project_id"] !== manifest.project_id || plan["name"] !== manifest.plan.name || plan["description"] !== (manifest.plan.description ?? null) || plan["status"] !== (manifest.plan.status ?? "active") || plan["task_list_id"] !== (manifest.task_list_id ?? null) || plan["slug"] !== taskManifestPlanSlug(manifest, applyResult.graph.plan_id)) {
41000
41011
  throw new TodosTaskManifestError("TODOS_TASK_MANIFEST_COMPENSATION_REFUSED", "Compensation refused: plan changed since apply");
41001
41012
  }
41002
41013
  for (const task3 of manifest.tasks) {
@@ -41194,7 +41205,7 @@ function taskPayload2(manifest, task3, taskId, planId, now4) {
41194
41205
  function planPayload(input) {
41195
41206
  return {
41196
41207
  id: input.graph.plan_id,
41197
- slug: null,
41208
+ slug: taskManifestPlanSlug(input.manifest, input.graph.plan_id),
41198
41209
  project_id: input.manifest.project_id,
41199
41210
  task_list_id: input.manifest.task_list_id ?? null,
41200
41211
  agent_id: null,
@@ -43178,11 +43189,14 @@ function resolveAdapter(options) {
43178
43189
  const client = getTodosCloudClient(options.env);
43179
43190
  return client ? createHttpTodosAiReadAdapter(client) : createLocalTodosAiReadAdapter(options.database);
43180
43191
  }
43181
- function resolvePermission(options) {
43192
+ function resolvePermission(options, profile) {
43182
43193
  if (options.workspacePermission)
43183
43194
  return options.workspacePermission;
43184
43195
  const path = options.workspacePath ?? process.cwd();
43185
- return (permission) => checkWorkspacePermission({ path, tool: permission }).allowed;
43196
+ return (permission, tool) => {
43197
+ const check = checkWorkspacePermission({ path, tool: permission });
43198
+ return check.allowed || profile === "minimal" && tool === "get_task" && permission === "read" && check.status.matched_root === null && check.status.profile.preset === "restricted";
43199
+ };
43186
43200
  }
43187
43201
  function configuredProfileIsKnown(value) {
43188
43202
  if (value === undefined || value.trim() === "")
@@ -43194,7 +43208,7 @@ function createTodosAiToolSource(options = {}) {
43194
43208
  const adapter = resolveAdapter(options);
43195
43209
  const configuredProfile = options.env ? options.env["TODOS_PROFILE"] : process.env["TODOS_PROFILE"];
43196
43210
  const profile = options.accessProfile ?? resolveAccessProfile(configuredProfile ?? "minimal");
43197
- const permission = resolvePermission(options);
43211
+ const permission = resolvePermission(options, profile);
43198
43212
  const enabled = new Set(TODOS_AI_READ_TOOL_NAMES.filter((name) => shouldRegisterToolForProfile2(name, profile) && permission(name === "get_task" ? "read" : "list", name)));
43199
43213
  const hostAllowsUpdate = (options.accessProfile !== undefined || configuredProfileIsKnown(configuredProfile)) && shouldRegisterToolForProfile2("update_task", profile) && permission("write", "update_task");
43200
43214
  const approvalVerifier = options.approvalVerifier ?? adapter.verifyApproval;
package/dist/mcp/index.js CHANGED
@@ -35803,7 +35803,7 @@ var package_default;
35803
35803
  var init_package = __esm(() => {
35804
35804
  package_default = {
35805
35805
  name: "@hasna/todos",
35806
- version: "0.15.24",
35806
+ version: "0.15.26",
35807
35807
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
35808
35808
  type: "module",
35809
35809
  main: "dist/index.js",
@@ -35852,7 +35852,8 @@ var init_package = __esm(() => {
35852
35852
  }
35853
35853
  },
35854
35854
  workspaces: [
35855
- "dashboard"
35855
+ "dashboard",
35856
+ "ai"
35856
35857
  ],
35857
35858
  files: [
35858
35859
  "dist",
@@ -35875,6 +35876,8 @@ var init_package = __esm(() => {
35875
35876
  "dev:serve": "bun run src/server/index.ts",
35876
35877
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
35877
35878
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
35879
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
35880
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
35878
35881
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
35879
35882
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
35880
35883
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -35921,12 +35924,14 @@ var init_package = __esm(() => {
35921
35924
  zod: "^3.24.2"
35922
35925
  },
35923
35926
  overrides: {
35927
+ ajv: "8.20.0",
35924
35928
  "fast-uri": "3.1.2"
35925
35929
  },
35926
35930
  devDependencies: {
35927
35931
  "@types/bun": "^1.2.4",
35928
35932
  "@types/react": "^18.3.18",
35929
35933
  "bun-types": "1.3.9",
35934
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
35930
35935
  typescript: "^5.7.3"
35931
35936
  }
35932
35937
  };
@@ -51825,6 +51830,13 @@ var init_schema2 = __esm(() => {
51825
51830
  }).strict();
51826
51831
  });
51827
51832
 
51833
+ // src/task-manifest/plan-slug.ts
51834
+ function taskManifestPlanSlug(manifest, planId) {
51835
+ const base = normalizeSlug(manifest.plan.key) || normalizeSlug(manifest.plan.name) || "plan";
51836
+ return `${base}-${planId}`;
51837
+ }
51838
+ var init_plan_slug = () => {};
51839
+
51828
51840
  // src/task-manifest/backend.ts
51829
51841
  function validateTaskManifestBindingLookupRows(rows, tenantId, planId) {
51830
51842
  if (rows.length === 0) {
@@ -51961,6 +51973,7 @@ function postgresTodosTaskManifestSchemaSql(tenantId = "default") {
51961
51973
  var sqliteTails;
51962
51974
  var init_sqlite2 = __esm(() => {
51963
51975
  init_canonical();
51976
+ init_plan_slug();
51964
51977
  init_backend();
51965
51978
  init_types5();
51966
51979
  sqliteTails = new WeakMap;
@@ -52061,7 +52074,7 @@ function taskPayload2(manifest, task3, taskId, planId, now4) {
52061
52074
  function planPayload(input) {
52062
52075
  return {
52063
52076
  id: input.graph.plan_id,
52064
- slug: null,
52077
+ slug: taskManifestPlanSlug(input.manifest, input.graph.plan_id),
52065
52078
  project_id: input.manifest.project_id,
52066
52079
  task_list_id: input.manifest.task_list_id ?? null,
52067
52080
  agent_id: null,
@@ -52610,6 +52623,7 @@ class PostgresTodosTaskManifestBackend {
52610
52623
  }
52611
52624
  var init_postgres3 = __esm(() => {
52612
52625
  init_canonical();
52626
+ init_plan_slug();
52613
52627
  init_backend();
52614
52628
  init_postgres_sync();
52615
52629
  init_types5();
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.15.24",
44
+ version: "0.15.26",
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",
@@ -90,7 +90,8 @@ var package_default = {
90
90
  }
91
91
  },
92
92
  workspaces: [
93
- "dashboard"
93
+ "dashboard",
94
+ "ai"
94
95
  ],
95
96
  files: [
96
97
  "dist",
@@ -113,6 +114,8 @@ var package_default = {
113
114
  "dev:serve": "bun run src/server/index.ts",
114
115
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
115
116
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
117
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
118
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
116
119
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
117
120
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
118
121
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -159,12 +162,14 @@ var package_default = {
159
162
  zod: "^3.24.2"
160
163
  },
161
164
  overrides: {
165
+ ajv: "8.20.0",
162
166
  "fast-uri": "3.1.2"
163
167
  },
164
168
  devDependencies: {
165
169
  "@types/bun": "^1.2.4",
166
170
  "@types/react": "^18.3.18",
167
171
  "bun-types": "1.3.9",
172
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
168
173
  typescript: "^5.7.3"
169
174
  }
170
175
  };
@@ -12661,7 +12661,7 @@ import { createHash as createHash6 } from "crypto";
12661
12661
  // package.json
12662
12662
  var package_default = {
12663
12663
  name: "@hasna/todos",
12664
- version: "0.15.24",
12664
+ version: "0.15.26",
12665
12665
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12666
12666
  type: "module",
12667
12667
  main: "dist/index.js",
@@ -12710,7 +12710,8 @@ var package_default = {
12710
12710
  }
12711
12711
  },
12712
12712
  workspaces: [
12713
- "dashboard"
12713
+ "dashboard",
12714
+ "ai"
12714
12715
  ],
12715
12716
  files: [
12716
12717
  "dist",
@@ -12733,6 +12734,8 @@ var package_default = {
12733
12734
  "dev:serve": "bun run src/server/index.ts",
12734
12735
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
12735
12736
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12737
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12738
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12736
12739
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12737
12740
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12738
12741
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -12779,12 +12782,14 @@ var package_default = {
12779
12782
  zod: "^3.24.2"
12780
12783
  },
12781
12784
  overrides: {
12785
+ ajv: "8.20.0",
12782
12786
  "fast-uri": "3.1.2"
12783
12787
  },
12784
12788
  devDependencies: {
12785
12789
  "@types/bun": "^1.2.4",
12786
12790
  "@types/react": "^18.3.18",
12787
12791
  "bun-types": "1.3.9",
12792
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
12788
12793
  typescript: "^5.7.3"
12789
12794
  }
12790
12795
  };
package/dist/registry.js CHANGED
@@ -12658,7 +12658,7 @@ var init_tasks = __esm(() => {
12658
12658
  // package.json
12659
12659
  var package_default = {
12660
12660
  name: "@hasna/todos",
12661
- version: "0.15.24",
12661
+ version: "0.15.26",
12662
12662
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12663
12663
  type: "module",
12664
12664
  main: "dist/index.js",
@@ -12707,7 +12707,8 @@ var package_default = {
12707
12707
  }
12708
12708
  },
12709
12709
  workspaces: [
12710
- "dashboard"
12710
+ "dashboard",
12711
+ "ai"
12711
12712
  ],
12712
12713
  files: [
12713
12714
  "dist",
@@ -12730,6 +12731,8 @@ var package_default = {
12730
12731
  "dev:serve": "bun run src/server/index.ts",
12731
12732
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
12732
12733
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12734
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12735
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12733
12736
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12734
12737
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12735
12738
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -12776,12 +12779,14 @@ var package_default = {
12776
12779
  zod: "^3.24.2"
12777
12780
  },
12778
12781
  overrides: {
12782
+ ajv: "8.20.0",
12779
12783
  "fast-uri": "3.1.2"
12780
12784
  },
12781
12785
  devDependencies: {
12782
12786
  "@types/bun": "^1.2.4",
12783
12787
  "@types/react": "^18.3.18",
12784
12788
  "bun-types": "1.3.9",
12789
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
12785
12790
  typescript: "^5.7.3"
12786
12791
  }
12787
12792
  };
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.15.24",
3
+ "packageVersion": "0.15.26",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "0615d8cf75416fa0cd8846dd95394574d25c82bf",
6
- "gitTree": "cca883ccd7d6844e682869d38d4e9b588f256281",
7
- "sourceTreeSha256": "a806a5f6d99bdfcb9aa142ea45c024dca2d11877310ed8e65c0f594184315cf7",
8
- "generatedAt": "2026-08-10T15:43:01.000Z"
5
+ "gitCommit": "34751c1061a1947a6744a6258edc3a35e2c44e5f",
6
+ "gitTree": "c475638e8e15e320c77788bb801751180b96360a",
7
+ "sourceTreeSha256": "86687d0033f4f9f66be50d537891bbf47cfeee33518b064df796d1c04b42c987",
8
+ "generatedAt": "2026-08-10T21:23:08.000Z"
9
9
  }