Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
d98f59f
chore(beads): init
cameronraysmith Jan 19, 2026
0c97d2e
chore(issues): seed beads graph with workstream epics and tasks
cameronraysmith Jan 19, 2026
53040d0
chore(issues): add dependency chains and clarify bootstrap.sh stability
cameronraysmith Jan 19, 2026
e2d13ee
chore(gitignore): add bv
cameronraysmith Jan 28, 2026
52913d3
chore(gitignore): allow markdown files in docs/ directory
cameronraysmith Jan 28, 2026
c9db3e2
docs(architecture): add crane + uv2nix + maturin integration design
cameronraysmith Jan 28, 2026
5a7671e
chore(issues): update pnt-btz epic with architecture reference
cameronraysmith Jan 28, 2026
65a2fc4
chore(issues): mark pnt-4jg.1 in_progress
cameronraysmith Feb 2, 2026
25f94ac
refactor(pyproject): remove uv workspace coordination
cameronraysmith Feb 2, 2026
a899131
refactor(uv): remove root workspace lock file
cameronraysmith Feb 2, 2026
4d80903
build(pnt-functional): add independent uv lock file
cameronraysmith Feb 2, 2026
593f820
build(python-nix-template): add independent uv lock file
cameronraysmith Feb 2, 2026
a7a81d8
refactor(nix): load packages independently via per-package workspaces
cameronraysmith Feb 2, 2026
83a19d8
refactor(nix): merge federated workspace deps in packages module
cameronraysmith Feb 2, 2026
e5e4ccc
refactor(nix): merge federated workspace deps in devshell module
cameronraysmith Feb 2, 2026
a8a823f
refactor(nix): merge federated workspace deps in containers module
cameronraysmith Feb 2, 2026
48d5a66
chore(issues): close pnt-4jg.1
cameronraysmith Feb 2, 2026
ce19a17
docs(issues): update pnt-dre.4 with per-package CI matrix concern pos…
cameronraysmith Feb 2, 2026
d0cab2a
fix(ci): update lock file references for per-package federation
cameronraysmith Feb 2, 2026
7b3e7ae
fixup! refactor(nix): merge federated workspace deps in packages module
cameronraysmith Feb 2, 2026
36eb8a7
fixup! refactor(nix): load packages independently via per-package wor…
cameronraysmith Feb 2, 2026
774ec26
fixup! refactor(nix): load packages independently via per-package wor…
cameronraysmith Feb 2, 2026
1e1a9b2
chore(issues): add review fixup context to pnt-4jg.1, update pnt-dre.…
cameronraysmith Feb 2, 2026
f488768
feat(pixi): add feature tasks to python-nix-template package
cameronraysmith Feb 2, 2026
7be5c4b
fix(justfile): delegate conda recipes to pixi task names
cameronraysmith Feb 2, 2026
22e4ea9
fix(pixi): move build channels to backend.channels in pnt-functional
cameronraysmith Feb 2, 2026
da55cb6
fix(pixi): move build channels to backend.channels in python-nix-temp…
cameronraysmith Feb 2, 2026
1ebaa3e
chore(pixi): regenerate pnt-functional lock after build config change
cameronraysmith Feb 2, 2026
09be341
chore(pixi): regenerate python-nix-template lock after build config c…
cameronraysmith Feb 2, 2026
cd33dcc
chore(issues): close pnt-4jg.2, pixi feature composition verified
cameronraysmith Feb 2, 2026
0ed1614
docs(architecture): document package distribution channels
cameronraysmith Feb 2, 2026
5a170b6
chore(issues): close pnt-4jg.3 and pnt-4jg epic, dependency migration…
cameronraysmith Feb 2, 2026
bfb8fb8
feat(makefile): add verify, setup-user, and check-secrets targets
cameronraysmith Feb 2, 2026
e25e120
chore(issues): close pnt-dre.1, Makefile bootstrap-only aligned
cameronraysmith Feb 2, 2026
3bc2bec
refactor(justfile): align group naming and structure with conventions
cameronraysmith Feb 2, 2026
664c9cf
chore(issues): close pnt-dre.2, justfile groups aligned
cameronraysmith Feb 2, 2026
4ac6a6b
feat(scripts): add self-contained bootstrap script for curl one-liner
cameronraysmith Feb 2, 2026
2056806
feat(scripts): extract maximize-build-space script for CI runners
cameronraysmith Feb 2, 2026
08bb2a9
chore(issues): close pnt-dre.3, scripts directory reorganized
cameronraysmith Feb 2, 2026
44abfe5
feat(ci): add cached-ci-job composite action
cameronraysmith Feb 2, 2026
900235a
feat(justfile): add per-package CI recipes for local/CI symmetry
cameronraysmith Feb 2, 2026
ed1e365
refactor(ci): rewrite python-test workflow to use nix develop
cameronraysmith Feb 2, 2026
aeb3451
refactor(ci): add cached-ci-job, dynamic package discovery, force_run
cameronraysmith Feb 2, 2026
99086e8
chore(issues): close pnt-dre.4, cached-ci-job and CI redesign complete
cameronraysmith Feb 2, 2026
f9abbf5
fix(ci): update template workflow path filters for per-package locks
cameronraysmith Feb 2, 2026
c45dd26
chore(issues): close pnt-dre.5 and pnt-dre epic, infrastructure align…
cameronraysmith Feb 2, 2026
73cfc63
feat(issues): add setup-nix and nix2container migration tasks
cameronraysmith Feb 3, 2026
e91dbad
chore: add Rust target/ to gitignore
cameronraysmith Feb 3, 2026
b33f576
feat(pnt-cli): add pyproject.toml with maturin build backend
cameronraysmith Feb 3, 2026
a3e79c3
feat(pnt-cli): add Python wrapper, type stubs, and tests for native m…
cameronraysmith Feb 3, 2026
01ebe5f
chore(issues): close pnt-btz.1, pnt-cli package scaffold complete
cameronraysmith Feb 3, 2026
271aacf
chore(pnt-cli): generate uv.lock for federated package resolution
cameronraysmith Feb 3, 2026
cf9f983
feat(nix): add crane input for Rust build integration
cameronraysmith Feb 3, 2026
073fe08
feat(pnt-cli): add crane configuration for Rust extension crates
cameronraysmith Feb 3, 2026
165d635
feat(pnt-cli): add Python + Rust composition overlay and checks
cameronraysmith Feb 3, 2026
0f15b27
feat(nix): compose pnt-cli uv2nix and crane overlays in python module
cameronraysmith Feb 3, 2026
4ec289f
feat(nix): add Rust tooling to devshell
cameronraysmith Feb 3, 2026
64a88f8
fix(nix): remove deprecated darwin.apple_sdk framework references
cameronraysmith Feb 3, 2026
0ee302f
fix(pnt-cli): configure cargo vendored deps for offline maturin builds
cameronraysmith Feb 3, 2026
525f210
fix(pnt-cli): use crane's vendor config.toml for source replacement
cameronraysmith Feb 3, 2026
82a9b37
fix(pnt-cli): disable readme field to avoid maturin build failure
cameronraysmith Feb 3, 2026
f3ae6d9
fix(pnt-cli): remove readme field from pyproject.toml
cameronraysmith Feb 3, 2026
e399fd5
fix(pnt-cli): remove CARGO_TARGET_DIR override for writable maturin b…
cameronraysmith Feb 3, 2026
8d8a814
fix(pnt-cli): set pymodule name to _native for correct PyInit export
cameronraysmith Feb 3, 2026
875a6dc
chore(issues): close pnt-btz.2, crane + uv2nix Nix modules complete
cameronraysmith Feb 3, 2026
1b7b12e
feat(ci): add Rust justfile recipes, update CI filters and hash-sources
cameronraysmith Feb 3, 2026
301226c
chore(issues): close pnt-btz.3 and pnt-btz epic, pyo3 integration com…
cameronraysmith Feb 3, 2026
d968bed
docs(architecture): add resolved decisions from pnt-btz implementation
cameronraysmith Feb 3, 2026
0945ada
feat(ci): add setup-nix composite action with nothing-but-nix pattern
cameronraysmith Feb 3, 2026
a594732
refactor(ci): use setup-nix action in nixci job
cameronraysmith Feb 3, 2026
5c45f5e
refactor(ci): use setup-nix action in python-test workflow
cameronraysmith Feb 3, 2026
02c9a9f
refactor(ci): use setup-nix action in build-nix-images workflow
cameronraysmith Feb 3, 2026
ec27c9a
refactor(ci): remove redundant Nix setup from build-nix-image action
cameronraysmith Feb 3, 2026
0b1e4fa
refactor(ci): remove maximize-build-space script
cameronraysmith Feb 3, 2026
2bde5fe
chore(issues): close pnt-m3t, setup-nix composite action complete
cameronraysmith Feb 3, 2026
3e50f40
refactor(issues): rescope pnt-5vr to production containers, add block…
cameronraysmith Feb 3, 2026
94621bf
chore(issues): rescope pnt-5vr to production containers, create pnt-m…
cameronraysmith Feb 3, 2026
b50ac37
feat(nix): replace flocken input with nix2container
cameronraysmith Feb 3, 2026
3bdbe64
chore(gitignore): allow nix/lib/ through Python lib/ exclusion
cameronraysmith Feb 3, 2026
99fe7b8
feat(nix): add crane-based multi-arch manifest builder
cameronraysmith Feb 3, 2026
e18d8d3
feat(pnt-cli): add minimal CLI entrypoint exercising pyo3 bindings
cameronraysmith Feb 3, 2026
8d52b1a
feat(pnt-cli): register console_scripts entrypoint in pyproject.toml
cameronraysmith Feb 3, 2026
e92e1e5
refactor(nix): replace flocken with crane-based manifests, add nix2co…
cameronraysmith Feb 3, 2026
75797f9
refactor(justfile): reorganize container recipes with production support
cameronraysmith Feb 3, 2026
5c13065
refactor(ci): adopt 3-job container workflow with containerMatrix
cameronraysmith Feb 3, 2026
82a74f5
refactor(ci): update PR image build to use containerMatrix workflow
cameronraysmith Feb 3, 2026
876600e
refactor(ci): update release image build to use containerMatrix workflow
cameronraysmith Feb 3, 2026
cd00d86
chore(nix): update flake.lock for nix2container input
cameronraysmith Feb 3, 2026
69594e4
chore(issues): update pnt-5vr checkpoint with implementation status
cameronraysmith Feb 3, 2026
4880793
chore(issues): create pnt-wbq for pkgsCross follow-up discovered from…
cameronraysmith Feb 3, 2026
06edd0a
fix(ci): add packages:write permission to test-release-packages job
cameronraysmith Feb 3, 2026
564d8d5
fix(ci): add discover to manifest job needs for output access
cameronraysmith Feb 3, 2026
9177ece
fix(template): add project table and workspace to root pyproject.toml
cameronraysmith Feb 3, 2026
edea99d
refactor(ci): simplify template.yaml with setup-nix action
cameronraysmith Feb 3, 2026
089d50d
feat(ci): add ci-build-category.sh for matrix builds
cameronraysmith Feb 3, 2026
80ad72e
feat(ci): add justfile recipes for CI matrix, secrets scan, and release
cameronraysmith Feb 3, 2026
c8edf75
refactor(ci): replace omnix with category-based nix matrix architecture
cameronraysmith Feb 3, 2026
adf66e3
refactor(ci): replace standalone tool installs with nix develop in pa…
cameronraysmith Feb 3, 2026
00d4a14
feat(nix): add gitleaks to devshell for local/CI secrets scanning parity
cameronraysmith Feb 3, 2026
ab6f265
fix(ci): use nix develop for secrets-scan to maintain local/CI parity
cameronraysmith Feb 3, 2026
4bc84a3
fix(ci): add packages:write permission to build-pr-images job
cameronraysmith Feb 3, 2026
68dbf33
chore(issues): update pnt-5vr checkpoint with CI refactoring status
cameronraysmith Feb 3, 2026
567df4c
fix(ci): add --no-confirm to Nix installer for non-interactive CI
cameronraysmith Feb 3, 2026
349bff6
fix(ci): replace nix flake check with system-specific validation
cameronraysmith Feb 3, 2026
e6d1404
fix(ci): exclude multi-arch manifest packages from category builds
cameronraysmith Feb 3, 2026
34be403
fix(ci): rename root workspace project to avoid uv name collision
cameronraysmith Feb 3, 2026
22853ee
feat(pnt-cli): add package.json for yarn workspace and semantic-release
cameronraysmith Feb 3, 2026
66b21da
chore: update yarn.lock with pnt-cli workspace entry
cameronraysmith Feb 3, 2026
53e2445
fix(ci): iterate over check attributes in flake-check recipe
cameronraysmith Feb 3, 2026
c760bd1
fix(ci): use main branch for semantic-release dry-run validation
cameronraysmith Feb 3, 2026
223b0cd
chore(issues): close pnt-5vr after CI verification
cameronraysmith Feb 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .beads/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# SQLite databases
*.db
*.db?*
*.db-journal
*.db-wal
*.db-shm

