@locusai/cli 0.1.5 → 0.1.7

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/bin/locus.js CHANGED
@@ -4,14 +4,14 @@
4
4
  // packages/cli/index.ts
5
5
  import { existsSync as existsSync2 } from "fs";
6
6
  import { homedir } from "os";
7
- import { isAbsolute, join as join6, resolve } from "path";
7
+ import { isAbsolute, join as join6, resolve as resolve2 } from "path";
8
8
  import { parseArgs } from "util";
9
9
 
10
10
  // packages/cli/src/generators/locus.ts
11
11
  import { Database } from "bun:sqlite";
12
12
  import { existsSync } from "fs";
13
13
  import { writeFile as writeFile2 } from "fs/promises";
14
- import { join } from "path";
14
+ import { join, resolve } from "path";
15
15
 
16
16
  // packages/cli/src/utils.ts
17
17
  import { mkdir, writeFile } from "fs/promises";
@@ -99,11 +99,18 @@ Managed by Locus.
99
99
  }
100
100
  async function logMcpConfig(config) {
101
101
  const { projectPath, projectName } = config;
102
+ const scriptDir = import.meta.dir;
103
+ const isBundled = scriptDir.endsWith("/bin") || scriptDir.endsWith("\\bin");
104
+ const locusRoot = isBundled ? resolve(scriptDir, "../") : resolve(scriptDir, "../../../../");
105
+ const mcpSourcePath = join(locusRoot, "apps/mcp/src/index.ts");
106
+ const mcpBundledPath = isBundled ? join(scriptDir, "mcp.js") : join(locusRoot, "packages/cli/bin/mcp.js");
107
+ const mcpExecPath = existsSync(mcpSourcePath) ? mcpSourcePath : mcpBundledPath;
102
108
  const mcpConfig = {
103
109
  mcpServers: {
104
- locus: {
105
- command: "npx",
106
- args: ["@locusai/cli", "mcp", "--project", projectPath]
110
+ [projectName]: {
111
+ command: "bun",
112
+ args: ["run", mcpExecPath, "--project", join(projectPath, ".locus")],
113
+ env: {}
107
114
  }
108
115
  }
109
116
  };
@@ -113,7 +120,7 @@ Project created successfully!`);
113
120
  Next steps:`);
114
121
  console.log(` cd ${projectName}`);
115
122
  console.log(" bun install");
116
- console.log(" npx @locusai/cli dev");
123
+ console.log(" bun run dev");
117
124
  console.log(`
118
125
  MCP Configuration (add to your IDE or Claude Desktop config):`);
119
126
  console.log(JSON.stringify(mcpConfig, null, 2));
@@ -1003,7 +1010,7 @@ async function init(args) {
1003
1010
  let basePath = process.cwd();
1004
1011
  if (userPathInput) {
1005
1012
  const userPath = userPathInput.startsWith("~") ? join6(homedir(), userPathInput.slice(1)) : userPathInput;
1006
- basePath = isAbsolute(userPath) ? userPath : resolve(process.cwd(), userPath);
1013
+ basePath = isAbsolute(userPath) ? userPath : resolve2(process.cwd(), userPath);
1007
1014
  }
1008
1015
  projectPath = join6(basePath, projectName);
1009
1016
  } else {
@@ -1043,7 +1050,7 @@ async function dev(args) {
1043
1050
  strict: false
1044
1051
  });
1045
1052
  const projectPath = values.project || process.cwd();
1046
- const locusDir = isAbsolute(projectPath) ? join6(projectPath, ".locus") : resolve(process.cwd(), projectPath, ".locus");
1053
+ const locusDir = isAbsolute(projectPath) ? join6(projectPath, ".locus") : resolve2(process.cwd(), projectPath, ".locus");
1047
1054
  if (!existsSync2(locusDir)) {
1048
1055
  console.error(`Error: .locus directory not found at ${locusDir}`);
1049
1056
  console.log("Are you in a Locus project?");
@@ -1051,7 +1058,7 @@ async function dev(args) {
1051
1058
  }
1052
1059
  const cliDir = import.meta.dir;
1053
1060
  const isBundled = cliDir.endsWith("/bin") || cliDir.endsWith("\\bin");
1054
- const locusRoot = isBundled ? resolve(cliDir, "../") : resolve(cliDir, "../../");
1061
+ const locusRoot = isBundled ? resolve2(cliDir, "../") : resolve2(cliDir, "../../");
1055
1062
  const serverSourcePath = join6(locusRoot, "apps/server/src/index.ts");
1056
1063
  const serverBundledPath = isBundled ? join6(cliDir, "server.js") : join6(locusRoot, "packages/cli/bin/server.js");
1057
1064
  const serverExecPath = existsSync2(serverSourcePath) ? serverSourcePath : serverBundledPath;
@@ -1104,7 +1111,7 @@ async function mcp(args) {
1104
1111
  strict: false
1105
1112
  });
1106
1113
  const projectPath = values.project || process.cwd();
1107
- const locusDir = isAbsolute(projectPath) ? projectPath.endsWith(".locus") ? projectPath : join6(projectPath, ".locus") : resolve(process.cwd(), projectPath, ".locus");
1114
+ const locusDir = isAbsolute(projectPath) ? projectPath.endsWith(".locus") ? projectPath : join6(projectPath, ".locus") : resolve2(process.cwd(), projectPath, ".locus");
1108
1115
  if (!existsSync2(locusDir)) {
1109
1116
  console.error(`Error: .locus directory not found at ${locusDir}`);
1110
1117
  process.exit(1);
@@ -1112,7 +1119,7 @@ async function mcp(args) {
1112
1119
  process.env.LOCUS_PROJECT_PATH = locusDir;
1113
1120
  const cliDir = import.meta.dir;
1114
1121
  const isBundled = cliDir.endsWith("/bin") || cliDir.endsWith("\\bin");
1115
- const locusRoot = isBundled ? resolve(cliDir, "../") : resolve(cliDir, "../../");
1122
+ const locusRoot = isBundled ? resolve2(cliDir, "../") : resolve2(cliDir, "../../");
1116
1123
  const mcpSourcePath = join6(locusRoot, "apps/mcp/src/index.ts");
1117
1124
  const mcpBundledPath = isBundled ? join6(cliDir, "mcp.js") : join6(locusRoot, "packages/cli/bin/mcp.js");
1118
1125
  const mcpExecPath = existsSync2(mcpSourcePath) ? mcpSourcePath : mcpBundledPath;
package/bin/mcp.js CHANGED
@@ -19394,7 +19394,6 @@ if (!projectPath || typeof projectPath !== "string") {
19394
19394
  console.error("Or set LOCUS_PROJECT_PATH environment variable");
19395
19395
  process.exit(1);
19396
19396
  }
19397
- var projectDir = projectPath;
19398
19397
  var API_BASE = "http://localhost:3080/api";
19399
19398
 
19400
19399
  // apps/mcp/src/api.ts
@@ -19525,43 +19524,40 @@ function registerDocsTools(server) {
19525
19524
  var ROLE_PROMPTS = {
19526
19525
  FRONTEND: `## Frontend Implementation Guidelines
19527
19526
 
19528
- ### Design & Aesthetics
19529
- - **Visual Excellence**: Create stunning, premium interfaces. Use vibrant colors, glassmorphism, and smooth animations. Avoid generic or flat designs.
19530
- - **Modern Typography**: Use curated fonts (e.g., Inter, Roboto, Outfit). Avoid browser defaults.
19531
- - **Dynamic Interactions**: Add hover effects, micro-animations, and fluid transitions to make the UI feel alive.
19532
- - **Responsiveness**: Ensure flawless rendering across all device sizes.
19527
+ ### Locus Design Aesthetics
19528
+ - **Visual Excellence**: Create stunning, premium interfaces. Use vibrant, harmonious color palettes (avoid generic colors).
19529
+ - **Glassmorphism & Depth**: Use subtle backgrounds, blurred overlays, and soft shadows to create depth.
19530
+ - **Dynamic Interactions**: Implement smooth transitions, hover effects, and micro-animations for a responsive feel.
19531
+ - **Typography**: Use modern, readable fonts (Inter, Roboto, Outfit). Ensure perfect hierarchy and spacing.
19533
19532
 
19534
19533
  ### Technical Standards
19535
- - **Component-Driven**: Build small, reusable components. Use props for customization.
19536
- - **State Management**: Keep state local where possible; use global state only when necessary.
19537
- - **Clean Code**: Use semantic HTML, proper naming, and avoid inline styles (use CSS classes/variables).
19538
- - **Performance**: Optimize images and minimize re-renders.
19534
+ - **Component-Driven**: Build modular, reusable components with clear prop interfaces.
19535
+ - **Modern CSS**: Use Vanilla CSS with variables for the design system. Avoid ad-hoc utilities.
19536
+ - **Performance**: Optimize assets and minimize re-renders.
19539
19537
 
19540
19538
  ### Workflow Rules (CRITICAL)
19541
- 1. **Branching**: A git branch is automatically created when task moves to IN_PROGRESS.
19542
- 2. **Working**: Implement the task, check all acceptance criteria in the task.
19543
- 3. **Committing**: Use \`kanban.commit\` when work is ready to save your changes.
19544
- 4. **Completion**: Move task to **VERIFICATION** using \`kanban.move(taskId, "VERIFICATION")\`.
19545
- 5. **NEVER move to DONE**: The system will reject direct DONE transitions. Only the manager can approve to DONE.
19546
- 6. **If Rejected**: Check task comments for feedback, fix issues, commit again, and move back to VERIFICATION.`,
19539
+ 1. **Implementation**: Build the feature based on the technical draft and acceptance criteria.
19540
+ 2. **Verification**: Run \`bun run lint\` and \`bun run typecheck\`. Use \`ci.run(taskId, "quick")\` to validate your changes.
19541
+ 3. **Submission**: Use \`kanban.check\` to mark items as done, then move to **VERIFICATION** using \`kanban.move(taskId, "VERIFICATION")\`.
19542
+ 4. **NEVER move to DONE**: Only the manager can approve a task to DONE.
19543
+ 5. **Rejection**: If rejected, review feedback in task comments and resubmit.`,
19547
19544
  BACKEND: `## Backend Implementation Guidelines
19548
19545
 
19549
19546
  ### Architecture & Quality
19550
- - **Modularity**: Keep concerns separated (routes, controllers, services, db).
19551
- - **Type Safety**: Use strict TypeScript types. Avoid \`any\`.
19552
- - **Error Handling**: Gracefully handle errors and return standard HTTP status codes.
19547
+ - **Modularity**: Use a strict Controller-Service-Repository pattern.
19548
+ - **Type Safety**: Ensure 100% type coverage. Avoid \`any\`. Use Zod for validation.
19549
+ - **Error Handling**: Use the centralized error handling middleware and return semantic HTTP status codes.
19553
19550
 
19554
- ### Security & Performance
19555
- - **Input Validation**: Validate all incoming data (zod/joi).
19556
- - **Efficiency**: Optimize database queries and avoid N+1 problems.
19551
+ ### Security & Efficiency
19552
+ - **Data Integrity**: Use transactions where necessary. Optimize queries to avoid N+1 problems.
19553
+ - **Security**: Sanitize all inputs and follow least privilege principles.
19557
19554
 
19558
19555
  ### Workflow Rules (CRITICAL)
19559
- 1. **Branching**: A git branch is automatically created when task moves to IN_PROGRESS.
19560
- 2. **Working**: Implement the task, check all acceptance criteria in the task.
19561
- 3. **Committing**: Use \`kanban.commit\` when work is ready to save your changes.
19562
- 4. **Completion**: Move task to **VERIFICATION** using \`kanban.move(taskId, "VERIFICATION")\`.
19563
- 5. **NEVER move to DONE**: The system will reject direct DONE transitions. Only the manager can approve to DONE.
19564
- 6. **If Rejected**: Check task comments for feedback, fix issues, commit again, and move back to VERIFICATION.`
19556
+ 1. **Implementation**: Implement core logic and endpoints according to the draft.
19557
+ 2. **Verification**: Run \`bun run lint\` and \`bun run typecheck\`. Use \`ci.run(taskId, "quick")\` to validate your changes.
19558
+ 3. **Submission**: Use \`kanban.check\` to mark items as done, then move to **VERIFICATION** using \`kanban.move(taskId, "VERIFICATION")\`.
19559
+ 4. **NEVER move to DONE**: Only the manager can approve a task to DONE.
19560
+ 5. **Rejection**: If rejected, review feedback in task comments and resubmit.`
19565
19561
  };
19566
19562
 
19567
19563
  // apps/mcp/src/tools/kanban.ts
@@ -19684,56 +19680,6 @@ function registerKanbanTools(server) {
19684
19680
  return error2(String(e));
19685
19681
  }
19686
19682
  });
19687
- server.registerTool("kanban.commit", {
19688
- title: "Commit Task Changes",
19689
- description: "Create a git commit with the task ID in the message. Call this BEFORE moving to VERIFICATION to save your work.",
19690
- inputSchema: {
19691
- taskId: exports_external.number(),
19692
- additionalMessage: exports_external.string().optional()
19693
- }
19694
- }, async ({ taskId, additionalMessage }) => {
19695
- try {
19696
- const task = await apiGet(`/tasks/${taskId}`);
19697
- if (!task.title) {
19698
- return error2("Task not found");
19699
- }
19700
- let commitMessage = `Task #${taskId}: ${task.title}`;
19701
- if (additionalMessage) {
19702
- commitMessage += `
19703
-
19704
- ${additionalMessage}`;
19705
- }
19706
- const addProc = Bun.spawn(["git", "add", "-A"], {
19707
- cwd: projectDir,
19708
- stdout: "pipe",
19709
- stderr: "pipe"
19710
- });
19711
- await addProc.exited;
19712
- const commitProc = Bun.spawn(["git", "commit", "-m", commitMessage], {
19713
- cwd: projectDir,
19714
- stdout: "pipe",
19715
- stderr: "pipe"
19716
- });
19717
- const exitCode = await commitProc.exited;
19718
- const stdout = await new Response(commitProc.stdout).text();
19719
- const stderr = await new Response(commitProc.stderr).text();
19720
- if (exitCode !== 0) {
19721
- return success({
19722
- success: false,
19723
- error: stderr || "Git commit failed",
19724
- hint: "Make sure there are staged changes to commit"
19725
- });
19726
- }
19727
- return success({
19728
- success: true,
19729
- message: `Committed changes for Task #${taskId}`,
19730
- commitMessage,
19731
- output: stdout
19732
- });
19733
- } catch (e) {
19734
- return error2(String(e));
19735
- }
19736
- });
19737
19683
  server.registerTool("kanban.check", {
19738
19684
  title: "Check Acceptance Item",
19739
19685
  description: "Mark acceptance checklist items as completed. Pass the full updated checklist array with completed items marked.",
package/bin/server.js CHANGED
@@ -35762,7 +35762,26 @@ class TaskService {
35762
35762
  };
35763
35763
  }
35764
35764
  createTask(data) {
35765
- const id = this.taskRepo.create(data);
35765
+ const defaultItems = [
35766
+ { id: `default-lint-${Date.now()}`, text: "bun run lint", done: false },
35767
+ {
35768
+ id: `default-typecheck-${Date.now()}`,
35769
+ text: "bun run typecheck",
35770
+ done: false
35771
+ }
35772
+ ];
35773
+ const currentChecklist = data.acceptanceChecklist || [];
35774
+ const hasLint = currentChecklist.some((item) => item.text.includes("lint"));
35775
+ const hasTypecheck = currentChecklist.some((item) => item.text.includes("typecheck"));
35776
+ const mergedChecklist = [...currentChecklist];
35777
+ if (!hasLint)
35778
+ mergedChecklist.push(defaultItems[0]);
35779
+ if (!hasTypecheck)
35780
+ mergedChecklist.push(defaultItems[1]);
35781
+ const id = this.taskRepo.create({
35782
+ ...data,
35783
+ acceptanceChecklist: mergedChecklist
35784
+ });
35766
35785
  this.eventRepo.create(id, "TASK_CREATED", { title: data.title });
35767
35786
  return id;
35768
35787
  }
@@ -36179,8 +36198,6 @@ class TaskProcessor {
36179
36198
  console.log(`[TaskProcessor] Task ${taskId} moved from ${from} to ${to}`);
36180
36199
  if (to === "IN_PROGRESS") {
36181
36200
  await this.handleInProgress(taskId);
36182
- } else if (to === "VERIFICATION") {
36183
- await this.handleVerification(taskId);
36184
36201
  }
36185
36202
  }
36186
36203
  async handleInProgress(taskId) {
@@ -36195,9 +36212,6 @@ class TaskProcessor {
36195
36212
  if (presets.quick && labels.includes("auto-ci")) {
36196
36213
  await this.runCi(taskId, "quick");
36197
36214
  }
36198
- const slug = this.slugify(rawTask.title);
36199
- const branchName = `task/${taskId}-${slug}`;
36200
- await this.createBranch(branchName);
36201
36215
  } catch (err) {
36202
36216
  console.error("[TaskProcessor] Failed to process In Progress transition:", err);
36203
36217
  }
@@ -36209,20 +36223,25 @@ class TaskProcessor {
36209
36223
  ## Objective
36210
36224
  ${description || "No description provided."}
36211
36225
 
36212
- ## Suggested Steps
36213
- 1. [ ] Analyze current codebase for related components.
36214
- 2. [ ] Research potential side effects of the change.
36215
- 3. [ ] Implement the core logic.
36216
- 4. [ ] Run automated tests to verify.
36217
- 5. [ ] Perform manual verification.
36226
+ ## High-Level Approach
36227
+ 1. [ ] **Research**: Analyze current codebase for related components and state patterns.
36228
+ 2. [ ] **Architecture**: Plan the component structure (for frontend) or service logic (for backend).
36229
+ 3. [ ] **Execution**: Implement the core logic iteratively.
36230
+ 4. [ ] **Verification**: Run automated checks and perform manual validation.
36231
+
36232
+ ## Locus Design Standards
36233
+ - **Aesthetics**: Ensure the UI feels premium (gradients, glassmorphism, modern typography).
36234
+ - **Interactivity**: Add subtle micro-animations and smooth transitions.
36235
+ - **Standards**: Use local-first principles and strict type safety.
36218
36236
 
36219
36237
  ## Quality Gates
36220
- - [ ] Code follows project style guidelines.
36238
+ - [ ] Code follows project style guidelines and naming conventions.
36221
36239
  - [ ] No regression in existing functionality.
36222
36240
  - [ ] Documentation updated if necessary.
36241
+ - [ ] Lint and Typecheck pass successfully.
36223
36242
 
36224
36243
  ---
36225
- *This is an automatically generated draft to kickstart the task.*
36244
+ *This draft was automatically generated by Locus to kickstart your implementation.*
36226
36245
  `.trim();
36227
36246
  this.db.prepare(`
36228
36247
  INSERT INTO artifacts (taskId, type, title, contentText, createdBy, createdAt)
@@ -36236,7 +36255,17 @@ ${description || "No description provided."}
36236
36255
  const defaultChecklist = [
36237
36256
  { id: "step-1", text: "Research & Planning", done: false },
36238
36257
  { id: "step-2", text: "Implementation", done: false },
36239
- { id: "step-3", text: "Testing & Verification", done: false }
36258
+ { id: "step-3", text: "Testing & Verification", done: false },
36259
+ {
36260
+ id: `quality-lint-${Date.now()}`,
36261
+ text: "bun run lint",
36262
+ done: false
36263
+ },
36264
+ {
36265
+ id: `quality-typecheck-${Date.now()}`,
36266
+ text: "bun run typecheck",
36267
+ done: false
36268
+ }
36240
36269
  ];
36241
36270
  this.db.prepare("UPDATE tasks SET acceptanceChecklist = ?, updatedAt = ? WHERE id = ?").run(JSON.stringify(defaultChecklist), Date.now(), taskId);
36242
36271
  this.db.prepare("INSERT INTO events (taskId, type, payload, createdAt) VALUES (?, ?, ?, ?)").run(taskId, "CHECKLIST_INITIALIZED", JSON.stringify({ itemCount: defaultChecklist.length }), Date.now());
@@ -36288,65 +36317,6 @@ Error: ${message}
36288
36317
  source: "auto-processor"
36289
36318
  }), now);
36290
36319
  }
36291
- async handleVerification(taskId) {
36292
- try {
36293
- const rawTask = this.db.prepare("SELECT * FROM tasks WHERE id = ?").get(taskId);
36294
- if (!rawTask)
36295
- return;
36296
- const slug = this.slugify(rawTask.title);
36297
- const branchName = `task/${taskId}-${slug}`;
36298
- await this.createPullRequest(branchName, rawTask.title, rawTask.description);
36299
- } catch (err) {
36300
- console.error("[TaskProcessor] Failed to process Verification transition:", err);
36301
- }
36302
- }
36303
- slugify(text) {
36304
- return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
36305
- }
36306
- async createBranch(branchName) {
36307
- console.log(`[TaskProcessor] Creating branch ${branchName}...`);
36308
- try {
36309
- const checkProc = Bun.spawn(["git", "show-ref", "--verify", `refs/heads/${branchName}`], {
36310
- cwd: this.config.repoPath,
36311
- stdout: "ignore",
36312
- stderr: "ignore"
36313
- });
36314
- const exists = await checkProc.exited === 0;
36315
- if (!exists) {
36316
- await Bun.spawn(["git", "branch", branchName], {
36317
- cwd: this.config.repoPath,
36318
- stdout: "ignore",
36319
- stderr: "pipe"
36320
- }).exited;
36321
- }
36322
- } catch (error) {
36323
- console.error(`[TaskProcessor] Git branch operation failed: ${error}`);
36324
- }
36325
- }
36326
- async createPullRequest(branchName, title, description) {
36327
- console.log(`[TaskProcessor] Creating PR for ${branchName}...`);
36328
- try {
36329
- await Bun.spawn([
36330
- "gh",
36331
- "pr",
36332
- "create",
36333
- "--title",
36334
- `[Task] ${title}`,
36335
- "--body",
36336
- description || "Task implementation",
36337
- "--head",
36338
- branchName,
36339
- "--base",
36340
- "master"
36341
- ], {
36342
- cwd: this.config.repoPath,
36343
- stdout: "ignore",
36344
- stderr: "pipe"
36345
- }).exited;
36346
- } catch (error) {
36347
- console.error(`[TaskProcessor] PR creation failed: ${error}`);
36348
- }
36349
- }
36350
36320
  }
