clawvault 2.5.3 → 2.6.0

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.
Files changed (95) hide show
  1. package/README.md +159 -159
  2. package/bin/clawvault.js +111 -111
  3. package/bin/command-registration.test.js +166 -166
  4. package/bin/command-runtime.js +93 -93
  5. package/bin/command-runtime.test.js +154 -154
  6. package/bin/help-contract.test.js +39 -39
  7. package/bin/register-config-commands.js +153 -153
  8. package/bin/register-config-route-commands.test.js +121 -121
  9. package/bin/register-core-commands.js +237 -237
  10. package/bin/register-kanban-commands.js +56 -56
  11. package/bin/register-kanban-commands.test.js +83 -83
  12. package/bin/register-maintenance-commands.js +282 -282
  13. package/bin/register-project-commands.js +209 -209
  14. package/bin/register-project-commands.test.js +206 -206
  15. package/bin/register-query-commands.js +317 -317
  16. package/bin/register-query-commands.test.js +65 -65
  17. package/bin/register-resilience-commands.js +182 -182
  18. package/bin/register-resilience-commands.test.js +81 -81
  19. package/bin/register-route-commands.js +114 -114
  20. package/bin/register-session-lifecycle-commands.js +206 -206
  21. package/bin/register-tailscale-commands.js +106 -106
  22. package/bin/register-task-commands.js +348 -348
  23. package/bin/register-task-commands.test.js +69 -69
  24. package/bin/register-template-commands.js +75 -72
  25. package/bin/register-template-commands.test.js +87 -0
  26. package/bin/register-vault-operations-commands.js +300 -300
  27. package/bin/test-helpers/cli-command-fixtures.js +119 -119
  28. package/dashboard/lib/graph-diff.js +104 -104
  29. package/dashboard/lib/graph-diff.test.js +75 -75
  30. package/dashboard/lib/vault-parser.js +556 -556
  31. package/dashboard/lib/vault-parser.test.js +254 -254
  32. package/dashboard/public/app.js +796 -796
  33. package/dashboard/public/index.html +52 -52
  34. package/dashboard/public/styles.css +221 -221
  35. package/dashboard/server.js +374 -374
  36. package/dist/{chunk-J5EMBUPK.js → chunk-4OXMU5S2.js} +1 -1
  37. package/dist/{chunk-3FP5BJ42.js → chunk-4QYGFWRM.js} +1 -1
  38. package/dist/{chunk-4IV3R2F5.js → chunk-4TE4JMLA.js} +1 -1
  39. package/dist/{chunk-5GZFTAL7.js → chunk-AZYOKJYC.js} +128 -42
  40. package/dist/{chunk-FG6RJMCN.js → chunk-HA5M6KJB.js} +4 -4
  41. package/dist/{chunk-IZEY5S74.js → chunk-IEVLHNLU.js} +1 -1
  42. package/dist/{chunk-CLE2HHNT.js → chunk-IVRIKYFE.js} +18 -11
  43. package/dist/{chunk-AY4PGUVL.js → chunk-KL4NAOMO.js} +1 -1
  44. package/dist/{chunk-O7XHXF7F.js → chunk-MAKNAHAW.js} +4 -4
  45. package/dist/{chunk-OSMS7QIG.js → chunk-ME37YNW3.js} +2 -2
  46. package/dist/chunk-MFAWT5O5.js +301 -0
  47. package/dist/{chunk-TPDH3JPP.js → chunk-PBEE567J.js} +1 -1
  48. package/dist/{chunk-S2IG7VNM.js → chunk-Q2J5YTUF.js} +2 -2
  49. package/dist/{chunk-IOALNTAN.js → chunk-QWQ3TIKS.js} +103 -29
  50. package/dist/{chunk-YCVDVI5B.js → chunk-R2MIW5G7.js} +1 -1
  51. package/dist/{chunk-M25QVSJM.js → chunk-RVYA52PY.js} +1 -1
  52. package/dist/{chunk-NZ4ZZNSR.js → chunk-THRJVD4L.js} +1 -1
  53. package/dist/{chunk-4GBPTBFJ.js → chunk-TIGW564L.js} +1 -1
  54. package/dist/{chunk-LMEMZGUV.js → chunk-UEOUADMO.js} +3 -3
  55. package/dist/{chunk-GFJ3LIIB.js → chunk-XAVB4GB4.js} +1 -1
  56. package/dist/cli/index.js +15 -13
  57. package/dist/commands/backlog.js +3 -1
  58. package/dist/commands/blocked.js +3 -1
  59. package/dist/commands/canvas.js +3 -1
  60. package/dist/commands/context.js +3 -3
  61. package/dist/commands/doctor.js +9 -7
  62. package/dist/commands/embed.js +2 -2
  63. package/dist/commands/kanban.js +4 -2
  64. package/dist/commands/observe.js +7 -5
  65. package/dist/commands/project.js +5 -3
  66. package/dist/commands/rebuild.js +6 -4
  67. package/dist/commands/replay.js +6 -4
  68. package/dist/commands/setup.js +2 -2
  69. package/dist/commands/sleep.js +7 -5
  70. package/dist/commands/status.js +8 -6
  71. package/dist/commands/tailscale.js +3 -3
  72. package/dist/commands/task.js +4 -2
  73. package/dist/commands/template.d.ts +10 -1
  74. package/dist/commands/template.js +47 -55
  75. package/dist/commands/wake.js +2 -2
  76. package/dist/index.js +23 -22
  77. package/dist/lib/project-utils.js +4 -2
  78. package/dist/lib/tailscale.js +2 -2
  79. package/dist/lib/task-utils.d.ts +14 -13
  80. package/dist/lib/task-utils.js +3 -1
  81. package/dist/lib/template-engine.d.ts +1 -0
  82. package/dist/lib/webdav.js +1 -1
  83. package/hooks/clawvault/HOOK.md +83 -83
  84. package/hooks/clawvault/handler.js +816 -816
  85. package/hooks/clawvault/handler.test.js +263 -263
  86. package/package.json +94 -94
  87. package/templates/checkpoint.md +34 -19
  88. package/templates/daily-note.md +34 -19
  89. package/templates/daily.md +34 -19
  90. package/templates/decision.md +39 -17
  91. package/templates/handoff.md +34 -19
  92. package/templates/lesson.md +31 -16
  93. package/templates/person.md +37 -19
  94. package/templates/project.md +84 -23
  95. package/templates/task.md +81 -0
