Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
a2bfca1
Showcase of functionality
Esturban Oct 15, 2024
5b83d3e
Example - Showcase
Esturban Oct 15, 2024
318b466
Renaming Examples
Esturban Oct 15, 2024
b309766
Requirements
Esturban Oct 15, 2024
c548542
Including
Esturban Oct 15, 2024
e8a48b2
Modularize to single resource
Esturban Oct 16, 2024
d16f83e
Dataset Resource
Esturban Oct 16, 2024
0525006
Download File
Esturban Oct 16, 2024
c831fd1
Get Dataset Resources
Esturban Oct 16, 2024
bcb2c75
Example update
Esturban Oct 16, 2024
765b39e
Examples Update
Esturban Oct 16, 2024
de161f5
Moving Default Runtime Script
Esturban Oct 16, 2024
c7c6910
Tests Functions
Esturban Oct 16, 2024
c3cd605
Dev Container
Esturban Oct 16, 2024
7f25426
Allow JSON
Esturban Oct 16, 2024
104bc92
Test Container
Esturban Oct 16, 2024
1a150d0
SSL + Publishing
Esturban Oct 16, 2024
f62c081
Update versioning
Esturban Oct 16, 2024
e7c0b95
Encoding
Esturban Oct 23, 2024
661621a
Version Fallback
Esturban Oct 23, 2024
8f26f0f
Headers and Extensions
Esturban Oct 23, 2024
cdf771e
Parallel Resources
Esturban Oct 23, 2024
27449c9
Ignore Environments
Esturban Oct 24, 2024
d6fab76
SSL Adapter
Esturban Oct 24, 2024
7d3c438
Downloading Blank
Esturban Oct 24, 2024
0c49e3b
Disambiguating String
Esturban Oct 24, 2024
077ac80
Container Dependencies
Esturban Oct 29, 2024
ffc88c7
Pytest
Esturban Oct 29, 2024
94523ec
Examples
Esturban Oct 29, 2024
94faf01
Environment
Esturban Oct 29, 2024
f2925f9
JSON
Esturban Oct 29, 2024
d18fb35
Merge pull request #5 from Esturban/dev
Esturban Oct 29, 2024
97c4c62
Container Reorder
Esturban Oct 29, 2024
0a270bb
Adding Progress
Esturban Oct 29, 2024
ce14e3d
Update Example
Esturban Oct 29, 2024
3173774
Update README
Esturban Oct 29, 2024
a20fc4c
Merge pull request #6 from Esturban/dev
Esturban Oct 29, 2024
1e84d78
Collect Missing
Esturban Nov 10, 2024
e323131
Statistics per Download
Esturban Nov 10, 2024
3a5bceb
Retry
Esturban Nov 10, 2024
bc95670
README + Scope
Esturban May 25, 2025
513e0a0
Trigger GitHub Action
Esturban May 25, 2025
0d41479
Merge pull request #7 from Esturban/dev
Esturban May 25, 2025
f016dad
Clear Cache Runners
Esturban May 25, 2025
1dd501f
Clear Cache Runners
Esturban May 25, 2025
e19923a
Merge pull request #8 from Esturban/dev
Esturban May 25, 2025
c89133d
Persist
Esturban May 25, 2025
a98e16e
Update Sigstore
Esturban May 25, 2025
644a8f1
Semantic Versioning Scheme
Esturban May 25, 2025
69213ab
Merge pull request #9 from Esturban/dev
Esturban May 25, 2025
1ad651b
fix: organizations api
Esturban Sep 2, 2025
cb0ccc4
lint: clean up of examples
Esturban Sep 23, 2025
410844d
examples: workbooks that could run based on the API
Esturban Sep 23, 2025
b513f25
lint: clean up of the modules
Esturban Sep 23, 2025
75126e0
lint: black clean up of format and structure
Esturban Sep 23, 2025
3e66d17
feat: functionality for cli and in notebook
Esturban Sep 23, 2025
f768b8c
tests: integration of tests
Esturban Sep 23, 2025
a276dc0
cleanup: removing cache files from the environment
Esturban Sep 23, 2025
034d9cc
examples: simple examples that enable the cli
Esturban Sep 23, 2025
54c03bd
Merge pull request #10 from Esturban/001-create-an-extensible
Esturban Sep 23, 2025
4243b84
Merge pull request #11 from Esturban/dev
Esturban Sep 23, 2025
d70b0a7
Implement canonical resource-level batch orchestration
Esturban Mar 11, 2026
8506cf0
Add CI matrix and tighten package build metadata
Esturban Mar 11, 2026
8226656
chore(ci): add GitHub Actions + CODEOWNERS + PR template
Esturban Jun 26, 2026
a3ab6c1
feat: add CLI/notebook release notes, docs, specs and env/api check s…
Esturban Jul 9, 2026
c9991c3
chore(harness): mint AGENTS.md organs, init OpenWolf + CodeGraph
Esturban Jul 9, 2026
3a7fa78
fix(ci): resolve ruff lint errors (43 -> 3 remaining, notebook-cell o…
Esturban Jul 9, 2026
f86e244
fix(ci): split remaining if/print one-liners in example notebooks (E701)
Esturban Jul 9, 2026
7fd82ee
fix(ci): scope pytest discovery to open_ksa/tests
Esturban Jul 9, 2026
73fb033
chore: gitignore hygiene for AI scaffolding/IDE files + remove spec-k…
Esturban Jul 15, 2026
537dd00
fix(ci): gate TestPyPI publish on tags + harden release script
Esturban Jul 15, 2026
20b09d6
chore: remove commented-out debug print
Esturban Jul 18, 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
2 changes: 2 additions & 0 deletions .agent-config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
tracked = ["claude"]
local_only = ["codegraph"]
15 changes: 15 additions & 0 deletions .claude/rules/openwolf.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
description: OpenWolf protocol enforcement — active on all files
globs: **/*
---

- Check .wolf/anatomy.md before reading any project file
- Check .wolf/cerebrum.md Do-Not-Repeat list before generating code
- After writing or editing files, update .wolf/anatomy.md and append to .wolf/memory.md
- After receiving a user correction, update .wolf/cerebrum.md immediately (Preferences, Learnings, or Do-Not-Repeat)
- LEARN from every interaction: if you discover a convention, user preference, or project pattern, add it to .wolf/cerebrum.md. Low threshold — when in doubt, log it.
- BEFORE fixing any bug or error: read .wolf/buglog.json for known fixes
- AFTER fixing any bug, error, failed test, failed build, or user-reported problem: ALWAYS log to .wolf/buglog.json with error_message, root_cause, fix, and tags
- If you edit a file more than twice in a session, that likely indicates a bug — log it to .wolf/buglog.json
- When the user asks to check/evaluate UI design: run `openwolf designqc` to capture screenshots, then read them from .wolf/designqc-captures/
- When the user asks to change/pick/migrate UI framework: read .wolf/reframe-frameworks.md, ask decision questions, recommend a framework, then execute with the framework's prompt
17 changes: 17 additions & 0 deletions .devcontainer/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
.git
node_modules
__pycache__
*.pyc
*.log
venv
.code-workspace
.egg-info
dist
*.csv
opendata
data
dist/*
opendata/*
*/opendata/*
*venv**
venv/*
15 changes: 15 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Stage 1: Build stage
FROM python:3.12.1-alpine AS build
RUN apk add --no-cache git build-base
WORKDIR /workspaces
# Copy the requirements.txt file and install dependencies
COPY requirements.txt /workspaces/
COPY examples/ open_ksa/ pyproject.toml .devcontainer/ .github/ /workspaces/

# Stage 2: Final stage
FROM python:3.12.1-alpine
RUN apk add --no-cache git
WORKDIR /workspaces
COPY --from=build /workspaces /workspaces
RUN pip install --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
14 changes: 14 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "Open KSA Package",
"dockerFile": "Dockerfile",
"context": "..",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"extensions": [
"ms-python.python",
"ms-vscode-remote.remote-containers"
],
"remoteUser": "root"

}
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# All files — Esturban reviews every PR
* @Esturban
14 changes: 14 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## What

<!-- one sentence: what does this change -->

## Why

<!-- what problem or goal drives it -->

## Checklist

- [ ] Tests pass locally (`pytest -q` / `shellcheck` / `R CMD check`)
- [ ] No secrets or credentials committed
- [ ] Commit messages follow `type(scope): description`
- [ ] Ready for Esturban review
39 changes: 39 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: CI

on:
pull_request:
branches: [dev, master, main]
push:
branches: [dev]

jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: pip

- name: Install dependencies
run: |
pip install --upgrade pip
if [ -f pyproject.toml ]; then
pip install -e ".[dev]" 2>/dev/null || pip install -e ".[test]" 2>/dev/null || pip install -e . 2>/dev/null || true
fi
if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
pip install ruff pytest 2>/dev/null || true

- name: Lint
run: ruff check .

- name: Test
run: |
if find . -name "test_*.py" -o -name "*_test.py" | grep -q .; then
pytest --tb=short -q
else
echo "No tests found — skipping (add tests to enforce this step)"
fi
76 changes: 76 additions & 0 deletions .github/workflows/dev-to-trunk.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Dev to Trunk Auto-PR

# Opens (or refreshes) a PR from `dev` into this repo's trunk (default) branch on
# every push to `dev`, requesting the repo owner (Esturban) as reviewer.
#
# EV's hard rule: a PR is ONLY ever opened by this Action -- never by a human or
# agent running `gh pr create`. Push `dev` -> this Action opens the PR -> EV reviews.
#
# Idempotent + no-diff safe: if an open dev -> trunk PR already exists it is refreshed
# (reviewer re-requested), not duplicated; if `dev` has no commits ahead of trunk the
# run exits cleanly and fires again on the next push.

on:
push:
branches: [dev]

permissions:
contents: read
pull-requests: write

jobs:
open-pr:
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TRUNK: ${{ github.event.repository.default_branch }}
steps:
- name: Checkout (full history for trunk..dev diff)
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Open or refresh dev -> trunk PR
run: |
set -euo pipefail

# Hardcoded, not ${GITHUB_REPOSITORY_OWNER}: that resolves to the org
# name on org-owned repos (e.g. EV-Advisory), which isn't a valid PR
# reviewer/assignee target -- both calls silently no-op with `|| true`
# swallowing the error, so the Action reports success while doing nothing.
OWNER="Esturban"
echo "dev -> ${TRUNK} (reviewer: ${OWNER})"

# No commits on dev ahead of trunk -> nothing to PR (fires again next push).
if [ -z "$(git rev-list "origin/${TRUNK}..HEAD" 2>/dev/null || true)" ]; then
echo "No commits on dev ahead of ${TRUNK}; nothing to PR."
exit 0
fi

# Idempotency: refresh the existing open PR instead of opening a duplicate.
EXISTING="$(gh pr list --head dev --base "${TRUNK}" --state open --json number --jq '.[0].number // empty')"
if [ -n "${EXISTING}" ]; then
echo "PR #${EXISTING} already open for dev -> ${TRUNK}; re-requesting reviewer."
gh pr edit "${EXISTING}" --add-reviewer "${OWNER}" 2>/dev/null \
|| gh pr edit "${EXISTING}" --add-assignee "${OWNER}" 2>/dev/null || true
exit 0
fi

TITLE="$(git log -1 --pretty=format:%s HEAD)"
[ -n "${TITLE}" ] || TITLE="dev -> ${TRUNK}"
BODY="Auto-opened by the \`Dev to Trunk Auto-PR\` action on push to \`dev\` (base: \`${TRUNK}\`). ${OWNER} requested as reviewer."

# The owner cannot always be a reviewer; fall back to assignee but never
# double-create: if the reviewer call already created the PR, just edit it.
if gh pr create --base "${TRUNK}" --head dev --title "${TITLE}" --body "${BODY}" --reviewer "${OWNER}"; then
echo "PR created with ${OWNER} as reviewer."
else
NUM="$(gh pr list --head dev --base "${TRUNK}" --state open --json number --jq '.[0].number // empty')"
if [ -n "${NUM}" ]; then
echo "PR #${NUM} exists; adding ${OWNER} as assignee."
gh pr edit "${NUM}" --add-assignee "${OWNER}" 2>/dev/null || true
else
echo "Reviewer path failed and no PR exists; creating with assignee."
gh pr create --base "${TRUNK}" --head dev --title "${TITLE}" --body "${BODY}" --assignee "${OWNER}"
fi
fi
14 changes: 8 additions & 6 deletions .github/workflows/publish-to-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ jobs:

steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@v5
with:
Expand All @@ -26,15 +28,15 @@ jobs:
publish-to-pypi:
name: >-
Publish Python 🐍 distribution 📦 to PyPI
if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes
if: startsWith(github.ref, 'refs/tags/')
needs:
- build
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/open_ksa
permissions:
id-token: write # IMPORTANT: mandatory for trusted publishing
id-token: write

steps:
- name: Download all the dists
Expand All @@ -54,8 +56,8 @@ jobs:
runs-on: ubuntu-latest

permissions:
contents: write # IMPORTANT: mandatory for making GitHub Releases
id-token: write # IMPORTANT: mandatory for sigstore
contents: write
id-token: write

steps:
- name: Download all the dists
Expand All @@ -64,7 +66,7 @@ jobs:
name: python-package-distributions
path: dist/
- name: Sign the dists with Sigstore
uses: sigstore/gh-action-sigstore-python@v2.1.1
uses: sigstore/gh-action-sigstore-python@v3.0.0
with:
inputs: >-
./dist/*.tar.gz
Expand All @@ -87,9 +89,9 @@ jobs:
gh release upload
'${{ github.ref_name }}' dist/**
--repo '${{ github.repository }}'

publish-to-testpypi:
name: Publish Python 🐍 distribution 📦 to TestPyPI
if: startsWith(github.ref, 'refs/tags/')
needs:
- build
runs-on: ubuntu-latest
Expand Down
33 changes: 33 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Release

on:
push:
branches: [master, main]

permissions:
contents: write

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Create release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
# Use existing tag on this commit, or generate a date-based one
TAG=$(git tag --points-at HEAD | head -1)
if [ -z "$TAG" ]; then
TAG="v$(date -u +%Y.%m.%d)-$(git rev-parse --short HEAD)"
git tag "$TAG"
git push origin "$TAG"
fi
gh release create "$TAG" \
--generate-notes \
--title "$TAG" \
--target "$(git rev-parse HEAD)"
31 changes: 30 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ share/python-wheels/
.installed.cfg
*.egg
MANIFEST
src/

# PyInstaller
# Usually these files are written by a python script from a template
Expand Down Expand Up @@ -97,6 +98,7 @@ celerybeat-schedule
# Environments
.env
.venv
venv**
env/
venv/
ENV/
Expand Down Expand Up @@ -152,4 +154,31 @@ opendata

# Data types
*.csv
*.json
*.json
.specify
.cursor
.ruff_cache
.pytest_cache
.mypy_cache
.pytype
.pyre
.vscode
.DS_Store
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.codegraph/

# AI scaffolding / IDE (never public)
CLAUDE.md
AGENTS.md
GEMINI.md
.wolf/
.cursorrules
.clinerules
.windsurfrules
.roo*
memory-bank/
.github/copilot-instructions.md
Loading
Loading