36351
36321
 
36352
36322
  // apps/server/src/index.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@locusai/cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Local-first AI development platform & engineering workspace",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- <!DOCTYPE html><!--1BInkZcWpYFq8PBSpvumK--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/47cbc4e2adbc5db9-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/8aea088cdc4338f0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/13e8617b72f9d3aa.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ab85b3045756e687.js"/><script src="/_next/static/chunks/87c73c54-1f4741035a95c140.js" async=""></script><script src="/_next/static/chunks/902-d6926825a9fe8784.js" async=""></script><script src="/_next/static/chunks/main-app-123e879c5a937a00.js" async=""></script><script src="/_next/static/chunks/337-d3bb75304d130513.js" async=""></script><script src="/_next/static/chunks/146-34259952c594a3b0.js" async=""></script><script src="/_next/static/chunks/app/layout-05f504c042b9f7ee.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Locus Dashboard</title><meta name="description" content="Local-first task management and documentation for agentic engineering."/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="200x209"/><link rel="icon" href="/favicon.ico"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__className_6a21cc antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden bg-background"><aside class="w-[260px] flex flex-col border-r border-border/50 bg-card/50 backdrop-blur-sm h-full"><div class="flex items-center gap-3 p-5 border-b border-border/50"><img alt="Locus" loading="lazy" width="97.81" height="32" decoding="async" data-nimg="1" class="rounded-xl shadow-lg" style="color:transparent" src="/logo.png"/></div><div class="flex-1 p-4"><div class="text-[10px] uppercase font-bold tracking-widest text-muted-foreground/70 mb-3 px-3">Navigation</div><nav class="space-y-1"><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layout-dashboard group-hover:scale-110 transition-transform"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><div class="flex-1"><span class="block">Board</span></div></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/backlog"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list group-hover:scale-110 transition-transform"><path d="M3 12h.01"></path><path d="M3 18h.01"></path><path d="M3 6h.01"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M8 6h13"></path></svg><div class="flex-1"><span class="block">Backlog</span></div></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/docs"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text group-hover:scale-110 transition-transform"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><div class="flex-1"><span class="block">Library</span></div></a></nav></div><div class="p-4 border-t border-border/50"><a class="flex items-center gap-3 w-full px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary/60 hover:text-foreground" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg><span>Settings</span></a></div></aside><main class="flex-1 overflow-auto bg-background p-8"><div class="max-w-[1440px] mx-auto"><header class="flex items-center mb-6 py-3"><div class="relative flex-1 max-w-md group"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search absolute left-3.5 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-primary transition-colors"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><input type="text" placeholder="Search tasks, docs... (⌘K)" class="w-full bg-secondary/40 border border-border/50 rounded-lg pl-10 pr-4 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/70 outline-none transition-all focus:border-primary/50 focus:ring-2 focus:ring-primary/20 focus:bg-background hover:bg-secondary/60"/></div></header><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></div></main></div><script src="/_next/static/chunks/webpack-ab85b3045756e687.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[6096,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Providers\"]\n3:I[9798,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Sidebar\"]\n4:I[493,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Header\"]\n5:I[7132,[],\"\"]\n6:I[5082,[],\"\"]\n7:I[700,[],\"OutletBoundary\"]\n9:I[7748,[],\"AsyncMetadataOutlet\"]\nb:I[700,[],\"ViewportBoundary\"]\nd:I[700,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[1256,[],\"\"]\n:HL[\"/_next/static/media/47cbc4e2adbc5db9-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/8aea088cdc4338f0.css\",\"style\"]\n:HL[\"/_next/static/css/13e8617b72f9d3aa.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"1BInkZcWpYFq8PBSpvumK\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/8aea088cdc4338f0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/13e8617b72f9d3aa.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_6a21cc antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden bg-background\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-auto bg-background p-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-[1440px] mx-auto\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"11:I[4780,[],\"IconMark\"]\na:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Locus Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first task management and documentation for agentic engineering.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"200x209\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"$L11\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--D0NXe04ZCLNDckV_quc8g--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/47cbc4e2adbc5db9-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/8aea088cdc4338f0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/13e8617b72f9d3aa.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-99a10a055b5bb9c4.js"/><script src="/_next/static/chunks/87c73c54-1f4741035a95c140.js" async=""></script><script src="/_next/static/chunks/902-d6926825a9fe8784.js" async=""></script><script src="/_next/static/chunks/main-app-123e879c5a937a00.js" async=""></script><script src="/_next/static/chunks/337-d3bb75304d130513.js" async=""></script><script src="/_next/static/chunks/146-34259952c594a3b0.js" async=""></script><script src="/_next/static/chunks/app/layout-05f504c042b9f7ee.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Locus Dashboard</title><meta name="description" content="Local-first task management and documentation for agentic engineering."/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="200x209"/><link rel="icon" href="/favicon.ico"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__className_6a21cc antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden bg-background"><aside class="w-[260px] flex flex-col border-r border-border/50 bg-card/50 backdrop-blur-sm h-full"><div class="flex items-center gap-3 p-5 border-b border-border/50"><img alt="Locus" loading="lazy" width="97.81" height="32" decoding="async" data-nimg="1" class="rounded-xl shadow-lg" style="color:transparent" src="/logo.png"/></div><div class="flex-1 p-4"><div class="text-[10px] uppercase font-bold tracking-widest text-muted-foreground/70 mb-3 px-3">Navigation</div><nav class="space-y-1"><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layout-dashboard group-hover:scale-110 transition-transform"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><div class="flex-1"><span class="block">Board</span></div></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/backlog"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list group-hover:scale-110 transition-transform"><path d="M3 12h.01"></path><path d="M3 18h.01"></path><path d="M3 6h.01"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M8 6h13"></path></svg><div class="flex-1"><span class="block">Backlog</span></div></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/docs"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text group-hover:scale-110 transition-transform"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><div class="flex-1"><span class="block">Library</span></div></a></nav></div><div class="p-4 border-t border-border/50"><a class="flex items-center gap-3 w-full px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary/60 hover:text-foreground" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg><span>Settings</span></a></div></aside><main class="flex-1 overflow-auto bg-background p-8"><div class="max-w-[1440px] mx-auto"><header class="flex items-center mb-6 py-3"><div class="relative flex-1 max-w-md group"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search absolute left-3.5 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-primary transition-colors"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><input type="text" placeholder="Search tasks, docs... (⌘K)" class="w-full bg-secondary/40 border border-border/50 rounded-lg pl-10 pr-4 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/70 outline-none transition-all focus:border-primary/50 focus:ring-2 focus:ring-primary/20 focus:bg-background hover:bg-secondary/60"/></div></header><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></div></main></div><script src="/_next/static/chunks/webpack-99a10a055b5bb9c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[6096,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Providers\"]\n3:I[9798,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Sidebar\"]\n4:I[493,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Header\"]\n5:I[7132,[],\"\"]\n6:I[5082,[],\"\"]\n7:I[700,[],\"OutletBoundary\"]\n9:I[7748,[],\"AsyncMetadataOutlet\"]\nb:I[700,[],\"ViewportBoundary\"]\nd:I[700,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[1256,[],\"\"]\n:HL[\"/_next/static/media/47cbc4e2adbc5db9-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/8aea088cdc4338f0.css\",\"style\"]\n:HL[\"/_next/static/css/13e8617b72f9d3aa.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"D0NXe04ZCLNDckV_quc8g\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/8aea088cdc4338f0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/13e8617b72f9d3aa.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_6a21cc antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden bg-background\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-auto bg-background p-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-[1440px] mx-auto\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"11:I[4780,[],\"IconMark\"]\na:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Locus Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first task management and documentation for agentic engineering.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"200x209\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"$L11\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- (()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o].call(a.exports,a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var u=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],c=!0,s=0;s<o.length;s++)(!1&a||u>=a)&&Object.keys(r.O).every(e=>r.O[e](o[s]))?o.splice(s--,1):(c=!1,a<u&&(u=a));if(c){e.splice(i--,1);var l=n();void 0!==l&&(t=l)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var u=2&n&&o;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>337===e?"static/chunks/337-d3bb75304d130513.js":487===e?"static/chunks/487-1808785ba665f784.js":146===e?"static/chunks/146-34259952c594a3b0.js":"static/chunks/"+e+"."+({138:"b98511c56423f8bb",477:"1a6ecfe53375bd9c",544:"a9569941cc886e9d",996:"e0a334e6ae90900e"})[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var u,c,s=document.getElementsByTagName("script"),l=0;l<s.length;l++){var f=s[l];if(f.getAttribute("src")==o||f.getAttribute("data-webpack")==t+a){u=f;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,r.nc&&u.setAttribute("nonce",r.nc),u.setAttribute("data-webpack",t+a),u.src=r.tu(o)),e[o]=[n];var d=(t,r)=>{u.onerror=u.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=d.bind(null,u.onerror),u.onload=d.bind(null,u.onload),c&&document.head.appendChild(u)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="/_next/",(()=>{var e={68:0,844:0,678:0,851:0};r.f.j=(t,o)=>{var n=r.o(e,t)?e[t]:void 0;if(0!==n)if(n)o.push(n[2]);else if(/^(678|68|844|851)$/.test(t))e[t]=0;else{var a=new Promise((r,o)=>n=e[t]=[r,o]);o.push(n[2]=a);var i=r.p+r.u(t),u=Error();r.l(i,o=>{if(r.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var a=o&&("load"===o.type?"missing":o.type),i=o&&o.target&&o.target.src;u.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",u.name="ChunkLoadError",u.type=a,u.request=i,n[1](u)}},"chunk-"+t,t)}},r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[i,u,c]=o,s=0;if(i.some(t=>0!==e[t])){for(n in u)r.o(u,n)&&(r.m[n]=u[n]);if(c)var l=c(r)}for(t&&t(o);s<i.length;s++)a=i[s],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(l)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})()})();