package/package.json CHANGED
@@ -1,94 +1,94 @@
1
- {
2
- "name": "clawvault",
3
- "version": "2.5.3",
4
- "description": "Structured memory system for AI agents — typed storage, knowledge graph, context profiles, canvas dashboards, neural graph themes, and Obsidian-native task views. An elephant never forgets. 🐘",
5
- "type": "module",
6
- "main": "dist/index.cjs",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js",
13
- "require": "./dist/index.cjs"
14
- }
15
- },
16
- "bin": {
17
- "clawvault": "bin/clawvault.js"
18
- },
19
- "files": [
20
- "dist",
21
- "bin",
22
- "dashboard",
23
- "templates",
24
- "hooks"
25
- ],
26
- "openclaw": {
27
- "hooks": [
28
- "./hooks/clawvault"
29
- ]
30
- },
31
- "scripts": {
32
- "build": "tsup src/commands/archive.ts src/commands/backlog.ts src/commands/blocked.ts src/commands/canvas.ts src/commands/checkpoint.ts src/commands/compat.ts src/commands/context.ts src/commands/doctor.ts src/commands/embed.ts src/commands/entities.ts src/commands/graph.ts src/commands/inject.ts src/commands/kanban.ts src/commands/link.ts src/commands/migrate-observations.ts src/commands/observe.ts src/commands/project.ts src/commands/rebuild.ts src/commands/recover.ts src/commands/reflect.ts src/commands/repair-session.ts src/commands/replay.ts src/commands/session-recap.ts src/commands/setup.ts src/commands/shell-init.ts src/commands/sleep.ts src/commands/status.ts src/commands/sync-bd.ts src/commands/tailscale.ts src/commands/task.ts src/commands/template.ts src/commands/wake.ts src/cli/index.ts src/index.ts src/lib/auto-linker.ts src/lib/canvas-layout.ts src/lib/config.ts src/lib/entity-index.ts src/lib/project-utils.ts src/lib/session-repair.ts src/lib/session-utils.ts src/lib/tailscale.ts src/lib/task-utils.ts src/lib/template-engine.ts src/lib/webdav.ts --format esm --dts --clean",
33
- "dev": "tsup src/index.ts src/commands/*.ts src/lib/*.ts --format esm --dts --watch",
34
- "lint": "eslint src",
35
- "typecheck": "tsc --noEmit",
36
- "test": "vitest run",
37
- "ci": "npm run typecheck && npm test && npm run build",
38
- "prepublishOnly": "npm run build"
39
- },
40
- "keywords": [
41
- "ai-agent",
42
- "memory",
43
- "knowledge-graph",
44
- "obsidian",
45
- "markdown",
46
- "task-management",
47
- "context-death",
48
- "openclaw",
49
- "llm",
50
- "agent-memory",
51
- "canvas-dashboard",
52
- "semantic-search"
53
- ],
54
- "author": "Versatly",
55
- "license": "MIT",
56
- "repository": {
57
- "type": "git",
58
- "url": "git+https://github.com/Versatly/clawvault.git"
59
- },
60
- "homepage": "https://clawvault.dev",
61
- "bugs": {
62
- "url": "https://github.com/Versatly/clawvault/issues"
63
- },
64
- "engines": {
65
- "node": ">=18"
66
- },
67
- "dependencies": {
68
- "chalk": "^5.3.0",
69
- "chokidar": "^5.0.0",
70
- "commander": "^12.0.0",
71
- "express": "^5.2.1",
72
- "force-graph": "^1.51.1",
73
- "glob": "^10.3.10",
74
- "gray-matter": "^4.0.3",
75
- "natural": "^6.10.4",
76
- "ws": "^8.19.0"
77
- },
78
- "peerDependencies": {
79
- "qmd": "*"
80
- },
81
- "peerDependenciesMeta": {
82
- "qmd": {
83
- "optional": true
84
- }
85
- },
86
- "devDependencies": {
87
- "@types/node": "^20.11.0",
88
- "ajv": "^8.17.1",
89
- "puppeteer": "^24.37.2",
90
- "tsup": "^8.0.1",
91
- "typescript": "^5.3.3",
92
- "vitest": "^1.2.0"
93
- }
94
- }
1
+ {
2
+ "name": "clawvault",
3
+ "version": "2.6.0",
4
+ "description": "Structured memory system for AI agents — typed storage, knowledge graph, context profiles, canvas dashboards, neural graph themes, and Obsidian-native task views. An elephant never forgets. 🐘",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "bin": {
17
+ "clawvault": "bin/clawvault.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "bin",
22
+ "dashboard",
23
+ "templates",
24
+ "hooks"
25
+ ],
26
+ "openclaw": {
27
+ "hooks": [
28
+ "./hooks/clawvault"
29
+ ]
30
+ },
31
+ "scripts": {
32
+ "build": "tsup src/commands/archive.ts src/commands/backlog.ts src/commands/blocked.ts src/commands/canvas.ts src/commands/checkpoint.ts src/commands/compat.ts src/commands/context.ts src/commands/doctor.ts src/commands/embed.ts src/commands/entities.ts src/commands/graph.ts src/commands/inject.ts src/commands/kanban.ts src/commands/link.ts src/commands/migrate-observations.ts src/commands/observe.ts src/commands/project.ts src/commands/rebuild.ts src/commands/recover.ts src/commands/reflect.ts src/commands/repair-session.ts src/commands/replay.ts src/commands/session-recap.ts src/commands/setup.ts src/commands/shell-init.ts src/commands/sleep.ts src/commands/status.ts src/commands/sync-bd.ts src/commands/tailscale.ts src/commands/task.ts src/commands/template.ts src/commands/wake.ts src/cli/index.ts src/index.ts src/lib/auto-linker.ts src/lib/canvas-layout.ts src/lib/config.ts src/lib/entity-index.ts src/lib/project-utils.ts src/lib/session-repair.ts src/lib/session-utils.ts src/lib/tailscale.ts src/lib/task-utils.ts src/lib/template-engine.ts src/lib/webdav.ts --format esm --dts --clean",
33
+ "dev": "tsup src/index.ts src/commands/*.ts src/lib/*.ts --format esm --dts --watch",
34
+ "lint": "eslint src",
35
+ "typecheck": "tsc --noEmit",
36
+ "test": "vitest run",
37
+ "ci": "npm run typecheck && npm test && npm run build",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "keywords": [
41
+ "ai-agent",
42
+ "memory",
43
+ "knowledge-graph",
44
+ "obsidian",
45
+ "markdown",
46
+ "task-management",
47
+ "context-death",
48
+ "openclaw",
49
+ "llm",
50
+ "agent-memory",
51
+ "canvas-dashboard",
52
+ "semantic-search"
53
+ ],
54
+ "author": "Versatly",
55
+ "license": "MIT",
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/Versatly/clawvault.git"
59
+ },
60
+ "homepage": "https://clawvault.dev",
61
+ "bugs": {
62
+ "url": "https://github.com/Versatly/clawvault/issues"
63
+ },
64
+ "engines": {
65
+ "node": ">=18"
66
+ },
67
+ "dependencies": {
68
+ "chalk": "^5.3.0",
69
+ "chokidar": "^5.0.0",
70
+ "commander": "^12.0.0",
71
+ "express": "^5.2.1",
72
+ "force-graph": "^1.51.1",
73
+ "glob": "^10.3.10",
74
+ "gray-matter": "^4.0.3",
75
+ "natural": "^6.10.4",
76
+ "ws": "^8.19.0"
77
+ },
78
+ "peerDependencies": {
79
+ "qmd": "*"
80
+ },
81
+ "peerDependenciesMeta": {
82
+ "qmd": {
83
+ "optional": true
84
+ }
85
+ },
86
+ "devDependencies": {
87
+ "@types/node": "^20.11.0",
88
+ "ajv": "^8.17.1",
89
+ "puppeteer": "^24.37.2",
90
+ "tsup": "^8.0.1",
91
+ "typescript": "^5.3.3",
92
+ "vitest": "^1.2.0"
93
+ }
94
+ }
@@ -1,19 +1,34 @@
1
- ---
2
- title: "Checkpoint {{datetime}}"
3
- date: {{date}}
4
- type: {{type}}
5
- ---
6
-
7
- # Checkpoint
8
-
9
- ## Working On
10
- -
11
-
12
- ## Focus
13
- -
14
-
15
- ## Blocked
16
- -
17
-
18
- ## Notes
19
- -
1
+ ---
2
+ primitive: checkpoint
3
+ description: Canonical schema for resilience checkpoints.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "Checkpoint {{datetime}}"
9
+ description: Checkpoint title.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Checkpoint date.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: checkpoint
19
+ description: Primitive discriminator for checkpoint notes.
20
+ ---
21
+
22
+ # Checkpoint
23
+
24
+ ## Working On
25
+ -
26
+
27
+ ## Focus
28
+ -
29
+
30
+ ## Blocked
31
+ -
32
+
33
+ ## Notes
34
+ -
@@ -1,19 +1,34 @@
1
- ---
2
- title: "{{date}}"
3
- date: {{date}}
4
- type: {{type}}
5
- ---
6
-
7
- # {{date}}
8
-
9
- ## Focus
10
- -
11
-
12
- ## Wins
13
- -
14
-
15
- ## Notes
16
- -
17
-
18
- ## Next
19
- - [ ]
1
+ ---
2
+ primitive: daily-note
3
+ description: Canonical schema for daily context snapshots.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "{{date}}"
9
+ description: Daily note title.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Date represented by this note.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: daily-note
19
+ description: Primitive discriminator for daily note documents.
20
+ ---
21
+
22
+ # {{date}}
23
+
24
+ ## Focus
25
+ -
26
+
27
+ ## Wins
28
+ -
29
+
30
+ ## Notes
31
+ -
32
+
33
+ ## Next
34
+ - [ ]
@@ -1,19 +1,34 @@
1
- ---
2
- title: "{{date}}"
3
- date: {{date}}
4
- type: {{type}}
5
- ---
6
-
7
- # {{date}}
8
-
9
- ## Focus
10
- -
11
-
12
- ## Wins
13
- -
14
-
15
- ## Notes
16
- -
17
-
18
- ## Next
19
- - [ ]
1
+ ---
2
+ primitive: daily-note
3
+ description: Legacy alias for daily-note template.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "{{date}}"
9
+ description: Daily note title.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Date represented by this note.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: daily
19
+ description: Legacy discriminator used by older vaults.
20
+ ---
21
+
22
+ # {{date}}
23
+
24
+ ## Focus
25
+ -
26
+
27
+ ## Wins
28
+ -
29
+
30
+ ## Notes
31
+ -
32
+
33
+ ## Next
34
+ - [ ]
@@ -1,17 +1,39 @@
1
- ---
2
- title: "{{title}}"
3
- date: {{date}}
4
- type: {{type}}
5
- status: decided
6
- ---
7
-
8
- # Decision: {{title}}
9
-
10
- ## Context
11
- -
12
-
13
- ## Decision
14
- -
15
-
16
- ## Consequences
17
- -
1
+ ---
2
+ primitive: decision
3
+ description: Canonical schema for decision records.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "{{title}}"
9
+ description: Decision title.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Date the decision was captured.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: decision
19
+ description: Primitive discriminator for decision notes.
20
+ status:
21
+ type: string
22
+ default: decided
23
+ enum:
24
+ - proposed
25
+ - decided
26
+ - superseded
27
+ description: Decision state.
28
+ ---
29
+
30
+ # Decision: {{title}}
31
+
32
+ ## Context
33
+ -
34
+
35
+ ## Decision
36
+ -
37
+
38
+ ## Consequences
39
+ -
@@ -1,19 +1,34 @@
1
- ---
2
- title: "Handoff {{datetime}}"
3
- date: {{date}}
4
- type: {{type}}
5
- ---
6
-
7
- # Session Handoff
8
-
9
- ## Working On
10
- -
11
-
12
- ## Blocked
13
- -
14
-
15
- ## Next
16
- - [ ]
17
-
18
- ## Notes
19
- -
1
+ ---
2
+ primitive: handoff
3
+ description: Canonical schema for session handoff documents.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "Handoff {{datetime}}"
9
+ description: Handoff title.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Handoff date.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: handoff
19
+ description: Primitive discriminator for handoff notes.
20
+ ---
21
+
22
+ # Session Handoff
23
+
24
+ ## Working On
25
+ -
26
+
27
+ ## Blocked
28
+ -
29
+
30
+ ## Next
31
+ - [ ]
32
+
33
+ ## Notes
34
+ -
@@ -1,16 +1,31 @@
1
- ---
2
- title: "{{title}}"
3
- date: {{date}}
4
- type: {{type}}
5
- ---
6
-
7
- # Lesson: {{title}}
8
-
9
- ## Insight
10
- -
11
-
12
- ## Evidence
13
- -
14
-
15
- ## Application
16
- -
1
+ ---
2
+ primitive: lesson
3
+ description: Canonical schema for lessons learned.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "{{title}}"
9
+ description: Lesson title.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Date the lesson was captured.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: lesson
19
+ description: Primitive discriminator for lessons.
20
+ ---
21
+
22
+ # Lesson: {{title}}
23
+
24
+ ## Insight
25
+ -
26
+
27
+ ## Evidence
28
+ -
29
+
30
+ ## Application
31
+ -
@@ -1,19 +1,37 @@
1
- ---
2
- title: "{{title}}"
3
- date: {{date}}
4
- type: {{type}}
5
- relationship: contact
6
- ---
7
-
8
- # {{title}}
9
-
10
- ## Context
11
- -
12
-
13
- ## Details
14
- - Contact:
15
- - Role:
16
- - Timezone:
17
-
18
- ## History
19
- - {{date}}:
1
+ ---
2
+ primitive: person
3
+ description: Canonical schema for people and relationship notes.
4
+ fields:
5
+ title:
6
+ type: string
7
+ required: true
8
+ default: "{{title}}"
9
+ description: Person display name.
10
+ date:
11
+ type: date
12
+ required: true
13
+ default: "{{date}}"
14
+ description: Date this profile was created.
15
+ type:
16
+ type: string
17
+ required: true
18
+ default: person
19
+ description: Primitive discriminator for person notes.
20
+ relationship:
21
+ type: string
22
+ default: contact
23
+ description: Relationship category.
24
+ ---
25
+
26
+ # {{title}}
27
+
28
+ ## Context
29
+ -
30
+
31
+ ## Details
32
+ - Contact:
33
+ - Role:
34
+ - Timezone:
35
+
36
+ ## History
37
+ - {{date}}:
@@ -1,23 +1,84 @@
1
- ---
2
- title: "{{title}}"
3
- date: {{date}}
4
- type: {{type}}
5
- status: active
6
- ---
7
-
8
- # {{title}}
9
-
10
- ## Objective
11
- -
12
-
13
- ## Status
14
- - [ ] Planning
15
- - [ ] In progress
16
- - [ ] Blocked
17
- - [ ] Done
18
-
19
- ## Next
20
- - [ ]
21
-
22
- ## Notes
23
- -
1
+ ---
2
+ primitive: project
3
+ description: Canonical schema for project definition documents.
4
+ fields:
5
+ type:
6
+ type: string
7
+ required: true
8
+ default: project
9
+ description: Primitive discriminator for project documents.
10
+ status:
11
+ type: string
12
+ required: true
13
+ default: active
14
+ enum:
15
+ - active
16
+ - paused
17
+ - completed
18
+ - archived
19
+ description: Project lifecycle state.
20
+ created:
21
+ type: datetime
22
+ required: true
23
+ default: "{{datetime}}"
24
+ description: ISO timestamp when the project was created.
25
+ updated:
26
+ type: datetime
27
+ required: true
28
+ default: "{{datetime}}"
29
+ description: ISO timestamp of the most recent update.
30
+ owner:
31
+ type: string
32
+ description: Primary owner for the project.
33
+ team:
34
+ type: string[]
35
+ description: Team members collaborating on the project.
36
+ client:
37
+ type: string
38
+ description: Client or stakeholder name.
39
+ tags:
40
+ type: string[]
41
+ description: Labels used for filtering.
42
+ description:
43
+ type: string
44
+ description: One-line project summary.
45
+ started:
46
+ type: date
47
+ description: Optional project start date.
48
+ deadline:
49
+ type: date
50
+ description: Project due date.
51
+ repo:
52
+ type: string
53
+ description: Source repository URL.
54
+ url:
55
+ type: string
56
+ description: Production or staging URL.
57
+ completed:
58
+ type: datetime
59
+ description: Completion timestamp when finished.
60
+ reason:
61
+ type: string
62
+ description: Optional reason for archival/completion.
63
+ ---
64
+
65
+ # {{title}}
66
+
67
+ {{links_line}}
68
+
69
+ {{content}}
70
+
71
+ ## Objective
72
+ -
73
+
74
+ ## Status
75
+ - [ ] Planning
76
+ - [ ] In progress
77
+ - [ ] Blocked
78
+ - [ ] Done
79
+
80
+ ## Next
81
+ - [ ]
82
+
83
+ ## Notes
84
+ -