# Daemon runtime files
daemon.lock
daemon.log
daemon.pid
bd.sock
sync-state.json
last-touched

# Local version tracking (prevents upgrade notification spam after git ops)
.local_version

# Legacy database files
db.sqlite
bd.db

# Worktree redirect file (contains relative path to main repo's .beads/)
# Must not be committed as paths would be wrong in other clones
redirect

# Merge artifacts (temporary files from 3-way merge)
beads.base.jsonl
beads.base.meta.json
beads.left.jsonl
beads.left.meta.json
beads.right.jsonl
beads.right.meta.json

# Sync state (local-only, per-machine)
# These files are machine-specific and should not be shared across clones
.sync.lock
sync_base.jsonl

# .beads
README.md
config.yaml

# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
# They would override fork protection in .git/info/exclude, allowing
# contributors to accidentally commit upstream issue databases.
# The JSONL files (issues.jsonl, interactions.jsonl) and config files
# are tracked by git by default since no pattern above ignores them.
Empty file added .beads/interactions.jsonl
Empty file.
18 changes: 18 additions & 0 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions .beads/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"database": "beads.db",
"jsonl_export": "issues.jsonl"
}
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@ flake.lock linguist-generated=true
uv.lock linguist-generated=true
pixi.lock linguist-generated=true
yarn.lock linguist-generated=true

