vault-tasks 0.4.0__tar.gz

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 (150) hide show
  1. vault_tasks-0.4.0/.gitignore +19 -0
  2. vault_tasks-0.4.0/PKG-INFO +217 -0
  3. vault_tasks-0.4.0/README.md +193 -0
  4. vault_tasks-0.4.0/pyproject.toml +67 -0
  5. vault_tasks-0.4.0/vault_tasks/__init__.py +3 -0
  6. vault_tasks-0.4.0/vault_tasks/__main__.py +82 -0
  7. vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.d.ts +3 -0
  8. vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.d.ts.map +1 -0
  9. vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.js +351 -0
  10. vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.js.map +1 -0
  11. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.d.ts +3 -0
  12. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.d.ts.map +1 -0
  13. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.js +14 -0
  14. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.js.map +1 -0
  15. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.d.ts +5 -0
  16. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.d.ts.map +1 -0
  17. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.js +8 -0
  18. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.js.map +1 -0
  19. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.d.ts +8 -0
  20. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.d.ts.map +1 -0
  21. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.js +12 -0
  22. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.js.map +1 -0
  23. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.d.ts +4 -0
  24. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.d.ts.map +1 -0
  25. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.js +60 -0
  26. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.js.map +1 -0
  27. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.d.ts +7 -0
  28. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.d.ts.map +1 -0
  29. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.js +130 -0
  30. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.js.map +1 -0
  31. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.d.ts +11 -0
  32. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.d.ts.map +1 -0
  33. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.js +45 -0
  34. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.js.map +1 -0
  35. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.d.ts +8 -0
  36. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.d.ts.map +1 -0
  37. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.js +22 -0
  38. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.js.map +1 -0
  39. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.d.ts +12 -0
  40. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.d.ts.map +1 -0
  41. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.js +112 -0
  42. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.js.map +1 -0
  43. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.d.ts +6 -0
  44. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.d.ts.map +1 -0
  45. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.js +12 -0
  46. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.js.map +1 -0
  47. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.d.ts +5 -0
  48. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.d.ts.map +1 -0
  49. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.js +8 -0
  50. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.js.map +1 -0
  51. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.d.ts +5 -0
  52. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.d.ts.map +1 -0
  53. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.js +8 -0
  54. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.js.map +1 -0
  55. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.d.ts +5 -0
  56. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.d.ts.map +1 -0
  57. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.js +12 -0
  58. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.js.map +1 -0
  59. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.d.ts +3 -0
  60. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.d.ts.map +1 -0
  61. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.js +8 -0
  62. vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.js.map +1 -0
  63. vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.d.ts +71 -0
  64. vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.d.ts.map +1 -0
  65. vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.js +453 -0
  66. vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.js.map +1 -0
  67. vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.d.ts +11 -0
  68. vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.d.ts.map +1 -0
  69. vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.js +131 -0
  70. vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.js.map +1 -0
  71. vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.d.ts +16 -0
  72. vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.d.ts.map +1 -0
  73. vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.js +187 -0
  74. vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.js.map +1 -0
  75. vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.d.ts +10 -0
  76. vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.d.ts.map +1 -0
  77. vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.js +7 -0
  78. vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.js.map +1 -0
  79. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.d.ts +11 -0
  80. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.d.ts.map +1 -0
  81. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.js +38 -0
  82. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.js.map +1 -0
  83. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.d.ts +15 -0
  84. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.d.ts.map +1 -0
  85. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.js +57 -0
  86. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.js.map +1 -0
  87. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.d.ts +20 -0
  88. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.d.ts.map +1 -0
  89. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.js +61 -0
  90. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.js.map +1 -0
  91. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.d.ts +11 -0
  92. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.d.ts.map +1 -0
  93. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.js +48 -0
  94. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.js.map +1 -0
  95. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.d.ts +44 -0
  96. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.d.ts.map +1 -0
  97. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.js +223 -0
  98. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.js.map +1 -0
  99. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.d.ts +29 -0
  100. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.d.ts.map +1 -0
  101. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.js +119 -0
  102. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.js.map +1 -0
  103. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.d.ts +11 -0
  104. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.d.ts.map +1 -0
  105. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.js +77 -0
  106. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.js.map +1 -0
  107. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.d.ts +48 -0
  108. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.d.ts.map +1 -0
  109. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.js +147 -0
  110. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.js.map +1 -0
  111. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.d.ts +31 -0
  112. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.d.ts.map +1 -0
  113. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.js +124 -0
  114. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.js.map +1 -0
  115. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.d.ts +130 -0
  116. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.d.ts.map +1 -0
  117. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.js +8 -0
  118. vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.js.map +1 -0
  119. vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.d.ts +9 -0
  120. vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.d.ts.map +1 -0
  121. vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.js +59 -0
  122. vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.js.map +1 -0
  123. vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.d.ts +12 -0
  124. vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.d.ts.map +1 -0
  125. vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.js +62 -0
  126. vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.js.map +1 -0
  127. vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.d.ts +5 -0
  128. vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.d.ts.map +1 -0
  129. vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.js +27 -0
  130. vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.js.map +1 -0
  131. vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.d.ts +41 -0
  132. vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.d.ts.map +1 -0
  133. vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.js +386 -0
  134. vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.js.map +1 -0
  135. vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.d.ts +28 -0
  136. vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.d.ts.map +1 -0
  137. vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.js +2 -0
  138. vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.js.map +1 -0
  139. vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.d.ts +19 -0
  140. vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.d.ts.map +1 -0
  141. vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.js +121 -0
  142. vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.js.map +1 -0
  143. vault_tasks-0.4.0/vault_tasks/_bundle/templates/backlog.base +62 -0
  144. vault_tasks-0.4.0/vault_tasks/_bundle/templates/rules/backlog.md +14 -0
  145. vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/brief/SKILL.md +54 -0
  146. vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/build-log/SKILL.md +47 -0
  147. vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/lint/SKILL.md +123 -0
  148. vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/task/SKILL.md +28 -0
  149. vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/weekly-review/SKILL.md +90 -0
  150. vault_tasks-0.4.0/vault_tasks/_version.py +2 -0
