@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.
package/dist/index.js CHANGED
@@ -1198,6 +1198,11 @@ var init_migrations = __esm(() => {
1198
1198
  CREATE INDEX IF NOT EXISTS idx_storage_tombstones_object ON storage_tombstones(object_type, object_id);
1199
1199
  CREATE INDEX IF NOT EXISTS idx_storage_tombstones_updated ON storage_tombstones(updated_at);
1200
1200
  INSERT OR IGNORE INTO _migrations (id) VALUES (63);
1201
+ `,
1202
+ `
1203
+ ALTER TABLE plans ADD COLUMN slug TEXT;
1204
+ CREATE INDEX IF NOT EXISTS idx_plans_slug ON plans(slug);
1205
+ INSERT OR IGNORE INTO _migrations (id) VALUES (64);
1201
1206
  `
1202
1207
  ];
1203
1208
  });
@@ -1221,6 +1226,29 @@ function runMigrations(db) {
1221
1226
  }
1222
1227
  ensureSchema(db);
1223
1228
  }
1229
+ function planSlugBase(value) {
1230
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "plan";
1231
+ }
1232
+ function backfillPlanSlugs(db) {
1233
+ try {
1234
+ const rows = db.query("SELECT id, project_id, name, slug FROM plans ORDER BY created_at ASC, id ASC").all();
1235
+ const used = new Set;
1236
+ for (const row of rows) {
1237
+ const scope = row.project_id ?? "__global__";
1238
+ const base = planSlugBase(row.slug || row.name);
1239
+ let candidate = base;
1240
+ let suffix = 2;
1241
+ while (used.has(`${scope}:${candidate}`)) {
1242
+ candidate = `${base}-${suffix}`;
1243
+ suffix += 1;
1244
+ }
1245
+ used.add(`${scope}:${candidate}`);
1246
+ if (row.slug !== candidate) {
1247
+ db.run("UPDATE plans SET slug = ? WHERE id = ?", [candidate, row.id]);
1248
+ }
1249
+ }
1250
+ } catch {}
1251
+ }
1224
1252
  function ensureSchema(db) {
1225
1253
  const ensureColumn = (table, column, type) => {
1226
1254
  try {
@@ -1270,7 +1298,8 @@ function ensureSchema(db) {
1270
1298
  )`);
1271
1299
  ensureTable("plans", `
1272
1300
  CREATE TABLE plans (
1273
- id TEXT PRIMARY KEY, project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
1301
+ id TEXT PRIMARY KEY, slug TEXT,
1302
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
1274
1303
  task_list_id TEXT, agent_id TEXT,
1275
1304
  name TEXT NOT NULL, description TEXT,
1276
1305
  status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'archived')),
@@ -1785,8 +1814,10 @@ function ensureSchema(db) {
1785
1814
  ensureColumn("agents", "org_id", "TEXT");
1786
1815
  ensureColumn("agents", "capabilities", "TEXT DEFAULT '[]'");
1787
1816
  ensureColumn("projects", "org_id", "TEXT");
1817
+ ensureColumn("plans", "slug", "TEXT");
1788
1818
  ensureColumn("plans", "task_list_id", "TEXT");
1789
1819
  ensureColumn("plans", "agent_id", "TEXT");
1820
+ backfillPlanSlugs(db);
1790
1821
  ensureColumn("task_templates", "variables", "TEXT DEFAULT '[]'");
1791
1822
  ensureColumn("task_templates", "version", "INTEGER NOT NULL DEFAULT 1");
1792
1823
  ensureColumn("template_tasks", "condition", "TEXT");
@@ -1901,6 +1932,8 @@ function ensureSchema(db) {
1901
1932
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_tags_name ON tags(name)");
1902
1933
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_project ON plans(project_id)");
1903
1934
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_status ON plans(status)");
1935
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_slug ON plans(slug)");
1936
+ ensureIndex("CREATE UNIQUE INDEX IF NOT EXISTS idx_plans_scope_slug ON plans(COALESCE(project_id, ''), slug) WHERE slug IS NOT NULL");
1904
1937
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_task_list ON plans(task_list_id)");
1905
1938
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_agent ON plans(agent_id)");
1906
1939
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_history_task ON task_history(task_id)");
@@ -2734,6 +2767,9 @@ function clearExpiredLocks(db) {
2734
2767
  const cutoff = lockExpiryCutoff();
2735
2768
  db.run("UPDATE tasks SET locked_by = NULL, locked_at = NULL WHERE locked_at IS NOT NULL AND locked_at < ?", [cutoff]);
2736
2769
  }
2770
+ function slugifyRef(value) {
2771
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
2772
+ }
2737
2773
  function resolvePartialId(db, table, partialId) {
2738
2774
  if (!ALLOWED_TABLES.has(table)) {
2739
2775
  throw new Error(`Invalid table name: ${table}`);
@@ -2760,6 +2796,16 @@ function resolvePartialId(db, table, partialId) {
2760
2796
  if (slugRow)
2761
2797
  return slugRow.id;
2762
2798
  }
2799
+ if (table === "plans") {
2800
+ const slug = slugifyRef(partialId);
2801
+ if (slug) {
2802
+ const slugRows = db.query("SELECT id FROM plans WHERE slug = ?").all(slug);
2803
+ if (slugRows.length === 1)
2804
+ return slugRows[0].id;
2805
+ if (slugRows.length > 1)
2806
+ return null;
2807
+ }
2808
+ }
2763
2809
  if (table === "projects") {
2764
2810
  const nameRow = db.query("SELECT id FROM projects WHERE lower(name) = ?").get(partialId.toLowerCase());
2765
2811
  if (nameRow)
@@ -10736,15 +10782,59 @@ init_database();
10736
10782
  // src/db/plans.ts
10737
10783
  init_types();
10738
10784
  init_database();
10785
+ function planSlugBase2(value) {
10786
+ return slugify(value) || "plan";
10787
+ }
10788
+ function normalizePlanSlug(value) {
10789
+ const slug = slugify(value);
10790
+ if (!slug)
10791
+ throw new Error("Invalid plan slug");
10792
+ return slug;
10793
+ }
10794
+ function plansBySlug(slug, db, projectId) {
10795
+ if (projectId !== undefined) {
10796
+ if (projectId === null) {
10797
+ return db.query("SELECT * FROM plans WHERE slug = ? AND project_id IS NULL ORDER BY created_at ASC, id ASC").all(slug);
10798
+ }
10799
+ return db.query("SELECT * FROM plans WHERE slug = ? AND project_id = ? ORDER BY created_at ASC, id ASC").all(slug, projectId);
10800
+ }
10801
+ return db.query("SELECT * FROM plans WHERE slug = ? ORDER BY created_at ASC, id ASC").all(slug);
10802
+ }
10803
+ function planSlugExists(slug, projectId, db, excludeId) {
10804
+ const rows = plansBySlug(slug, db, projectId);
10805
+ return rows.some((plan) => plan.id !== excludeId);
10806
+ }
10807
+ function nextPlanSlug(base, projectId, db, excludeId) {
10808
+ let candidate = base;
10809
+ let suffix = 2;
10810
+ while (planSlugExists(candidate, projectId, db, excludeId)) {
10811
+ candidate = `${base}-${suffix}`;
10812
+ suffix += 1;
10813
+ }
10814
+ return candidate;
10815
+ }
10816
+ function resolveCreateSlug(input, projectId, db) {
10817
+ if (input.slug !== undefined) {
10818
+ const slug = normalizePlanSlug(input.slug);
10819
+ if (planSlugExists(slug, projectId, db)) {
10820
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
10821
+ }
10822
+ return slug;
10823
+ }
10824
+ return nextPlanSlug(planSlugBase2(input.name), projectId, db);
10825
+ }
10739
10826
  function createPlan(input, db) {
10740
10827
  const d = db || getDatabase();
10741
10828
  const id = uuid();
10742
10829
  const timestamp = now();
10830
+ const projectId = input.project_id || null;
10831
+ const slug = resolveCreateSlug(input, projectId, d);
10743
10832
  const machineId = currentStorageMachineId(d);
10744
- d.run(`INSERT INTO plans (id, project_id, task_list_id, agent_id, name, description, status, created_at, updated_at, machine_id)
10745
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
10833
+ d.run(`INSERT INTO plans (id, slug, project_id, task_list_id, agent_id, name, description, status, created_at, updated_at, machine_id)
10834
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
10746
10835
  id,
10747
- input.project_id || null,
10836
+ slug,
10837
+ projectId,
10748
10838
  input.task_list_id || null,
10749
10839
  input.agent_id || null,
10750
10840
  input.name,
@@ -10779,6 +10869,14 @@ function updatePlan(id, input, db) {
10779
10869
  sets.push("name = ?");
10780
10870
  params.push(input.name);
10781
10871
  }
10872
+ if (input.slug !== undefined) {
10873
+ const slug = normalizePlanSlug(input.slug);
10874
+ if (planSlugExists(slug, plan.project_id, d, id)) {
10875
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
10876
+ }
10877
+ sets.push("slug = ?");
10878
+ params.push(slug);
10879
+ }
10782
10880
  if (input.description !== undefined) {
10783
10881
  sets.push("description = ?");
10784
10882
  params.push(input.description);
@@ -12632,7 +12730,7 @@ var dataKeys = [
12632
12730
  var insertColumns = {
12633
12731
  projects: ["id", "name", "path", "description", "task_list_id", "task_prefix", "task_counter", "created_at", "updated_at", "machine_id", "synced_at"],
12634
12732
  task_lists: ["id", "project_id", "slug", "name", "description", "metadata", "created_at", "updated_at", "machine_id", "synced_at"],
12635
- plans: ["id", "project_id", "task_list_id", "agent_id", "name", "description", "status", "created_at", "updated_at", "machine_id", "synced_at"],
12733
+ plans: ["id", "slug", "project_id", "task_list_id", "agent_id", "name", "description", "status", "created_at", "updated_at", "machine_id", "synced_at"],
12636
12734
  tasks: [
12637
12735
  "id",
12638
12736
  "short_id",
@@ -12924,6 +13022,36 @@ function prepareValue(column, value) {
12924
13022
  return JSON.stringify(value ?? (column === "tags" || column === "files_changed" ? [] : {}));
12925
13023
  return value === undefined ? null : value;
12926
13024
  }
13025
+ function slugifyPlanValue(value) {
13026
+ return typeof value === "string" ? value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") : "";
13027
+ }
13028
+ function planSlugBase3(plan) {
13029
+ return slugifyPlanValue(plan.slug) || slugifyPlanValue(plan.name) || "plan";
13030
+ }
13031
+ function planSlugScope(projectId) {
13032
+ return typeof projectId === "string" && projectId ? projectId : "__global__";
13033
+ }
13034
+ function planSlugKey(projectId, slug) {
13035
+ return `${planSlugScope(projectId)}:${slug}`;
13036
+ }
13037
+ function normalizeBridgePlanSlugs(plans, db) {
13038
+ const existingRows = db.query("SELECT id, project_id, slug FROM plans WHERE slug IS NOT NULL").all();
13039
+ const existingIds = new Set(existingRows.map((row) => row.id));
13040
+ const used = new Set(existingRows.filter((row) => row.slug).map((row) => planSlugKey(row.project_id, row.slug)));
13041
+ return plans.map((plan) => {
13042
+ if (existingIds.has(plan.id))
13043
+ return plan;
13044
+ const base = planSlugBase3(plan);
13045
+ let candidate = base;
13046
+ let suffix = 2;
13047
+ while (used.has(planSlugKey(plan.project_id, candidate))) {
13048
+ candidate = `${base}-${suffix}`;
13049
+ suffix += 1;
13050
+ }
13051
+ used.add(planSlugKey(plan.project_id, candidate));
13052
+ return { ...plan, slug: candidate };
13053
+ });
13054
+ }
12927
13055
  function insertRecord(db, tableKey, row) {
12928
13056
  const table = tableByKey[tableKey];
12929
13057
  const columns = insertColumns[tableKey];
@@ -13060,6 +13188,7 @@ function importLocalBridgeBundle(bundle, options = {}, db) {
13060
13188
  const conflictStrategy = options.conflictStrategy ?? "skip";
13061
13189
  const data = {
13062
13190
  ...bundle.data,
13191
+ plans: normalizeBridgePlanSlugs(bundle.data.plans, d),
13063
13192
  tasks: sortedTasks(bundle.data.tasks),
13064
13193
  saved_views: bundle.data.saved_views ?? [],
13065
13194
  task_boards: bundle.data.task_boards ?? [],
@@ -13253,6 +13382,7 @@ function createAgentProjectDemoBundle() {
13253
13382
  });
13254
13383
  data.plans.push({
13255
13384
  id: ids.plan,
13385
+ slug: "ship-local-demo-workflow",
13256
13386
  project_id: ids.project,
13257
13387
  task_list_id: ids.list,
13258
13388
  agent_id: "demo-agent",
@@ -23380,9 +23510,17 @@ async function updateProject2(id, input, store) {
23380
23510
  }
23381
23511
  async function createPlan2(input, store, context) {
23382
23512
  const timestamp2 = new Date().toISOString();
23513
+ const projectId = input.project_id ?? context?.projectId ?? null;
23514
+ const slug = await resolvePostgresPlanSlug({
23515
+ name: input.name,
23516
+ slug: input.slug,
23517
+ projectId,
23518
+ store
23519
+ });
23383
23520
  return store.upsert("plans", {
23384
23521
  id: randomUUID3(),
23385
- project_id: input.project_id ?? context?.projectId ?? null,
23522
+ slug,
23523
+ project_id: projectId,
23386
23524
  task_list_id: input.task_list_id ?? context?.taskListId ?? null,
23387
23525
  agent_id: input.agent_id ?? context?.agentId ?? null,
23388
23526
  name: input.name,
@@ -23396,7 +23534,17 @@ async function createPlan2(input, store, context) {
23396
23534
  }
23397
23535
  async function updatePlan2(id, input, store) {
23398
23536
  const plan = await requireRecord("plans", id, store);
23399
- return store.upsert("plans", { ...plan, ...definedPatch(input), updated_at: new Date().toISOString() });
23537
+ const patch = definedPatch(input);
23538
+ if (input.slug !== undefined) {
23539
+ patch.slug = await resolvePostgresPlanSlug({
23540
+ name: plan.name,
23541
+ slug: input.slug,
23542
+ projectId: plan.project_id,
23543
+ store,
23544
+ excludeId: id
23545
+ });
23546
+ }
23547
+ return store.upsert("plans", { ...plan, ...patch, updated_at: new Date().toISOString() });
23400
23548
  }
23401
23549
  async function registerAgent2(input, store, context) {
23402
23550
  const existing = (await store.list("agents")).find((agent2) => agent2.name === input.name && agent2.status !== "archived");
@@ -23649,8 +23797,38 @@ function matchesOne(value, expected) {
23649
23797
  function priorityRank(priority) {
23650
23798
  return { critical: 0, high: 1, medium: 2, low: 3 }[priority];
23651
23799
  }
23800
+ function slugifyRaw(value) {
23801
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
23802
+ }
23652
23803
  function slugify2(value) {
23653
- return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "todos";
23804
+ return slugifyRaw(value) || "todos";
23805
+ }
23806
+ function normalizePlanSlug2(value) {
23807
+ const slug = slugifyRaw(value);
23808
+ if (!slug)
23809
+ throw new Error("Invalid plan slug");
23810
+ return slug;
23811
+ }
23812
+ function planSlugBase4(value) {
23813
+ return slugifyRaw(value) || "plan";
23814
+ }
23815
+ async function resolvePostgresPlanSlug(options) {
23816
+ const plans = await options.store.list("plans");
23817
+ const used = new Set(plans.filter((plan) => plan.project_id === options.projectId && plan.id !== options.excludeId && plan.slug).map((plan) => plan.slug));
23818
+ if (options.slug !== undefined) {
23819
+ const slug = normalizePlanSlug2(options.slug);
23820
+ if (used.has(slug))
23821
+ throw new Error(`Plan slug already exists in this scope: ${slug}`);
23822
+ return slug;
23823
+ }
23824
+ const base = planSlugBase4(options.name);
23825
+ let candidate = base;
23826
+ let suffix = 2;
23827
+ while (used.has(candidate)) {
23828
+ candidate = `${base}-${suffix}`;
23829
+ suffix += 1;
23830
+ }
23831
+ return candidate;
23654
23832
  }
23655
23833
  function definedPatch(value) {
23656
23834
  return Object.fromEntries(Object.entries(value).filter(([, entry2]) => entry2 !== undefined));
@@ -25000,6 +25178,9 @@ function projectSlugMatches(project, ref) {
25000
25178
  const normalized = slugify(ref);
25001
25179
  return Boolean(normalized) && (project.task_list_id === normalized || slugify(project.name) === normalized);
25002
25180
  }
25181
+ function planArtifactSlug(plan) {
25182
+ return slugify(plan.slug || plan.name) || "plan";
25183
+ }
25003
25184
  function resolvePlanArtifactProject(input) {
25004
25185
  const db = input.db || getDatabase();
25005
25186
  const ref = input.project_id || input.project_ref;
@@ -25025,11 +25206,24 @@ function resolvePlanArtifactPaths(input) {
25025
25206
  const projectRoot = resolve10(project.path);
25026
25207
  const directory = join10(projectRoot, ".hasna", "todos", "plans", projectId);
25027
25208
  const planId = input.plan_id ? assertSafePathSegment(input.plan_id, "plan id") : null;
25209
+ const planSlug = input.plan_slug ? assertSafePathSegment(slugify(input.plan_slug), "plan slug") : null;
25210
+ const fileName = planId ? planSlug ? `${planSlug}--${planId.slice(0, 8)}.md` : `${planId}.md` : null;
25028
25211
  return {
25029
25212
  project_id: project.id,
25030
25213
  project_root: projectRoot,
25031
25214
  directory,
25032
- file_path: planId ? join10(directory, `${planId}.md`) : directory
25215
+ file_path: fileName ? join10(directory, fileName) : directory
25216
+ };
25217
+ }
25218
+ function resolvePlanArtifactCandidatePaths(plan, db) {
25219
+ return {
25220
+ primary: resolvePlanArtifactPaths({
25221
+ project_id: plan.project_id,
25222
+ plan_id: plan.id,
25223
+ plan_slug: planArtifactSlug(plan),
25224
+ db
25225
+ }),
25226
+ legacy: resolvePlanArtifactPaths({ project_id: plan.project_id, plan_id: plan.id, db })
25033
25227
  };
25034
25228
  }
25035
25229
  function buildPlanArtifactSnapshot(plan, tasks = [], artifactUpdatedAt = new Date().toISOString()) {
@@ -25046,6 +25240,7 @@ function buildPlanArtifactSnapshot(plan, tasks = [], artifactUpdatedAt = new Dat
25046
25240
  metadata: {
25047
25241
  schema: PLAN_MARKDOWN_SCHEMA,
25048
25242
  plan_id: plan.id,
25243
+ plan_slug: plan.slug ?? null,
25049
25244
  project_id: plan.project_id,
25050
25245
  task_list_id: plan.task_list_id ?? null,
25051
25246
  agent_id: plan.agent_id ?? null,
@@ -25085,6 +25280,7 @@ function renderPlanArtifactMarkdown(snapshot) {
25085
25280
  "---",
25086
25281
  `schema: ${frontmatterScalar(metadata.schema)}`,
25087
25282
  `plan_id: ${frontmatterScalar(metadata.plan_id)}`,
25283
+ `plan_slug: ${frontmatterScalar(metadata.plan_slug)}`,
25088
25284
  `project_id: ${frontmatterScalar(metadata.project_id)}`,
25089
25285
  `task_list_id: ${frontmatterScalar(metadata.task_list_id)}`,
25090
25286
  `agent_id: ${frontmatterScalar(metadata.agent_id)}`,
@@ -25130,6 +25326,7 @@ function parsePlanArtifactMarkdown(markdown) {
25130
25326
  metadata: {
25131
25327
  schema: PLAN_MARKDOWN_SCHEMA,
25132
25328
  plan_id: rawMetadata.plan_id,
25329
+ plan_slug: rawMetadata.plan_slug ?? null,
25133
25330
  project_id: rawMetadata.project_id,
25134
25331
  task_list_id: rawMetadata.task_list_id ?? null,
25135
25332
  agent_id: rawMetadata.agent_id ?? null,
@@ -25170,7 +25367,7 @@ function writePlanArtifact(plan, db) {
25170
25367
  return null;
25171
25368
  const d = db || getDatabase();
25172
25369
  const tasks = listTasks({ plan_id: plan.id, include_archived: true }, d);
25173
- const paths = resolvePlanArtifactPaths({ project_id: plan.project_id, plan_id: plan.id, db: d });
25370
+ const paths = resolvePlanArtifactCandidatePaths(plan, d).primary;
25174
25371
  const snapshot = buildPlanArtifactSnapshot(plan, tasks);
25175
25372
  mkdirSync8(paths.directory, { recursive: true });
25176
25373
  writeFileSync6(paths.file_path, renderPlanArtifactMarkdown(snapshot), "utf8");
@@ -25180,12 +25377,13 @@ function readPlanArtifact(plan, db) {
25180
25377
  if (!plan.project_id)
25181
25378
  return null;
25182
25379
  const d = db || getDatabase();
25183
- const paths = resolvePlanArtifactPaths({ project_id: plan.project_id, plan_id: plan.id, db: d });
25184
- if (!existsSync9(paths.file_path))
25380
+ const paths = resolvePlanArtifactCandidatePaths(plan, d);
25381
+ const path = existsSync9(paths.primary.file_path) ? paths.primary.file_path : existsSync9(paths.legacy.file_path) ? paths.legacy.file_path : null;
25382
+ if (!path)
25185
25383
  return null;
25186
- const markdown = readFileSync7(paths.file_path, "utf8");
25384
+ const markdown = readFileSync7(path, "utf8");
25187
25385
  return {
25188
- path: paths.file_path,
25386
+ path,
25189
25387
  markdown,
25190
25388
  ...parsePlanArtifactMarkdown(markdown)
25191
25389
  };
@@ -25194,10 +25392,11 @@ function inspectPlanArtifact(plan, db) {
25194
25392
  if (!plan.project_id)
25195
25393
  return null;
25196
25394
  const d = db || getDatabase();
25197
- const paths = resolvePlanArtifactPaths({ project_id: plan.project_id, plan_id: plan.id, db: d });
25198
- if (!existsSync9(paths.file_path)) {
25395
+ const paths = resolvePlanArtifactCandidatePaths(plan, d);
25396
+ const path = existsSync9(paths.primary.file_path) ? paths.primary.file_path : existsSync9(paths.legacy.file_path) ? paths.legacy.file_path : null;
25397
+ if (!path) {
25199
25398
  return {
25200
- path: paths.file_path,
25399
+ path: paths.primary.file_path,
25201
25400
  exists: false,
25202
25401
  parse_error: null,
25203
25402
  metadata: null,
@@ -25206,9 +25405,9 @@ function inspectPlanArtifact(plan, db) {
25206
25405
  };
25207
25406
  }
25208
25407
  try {
25209
- const artifact = parsePlanArtifactMarkdown(readFileSync7(paths.file_path, "utf8"));
25408
+ const artifact = parsePlanArtifactMarkdown(readFileSync7(path, "utf8"));
25210
25409
  return {
25211
- path: paths.file_path,
25410
+ path,
25212
25411
  exists: true,
25213
25412
  parse_error: null,
25214
25413
  metadata: artifact.metadata,
@@ -25217,7 +25416,7 @@ function inspectPlanArtifact(plan, db) {
25217
25416
  };
25218
25417
  } catch (error) {
25219
25418
  return {
25220
- path: paths.file_path,
25419
+ path,
25221
25420
  exists: true,
25222
25421
  parse_error: error instanceof Error ? error.message : String(error),
25223
25422
  metadata: null,
@@ -25229,6 +25428,9 @@ function inspectPlanArtifact(plan, db) {
25229
25428
  function comparePlanArtifact(plan, artifact, tasks) {
25230
25429
  const conflicts = [];
25231
25430
  compare("plan_id", plan.id, artifact.metadata.plan_id, conflicts);
25431
+ if (artifact.metadata.plan_slug !== null) {
25432
+ compare("plan_slug", plan.slug ?? null, artifact.metadata.plan_slug, conflicts);
25433
+ }
25232
25434
  compare("project_id", plan.project_id ?? null, artifact.metadata.project_id, conflicts);
25233
25435
  compare("name", plan.name, artifact.metadata.name, conflicts);
25234
25436
  compare("status", plan.status, artifact.metadata.status, conflicts);
@@ -32927,6 +33129,7 @@ var JSON_SCHEMAS = {
32927
33129
  plan: def("plan", "todos.plan.v1", "Plan", ["schema_version", "id", "name", "status", "created_at", "updated_at"], {
32928
33130
  schema_version: { type: "string", enum: ["todos.plan.v1"] },
32929
33131
  id: { type: "string" },
33132
+ slug: { type: ["string", "null"] },
32930
33133
  project_id: { type: ["string", "null"] },
32931
33134
  name: { type: "string" },
32932
33135
  description: { type: ["string", "null"] },
@@ -1 +1 @@
1
- {"version":3,"file":"json-schemas.d.ts","sourceRoot":"","sources":["../../src/lib/json-schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-schemas.d.ts","sourceRoot":"","sources":["../../src/lib/json-schemas.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/local-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/local-bridge.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-fixtures.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,wCAAwC,eAAe,CAAC;AACrE,eAAO,MAAM,+BAA+B,sCAAsC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAmXD,wBAAgB,sBAAsB,IAAI,wBAAwB,EAAE,CAMnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,SAAuB,GAAG,iBAAiB,CAUnF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,SAAuB,GAAG,sBAAsB,CAE9F;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,4BAA4B,CAS3F;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAMzB"}
1
+ {"version":3,"file":"onboarding-fixtures.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,wCAAwC,eAAe,CAAC;AACrE,eAAO,MAAM,+BAA+B,sCAAsC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoXD,wBAAgB,sBAAsB,IAAI,wBAAwB,EAAE,CAMnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,SAAuB,GAAG,iBAAiB,CAUnF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,SAAuB,GAAG,sBAAsB,CAE9F;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,4BAA4B,CAS3F;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAMzB"}
@@ -11,6 +11,7 @@ export interface ResolvePlanArtifactPathInput {
11
11
  project_id?: string | null;
12
12
  project_ref?: string | null;
13
13
  plan_id?: string | null;
14
+ plan_slug?: string | null;
14
15
  db?: Database;
15
16
  }
16
17
  export interface PlanArtifactTaskReference {
@@ -22,6 +23,7 @@ export interface PlanArtifactTaskReference {
22
23
  export interface PlanArtifactMetadata {
23
24
  schema: typeof PLAN_MARKDOWN_SCHEMA;
24
25
  plan_id: string;
26
+ plan_slug: string | null;
25
27
  project_id: string;
26
28
  task_list_id: string | null;
27
29
  agent_id: string | null;
@@ -58,6 +60,7 @@ export interface WritePlanArtifactResult {
58
60
  path: string;
59
61
  snapshot: PlanArtifactSnapshot;
60
62
  }
63
+ export declare function planArtifactFileName(plan: Pick<Plan, "id" | "name" | "slug">): string;
61
64
  export declare function resolvePlanArtifactProject(input: ResolvePlanArtifactPathInput): Project;
62
65
  export declare function resolvePlanArtifactPaths(input: ResolvePlanArtifactPathInput): PlanArtifactPaths;
63
66
  export declare function buildPlanArtifactSnapshot(plan: Plan, tasks?: Task[], artifactUpdatedAt?: string): PlanArtifactSnapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"plan-artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/plan-artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/plan-artifacts.ts"],"names":[],"mappings":"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"}