# Use bd merge for beads JSONL files
.beads/issues.jsonl merge=beads
143 changes: 0 additions & 143 deletions .github/actions/build-nix-image/action.yml

This file was deleted.

183 changes: 183 additions & 0 deletions .github/actions/cached-ci-job/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
name: Cached CI Job
description: Execute job only if not already successful for this commit SHA

inputs:
check-name:
description: Full check run name (defaults to github.job, include matrix values for matrix jobs)
required: false
default: ${{ github.job }}
hash-sources:
description: |
Glob patterns for files to hash (one per line or space-separated).
Used to compute content-addressed cache key.
Example: '**/*.nix flake.lock justfile'
The workflow file is automatically included.
required: false
default: ''
force-run:
description: Force execution even if already successful
required: false
default: 'false'

outputs:
should-run:
description: Whether job should execute (true/false)
value: ${{ steps.decide.outputs.should-run }}
cache-source:
description: 'Where cache hit occurred (actions-cache or none)'
value: ${{ steps.decide.outputs.cache-source }}
cache-key:
description: 'Content-addressed cache key'
value: ${{ steps.compute-hash.outputs.cache-key }}
cache-path:
description: 'Cache directory path for job result marker'
value: ${{ steps.compute-hash.outputs.cache-path }}

runs:
using: composite
steps:
- name: Compute content-addressed cache key
id: compute-hash
shell: bash
env:
CHECK_NAME: ${{ inputs.check-name }}
HASH_SOURCES: ${{ inputs.hash-sources }}
run: |
# Sanitize check name
SANITIZED=$(echo "$CHECK_NAME" | tr -d '()' | tr ', ' '-' | tr -s '-')

