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.
- vault_tasks-0.4.0/.gitignore +19 -0
- vault_tasks-0.4.0/PKG-INFO +217 -0
- vault_tasks-0.4.0/README.md +193 -0
- vault_tasks-0.4.0/pyproject.toml +67 -0
- vault_tasks-0.4.0/vault_tasks/__init__.py +3 -0
- vault_tasks-0.4.0/vault_tasks/__main__.py +82 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.d.ts +3 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.js +351 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/cli.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.d.ts +3 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.js +14 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/archive.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.d.ts +5 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.js +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/done.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.d.ts +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.js +12 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/edit.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.d.ts +4 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.js +60 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/init.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.d.ts +7 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.js +130 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/install-skills.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.d.ts +11 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.js +45 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/lint.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.d.ts +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.js +22 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/list.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.d.ts +12 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.js +112 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/new.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.d.ts +6 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.js +12 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/search.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.d.ts +5 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.js +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/show.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.d.ts +5 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.js +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/stale.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.d.ts +5 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.js +12 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/start.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.d.ts +3 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.js +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/commands/tags.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.d.ts +71 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.js +453 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/config.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.d.ts +11 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.js +131 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/counter.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.d.ts +16 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.js +187 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/frontmatter.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.d.ts +10 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.js +7 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/index.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.d.ts +11 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.js +38 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/broken.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.d.ts +15 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.js +57 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/drift.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.d.ts +20 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.js +61 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/orphans.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.d.ts +11 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.js +48 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/checks/stale.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.d.ts +44 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.js +223 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/collect.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.d.ts +29 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.js +119 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/index.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.d.ts +11 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.js +77 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/report.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.d.ts +48 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.js +147 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/resolve.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.d.ts +31 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.js +124 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/suggest.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.d.ts +130 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.js +8 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/lint/types.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.d.ts +9 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.js +59 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/output.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.d.ts +12 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.js +62 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/similarity.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.d.ts +5 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.js +27 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/slugify.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.d.ts +41 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.js +386 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/store.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.d.ts +28 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.js +2 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/task.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.d.ts +19 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.d.ts.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.js +121 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/dist/ulid.js.map +1 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/backlog.base +62 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/rules/backlog.md +14 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/brief/SKILL.md +54 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/build-log/SKILL.md +47 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/lint/SKILL.md +123 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/task/SKILL.md +28 -0
- vault_tasks-0.4.0/vault_tasks/_bundle/templates/skills/weekly-review/SKILL.md +90 -0
- 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,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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|