@hasna/todos 0.11.70 → 0.11.71

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.
@@ -1248,6 +1248,11 @@ var init_migrations = __esm(() => {
1248
1248
  CREATE INDEX IF NOT EXISTS idx_storage_tombstones_object ON storage_tombstones(object_type, object_id);
1249
1249
  CREATE INDEX IF NOT EXISTS idx_storage_tombstones_updated ON storage_tombstones(updated_at);
1250
1250
  INSERT OR IGNORE INTO _migrations (id) VALUES (63);
1251
+ `,
1252
+ `
1253
+ ALTER TABLE plans ADD COLUMN slug TEXT;
1254
+ CREATE INDEX IF NOT EXISTS idx_plans_slug ON plans(slug);
1255
+ INSERT OR IGNORE INTO _migrations (id) VALUES (64);
1251
1256
  `
1252
1257
  ];
1253
1258
  });
@@ -1271,6 +1276,29 @@ function runMigrations(db) {
1271
1276
  }
1272
1277
  ensureSchema(db);
1273
1278
  }
1279
+ function planSlugBase(value) {
1280
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "plan";
1281
+ }
1282
+ function backfillPlanSlugs(db) {
1283
+ try {
1284
+ const rows = db.query("SELECT id, project_id, name, slug FROM plans ORDER BY created_at ASC, id ASC").all();
1285
+ const used = new Set;
1286
+ for (const row of rows) {
1287
+ const scope = row.project_id ?? "__global__";
1288
+ const base = planSlugBase(row.slug || row.name);
1289
+ let candidate = base;
1290
+ let suffix = 2;
1291
+ while (used.has(`${scope}:${candidate}`)) {
1292
+ candidate = `${base}-${suffix}`;
1293
+ suffix += 1;
1294
+ }
1295
+ used.add(`${scope}:${candidate}`);
1296
+ if (row.slug !== candidate) {
1297
+ db.run("UPDATE plans SET slug = ? WHERE id = ?", [candidate, row.id]);
1298
+ }
1299
+ }
1300
+ } catch {}
1301
+ }
1274
1302
  function ensureSchema(db) {
1275
1303
  const ensureColumn = (table, column, type) => {
1276
1304
  try {
@@ -1320,7 +1348,8 @@ function ensureSchema(db) {
1320
1348
  )`);
1321
1349
  ensureTable("plans", `
1322
1350
  CREATE TABLE plans (
1323
- id TEXT PRIMARY KEY, project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
1351
+ id TEXT PRIMARY KEY, slug TEXT,
1352
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
1324
1353
  task_list_id TEXT, agent_id TEXT,
1325
1354
  name TEXT NOT NULL, description TEXT,
1326
1355
  status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'archived')),
@@ -1835,8 +1864,10 @@ function ensureSchema(db) {
1835
1864
  ensureColumn("agents", "org_id", "TEXT");
1836
1865
  ensureColumn("agents", "capabilities", "TEXT DEFAULT '[]'");
1837
1866
  ensureColumn("projects", "org_id", "TEXT");
1867
+ ensureColumn("plans", "slug", "TEXT");
1838
1868
  ensureColumn("plans", "task_list_id", "TEXT");
1839
1869
  ensureColumn("plans", "agent_id", "TEXT");
1870
+ backfillPlanSlugs(db);
1840
1871
  ensureColumn("task_templates", "variables", "TEXT DEFAULT '[]'");
1841
1872
  ensureColumn("task_templates", "version", "INTEGER NOT NULL DEFAULT 1");
1842
1873
  ensureColumn("template_tasks", "condition", "TEXT");
@@ -1951,6 +1982,8 @@ function ensureSchema(db) {
1951
1982
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_tags_name ON tags(name)");
1952
1983
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_project ON plans(project_id)");
1953
1984
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_status ON plans(status)");
1985
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_slug ON plans(slug)");
1986
+ ensureIndex("CREATE UNIQUE INDEX IF NOT EXISTS idx_plans_scope_slug ON plans(COALESCE(project_id, ''), slug) WHERE slug IS NOT NULL");
1954
1987
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_task_list ON plans(task_list_id)");
1955
1988
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_agent ON plans(agent_id)");
1956
1989
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_history_task ON task_history(task_id)");
@@ -2799,6 +2832,9 @@ function clearExpiredLocks(db) {
2799
2832
  const cutoff = lockExpiryCutoff();
2800
2833
  db.run("UPDATE tasks SET locked_by = NULL, locked_at = NULL WHERE locked_at IS NOT NULL AND locked_at < ?", [cutoff]);
2801
2834
  }
2835
+ function slugifyRef(value) {
2836
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
2837
+ }
2802
2838
  function resolvePartialId(db, table, partialId) {
2803
2839
  if (!ALLOWED_TABLES.has(table)) {
2804
2840
  throw new Error(`Invalid table name: ${table}`);
@@ -2825,6 +2861,16 @@ function resolvePartialId(db, table, partialId) {
2825
2861
  if (slugRow)
2826
2862
  return slugRow.id;
2827
2863
  }
2864
+ if (table === "plans") {
2865
+ const slug = slugifyRef(partialId);
2866
+ if (slug) {
2867
+ const slugRows = db.query("SELECT id FROM plans WHERE slug = ?").all(slug);
2868
+ if (slugRows.length === 1)
2869
+ return slugRows[0].id;
2870
+ if (slugRows.length > 1)
2871
+ return null;
2872
+ }
2873
+ }
2828
2874
  if (table === "projects") {
2829
2875
  const nameRow = db.query("SELECT id FROM projects WHERE lower(name) = ?").get(partialId.toLowerCase());
2830
2876
  if (nameRow)
@@ -8142,15 +8188,59 @@ var init_task_relations = __esm(() => {
8142
8188
  });
8143
8189
 
8144
8190
  // src/db/plans.ts
8191
+ function planSlugBase2(value) {
8192
+ return slugify(value) || "plan";
8193
+ }
8194
+ function normalizePlanSlug(value) {
8195
+ const slug = slugify(value);
8196
+ if (!slug)
8197
+ throw new Error("Invalid plan slug");
8198
+ return slug;
8199
+ }
8200
+ function plansBySlug(slug, db, projectId) {
8201
+ if (projectId !== undefined) {
8202
+ if (projectId === null) {
8203
+ return db.query("SELECT * FROM plans WHERE slug = ? AND project_id IS NULL ORDER BY created_at ASC, id ASC").all(slug);
8204
+ }
8205
+ return db.query("SELECT * FROM plans WHERE slug = ? AND project_id = ? ORDER BY created_at ASC, id ASC").all(slug, projectId);
8206
+ }
8207
+ return db.query("SELECT * FROM plans WHERE slug = ? ORDER BY created_at ASC, id ASC").all(slug);
8208
+ }
8209
+ function planSlugExists(slug, projectId, db, excludeId) {
8210
+ const rows = plansBySlug(slug, db, projectId);
8211
+ return rows.some((plan) => plan.id !== excludeId);
8212
+ }
8213
+ function nextPlanSlug(base, projectId, db, excludeId) {
8214
+ let candidate = base;
8215
+ let suffix = 2;
8216
+ while (planSlugExists(candidate, projectId, db, excludeId)) {
8217
+ candidate = `${base}-${suffix}`;
8218
+ suffix += 1;
8219
+ }
8220
+ return candidate;
8221
+ }
8222
+ function resolveCreateSlug(input, projectId, db) {
8223
+ if (input.slug !== undefined) {
8224
+ const slug = normalizePlanSlug(input.slug);
8225
+ if (planSlugExists(slug, projectId, db)) {
8226
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
8227
+ }
8228
+ return slug;
8229
+ }
8230
+ return nextPlanSlug(planSlugBase2(input.name), projectId, db);
8231
+ }
8145
8232
  function createPlan(input, db) {
8146
8233
  const d = db || getDatabase();
8147
8234
  const id = uuid();
8148
8235
  const timestamp = now();
8236
+ const projectId = input.project_id || null;
8237
+ const slug = resolveCreateSlug(input, projectId, d);
8149
8238
  const machineId = currentStorageMachineId(d);
8150
- d.run(`INSERT INTO plans (id, project_id, task_list_id, agent_id, name, description, status, created_at, updated_at, machine_id)
8151
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
8239
+ d.run(`INSERT INTO plans (id, slug, project_id, task_list_id, agent_id, name, description, status, created_at, updated_at, machine_id)
8240
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
8152
8241
  id,
8153
- input.project_id || null,
8242
+ slug,
8243
+ projectId,
8154
8244
  input.task_list_id || null,
8155
8245
  input.agent_id || null,
8156
8246
  input.name,
@@ -8185,6 +8275,14 @@ function updatePlan(id, input, db) {
8185
8275
  sets.push("name = ?");
8186
8276
  params.push(input.name);
8187
8277
  }
8278
+ if (input.slug !== undefined) {
8279
+ const slug = normalizePlanSlug(input.slug);
8280
+ if (planSlugExists(slug, plan.project_id, d, id)) {
8281
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
8282
+ }
8283
+ sets.push("slug = ?");
8284
+ params.push(slug);
8285
+ }
8188
8286
  if (input.description !== undefined) {
8189
8287
  sets.push("description = ?");
8190
8288
  params.push(input.description);
@@ -8229,6 +8327,7 @@ var init_plans = __esm(() => {
8229
8327
  init_event_emission_safety();
8230
8328
  init_event_hooks();
8231
8329
  init_database();
8330
+ init_projects();
8232
8331
  init_storage_tombstones();
8233
8332
  });
8234
8333
 
@@ -12111,6 +12210,7 @@ async function handleCreatePlan(req, _ctx, json2) {
12111
12210
  return json2({ error: "Missing 'name'" }, 400);
12112
12211
  const plan = createPlan({
12113
12212
  name: body.name,
12213
+ slug: body.slug,
12114
12214
  description: body.description,
12115
12215
  project_id: body.project_id,
12116
12216
  task_list_id: body.task_list_id,
@@ -40130,6 +40230,7 @@ Tasks:` : null,
40130
40230
  if (shouldRegisterTool("create_plan")) {
40131
40231
  server.tool("create_plan", "Create a new plan (sprint/milestone).", {
40132
40232
  name: exports_external.string().describe("Plan name"),
40233
+ slug: exports_external.string().optional().describe("Readable plan slug"),
40133
40234
  project_id: exports_external.string().optional().describe("Project ID"),
40134
40235
  description: exports_external.string().optional(),
40135
40236
  start_date: exports_external.string().optional().describe("ISO date"),
@@ -70547,6 +70648,36 @@ function prepareValue(column, value) {
70547
70648
  return JSON.stringify(value ?? (column === "tags" || column === "files_changed" ? [] : {}));
70548
70649
  return value === undefined ? null : value;
70549
70650
  }
70651
+ function slugifyPlanValue(value) {
70652
+ return typeof value === "string" ? value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") : "";
70653
+ }
70654
+ function planSlugBase3(plan) {
70655
+ return slugifyPlanValue(plan.slug) || slugifyPlanValue(plan.name) || "plan";
70656
+ }
70657
+ function planSlugScope(projectId) {
70658
+ return typeof projectId === "string" && projectId ? projectId : "__global__";
70659
+ }
70660
+ function planSlugKey(projectId, slug) {
70661
+ return `${planSlugScope(projectId)}:${slug}`;
70662
+ }
70663
+ function normalizeBridgePlanSlugs(plans, db) {
70664
+ const existingRows = db.query("SELECT id, project_id, slug FROM plans WHERE slug IS NOT NULL").all();
70665
+ const existingIds = new Set(existingRows.map((row) => row.id));
70666
+ const used = new Set(existingRows.filter((row) => row.slug).map((row) => planSlugKey(row.project_id, row.slug)));
70667
+ return plans.map((plan) => {
70668
+ if (existingIds.has(plan.id))
70669
+ return plan;
70670
+ const base = planSlugBase3(plan);
70671
+ let candidate = base;
70672
+ let suffix = 2;
70673
+ while (used.has(planSlugKey(plan.project_id, candidate))) {
70674
+ candidate = `${base}-${suffix}`;
70675
+ suffix += 1;
70676
+ }
70677
+ used.add(planSlugKey(plan.project_id, candidate));
70678
+ return { ...plan, slug: candidate };
70679
+ });
70680
+ }
70550
70681
  function insertRecord(db, tableKey, row) {
70551
70682
  const table = tableByKey[tableKey];
70552
70683
  const columns = insertColumns[tableKey];
@@ -70683,6 +70814,7 @@ function importLocalBridgeBundle(bundle, options = {}, db) {
70683
70814
  const conflictStrategy = options.conflictStrategy ?? "skip";
70684
70815
  const data = {
70685
70816
  ...bundle.data,
70817
+ plans: normalizeBridgePlanSlugs(bundle.data.plans, d),
70686
70818
  tasks: sortedTasks(bundle.data.tasks),
70687
70819
  saved_views: bundle.data.saved_views ?? [],
70688
70820
  task_boards: bundle.data.task_boards ?? [],
@@ -70767,7 +70899,7 @@ var init_local_bridge = __esm(() => {
70767
70899
  insertColumns = {
70768
70900
  projects: ["id", "name", "path", "description", "task_list_id", "task_prefix", "task_counter", "created_at", "updated_at", "machine_id", "synced_at"],
70769
70901
  task_lists: ["id", "project_id", "slug", "name", "description", "metadata", "created_at", "updated_at", "machine_id", "synced_at"],
70770
- plans: ["id", "project_id", "task_list_id", "agent_id", "name", "description", "status", "created_at", "updated_at", "machine_id", "synced_at"],
70902
+ plans: ["id", "slug", "project_id", "task_list_id", "agent_id", "name", "description", "status", "created_at", "updated_at", "machine_id", "synced_at"],
70771
70903
  tasks: [
70772
70904
  "id",
70773
70905
  "short_id",
@@ -71269,6 +71401,7 @@ function createAgentProjectDemoBundle() {
71269
71401
  });
71270
71402
  data.plans.push({
71271
71403
  id: ids.plan,
71404
+ slug: "ship-local-demo-workflow",
71272
71405
  project_id: ids.project,
71273
71406
  task_list_id: ids.list,
71274
71407
  agent_id: "demo-agent",
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"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"}
package/dist/storage.js CHANGED
@@ -1328,6 +1328,11 @@ var init_migrations = __esm(() => {
1328
1328
  CREATE INDEX IF NOT EXISTS idx_storage_tombstones_object ON storage_tombstones(object_type, object_id);
1329
1329
  CREATE INDEX IF NOT EXISTS idx_storage_tombstones_updated ON storage_tombstones(updated_at);
1330
1330
  INSERT OR IGNORE INTO _migrations (id) VALUES (63);
1331
+ `,
1332
+ `
1333
+ ALTER TABLE plans ADD COLUMN slug TEXT;
1334
+ CREATE INDEX IF NOT EXISTS idx_plans_slug ON plans(slug);
1335
+ INSERT OR IGNORE INTO _migrations (id) VALUES (64);
1331
1336
  `
1332
1337
  ];
1333
1338
  });
@@ -1351,6 +1356,29 @@ function runMigrations(db) {
1351
1356
  }
1352
1357
  ensureSchema(db);
1353
1358
  }
1359
+ function planSlugBase(value) {
1360
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "plan";
1361
+ }
1362
+ function backfillPlanSlugs(db) {
1363
+ try {
1364
+ const rows = db.query("SELECT id, project_id, name, slug FROM plans ORDER BY created_at ASC, id ASC").all();
1365
+ const used = new Set;
1366
+ for (const row of rows) {
1367
+ const scope = row.project_id ?? "__global__";
1368
+ const base = planSlugBase(row.slug || row.name);
1369
+ let candidate = base;
1370
+ let suffix = 2;
1371
+ while (used.has(`${scope}:${candidate}`)) {
1372
+ candidate = `${base}-${suffix}`;
1373
+ suffix += 1;
1374
+ }
1375
+ used.add(`${scope}:${candidate}`);
1376
+ if (row.slug !== candidate) {
1377
+ db.run("UPDATE plans SET slug = ? WHERE id = ?", [candidate, row.id]);
1378
+ }
1379
+ }
1380
+ } catch {}
1381
+ }
1354
1382
  function ensureSchema(db) {
1355
1383
  const ensureColumn = (table, column, type) => {
1356
1384
  try {
@@ -1400,7 +1428,8 @@ function ensureSchema(db) {
1400
1428
  )`);
1401
1429
  ensureTable("plans", `
1402
1430
  CREATE TABLE plans (
1403
- id TEXT PRIMARY KEY, project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
1431
+ id TEXT PRIMARY KEY, slug TEXT,
1432
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
1404
1433
  task_list_id TEXT, agent_id TEXT,
1405
1434
  name TEXT NOT NULL, description TEXT,
1406
1435
  status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'archived')),
@@ -1915,8 +1944,10 @@ function ensureSchema(db) {
1915
1944
  ensureColumn("agents", "org_id", "TEXT");
1916
1945
  ensureColumn("agents", "capabilities", "TEXT DEFAULT '[]'");
1917
1946
  ensureColumn("projects", "org_id", "TEXT");
1947
+ ensureColumn("plans", "slug", "TEXT");
1918
1948
  ensureColumn("plans", "task_list_id", "TEXT");
1919
1949
  ensureColumn("plans", "agent_id", "TEXT");
1950
+ backfillPlanSlugs(db);
1920
1951
  ensureColumn("task_templates", "variables", "TEXT DEFAULT '[]'");
1921
1952
  ensureColumn("task_templates", "version", "INTEGER NOT NULL DEFAULT 1");
1922
1953
  ensureColumn("template_tasks", "condition", "TEXT");
@@ -2031,6 +2062,8 @@ function ensureSchema(db) {
2031
2062
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_tags_name ON tags(name)");
2032
2063
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_project ON plans(project_id)");
2033
2064
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_status ON plans(status)");
2065
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_slug ON plans(slug)");
2066
+ ensureIndex("CREATE UNIQUE INDEX IF NOT EXISTS idx_plans_scope_slug ON plans(COALESCE(project_id, ''), slug) WHERE slug IS NOT NULL");
2034
2067
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_task_list ON plans(task_list_id)");
2035
2068
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_agent ON plans(agent_id)");
2036
2069
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_history_task ON task_history(task_id)");
@@ -2864,6 +2897,9 @@ function clearExpiredLocks(db) {
2864
2897
  const cutoff = lockExpiryCutoff();
2865
2898
  db.run("UPDATE tasks SET locked_by = NULL, locked_at = NULL WHERE locked_at IS NOT NULL AND locked_at < ?", [cutoff]);
2866
2899
  }
2900
+ function slugifyRef(value) {
2901
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
2902
+ }
2867
2903
  function resolvePartialId(db, table, partialId) {
2868
2904
  if (!ALLOWED_TABLES.has(table)) {
2869
2905
  throw new Error(`Invalid table name: ${table}`);
@@ -2890,6 +2926,16 @@ function resolvePartialId(db, table, partialId) {
2890
2926
  if (slugRow)
2891
2927
  return slugRow.id;
2892
2928
  }
2929
+ if (table === "plans") {
2930
+ const slug = slugifyRef(partialId);
2931
+ if (slug) {
2932
+ const slugRows = db.query("SELECT id FROM plans WHERE slug = ?").all(slug);
2933
+ if (slugRows.length === 1)
2934
+ return slugRows[0].id;
2935
+ if (slugRows.length > 1)
2936
+ return null;
2937
+ }
2938
+ }
2893
2939
  if (table === "projects") {
2894
2940
  const nameRow = db.query("SELECT id FROM projects WHERE lower(name) = ?").get(partialId.toLowerCase());
2895
2941
  if (nameRow)
@@ -8179,15 +8225,59 @@ init_database();
8179
8225
  // src/db/plans.ts
8180
8226
  init_types();
8181
8227
  init_database();
8228
+ function planSlugBase2(value) {
8229
+ return slugify(value) || "plan";
8230
+ }
8231
+ function normalizePlanSlug(value) {
8232
+ const slug = slugify(value);
8233
+ if (!slug)
8234
+ throw new Error("Invalid plan slug");
8235
+ return slug;
8236
+ }
8237
+ function plansBySlug(slug, db, projectId) {
8238
+ if (projectId !== undefined) {
8239
+ if (projectId === null) {
8240
+ return db.query("SELECT * FROM plans WHERE slug = ? AND project_id IS NULL ORDER BY created_at ASC, id ASC").all(slug);
8241
+ }
8242
+ return db.query("SELECT * FROM plans WHERE slug = ? AND project_id = ? ORDER BY created_at ASC, id ASC").all(slug, projectId);
8243
+ }
8244
+ return db.query("SELECT * FROM plans WHERE slug = ? ORDER BY created_at ASC, id ASC").all(slug);
8245
+ }
8246
+ function planSlugExists(slug, projectId, db, excludeId) {
8247
+ const rows = plansBySlug(slug, db, projectId);
8248
+ return rows.some((plan) => plan.id !== excludeId);
8249
+ }
8250
+ function nextPlanSlug(base, projectId, db, excludeId) {
8251
+ let candidate = base;
8252
+ let suffix = 2;
8253
+ while (planSlugExists(candidate, projectId, db, excludeId)) {
8254
+ candidate = `${base}-${suffix}`;
8255
+ suffix += 1;
8256
+ }
8257
+ return candidate;
8258
+ }
8259
+ function resolveCreateSlug(input, projectId, db) {
8260
+ if (input.slug !== undefined) {
8261
+ const slug = normalizePlanSlug(input.slug);
8262
+ if (planSlugExists(slug, projectId, db)) {
8263
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
8264
+ }
8265
+ return slug;
8266
+ }
8267
+ return nextPlanSlug(planSlugBase2(input.name), projectId, db);
8268
+ }
8182
8269
  function createPlan(input, db) {
8183
8270
  const d = db || getDatabase();
8184
8271
  const id = uuid();
8185
8272
  const timestamp = now();
8273
+ const projectId = input.project_id || null;
8274
+ const slug = resolveCreateSlug(input, projectId, d);
8186
8275
  const machineId = currentStorageMachineId(d);
8187
- d.run(`INSERT INTO plans (id, project_id, task_list_id, agent_id, name, description, status, created_at, updated_at, machine_id)
8188
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
8276
+ d.run(`INSERT INTO plans (id, slug, project_id, task_list_id, agent_id, name, description, status, created_at, updated_at, machine_id)
8277
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
8189
8278
  id,
8190
- input.project_id || null,
8279
+ slug,
8280
+ projectId,
8191
8281
  input.task_list_id || null,
8192
8282
  input.agent_id || null,
8193
8283
  input.name,
@@ -8222,6 +8312,14 @@ function updatePlan(id, input, db) {
8222
8312
  sets.push("name = ?");
8223
8313
  params.push(input.name);
8224
8314
  }
8315
+ if (input.slug !== undefined) {
8316
+ const slug = normalizePlanSlug(input.slug);
8317
+ if (planSlugExists(slug, plan.project_id, d, id)) {
8318
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
8319
+ }
8320
+ sets.push("slug = ?");
8321
+ params.push(slug);
8322
+ }
8225
8323
  if (input.description !== undefined) {
8226
8324
  sets.push("description = ?");
8227
8325
  params.push(input.description);
@@ -11822,9 +11920,17 @@ async function updateProject2(id, input, store) {
11822
11920
  }
11823
11921
  async function createPlan2(input, store, context) {
11824
11922
  const timestamp = new Date().toISOString();
11923
+ const projectId = input.project_id ?? context?.projectId ?? null;
11924
+ const slug = await resolvePostgresPlanSlug({
11925
+ name: input.name,
11926
+ slug: input.slug,
11927
+ projectId,
11928
+ store
11929
+ });
11825
11930
  return store.upsert("plans", {
11826
11931
  id: randomUUID3(),
11827
- project_id: input.project_id ?? context?.projectId ?? null,
11932
+ slug,
11933
+ project_id: projectId,
11828
11934
  task_list_id: input.task_list_id ?? context?.taskListId ?? null,
11829
11935
  agent_id: input.agent_id ?? context?.agentId ?? null,
11830
11936
  name: input.name,
@@ -11838,7 +11944,17 @@ async function createPlan2(input, store, context) {
11838
11944
  }
11839
11945
  async function updatePlan2(id, input, store) {
11840
11946
  const plan = await requireRecord("plans", id, store);
11841
- return store.upsert("plans", { ...plan, ...definedPatch(input), updated_at: new Date().toISOString() });
11947
+ const patch = definedPatch(input);
11948
+ if (input.slug !== undefined) {
11949
+ patch.slug = await resolvePostgresPlanSlug({
11950
+ name: plan.name,
11951
+ slug: input.slug,
11952
+ projectId: plan.project_id,
11953
+ store,
11954
+ excludeId: id
11955
+ });
11956
+ }
11957
+ return store.upsert("plans", { ...plan, ...patch, updated_at: new Date().toISOString() });
11842
11958
  }
11843
11959
  async function registerAgent2(input, store, context) {
11844
11960
  const existing = (await store.list("agents")).find((agent2) => agent2.name === input.name && agent2.status !== "archived");
@@ -12091,8 +12207,38 @@ function matchesOne(value, expected) {
12091
12207
  function priorityRank(priority) {
12092
12208
  return { critical: 0, high: 1, medium: 2, low: 3 }[priority];
12093
12209
  }
12210
+ function slugifyRaw(value) {
12211
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
12212
+ }
12094
12213
  function slugify2(value) {
12095
- return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "todos";
12214
+ return slugifyRaw(value) || "todos";
12215
+ }
12216
+ function normalizePlanSlug2(value) {
12217
+ const slug = slugifyRaw(value);
12218
+ if (!slug)
12219
+ throw new Error("Invalid plan slug");
12220
+ return slug;
12221
+ }
12222
+ function planSlugBase3(value) {
12223
+ return slugifyRaw(value) || "plan";
12224
+ }
12225
+ async function resolvePostgresPlanSlug(options) {
12226
+ const plans = await options.store.list("plans");
12227
+ const used = new Set(plans.filter((plan) => plan.project_id === options.projectId && plan.id !== options.excludeId && plan.slug).map((plan) => plan.slug));
12228
+ if (options.slug !== undefined) {
12229
+ const slug = normalizePlanSlug2(options.slug);
12230
+ if (used.has(slug))
12231
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
12232
+ return slug;
12233
+ }
12234
+ const base = planSlugBase3(options.name);
12235
+ let candidate = base;
12236
+ let suffix = 2;
12237
+ while (used.has(candidate)) {
12238
+ candidate = `${base}-${suffix}`;
12239
+ suffix += 1;
12240
+ }
12241
+ return candidate;
12096
12242
  }
12097
12243
  function definedPatch(value) {
12098
12244
  return Object.fromEntries(Object.entries(value).filter(([, entry2]) => entry2 !== undefined));
@@ -70,6 +70,7 @@ export interface CreateOrgInput {
70
70
  }
71
71
  export interface Plan {
72
72
  id: string;
73
+ slug: string | null;
73
74
  project_id: string | null;
74
75
  task_list_id: string | null;
75
76
  agent_id: string | null;
@@ -83,6 +84,7 @@ export interface Plan {
83
84
  }
84
85
  export interface CreatePlanInput {
85
86
  name: string;
87
+ slug?: string;
86
88
  project_id?: string;
87
89
  task_list_id?: string;
88
90
  agent_id?: string;
@@ -91,6 +93,7 @@ export interface CreatePlanInput {
91
93
  }
92
94
  export interface UpdatePlanInput {
93
95
  name?: string;
96
+ slug?: string;
94
97
  description?: string;
95
98
  status?: PlanStatus;
96
99
  task_list_id?: string;