# Get workflow file path (automatically included in hash)
WORKFLOW_FILE=$(echo "$GITHUB_WORKFLOW_REF" | sed 's|^[^/]*/[^/]*/||' | sed 's|@.*||')
echo "Workflow file: $WORKFLOW_FILE"

# Auto-include the composite action itself
CACHE_ACTION=".github/actions/cached-ci-job/action.yaml"

# Combine user sources + workflow file + cache action
if [ -n "$HASH_SOURCES" ]; then
ALL_SOURCES="$HASH_SOURCES $WORKFLOW_FILE $CACHE_ACTION"
else
ALL_SOURCES="$WORKFLOW_FILE $CACHE_ACTION"
fi

echo "Hash sources: $ALL_SOURCES"

# Compute content hash of all source files
# Disable glob expansion to preserve patterns for manual processing
set -f
CONTENT_HASH=""
for pattern in $ALL_SOURCES; do
if [ -f "$pattern" ]; then
case "$pattern" in
docs/notes/*)
continue
;;
esac
FILE_HASH=$(git hash-object "$pattern" 2>/dev/null || echo "missing")
CONTENT_HASH="${CONTENT_HASH}${FILE_HASH}"
elif [[ "$pattern" == *"*"* ]]; then
if [[ "$pattern" == *"/"* ]]; then
BASE_DIR="${pattern%%/**}"
FILE_PATTERN="${pattern##*/}"
else
BASE_DIR="."
FILE_PATTERN="$pattern"
fi

