@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/cli/commands/plan-template-commands.d.ts.map +1 -1
- package/dist/cli/index.js +278 -49
- package/dist/contracts.js +135 -5
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/plans.d.ts +8 -0
- package/dist/db/plans.d.ts.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/index.js +223 -20
- package/dist/lib/json-schemas.d.ts.map +1 -1
- package/dist/lib/local-bridge.d.ts.map +1 -1
- package/dist/lib/onboarding-fixtures.d.ts.map +1 -1
- package/dist/lib/plan-artifacts.d.ts +3 -0
- package/dist/lib/plan-artifacts.d.ts.map +1 -1
- package/dist/mcp/index.js +138 -5
- package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
- package/dist/registry.js +135 -5
- package/dist/release-provenance.json +3 -3
- package/dist/server/index.js +138 -5
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/storage.js +153 -7
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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 =
|
|
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 =
|
|
25184
|
-
|
|
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(
|
|
25384
|
+
const markdown = readFileSync7(path, "utf8");
|
|
25187
25385
|
return {
|
|
25188
|
-
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 =
|
|
25198
|
-
|
|
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(
|
|
25408
|
+
const artifact = parsePlanArtifactMarkdown(readFileSync7(path, "utf8"));
|
|
25210
25409
|
return {
|
|
25211
|
-
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
|
|
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":"AAAA;;;GAGG;AAEH,eAAO,MAAM,2BAA2B,iCAAiC,CAAC;AAC1E,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,eAAO,MAAM,eAAe,sOAalB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/C,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAwBD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,oBAAoB,
|
|
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;
|
|
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":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE7D,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,eAAe,EAAE,yBAAyB,EAAE,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,yBAAyB,EAAE,CAAC;IAC7C,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"plan-artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/plan-artifacts.ts"],"names":[],"mappings":"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"}
|