1
+ (()=>{"use strict";var e={},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}},i=!0;try{e[o].call(a.exports,a,a.exports,r),i=!1}finally{i&&delete t[o]}return a.exports}r.m=e,(()=>{var e=[];r.O=(t,o,n,a)=>{if(o){a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[o,n,a];return}for(var u=1/0,i=0;i<e.length;i++){for(var[o,n,a]=e[i],c=!0,s=0;s<o.length;s++)(!1&a||u>=a)&&Object.keys(r.O).every(e=>r.O[e](o[s]))?o.splice(s--,1):(c=!1,a<u&&(u=a));if(c){e.splice(i--,1);var l=n();void 0!==l&&(t=l)}}return t}})(),r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;r.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);r.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var u=2&n&&o;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).forEach(e=>i[e]=()=>o[e]);return i.default=()=>o,r.d(a,i),a}})(),r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,o)=>(r.f[o](e,t),t),[])),r.u=e=>337===e?"static/chunks/337-d3bb75304d130513.js":487===e?"static/chunks/487-1808785ba665f784.js":146===e?"static/chunks/146-34259952c594a3b0.js":"static/chunks/"+e+"."+({138:"b98511c56423f8bb",477:"1a6ecfe53375bd9c",544:"a9569941cc886e9d",996:"e0a334e6ae90900e"})[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="_N_E:";r.l=(o,n,a,i)=>{if(e[o])return void e[o].push(n);if(void 0!==a)for(var u,c,s=document.getElementsByTagName("script"),l=0;l<s.length;l++){var d=s[l];if(d.getAttribute("src")==o||d.getAttribute("data-webpack")==t+a){u=d;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,r.nc&&u.setAttribute("nonce",r.nc),u.setAttribute("data-webpack",t+a),u.src=r.tu(o)),e[o]=[n];var f=(t,r)=>{u.onerror=u.onload=null,clearTimeout(p);var n=e[o];if(delete e[o],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(e=>e(r)),t)return t(r)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),c&&document.head.appendChild(u)}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:e=>e},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("nextjs#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="/_next/",(()=>{var e={68:0,844:0,678:0,851:0};r.f.j=(t,o)=>{var n=r.o(e,t)?e[t]:void 0;if(0!==n)if(n)o.push(n[2]);else if(/^(678|68|844|851)$/.test(t))e[t]=0;else{var a=new Promise((r,o)=>n=e[t]=[r,o]);o.push(n[2]=a);var i=r.p+r.u(t),u=Error();r.l(i,o=>{if(r.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var a=o&&("load"===o.type?"missing":o.type),i=o&&o.target&&o.target.src;u.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",u.name="ChunkLoadError",u.type=a,u.request=i,n[1](u)}},"chunk-"+t,t)}},r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[i,u,c]=o,s=0;if(i.some(t=>0!==e[t])){for(n in u)r.o(u,n)&&(r.m[n]=u[n]);if(c)var l=c(r)}for(t&&t(o);s<i.length;s++)a=i[s],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(l)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})()})();
@@ -1 +1 @@
1
- <!DOCTYPE html><!--1BInkZcWpYFq8PBSpvumK--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/47cbc4e2adbc5db9-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/8aea088cdc4338f0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/13e8617b72f9d3aa.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-ab85b3045756e687.js"/><script src="/_next/static/chunks/87c73c54-1f4741035a95c140.js" async=""></script><script src="/_next/static/chunks/902-d6926825a9fe8784.js" async=""></script><script src="/_next/static/chunks/main-app-123e879c5a937a00.js" async=""></script><script src="/_next/static/chunks/337-d3bb75304d130513.js" async=""></script><script src="/_next/static/chunks/146-34259952c594a3b0.js" async=""></script><script src="/_next/static/chunks/app/layout-05f504c042b9f7ee.js" async=""></script><script src="/_next/static/chunks/app/backlog/page-dce1450769bfae8f.js" async=""></script><meta name="next-size-adjust" content=""/><title>Locus Dashboard</title><meta name="description" content="Local-first task management and documentation for agentic engineering."/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="200x209"/><link rel="icon" href="/favicon.ico"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__className_6a21cc antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden bg-background"><aside class="w-[260px] flex flex-col border-r border-border/50 bg-card/50 backdrop-blur-sm h-full"><div class="flex items-center gap-3 p-5 border-b border-border/50"><img alt="Locus" loading="lazy" width="97.81" height="32" decoding="async" data-nimg="1" class="rounded-xl shadow-lg" style="color:transparent" src="/logo.png"/></div><div class="flex-1 p-4"><div class="text-[10px] uppercase font-bold tracking-widest text-muted-foreground/70 mb-3 px-3">Navigation</div><nav class="space-y-1"><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layout-dashboard group-hover:scale-110 transition-transform"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><div class="flex-1"><span class="block">Board</span></div></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all bg-primary text-primary-foreground shadow-md shadow-primary/20" href="/backlog"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list"><path d="M3 12h.01"></path><path d="M3 18h.01"></path><path d="M3 6h.01"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M8 6h13"></path></svg><div class="flex-1"><span class="block">Backlog</span></div><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right opacity-70"><path d="m9 18 6-6-6-6"></path></svg></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/docs"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text group-hover:scale-110 transition-transform"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><div class="flex-1"><span class="block">Library</span></div></a></nav></div><div class="p-4 border-t border-border/50"><a class="flex items-center gap-3 w-full px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary/60 hover:text-foreground" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg><span>Settings</span></a></div></aside><main class="flex-1 overflow-auto bg-background p-8"><div class="max-w-[1440px] mx-auto"><header class="flex items-center mb-6 py-3"><div class="relative flex-1 max-w-md group"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search absolute left-3.5 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-primary transition-colors"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><input type="text" placeholder="Search tasks, docs... (⌘K)" class="w-full bg-secondary/40 border border-border/50 rounded-lg pl-10 pr-4 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/70 outline-none transition-all focus:border-primary/50 focus:ring-2 focus:ring-primary/20 focus:bg-background hover:bg-secondary/60"/></div></header><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><div class="flex-1 flex items-center justify-center"><div class="animate-pulse text-muted-foreground">Loading...</div></div><!--/$--><!--$--><!--/$--></div></main></div><script src="/_next/static/chunks/webpack-ab85b3045756e687.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[6096,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Providers\"]\n3:I[9798,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Sidebar\"]\n4:I[493,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Header\"]\n5:I[7132,[],\"\"]\n6:I[5082,[],\"\"]\n7:I[9065,[],\"ClientPageRoot\"]\n8:I[3418,[\"286\",\"static/chunks/app/backlog/page-dce1450769bfae8f.js\"],\"default\"]\nb:I[700,[],\"OutletBoundary\"]\nd:I[7748,[],\"AsyncMetadataOutlet\"]\nf:I[700,[],\"ViewportBoundary\"]\n11:I[700,[],\"MetadataBoundary\"]\n12:\"$Sreact.suspense\"\n14:I[1256,[],\"\"]\n:HL[\"/_next/static/media/47cbc4e2adbc5db9-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/8aea088cdc4338f0.css\",\"style\"]\n:HL[\"/_next/static/css/13e8617b72f9d3aa.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"1BInkZcWpYFq8PBSpvumK\",\"p\":\"\",\"c\":[\"\",\"backlog\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"backlog\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/8aea088cdc4338f0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/13e8617b72f9d3aa.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_6a21cc antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden bg-background\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-auto bg-background p-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-[1440px] mx-auto\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}]}]}]}]]}],{\"children\":[\"backlog\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"Component\":\"$8\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@9\",\"$@a\"]}],null,[\"$\",\"$Lb\",null,{\"children\":[\"$Lc\",[\"$\",\"$Ld\",null,{\"promise\":\"$@e\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L11\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$12\",null,{\"fallback\":null,\"children\":\"$L13\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:{}\na:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nc:null\n"])</script><script>self.__next_f.push([1,"15:I[4780,[],\"IconMark\"]\ne:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Locus Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first task management and documentation for agentic engineering.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"200x209\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"$L15\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"13:\"$e:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--D0NXe04ZCLNDckV_quc8g--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/47cbc4e2adbc5db9-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/8aea088cdc4338f0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/13e8617b72f9d3aa.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-99a10a055b5bb9c4.js"/><script src="/_next/static/chunks/87c73c54-1f4741035a95c140.js" async=""></script><script src="/_next/static/chunks/902-d6926825a9fe8784.js" async=""></script><script src="/_next/static/chunks/main-app-123e879c5a937a00.js" async=""></script><script src="/_next/static/chunks/337-d3bb75304d130513.js" async=""></script><script src="/_next/static/chunks/146-34259952c594a3b0.js" async=""></script><script src="/_next/static/chunks/app/layout-05f504c042b9f7ee.js" async=""></script><script src="/_next/static/chunks/app/backlog/page-dce1450769bfae8f.js" async=""></script><meta name="next-size-adjust" content=""/><title>Locus Dashboard</title><meta name="description" content="Local-first task management and documentation for agentic engineering."/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="200x209"/><link rel="icon" href="/favicon.ico"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__className_6a21cc antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-screen overflow-hidden bg-background"><aside class="w-[260px] flex flex-col border-r border-border/50 bg-card/50 backdrop-blur-sm h-full"><div class="flex items-center gap-3 p-5 border-b border-border/50"><img alt="Locus" loading="lazy" width="97.81" height="32" decoding="async" data-nimg="1" class="rounded-xl shadow-lg" style="color:transparent" src="/logo.png"/></div><div class="flex-1 p-4"><div class="text-[10px] uppercase font-bold tracking-widest text-muted-foreground/70 mb-3 px-3">Navigation</div><nav class="space-y-1"><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layout-dashboard group-hover:scale-110 transition-transform"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><div class="flex-1"><span class="block">Board</span></div></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all bg-primary text-primary-foreground shadow-md shadow-primary/20" href="/backlog"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list"><path d="M3 12h.01"></path><path d="M3 18h.01"></path><path d="M3 6h.01"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M8 6h13"></path></svg><div class="flex-1"><span class="block">Backlog</span></div><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right opacity-70"><path d="m9 18 6-6-6-6"></path></svg></a><a class="group flex items-center gap-3 px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary hover:text-foreground" href="/docs"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text group-hover:scale-110 transition-transform"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg><div class="flex-1"><span class="block">Library</span></div></a></nav></div><div class="p-4 border-t border-border/50"><a class="flex items-center gap-3 w-full px-3 py-2.5 text-sm font-medium rounded-xl transition-all text-muted-foreground hover:bg-secondary/60 hover:text-foreground" href="/settings"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg><span>Settings</span></a></div></aside><main class="flex-1 overflow-auto bg-background p-8"><div class="max-w-[1440px] mx-auto"><header class="flex items-center mb-6 py-3"><div class="relative flex-1 max-w-md group"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search absolute left-3.5 top-1/2 -translate-y-1/2 text-muted-foreground group-focus-within:text-primary transition-colors"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><input type="text" placeholder="Search tasks, docs... (⌘K)" class="w-full bg-secondary/40 border border-border/50 rounded-lg pl-10 pr-4 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/70 outline-none transition-all focus:border-primary/50 focus:ring-2 focus:ring-primary/20 focus:bg-background hover:bg-secondary/60"/></div></header><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><div class="flex-1 flex items-center justify-center"><div class="animate-pulse text-muted-foreground">Loading...</div></div><!--/$--><!--$--><!--/$--></div></main></div><script src="/_next/static/chunks/webpack-99a10a055b5bb9c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[6096,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Providers\"]\n3:I[9798,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Sidebar\"]\n4:I[493,[\"337\",\"static/chunks/337-d3bb75304d130513.js\",\"146\",\"static/chunks/146-34259952c594a3b0.js\",\"177\",\"static/chunks/app/layout-05f504c042b9f7ee.js\"],\"Header\"]\n5:I[7132,[],\"\"]\n6:I[5082,[],\"\"]\n7:I[9065,[],\"ClientPageRoot\"]\n8:I[3418,[\"286\",\"static/chunks/app/backlog/page-dce1450769bfae8f.js\"],\"default\"]\nb:I[700,[],\"OutletBoundary\"]\nd:I[7748,[],\"AsyncMetadataOutlet\"]\nf:I[700,[],\"ViewportBoundary\"]\n11:I[700,[],\"MetadataBoundary\"]\n12:\"$Sreact.suspense\"\n14:I[1256,[],\"\"]\n:HL[\"/_next/static/media/47cbc4e2adbc5db9-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/8aea088cdc4338f0.css\",\"style\"]\n:HL[\"/_next/static/css/13e8617b72f9d3aa.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"D0NXe04ZCLNDckV_quc8g\",\"p\":\"\",\"c\":[\"\",\"backlog\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"backlog\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/8aea088cdc4338f0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/13e8617b72f9d3aa.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_6a21cc antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-screen overflow-hidden bg-background\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-auto bg-background p-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-[1440px] mx-auto\",\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}]}]}]}]]}],{\"children\":[\"backlog\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"Component\":\"$8\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@9\",\"$@a\"]}],null,[\"$\",\"$Lb\",null,{\"children\":[\"$Lc\",[\"$\",\"$Ld\",null,{\"promise\":\"$@e\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lf\",null,{\"children\":\"$L10\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$L11\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$12\",null,{\"fallback\":null,\"children\":\"$L13\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:{}\na:\"$0:f:0:1:2:children:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nc:null\n"])</script><script>self.__next_f.push([1,"15:I[4780,[],\"IconMark\"]\ne:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Locus Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first task management and documentation for agentic engineering.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"200x209\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"$L15\",\"4\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"13:\"$e:metadata\"\n"])</script></body></html>