@@ -0,0 +1,19 @@
1
+ node_modules/
2
+ dist/
3
+ *.tsbuildinfo
4
+ .DS_Store
5
+ *.tgz
6
+ .env*
7
+ coverage/
8
+
9
+ # Python wheel build artifacts (vault-tasks pip distribution).
10
+ # python/README.md is regenerated from the repo-root README by
11
+ # scripts/build-wheel.mjs so the PyPI page always shows the live doc.
12
+ python/README.md
13
+ python/vault_tasks/_bundle/
14
+ python/dist/
15
+ python/build/
16
+ python/*.egg-info/
17
+ __pycache__/
18
+ *.pyc
19
+ .venv/
@@ -0,0 +1,217 @@
1
+ Metadata-Version: 2.4
2
+ Name: vault-tasks
3
+ Version: 0.4.0
4
+ Summary: Markdown-file task manager for solo devs building with Claude Code
5
+ Project-URL: Homepage, https://github.com/adcoh/vault-tasks
6
+ Project-URL: Repository, https://github.com/adcoh/vault-tasks
7
+ Project-URL: Issues, https://github.com/adcoh/vault-tasks/issues
8
+ Project-URL: Changelog, https://github.com/adcoh/vault-tasks/blob/main/CHANGELOG.md
9
+ Author: Adam Cohn
10
+ License: MIT
11
+ Keywords: backlog,claude-code,markdown,obsidian,second-brain,tasks,zettelkasten
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: JavaScript
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Classifier: Topic :: Software Development
21
+ Classifier: Topic :: Utilities
22
+ Requires-Python: >=3.8
23
+ Description-Content-Type: text/markdown
24
+
25
+ # vault-tasks
26
+
27
+ Markdown-file task manager for solo devs building with [Claude Code](https://docs.anthropic.com/en/docs/claude-code).
28
+
29
+ Tasks are plain markdown files with YAML frontmatter. They live in your repo (or Obsidian vault), are version-controlled with git, and are readable by humans and LLMs alike. Zero runtime dependencies.
30
+
31
+ ## Install
32
+
33
+ ```bash
34
+ npm install -g vault-tasks
35
+ ```
36
+
37
+ Or use without installing:
38
+
39
+ ```bash
40
+ npx vault-tasks <command>
41
+ ```
42
+
43
+ Requires Node.js >= 20.
44
+
45
+ ### Python projects (pip / uv)
46
+
47
+ If your project's lockfile is Python-based and you'd rather pin vault-tasks alongside your other dev dependencies:
48
+
49
+ ```bash
50
+ pip install vault-tasks
51
+ # or
52
+ uv add --dev vault-tasks
53
+ ```
54
+
55
+ The pip wheel is small (~100 KB) and bundles the same compiled JS that ships on npm. It still requires `node` (>= 20) on `PATH` — the wheel does not vendor a Node.js runtime.
56
+
57
+ ## Quick start
58
+
59
+ ```bash
60
+ # Initialize in your repo/vault root
61
+ vt init
62
+
63
+ # Create a task
64
+ vt new "Fix login redirect bug" --priority high --tags auth,bug
65
+
66
+ # See what's open
67
+ vt list
68
+
69
+ # Start working on it
70
+ vt start 1
71
+
72
+ # Mark it done (auto-archives by default)
73
+ vt done 1
74
+ ```
75
+
76
+ `vt init` creates a `.vault-tasks.toml` config and a `backlog/` directory. Tasks are markdown files with ULID prefixes (e.g., `01HYX3KQPD7NG8RRGSSFQ9XNHY-fix-login-redirect-bug.md`). Sequential numeric IDs (`0001-...`) are also supported via config.
77
+
78
+ ## Commands
79
+
80
+ | Command | Description |
81
+ |---|---|
82
+ | `vt new <title>` | Create a task. Options: `--priority`, `--tags`, `--source`, `--commit` |
83
+ | `vt list` | List open tasks. Options: `--status`, `--priority`, `--tag`, `--all` |
84
+ | `vt search <keyword>` | Search titles and body text. `--all` includes archived |
85
+ | `vt show <id>` | Print full task file |
86
+ | `vt start <id>` | Set status to `in-progress` |
87
+ | `vt done <id>` | Set status to `done` (auto-archives) |
88
+ | `vt edit <id>` | Update fields: `--status`, `--priority`, `--tags` |
89
+ | `vt stale` | List open tasks older than 14 days. `--days` to customize |
90
+ | `vt archive` | Move all completed tasks to the archive directory |
91
+ | `vt tags` | List all tags and their counts |
92
+ | `vt lint` | Audit the vault: broken wikilinks, orphan evergreens, stale refs, drift. `--only`, `--scope`, `--json`, `--quiet`, `--no-suggestions` |
93
+ | `vt init` | Initialize config and backlog directory |
94
+ | `vt install-skills` | Install Claude Code skills and rules. `--install`, `--list`, `--update` |
95
+
96
+ Task lookup (`<id>`) accepts a ULID prefix (e.g., `vt done 01HYX`), a numeric ID for sequential vaults (e.g., `vt done 1`), or a substring match against the filename (e.g., `vt done login`).
97
+
98
+ ## Task format
99
+
100
+ Each task is a markdown file with YAML frontmatter:
101
+
102
+ ```markdown
103
+ ---
104
+ title: "Fix login redirect bug"
105
+ status: open
106
+ priority: high
107
+ tags:
108
+ - auth
109
+ - bug
110
+ created: 2026-04-02
111
+ source: "[[2026-04-02 Session Log]]"
112
+ ---
113
+
114
+ # Fix login redirect bug
115
+
116
+ After OAuth callback, users are redirected to `/` instead of the page they came from.
117
+ ```
118
+
119
+ - **Status**: `open`, `in-progress`, `done`, `wont-do`
120
+ - **Priority**: `high`, `medium`, `low`
121
+ - **Tags**: freeform, filterable via `vt list --tag`
122
+ - **Source**: where the task was noticed (supports `[[wikilinks]]`)
123
+
124
+ Extra frontmatter fields (e.g. `due`, `assignee`) are preserved through all operations.
125
+
126
+ ## Configuration
127
+
128
+ `vt init` creates `.vault-tasks.toml` at your vault root:
129
+
130
+ ```toml
131
+ [paths]
132
+ backlog_dir = "backlog" # where task files live
133
+ archive_dir = "archive" # relative to backlog_dir
134
+ # journal_dir = "journal" # build logs and session notes
135
+ # projects_dir = "projects" # project folders with CONTEXT.md
136
+ # evergreen_dir = "evergreen" # evergreen/zettelkasten notes
137
+
138
+ [task]
139
+ # statuses = ["open", "in-progress", "done", "wont-do"]
140
+ # priorities = ["high", "medium", "low"]
141
+ # default_priority = "medium"
142
+ # default_status = "open"
143
+ # archive_statuses = ["done", "wont-do"]
144
+ # auto_archive = true
145
+
146
+ [id]
147
+ # strategy = "ulid" # "ulid" | "sequential" | "timestamp"
148
+ # pad_width = 4 # zero-pad width (only used with sequential)
149
+
150
+ [slugify]
151
+ # max_length = 60
152
+ ```
153
+
154
+ The config file is discovered by walking up from the current directory, so it works from any subdirectory.
155
+
156
+ ## Claude Code skills
157
+
158
+ vault-tasks ships with skill templates that teach Claude Code how to work with your task backlog:
159
+
160
+ ```bash
161
+ vt install-skills --install
162
+ ```
163
+
164
+ This installs into `.claude/skills/` and `.claude/rules/`:
165
+
166
+ | Skill | What it does |
167
+ |---|---|
168
+ | `/brief` | Pre-session briefing: open tasks, last session context, stale threads |
169
+ | `/build-log` | End-of-session log: what was built, learned, decided. Extracts tasks |
170
+ | `/weekly-review` | Consolidates journal entries, creates evergreen notes, triages backlog |
171
+ | `/task` | Quick task creation/management from within a session |
172
+ | `/lint` | Vault health check: broken wikilinks, orphans, stale refs, convention drift |
173
+
174
+ Skills reference configurable vault paths (`journal_dir`, `projects_dir`, `evergreen_dir`) which are substituted from your `.vault-tasks.toml` at install time. Customize any skill by creating a `SKILL.local.md` next to the installed `SKILL.md` -- local files are never overwritten.
175
+
176
+ An [Obsidian Bases](https://obsidian.md/blog/bases/) dashboard (`backlog.base`) is also installed for visual task management.
177
+
178
+ ## Library API
179
+
180
+ vault-tasks also exports a programmatic API:
181
+
182
+ ```typescript
183
+ import { loadConfig, TaskStore } from "vault-tasks";
184
+
185
+ const config = loadConfig();
186
+ const store = new TaskStore(config);
187
+
188
+ // Create
189
+ const task = store.create({ title: "My task", priority: "high", tags: ["api"] });
190
+
191
+ // Query
192
+ const all = store.loadAll();
193
+ const results = store.search("login");
194
+ const stale = store.stale(14);
195
+ const tags = store.allTags();
196
+
197
+ // Update
198
+ store.update(task, { status: "done", priority: "low", tags: ["api", "shipped"] });
199
+ store.archiveCompleted();
200
+ ```
201
+
202
+ ### Exports
203
+
204
+ - `TaskStore` -- all CRUD operations
205
+ - `loadConfig` / `findConfigFile` -- config discovery and parsing
206
+ - `parseFrontmatter` / `writeFrontmatter` -- YAML frontmatter utilities
207
+ - `slugify` -- title to kebab-case filename
208
+ - `lintVault` -- run all lint checks; returns a `LintReport`
209
+ - Lower-level lint primitives: `buildIndex`, `resolveTarget`,
210
+ `collectWikilinks`, `findBrokenLinks`, `findOrphanEvergreens`,
211
+ `findStaleReferences`, `findEvergreenDrift`, `attachSuggestions`
212
+ - Types: `Task`, `CreateTaskOpts`, `Config`, `LintReport`, `LintOptions`,
213
+ `WikiLink`, `VaultFile`, `BrokenEntry`, `Suggestion`
214
+
215
+ ## License
216
+
217
+ MIT
@@ -0,0 +1,193 @@
1
+ # vault-tasks
2
+
3
+ Markdown-file task manager for solo devs building with [Claude Code](https://docs.anthropic.com/en/docs/claude-code).
4
+
5
+ Tasks are plain markdown files with YAML frontmatter. They live in your repo (or Obsidian vault), are version-controlled with git, and are readable by humans and LLMs alike. Zero runtime dependencies.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g vault-tasks
11
+ ```
12
+
13
+ Or use without installing:
14
+
15
+ ```bash
16
+ npx vault-tasks <command>
17
+ ```
18
+
19
+ Requires Node.js >= 20.
20
+
21
+ ### Python projects (pip / uv)
22
+
23
+ If your project's lockfile is Python-based and you'd rather pin vault-tasks alongside your other dev dependencies:
24
+
25
+ ```bash
26
+ pip install vault-tasks
27
+ # or
28
+ uv add --dev vault-tasks
29
+ ```
30
+
31
+ The pip wheel is small (~100 KB) and bundles the same compiled JS that ships on npm. It still requires `node` (>= 20) on `PATH` — the wheel does not vendor a Node.js runtime.
32
+
33
+ ## Quick start
34
+
35
+ ```bash
36
+ # Initialize in your repo/vault root
37
+ vt init
38
+
39
+ # Create a task
40
+ vt new "Fix login redirect bug" --priority high --tags auth,bug
41
+
42
+ # See what's open
43
+ vt list
44
+
45
+ # Start working on it
46
+ vt start 1
47
+
48
+ # Mark it done (auto-archives by default)
49
+ vt done 1
50
+ ```
51
+
52
+ `vt init` creates a `.vault-tasks.toml` config and a `backlog/` directory. Tasks are markdown files with ULID prefixes (e.g., `01HYX3KQPD7NG8RRGSSFQ9XNHY-fix-login-redirect-bug.md`). Sequential numeric IDs (`0001-...`) are also supported via config.
53
+
54
+ ## Commands
55
+
56
+ | Command | Description |
57
+ |---|---|
58
+ | `vt new <title>` | Create a task. Options: `--priority`, `--tags`, `--source`, `--commit` |
59
+ | `vt list` | List open tasks. Options: `--status`, `--priority`, `--tag`, `--all` |
60
+ | `vt search <keyword>` | Search titles and body text. `--all` includes archived |
61
+ | `vt show <id>` | Print full task file |
62
+ | `vt start <id>` | Set status to `in-progress` |
63
+ | `vt done <id>` | Set status to `done` (auto-archives) |
64
+ | `vt edit <id>` | Update fields: `--status`, `--priority`, `--tags` |
65
+ | `vt stale` | List open tasks older than 14 days. `--days` to customize |
66
+ | `vt archive` | Move all completed tasks to the archive directory |
67
+ | `vt tags` | List all tags and their counts |
68
+ | `vt lint` | Audit the vault: broken wikilinks, orphan evergreens, stale refs, drift. `--only`, `--scope`, `--json`, `--quiet`, `--no-suggestions` |
69
+ | `vt init` | Initialize config and backlog directory |
70
+ | `vt install-skills` | Install Claude Code skills and rules. `--install`, `--list`, `--update` |
71
+
72
+ Task lookup (`<id>`) accepts a ULID prefix (e.g., `vt done 01HYX`), a numeric ID for sequential vaults (e.g., `vt done 1`), or a substring match against the filename (e.g., `vt done login`).
73
+
74
+ ## Task format
75
+
76
+ Each task is a markdown file with YAML frontmatter:
77
+
78
+ ```markdown
79
+ ---
80
+ title: "Fix login redirect bug"
81
+ status: open
82
+ priority: high
83
+ tags:
84
+ - auth
85
+ - bug
86
+ created: 2026-04-02
87
+ source: "[[2026-04-02 Session Log]]"
88
+ ---
89
+
90
+ # Fix login redirect bug
91
+
92
+ After OAuth callback, users are redirected to `/` instead of the page they came from.
93
+ ```
94
+
95
+ - **Status**: `open`, `in-progress`, `done`, `wont-do`
96
+ - **Priority**: `high`, `medium`, `low`
97
+ - **Tags**: freeform, filterable via `vt list --tag`
98
+ - **Source**: where the task was noticed (supports `[[wikilinks]]`)
99
+
100
+ Extra frontmatter fields (e.g. `due`, `assignee`) are preserved through all operations.
101
+
102
+ ## Configuration
103
+
104
+ `vt init` creates `.vault-tasks.toml` at your vault root:
105
+
106
+ ```toml
107
+ [paths]
108
+ backlog_dir = "backlog" # where task files live
109
+ archive_dir = "archive" # relative to backlog_dir
110
+ # journal_dir = "journal" # build logs and session notes
111
+ # projects_dir = "projects" # project folders with CONTEXT.md
112
+ # evergreen_dir = "evergreen" # evergreen/zettelkasten notes
113
+
114
+ [task]
115
+ # statuses = ["open", "in-progress", "done", "wont-do"]
116
+ # priorities = ["high", "medium", "low"]
117
+ # default_priority = "medium"
118
+ # default_status = "open"
119
+ # archive_statuses = ["done", "wont-do"]
120
+ # auto_archive = true
121
+
122
+ [id]
123
+ # strategy = "ulid" # "ulid" | "sequential" | "timestamp"
124
+ # pad_width = 4 # zero-pad width (only used with sequential)
125
+
126
+ [slugify]
127
+ # max_length = 60
128
+ ```
129
+
130
+ The config file is discovered by walking up from the current directory, so it works from any subdirectory.
131
+
132
+ ## Claude Code skills
133
+
134
+ vault-tasks ships with skill templates that teach Claude Code how to work with your task backlog:
135
+
136
+ ```bash
137
+ vt install-skills --install
138
+ ```
139
+
140
+ This installs into `.claude/skills/` and `.claude/rules/`:
141
+
142
+ | Skill | What it does |
143
+ |---|---|
144
+ | `/brief` | Pre-session briefing: open tasks, last session context, stale threads |
145
+ | `/build-log` | End-of-session log: what was built, learned, decided. Extracts tasks |
146
+ | `/weekly-review` | Consolidates journal entries, creates evergreen notes, triages backlog |
147
+ | `/task` | Quick task creation/management from within a session |
148
+ | `/lint` | Vault health check: broken wikilinks, orphans, stale refs, convention drift |
149
+
150
+ Skills reference configurable vault paths (`journal_dir`, `projects_dir`, `evergreen_dir`) which are substituted from your `.vault-tasks.toml` at install time. Customize any skill by creating a `SKILL.local.md` next to the installed `SKILL.md` -- local files are never overwritten.
151
+
152
+ An [Obsidian Bases](https://obsidian.md/blog/bases/) dashboard (`backlog.base`) is also installed for visual task management.
153
+
154
+ ## Library API
155
+
156
+ vault-tasks also exports a programmatic API:
157
+
158
+ ```typescript
159
+ import { loadConfig, TaskStore } from "vault-tasks";
160
+
161
+ const config = loadConfig();
162
+ const store = new TaskStore(config);
163
+
164
+ // Create
165
+ const task = store.create({ title: "My task", priority: "high", tags: ["api"] });
166
+
167
+ // Query
168
+ const all = store.loadAll();
169
+ const results = store.search("login");
170
+ const stale = store.stale(14);
171
+ const tags = store.allTags();
172
+
173
+ // Update
174
+ store.update(task, { status: "done", priority: "low", tags: ["api", "shipped"] });
175
+ store.archiveCompleted();
176
+ ```
177
+
178
+ ### Exports
179
+
180
+ - `TaskStore` -- all CRUD operations
181
+ - `loadConfig` / `findConfigFile` -- config discovery and parsing
182
+ - `parseFrontmatter` / `writeFrontmatter` -- YAML frontmatter utilities
183
+ - `slugify` -- title to kebab-case filename
184
+ - `lintVault` -- run all lint checks; returns a `LintReport`
185
+ - Lower-level lint primitives: `buildIndex`, `resolveTarget`,
186
+ `collectWikilinks`, `findBrokenLinks`, `findOrphanEvergreens`,
187
+ `findStaleReferences`, `findEvergreenDrift`, `attachSuggestions`
188
+ - Types: `Task`, `CreateTaskOpts`, `Config`, `LintReport`, `LintOptions`,
189
+ `WikiLink`, `VaultFile`, `BrokenEntry`, `Suggestion`
190
+
191
+ ## License
192
+
193
+ MIT
@@ -0,0 +1,67 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.21"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "vault-tasks"
7
+ dynamic = ["version"]
8
+ description = "Markdown-file task manager for solo devs building with Claude Code"
9
+ readme = "README.md"
10
+ requires-python = ">=3.8"
11
+ license = { text = "MIT" }
12
+ authors = [{ name = "Adam Cohn" }]
13
+ keywords = [
14
+ "tasks",
15
+ "backlog",
16
+ "obsidian",
17
+ "claude-code",
18
+ "markdown",
19
+ "zettelkasten",
20
+ "second-brain",
21
+ ]
22
+ classifiers = [
23
+ "Development Status :: 4 - Beta",
24
+ "Environment :: Console",
25
+ "Intended Audience :: Developers",
26
+ "License :: OSI Approved :: MIT License",
27
+ "Operating System :: OS Independent",
28
+ "Programming Language :: JavaScript",
29
+ "Programming Language :: Python :: 3",
30
+ "Programming Language :: Python :: 3 :: Only",
31
+ "Topic :: Software Development",
32
+ "Topic :: Utilities",
33
+ ]
34
+
35
+ [project.scripts]
36
+ vault-tasks = "vault_tasks.__main__:main"
37
+ vt = "vault_tasks.__main__:main"
38
+
39
+ [project.urls]
40
+ Homepage = "https://github.com/adcoh/vault-tasks"
41
+ Repository = "https://github.com/adcoh/vault-tasks"
42
+ Issues = "https://github.com/adcoh/vault-tasks/issues"
43
+ Changelog = "https://github.com/adcoh/vault-tasks/blob/main/CHANGELOG.md"
44
+
45
+ [tool.hatch.version]
46
+ path = "vault_tasks/_version.py"
47
+
48
+ [tool.hatch.build]
49
+ # _bundle/ is gitignored (it is a build artifact staged by
50
+ # scripts/build-wheel.mjs from package.json + dist/ + templates/). Without
51
+ # this, hatchling honors .gitignore and silently drops the JS files from
52
+ # the wheel. `artifacts` re-includes them.
53
+ artifacts = [
54
+ "vault_tasks/_bundle/**",
55
+ ]
56
+
57
+ [tool.hatch.build.targets.wheel]
58
+ packages = ["vault_tasks"]
59
+
60
+ [tool.hatch.build.targets.sdist]
61
+ # sdist must be self-contained: include the staged bundle so reproducing the
62
+ # wheel from sdist does not require Node.js to be present on the builder.
63
+ include = [
64
+ "vault_tasks/**",
65
+ "README.md",
66
+ "pyproject.toml",
67
+ ]
@@ -0,0 +1,3 @@
1
+ from ._version import __version__
2
+
3
+ __all__ = ["__version__"]
@@ -0,0 +1,82 @@
1
+ """Python entry point for the vault-tasks CLI.
2
+
3
+ The pip wheel ships the compiled JS at vault_tasks/_bundle/dist/cli.js plus
4
+ the templates tree at vault_tasks/_bundle/templates/. This shim:
5
+
6
+ 1. Locates `node` on PATH (errors actionably if missing).
7
+ 2. Sets VAULT_TASKS_TEMPLATES_DIR so install-skills finds the bundled
8
+ templates instead of walking up from __dirname.
9
+ 3. Execs `node cli.js <forwarded argv>`. On POSIX we use os.execvpe so
10
+ signals (Ctrl-C) and exit codes pass through cleanly. On Windows we
11
+ fall back to subprocess.run because execvpe semantics there are
12
+ different enough to cause shell-related surprises.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ import shutil
19
+ import subprocess
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ NODE_MISSING_MESSAGE = (
24
+ "vault-tasks: Node.js is required but was not found on PATH.\n"
25
+ "\n"
26
+ "vault-tasks ships as JavaScript and needs Node.js >= 20 to run.\n"
27
+ "Install Node from https://nodejs.org or via your package manager:\n"
28
+ " macOS: brew install node\n"
29
+ " Ubuntu: sudo apt install nodejs\n"
30
+ " Windows: winget install OpenJS.NodeJS.LTS\n"
31
+ "Then re-run this command.\n"
32
+ )
33
+
34
+
35
+ def _bundle_root() -> Path:
36
+ return Path(__file__).resolve().parent / "_bundle"
37
+
38
+
39
+ def _find_node() -> str:
40
+ node = shutil.which("node")
41
+ if not node:
42
+ sys.stderr.write(NODE_MISSING_MESSAGE)
43
+ sys.exit(127)
44
+ return node
45
+
46
+
47
+ def main() -> None:
48
+ node = _find_node()
49
+ bundle = _bundle_root()
50
+ cli_js = bundle / "dist" / "cli.js"
51
+ templates = bundle / "templates"
52
+
53
+ if not cli_js.is_file():
54
+ sys.stderr.write(
55
+ f"vault-tasks: bundle is missing cli.js at {cli_js}.\n"
56
+ "The pip wheel appears to be corrupt. Try `pip install --force-reinstall vault-tasks`.\n"
57
+ )
58
+ sys.exit(1)
59
+ if not templates.is_dir():
60
+ sys.stderr.write(
61
+ f"vault-tasks: bundle is missing templates at {templates}.\n"
62
+ "The pip wheel appears to be corrupt. Try `pip install --force-reinstall vault-tasks`.\n"
63
+ )
64
+ sys.exit(1)
65
+
66
+ env = os.environ.copy()
67
+ env["VAULT_TASKS_TEMPLATES_DIR"] = str(templates)
68
+
69
+ argv = [node, str(cli_js), *sys.argv[1:]]
70
+
71
+ if os.name == "nt":
72
+ # Windows: subprocess.run preserves stdio/exit-code semantics best.
73
+ # Pass argv as a list so the shell does not re-quote anything.
74
+ completed = subprocess.run(argv, env=env)
75
+ sys.exit(completed.returncode)
76
+
77
+ # POSIX: replace the Python process so signals and exit codes pass through.
78
+ os.execvpe(node, argv, env)
79
+
80
+
81
+ if __name__ == "__main__":
82
+ main()
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}