if [[ "$pattern" == "**/"* ]]; then
BASE_DIR="."
FILE_PATTERN="${pattern#**/}"
fi

if [ -d "$BASE_DIR" ]; then
while IFS= read -r file; do
case "$file" in
docs/notes/*)
continue
;;
esac
FILE_HASH=$(git hash-object "$file" 2>/dev/null || echo "missing")
CONTENT_HASH="${CONTENT_HASH}${FILE_HASH}"
done < <(find "$BASE_DIR" -type f -name "$FILE_PATTERN" 2>/dev/null | sort)
else
echo "::warning::Pattern base directory not found: $BASE_DIR (pattern: $pattern)"
fi
else
echo "::warning::Source file not found: $pattern"
fi
done
set +f

FINAL_HASH=$(echo -n "$CONTENT_HASH" | sha256sum | cut -c1-12)
CACHE_KEY="job-result-${SANITIZED}-${FINAL_HASH}"
CACHE_PATH=".cache/job-results/${SANITIZED}"

echo "Content hash: $FINAL_HASH"
echo "Cache key: $CACHE_KEY"
echo "Cache path: $CACHE_PATH"

echo "cache-key=$CACHE_KEY" >> $GITHUB_OUTPUT
echo "cache-path=$CACHE_PATH" >> $GITHUB_OUTPUT
echo "content-hash=$FINAL_HASH" >> $GITHUB_OUTPUT

- name: Prepare cache restore keys
id: cache-result
shell: bash
env:
CHECK_NAME: ${{ inputs.check-name }}
run: |
SANITIZED=$(echo "$CHECK_NAME" | tr -d '()' | tr ', ' '-' | tr -s '-')
RESTORE_KEYS="job-result-${SANITIZED}-"
echo "Restore keys pattern: ${RESTORE_KEYS}*"
echo "restore-keys=$RESTORE_KEYS" >> $GITHUB_OUTPUT

- name: Lookup job result in actions/cache
id: cache-lookup
uses: actions/cache/restore@9255dc7a253b0ccc959486e2bca901246202afeb # v5
with:
path: ${{ steps.compute-hash.outputs.cache-path }}
key: ${{ steps.compute-hash.outputs.cache-key }}
restore-keys: ${{ steps.cache-result.outputs.restore-keys }}
lookup-only: true

- name: Make execution decision
id: decide
shell: bash
env:
FORCE: ${{ inputs.force-run }}
CACHE_HIT: ${{ steps.cache-lookup.outputs.cache-hit || 'false' }}
CACHE_KEY: ${{ steps.compute-hash.outputs.cache-key }}
CHECK_NAME: ${{ inputs.check-name }}
run: |
echo "=== Execution Decision ==="
echo "Force run: $FORCE"
echo "Cache key: $CACHE_KEY"
echo "Actions cache hit: $CACHE_HIT"
echo ""

SANITIZED_NAME=$(echo "$CHECK_NAME" | tr -d '()' | tr ', ' '-' | tr -s '-')

if [ "$FORCE" = "true" ]; then
echo "should-run=true" >> $GITHUB_OUTPUT
if [ "$CACHE_HIT" = "true" ]; then
echo "cache-source=actions-cache" >> $GITHUB_OUTPUT
else
echo "cache-source=none" >> $GITHUB_OUTPUT
fi
echo "::notice title=CI Cache | ${SANITIZED_NAME}::RUN | ${CACHE_KEY} | Forced"
echo "Decision: RUN (forced by input)"
exit 0
fi

if [ "$CACHE_HIT" = "true" ]; then
echo "should-run=false" >> $GITHUB_OUTPUT
echo "cache-source=actions-cache" >> $GITHUB_OUTPUT
echo "::notice title=CI Cache | ${SANITIZED_NAME}::SKIP | ${CACHE_KEY} | Cached"
echo "Decision: SKIP (cached result found)"
exit 0
fi

echo "should-run=true" >> $GITHUB_OUTPUT
echo "cache-source=none" >> $GITHUB_OUTPUT
echo "::notice title=CI Cache | ${SANITIZED_NAME}::RUN | ${CACHE_KEY} | Cache miss"
echo "Decision: RUN (no cached result found)"
Loading
Loading