diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..a6780f9 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,62 @@ +{ + "permissions": { + "allow": [ + "Bash(pql)", + "Bash(pql *)", + "Bash(/home/jpmschweitzer/.local/bin/pql:*)", + "Bash(git status:*)", + "Bash(git log:*)", + "Bash(git diff:*)", + "Bash(git branch:*)", + "Bash(.venv/bin/python -m pytest:*)", + "Bash(.venv/bin/pytest:*)", + "Bash(pytest:*)", + "Bash(alembic *)", + "Bash(docker logs core-api:*)", + "Bash(curl -s http://localhost:8083/*)" + ], + "deny": [ + "Bash(sudo *)", + "Bash(su *)", + "Bash(rm -rf /*)", + "Bash(rm -rf ~*)", + "Bash(rm -rf $HOME*)", + "Bash(mkfs*)", + "Bash(dd if=*)", + "Bash(chmod 777 *)", + "Bash(chmod -R 777 *)", + "Bash(find * -exec*)", + "Bash(find * -delete*)", + "Bash(git add -A*)", + "Bash(git * add -A*)", + "Bash(git add --all*)", + "Bash(git * add --all*)", + "Bash(git add .)", + "Bash(git * add .)", + "Bash(git push --force*)", + "Bash(git * push --force*)", + "Bash(git push -f*)", + "Bash(git * push -f*)", + "Bash(git reset --hard*)", + "Bash(git * reset --hard*)", + "Bash(git clean -fd*)", + "Bash(git * clean -fd*)", + "Bash(git clean -fdx*)", + "Bash(git * clean -fdx*)", + "Bash(git branch -D *)", + "Bash(git * branch -D *)", + "Bash(git checkout -- *)", + "Bash(git * checkout -- *)", + "Bash(git restore .*)", + "Bash(git * restore .*)", + "Bash(git commit --no-verify*)", + "Bash(git * commit --no-verify*)", + "Bash(git merge --no-ff*)", + "Bash(git * merge --no-ff*)", + "Bash(psql * -c DROP*)", + "Bash(psql * DROP DATABASE*)", + "Bash(psql * TRUNCATE*)", + "Bash(alembic downgrade base*)" + ] + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..788efb1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +.pql/changelog/*.sql merge=union diff --git a/.gitignore b/.gitignore index 6b8e426..fc43e7d 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,12 @@ Thumbs.db # profiling data .prof + +# Claude Code local settings (machine-specific, may contain credentials) +.claude/settings.local.json + +# pql — ignore everything except the changelog, which is the replication log of +# record and must be committed for tickets to travel with the repo. +.pql/* +!.pql/changelog/ + diff --git a/governance/README.md b/governance/README.md new file mode 100644 index 0000000..0945720 --- /dev/null +++ b/governance/README.md @@ -0,0 +1,54 @@ +# Decisions, Questions, Rejected + +This directory holds structured planning records that pql parses +into pql.db. Each record is a `### [DQR]-N: Title` heading inside +a markdown file. Files live in three per-type subdirectories: + +- `decisions/.md` — confirmed design decisions +- `questions/.md` — open questions that may resolve into + decisions or rejected proposals +- `rejected/.md` — rejected proposals (kept for the audit + trail) + +The parser infers domain from the filename stem and record type +from the parent subdirectory. + +D-records that propose implementation work link to `initiative`-type +tickets via `decision_ref`. Run `pql decisions show +--with-tickets` to inspect implementation status. + +## Recommended domains + +Start with this canonical set; create files as records land in +each domain: + +- **architecture** — structural commitments (storage, layering, + languages, libraries) +- **process** — team workflow (commits, branches, releases, reviews) +- **design** — user-facing surface (UX, UI, public APIs) +- **coding-conventions** — team-internal code shape (style, lint, + file layout) +- **testing** — quality strategy (coverage, layers, gates) + +You might also want, project-permitting: + +- `accessibility` — if you ship user-facing software +- `security` — if you handle user data or network surfaces +- `licensing` — if you release open-source or commercial +- `documentation` — if user-docs are non-trivial +- `deployment` — if shipping is non-trivial +- `performance` — if you have perf budgets / SLOs + + + +## Decisions + +- _(none)_ + +## Open questions + +- _(none)_ + +## Rejected + +- _(none)_