artoo-artifacts 0.1.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.
- artoo_artifacts-0.1.0/.github/workflows/ci.yml +21 -0
- artoo_artifacts-0.1.0/.github/workflows/publish.yml +34 -0
- artoo_artifacts-0.1.0/.gitignore +17 -0
- artoo_artifacts-0.1.0/.somm/calls.sqlite +0 -0
- artoo_artifacts-0.1.0/.somm/service_token +1 -0
- artoo_artifacts-0.1.0/CHANGELOG.md +36 -0
- artoo_artifacts-0.1.0/CONTRIBUTING.md +36 -0
- artoo_artifacts-0.1.0/DESIGN.md +249 -0
- artoo_artifacts-0.1.0/LICENSE +21 -0
- artoo_artifacts-0.1.0/PKG-INFO +106 -0
- artoo_artifacts-0.1.0/README.md +83 -0
- artoo_artifacts-0.1.0/RELEASING.md +25 -0
- artoo_artifacts-0.1.0/docs/.nojekyll +0 -0
- artoo_artifacts-0.1.0/docs/index.html +103 -0
- artoo_artifacts-0.1.0/docs/lib/artoo-kit/article.css +170 -0
- artoo_artifacts-0.1.0/docs/lib/artoo-kit/base.css +147 -0
- artoo_artifacts-0.1.0/docs/lib/artoo-kit/components.css +237 -0
- artoo_artifacts-0.1.0/docs/lib/artoo-kit/kit.js +49 -0
- artoo_artifacts-0.1.0/docs/lib/artoo-kit/tokens.css +142 -0
- artoo_artifacts-0.1.0/pyproject.toml +66 -0
- artoo_artifacts-0.1.0/site/landing/artifact.toml +22 -0
- artoo_artifacts-0.1.0/site/landing/site/index.html +103 -0
- artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/article.css +170 -0
- artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/base.css +147 -0
- artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/components.css +237 -0
- artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/kit.js +49 -0
- artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/tokens.css +142 -0
- artoo_artifacts-0.1.0/src/artoo/__init__.py +8 -0
- artoo_artifacts-0.1.0/src/artoo/build.py +47 -0
- artoo_artifacts-0.1.0/src/artoo/cli.py +274 -0
- artoo_artifacts-0.1.0/src/artoo/deploy/__init__.py +46 -0
- artoo_artifacts-0.1.0/src/artoo/deploy/base.py +45 -0
- artoo_artifacts-0.1.0/src/artoo/deploy/command.py +53 -0
- artoo_artifacts-0.1.0/src/artoo/deploy/github_pages.py +328 -0
- artoo_artifacts-0.1.0/src/artoo/deploy/rsync.py +116 -0
- artoo_artifacts-0.1.0/src/artoo/discover.py +67 -0
- artoo_artifacts-0.1.0/src/artoo/firewall.py +92 -0
- artoo_artifacts-0.1.0/src/artoo/generators/__init__.py +33 -0
- artoo_artifacts-0.1.0/src/artoo/generators/explainer/__init__.py +362 -0
- artoo_artifacts-0.1.0/src/artoo/generators/explainer/inventory.py +245 -0
- artoo_artifacts-0.1.0/src/artoo/generators/explainer/prompts.py +141 -0
- artoo_artifacts-0.1.0/src/artoo/generators/explainer/templates.py +81 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/__init__.py +143 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/kit/__init__.py +19 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/article.css +170 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/base.css +147 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/components.css +237 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/kit.js +49 -0
- artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/tokens.css +142 -0
- artoo_artifacts-0.1.0/src/artoo/manifest.py +228 -0
- artoo_artifacts-0.1.0/src/artoo/research.py +118 -0
- artoo_artifacts-0.1.0/src/artoo/scaffold.py +104 -0
- artoo_artifacts-0.1.0/src/artoo/workers.py +143 -0
- artoo_artifacts-0.1.0/tests/conftest.py +78 -0
- artoo_artifacts-0.1.0/tests/test_build.py +28 -0
- artoo_artifacts-0.1.0/tests/test_cli.py +68 -0
- artoo_artifacts-0.1.0/tests/test_deploy_command.py +39 -0
- artoo_artifacts-0.1.0/tests/test_deploy_github_pages.py +101 -0
- artoo_artifacts-0.1.0/tests/test_deploy_rsync.py +54 -0
- artoo_artifacts-0.1.0/tests/test_discover.py +38 -0
- artoo_artifacts-0.1.0/tests/test_explainer.py +62 -0
- artoo_artifacts-0.1.0/tests/test_firewall.py +50 -0
- artoo_artifacts-0.1.0/tests/test_inventory.py +47 -0
- artoo_artifacts-0.1.0/tests/test_libraries.py +54 -0
- artoo_artifacts-0.1.0/tests/test_manifest.py +74 -0
- artoo_artifacts-0.1.0/tests/test_workers.py +53 -0
- artoo_artifacts-0.1.0/uv.lock +124 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
strategy:
|
|
12
|
+
matrix:
|
|
13
|
+
python-version: ["3.12", "3.13"]
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: astral-sh/setup-uv@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: ${{ matrix.python-version }}
|
|
19
|
+
- run: uv sync
|
|
20
|
+
- run: uv run ruff check src tests --output-format=github
|
|
21
|
+
- run: uv run pytest -q
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Publishes artoo to PyPI via trusted publishing (OIDC — no stored tokens).
|
|
2
|
+
#
|
|
3
|
+
# PREREQUISITE (one-time): register a pending publisher on PyPI →
|
|
4
|
+
# Account settings → Publishing, with project "artoo-artifacts", owner
|
|
5
|
+
# "lavallee", repo "artoo", workflow "publish.yml", environment
|
|
6
|
+
# "pypi-artoo-artifacts". The GitHub environment is created
|
|
7
|
+
# automatically on first workflow run.
|
|
8
|
+
name: Publish to PyPI
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
release:
|
|
12
|
+
types: [published]
|
|
13
|
+
workflow_dispatch: {}
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
publish:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
environment:
|
|
19
|
+
name: pypi-artoo-artifacts
|
|
20
|
+
url: https://pypi.org/p/artoo-artifacts
|
|
21
|
+
permissions:
|
|
22
|
+
id-token: write
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
- name: Install uv
|
|
26
|
+
uses: astral-sh/setup-uv@v5
|
|
27
|
+
- name: Build
|
|
28
|
+
run: uv build
|
|
29
|
+
- name: Publish to PyPI
|
|
30
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
31
|
+
with:
|
|
32
|
+
# Idempotent re-runs: a version already on PyPI is skipped, not an
|
|
33
|
+
# error — needed when a partial publish is completed by re-dispatch.
|
|
34
|
+
skip-existing: true
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VTocK3HQdI6c9erJZyS_-LZwCyGZJtCdvZ8pOgxGY1s
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to artoo are documented here. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
|
|
5
|
+
[Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [0.1.0] — 2026-07-10
|
|
8
|
+
|
|
9
|
+
Published on PyPI as **`artoo-artifacts`** — the bare `artoo` name is
|
|
10
|
+
blocked by a confusable-name collision with the abandoned `ar_too`
|
|
11
|
+
project. The import package and the command are `artoo` either way.
|
|
12
|
+
|
|
13
|
+
First public release. Proven end-to-end on day one: the explainer
|
|
14
|
+
generator ran against the public [somm](https://github.com/lavallee/somm)
|
|
15
|
+
repo (55k LOC → 15 analysis briefs → 6 pages) and published to GitHub
|
|
16
|
+
Pages through the github-pages adapter.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Artifact model: `artifact.toml` manifest, `site/` publishable root,
|
|
21
|
+
research backing behind a deny-by-default deploy firewall.
|
|
22
|
+
- CLI: `init`, `list`, `status`, `build`, `deploy`, `lib`, `generate`,
|
|
23
|
+
`doctor`.
|
|
24
|
+
- Deploy adapters: `github-pages` (legacy `/docs`, workflow, and branch
|
|
25
|
+
modes), `rsync` (named targets, secrets outside the repo), `command`.
|
|
26
|
+
- Site libraries: vendored-with-provenance model; built-in `artoo-kit`
|
|
27
|
+
(tokens, base, article layout, components).
|
|
28
|
+
- Plugin system: `artoo.generators`, `artoo.deployers`, `artoo.libraries`
|
|
29
|
+
entry-point groups.
|
|
30
|
+
- Workers: tiered delegation to local agent CLIs (`codex` for analysis
|
|
31
|
+
fan-out, `claude` for synthesis); no API keys in core.
|
|
32
|
+
- `explainer` generator: multi-page repo explainer with deterministic
|
|
33
|
+
inventory, per-module analysis, narrative synthesis, Mermaid diagrams,
|
|
34
|
+
and a build colophon.
|
|
35
|
+
- Optional flip integration (`artoo[research]`): generator runs recorded
|
|
36
|
+
as reporter's-notebook sources, claims, and sessions.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Contributing to artoo
|
|
2
|
+
|
|
3
|
+
Thanks for helping. Ground rules that keep artoo coherent:
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/lavallee/artoo && cd artoo
|
|
9
|
+
uv sync
|
|
10
|
+
uv run pytest -q
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Principles
|
|
14
|
+
|
|
15
|
+
- **Core stays light.** `pip install artoo` must work with one small
|
|
16
|
+
dependency (`click`). Heavy or network-bound features go behind extras
|
|
17
|
+
or plugins. Model SDKs never enter core — generators shell out to agent
|
|
18
|
+
CLIs the user already has.
|
|
19
|
+
- **The firewall is sacred.** Nothing outside an artifact's `site/` root
|
|
20
|
+
ships, ever. Notebook files and `_`/`.`-prefixed paths never ship even
|
|
21
|
+
inside `site/`. Any change touching deploy paths needs tests proving
|
|
22
|
+
the firewall holds.
|
|
23
|
+
- **Manifests must diff cleanly.** `artifact.toml` is written with stable
|
|
24
|
+
key order, scalars before tables. Don't introduce nondeterminism.
|
|
25
|
+
- **Adapters degrade loudly.** When a deployer or worker can't proceed
|
|
26
|
+
(missing CLI, ambiguous Pages config), it says exactly what it found
|
|
27
|
+
and what to do — it never guesses silently.
|
|
28
|
+
- **Ecosystem over monolith.** New generators, deployers, and site
|
|
29
|
+
libraries belong in their own repos using the entry-point groups.
|
|
30
|
+
Reference implementations live here only when they're load-bearing for
|
|
31
|
+
the core experience.
|
|
32
|
+
|
|
33
|
+
## Tests
|
|
34
|
+
|
|
35
|
+
One `test_<module>.py` per source module, `tmp_path`-based, no network,
|
|
36
|
+
no global state. CI runs `ruff check` + `pytest` on Python 3.12 and 3.13.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# artoo — design
|
|
2
|
+
|
|
3
|
+
artoo generates and manages **artifacts**: self-contained, publishable HTML
|
|
4
|
+
bundles (mini-sites) that pair presentation with the research that backs it.
|
|
5
|
+
It is the tool layer for a growing practice: getting explanations of systems
|
|
6
|
+
out of LLMs as real pages — with navigation, diagrams, and provenance —
|
|
7
|
+
instead of markdown dumps, and composing reports from multiple assets.
|
|
8
|
+
|
|
9
|
+
This document records the v0.1 architecture and the reasoning behind it.
|
|
10
|
+
|
|
11
|
+
## Lineage
|
|
12
|
+
|
|
13
|
+
artoo generalizes patterns proven in weaver, a private static-site research
|
|
14
|
+
workbench by the same author, and adopts the packaging
|
|
15
|
+
conventions of its public siblings [vizier](https://github.com/lavallee/vizier),
|
|
16
|
+
[somm](https://github.com/lavallee/somm), and
|
|
17
|
+
[flip](https://github.com/lavallee/flip). The load-bearing ideas imported:
|
|
18
|
+
|
|
19
|
+
- **Descriptor as source of truth.** Every artifact carries a small TOML
|
|
20
|
+
manifest; everything else (listings, graphs, deploy routing) is derived
|
|
21
|
+
from it, never hand-maintained.
|
|
22
|
+
- **The private-file firewall.** Research notes, notebooks, and anything
|
|
23
|
+
`_`- or `.`-prefixed sit *next to* the presentation but never publish.
|
|
24
|
+
Evidence lives with the piece; the deploy path is deny-by-default.
|
|
25
|
+
- **Named deploy targets, per-artifact routing.** The mechanism (rsync/ssh,
|
|
26
|
+
Pages, command) is generic; the values (hosts, users, paths) are local
|
|
27
|
+
config that never enters the repo.
|
|
28
|
+
- **Kind-aware scaffolding.** New artifacts start from an archetype
|
|
29
|
+
(explainer, report, reference guide, …) with an appropriate skeleton and
|
|
30
|
+
a research notebook stamped in.
|
|
31
|
+
- **Revision snapshots.** Publishing is preceded by cheap local snapshots
|
|
32
|
+
so any shipped state can be diffed and recovered.
|
|
33
|
+
|
|
34
|
+
Where artoo deliberately departs from its ancestor:
|
|
35
|
+
|
|
36
|
+
- **Artifacts live anywhere.** The ancestor housed all projects in one
|
|
37
|
+
repo under `projects/`. artoo artifacts live inside whatever repo owns
|
|
38
|
+
them — a library's explainer lives in that library's repo — and one repo
|
|
39
|
+
can hold many artifacts. artoo is installed once and invoked anywhere.
|
|
40
|
+
- **No bundler.** Artifacts are self-contained static sites: vendored
|
|
41
|
+
assets, system font stacks, no build-time JS toolchain. What you commit
|
|
42
|
+
is what ships. (A manifest may declare build *commands* — e.g. "export
|
|
43
|
+
this dataset to JSON" — but artoo itself never requires Node or a
|
|
44
|
+
bundling step.)
|
|
45
|
+
- **No direct model calls in core.** Like its ancestor, artoo core is a
|
|
46
|
+
renderer/manager. Generators delegate model work to *worker CLIs* the
|
|
47
|
+
user already has (`claude`, `codex`), selected per task tier. artoo
|
|
48
|
+
never holds API keys.
|
|
49
|
+
|
|
50
|
+
## Concepts
|
|
51
|
+
|
|
52
|
+
### Artifact
|
|
53
|
+
|
|
54
|
+
An artifact is a directory marked by an `artifact.toml`. Canonical shape:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
my-explainer/
|
|
58
|
+
artifact.toml # the manifest (source of truth)
|
|
59
|
+
site/ # the publishable mini-site — self-contained
|
|
60
|
+
index.html
|
|
61
|
+
style.css
|
|
62
|
+
lib/ # vendored site libraries (managed, see below)
|
|
63
|
+
notebook/ # research backing (flip notebook) — never deployed
|
|
64
|
+
work/ # generator working files — never deployed
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`site/` is committed. It must render from a file:// URL or any static
|
|
68
|
+
host — no external requests required (CDN references are allowed only in
|
|
69
|
+
`vendor`-recorded fallbacks). Everything outside `site/` is backing
|
|
70
|
+
material and never leaves the repo.
|
|
71
|
+
|
|
72
|
+
### Manifest (`artifact.toml`)
|
|
73
|
+
|
|
74
|
+
```toml
|
|
75
|
+
[artifact]
|
|
76
|
+
slug = "chart-forms"
|
|
77
|
+
title = "Chart forms — when, how, and when not"
|
|
78
|
+
description = "A guide to 43 chart-form patterns."
|
|
79
|
+
kind = "reference-guide" # explainer | report | reference-guide | ...
|
|
80
|
+
status = "live" # draft | building | live | archived
|
|
81
|
+
created = "2026-07-10"
|
|
82
|
+
|
|
83
|
+
[build]
|
|
84
|
+
# Optional commands that refresh generated inputs before deploy.
|
|
85
|
+
commands = ["vizier patterns export -o site/data.json"]
|
|
86
|
+
site = "site" # publishable root, relative to the manifest
|
|
87
|
+
|
|
88
|
+
[research]
|
|
89
|
+
notebook = "notebook" # optional flip notebook directory
|
|
90
|
+
|
|
91
|
+
[deploy]
|
|
92
|
+
target = "github-pages"
|
|
93
|
+
|
|
94
|
+
[deploy.github-pages]
|
|
95
|
+
# artoo inspects the repo's actual Pages configuration and routes
|
|
96
|
+
# accordingly: legacy /docs serving, an Actions workflow, or a branch.
|
|
97
|
+
subpath = "reader" # where under the published site this lands
|
|
98
|
+
|
|
99
|
+
[[libraries]]
|
|
100
|
+
name = "artoo-kit"
|
|
101
|
+
version = "0.1.0"
|
|
102
|
+
sha256 = "…" # provenance of the vendored copy
|
|
103
|
+
|
|
104
|
+
[[vendor]]
|
|
105
|
+
name = "mermaid"
|
|
106
|
+
url = "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"
|
|
107
|
+
sha256 = "…"
|
|
108
|
+
path = "site/lib/vendor/mermaid.min.js"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Top-level tables only, scalars before tables, stable key order on write —
|
|
112
|
+
manifests must diff cleanly in git.
|
|
113
|
+
|
|
114
|
+
### Site libraries
|
|
115
|
+
|
|
116
|
+
The tension: artifacts should be **self-contained and stable** (they keep
|
|
117
|
+
working when the tooling moves on) yet **easy to upgrade**. Resolution:
|
|
118
|
+
libraries are *vendored with provenance*. `artoo lib add artoo-kit` copies
|
|
119
|
+
the library's files into `site/lib/artoo-kit/` and records
|
|
120
|
+
name/version/hash in the manifest. `artoo lib status` detects drift (local
|
|
121
|
+
edits vs. upstream); `artoo lib update` re-vendors a newer version.
|
|
122
|
+
|
|
123
|
+
- artoo ships one built-in library, **artoo-kit**: design tokens
|
|
124
|
+
(dark-default + light theme), base styles, article/prose layout with
|
|
125
|
+
margin notes and pull quotes, components (nav, cards, callouts, tables,
|
|
126
|
+
badges), and small JS helpers. Neutral, system fonts, ~tens of KB.
|
|
127
|
+
- External libraries live in **their own repos/packages** and register via
|
|
128
|
+
the `artoo.libraries` entry point, or are vendored from a URL with a
|
|
129
|
+
pinned hash (`[[vendor]]`). Core artoo stays small; the ecosystem grows
|
|
130
|
+
outside it.
|
|
131
|
+
|
|
132
|
+
### Deployment
|
|
133
|
+
|
|
134
|
+
Adapters, discovered via the `artoo.deployers` entry point group:
|
|
135
|
+
|
|
136
|
+
- **`github-pages`** — deployment intelligence lives here. It reads the
|
|
137
|
+
repo's actual Pages state (`gh api repos/{owner}/{repo}/pages`) and
|
|
138
|
+
handles the three real-world modes: *legacy* serving from `/docs` or
|
|
139
|
+
root (copy the built site into place, commit), *workflow*
|
|
140
|
+
(generate/maintain an `actions/deploy-pages` workflow that assembles
|
|
141
|
+
artifacts), or *branch* (push to `gh-pages`). It refuses to guess when
|
|
142
|
+
the config is ambiguous and says exactly what it found.
|
|
143
|
+
- **`rsync`** — ssh/rsync to named targets. Targets (host/user/path/key)
|
|
144
|
+
live in `~/.config/artoo/targets.toml` or a git-ignored
|
|
145
|
+
`.artoo/targets.toml` at the repo root — never in the manifest.
|
|
146
|
+
- **`command`** — an arbitrary publish command run with `ARTOO_SITE_DIR`,
|
|
147
|
+
`ARTOO_SLUG`, etc. in the environment. The escape hatch that makes any
|
|
148
|
+
bespoke pipeline work today.
|
|
149
|
+
- Future adapters (vercel, cloudflare) are plugins; nothing in core
|
|
150
|
+
assumes a particular host.
|
|
151
|
+
|
|
152
|
+
`artoo deploy` always runs the firewall check first: notebook files,
|
|
153
|
+
`_`/`.`-prefixed paths, and anything outside `site/` cannot ship.
|
|
154
|
+
|
|
155
|
+
### Plugins
|
|
156
|
+
|
|
157
|
+
Three entry-point groups, all Python:
|
|
158
|
+
|
|
159
|
+
| group | provides | example |
|
|
160
|
+
|--------------------|-----------------------------------|--------------------|
|
|
161
|
+
| `artoo.generators` | `artoo generate <name> …` | `explainer` |
|
|
162
|
+
| `artoo.deployers` | `[deploy] target = <name>` | `github-pages` |
|
|
163
|
+
| `artoo.libraries` | vendorable asset bundles | `artoo-kit` |
|
|
164
|
+
|
|
165
|
+
Core ships reference implementations of each; everything else lives in
|
|
166
|
+
separate repos. A generator is a callable that receives a context (target
|
|
167
|
+
artifact, repo root, worker pool, options) and produces/updates the
|
|
168
|
+
artifact.
|
|
169
|
+
|
|
170
|
+
### Workers and model tiers
|
|
171
|
+
|
|
172
|
+
Generators do model work through **workers** — thin shell-outs to agent
|
|
173
|
+
CLIs already on the machine and already authenticated:
|
|
174
|
+
|
|
175
|
+
```toml
|
|
176
|
+
[workers] # optional overrides in artifact.toml
|
|
177
|
+
analysis = "codex" # fan-out, high-volume, cheap
|
|
178
|
+
synthesis = "claude" # narrative, structure, judgment
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
- `codex` → `codex exec --sandbox read-only …` (bulk per-module analysis)
|
|
182
|
+
- `claude` → `claude -p … --model <tier>` (synthesis, editing, review)
|
|
183
|
+
|
|
184
|
+
Workers return text/JSON; generators validate and record results. If a
|
|
185
|
+
worker CLI is missing, the generator degrades explicitly (skips the stage
|
|
186
|
+
and says so) rather than failing the whole run. No API keys, no vendored
|
|
187
|
+
SDKs, no phone-home.
|
|
188
|
+
|
|
189
|
+
### Research backing
|
|
190
|
+
|
|
191
|
+
If [flip](https://github.com/lavallee/flip) is installed alongside artoo,
|
|
192
|
+
generators record what they learned as a flip reporter's notebook inside
|
|
193
|
+
the artifact: analyzed files become graded sources, generated statements
|
|
194
|
+
become claims with `file:line` provenance, and each run is a session. The
|
|
195
|
+
site is then a *render* of the notebook in flip's sense. Without flip,
|
|
196
|
+
generators fall back to plain markdown notes in `work/`. Either way the
|
|
197
|
+
material stays behind the firewall.
|
|
198
|
+
|
|
199
|
+
## The explainer generator
|
|
200
|
+
|
|
201
|
+
The first serious generator: `artoo generate explainer --repo <path>`
|
|
202
|
+
builds a detailed multi-page explainer of a code repository.
|
|
203
|
+
|
|
204
|
+
Pipeline (each stage resumable, artifacts cached in `work/`):
|
|
205
|
+
|
|
206
|
+
1. **Inventory** (deterministic, no models) — file tree, LOC, language
|
|
207
|
+
split, package/workspace layout, entry points, dependency graph
|
|
208
|
+
between modules, git history shape, test topology, existing docs.
|
|
209
|
+
2. **Analysis fan-out** (analysis tier) — per-module briefs: what it does,
|
|
210
|
+
key types/functions, invariants, dependencies, surprises. Structured
|
|
211
|
+
output, validated, recorded as notebook sources/claims.
|
|
212
|
+
3. **Synthesis** (synthesis tier) — the narrative: what this system is,
|
|
213
|
+
the architecture story, data flow, design decisions worth telling,
|
|
214
|
+
reading paths for different audiences. Produces page plans, then pages.
|
|
215
|
+
4. **Diagrams** — architecture/data-flow diagrams emitted as Mermaid
|
|
216
|
+
source, rendered client-side by a vendored `mermaid.min.js`.
|
|
217
|
+
5. **Assembly** — pages composed with artoo-kit into `site/`: overview,
|
|
218
|
+
architecture, module reference, data model, operations/how-to-read
|
|
219
|
+
pages, with cross-links and a nav manifest.
|
|
220
|
+
|
|
221
|
+
The generated site carries a colophon: which tiers ran, when, against
|
|
222
|
+
which commit — an explainer is a *dated snapshot*, and says so.
|
|
223
|
+
|
|
224
|
+
## CLI surface (v0.1)
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
artoo init [path] --kind <kind> --title <t> scaffold an artifact
|
|
228
|
+
artoo list [root] discover artifacts under a tree
|
|
229
|
+
artoo status [artifact] manifest, firewall, lib drift
|
|
230
|
+
artoo build [artifact] run build commands + checks
|
|
231
|
+
artoo deploy [artifact] [--dry-run] firewall check, then adapter
|
|
232
|
+
artoo lib add|update|status|list manage vendored libraries
|
|
233
|
+
artoo generate <generator> [opts] run a generator plugin
|
|
234
|
+
artoo doctor [root] repo-wide coherence report
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Non-goals (v0.1)
|
|
238
|
+
|
|
239
|
+
- No hosted service, no accounts, no telemetry.
|
|
240
|
+
- No WYSIWYG editing; artifacts are files in git.
|
|
241
|
+
- No bundler integration; if a project needs one, its build commands can
|
|
242
|
+
call it, but artoo won't manage it.
|
|
243
|
+
- No model API clients in core, ever.
|
|
244
|
+
|
|
245
|
+
## Success criterion for v0.1
|
|
246
|
+
|
|
247
|
+
Run the explainer against the public somm repo, land the artifact in
|
|
248
|
+
somm's `site/` folder, and publish it through the github-pages adapter
|
|
249
|
+
without disturbing somm's existing landing page.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marc Lavallee
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: artoo-artifacts
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Generate and manage artifacts: self-contained HTML mini-sites that pair presentation with the research backing it.
|
|
5
|
+
Project-URL: Homepage, https://github.com/lavallee/artoo
|
|
6
|
+
Project-URL: Repository, https://github.com/lavallee/artoo
|
|
7
|
+
Project-URL: Changelog, https://github.com/lavallee/artoo/blob/main/CHANGELOG.md
|
|
8
|
+
Author: Marc Lavallee
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: artifacts,explainer,llm,reports,static-site
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Documentation
|
|
19
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
20
|
+
Requires-Python: >=3.12
|
|
21
|
+
Requires-Dist: click>=8.1
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
# artoo
|
|
25
|
+
|
|
26
|
+
**Generate and manage artifacts** — self-contained HTML mini-sites that pair
|
|
27
|
+
presentation with the research backing it.
|
|
28
|
+
|
|
29
|
+
There's a burgeoning practice of getting explanations of systems out of LLMs
|
|
30
|
+
as real pages — with navigation, diagrams, and provenance — instead of
|
|
31
|
+
markdown dumps, and of composing reports from multiple assets. artoo is the
|
|
32
|
+
tool layer for that practice:
|
|
33
|
+
|
|
34
|
+
- **Artifacts live anywhere.** An artifact is a directory with an
|
|
35
|
+
`artifact.toml` inside whatever repo owns it. A library's explainer lives
|
|
36
|
+
in that library's repo. One repo can hold many artifacts.
|
|
37
|
+
- **Self-contained, with provenance.** The publishable `site/` renders from
|
|
38
|
+
a `file://` URL — vendored assets, no bundler, no CDN dependencies. Shared
|
|
39
|
+
components come from versioned, hash-pinned site libraries you can upgrade
|
|
40
|
+
deliberately.
|
|
41
|
+
- **Deployment-aware.** artoo understands GitHub Pages (including whether
|
|
42
|
+
your repo serves from `/docs`, a workflow, or a branch), ssh/rsync targets,
|
|
43
|
+
and arbitrary publish commands. Secrets never enter the repo.
|
|
44
|
+
- **Research stays with the piece.** Notebooks, working files, and anything
|
|
45
|
+
`_`-prefixed sit next to the presentation but can never ship — the deploy
|
|
46
|
+
path is deny-by-default.
|
|
47
|
+
- **Generators, not API keys.** Model-powered generators (like the repo
|
|
48
|
+
explainer) delegate to agent CLIs you already have — `claude`, `codex` —
|
|
49
|
+
with cheap tiers for fan-out analysis and strong tiers for synthesis.
|
|
50
|
+
artoo core makes no model calls and holds no keys.
|
|
51
|
+
|
|
52
|
+
## Install
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
uv tool install artoo-artifacts # or: pipx install artoo-artifacts
|
|
56
|
+
artoo --version # the command is `artoo`
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Research-notebook support activates automatically when
|
|
60
|
+
[flip](https://github.com/lavallee/flip) is installed alongside artoo.
|
|
61
|
+
|
|
62
|
+
## Quickstart
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Scaffold an artifact inside any repo
|
|
66
|
+
artoo init site/my-report --kind report --title "Q3 systems report"
|
|
67
|
+
|
|
68
|
+
# See every artifact in the repo
|
|
69
|
+
artoo list
|
|
70
|
+
|
|
71
|
+
# Check health: manifest, firewall, library drift
|
|
72
|
+
artoo status site/my-report
|
|
73
|
+
|
|
74
|
+
# Publish (adapter chosen by the manifest's [deploy] table)
|
|
75
|
+
artoo deploy site/my-report
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Generate a repo explainer
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
artoo generate explainer --repo . --out site/explainer
|
|
82
|
+
artoo deploy site/explainer
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The explainer inventories the repo deterministically, fans out per-module
|
|
86
|
+
analysis to a cheap worker (`codex`), synthesizes the narrative with a strong
|
|
87
|
+
worker (`claude`), renders architecture diagrams, and assembles a multi-page
|
|
88
|
+
site with the built-in design kit. The result is a dated snapshot with a
|
|
89
|
+
colophon saying exactly how it was made.
|
|
90
|
+
|
|
91
|
+
## Status
|
|
92
|
+
|
|
93
|
+
v0.1.0 — alpha. The manifest format, CLI surface, and plugin entry points
|
|
94
|
+
are young and may change before 1.0. See [DESIGN.md](DESIGN.md) for the
|
|
95
|
+
architecture and [CHANGELOG.md](CHANGELOG.md) for history.
|
|
96
|
+
|
|
97
|
+
## Development
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
git clone https://github.com/lavallee/artoo && cd artoo
|
|
101
|
+
uv sync
|
|
102
|
+
uv run pytest -q
|
|
103
|
+
uv run ruff check src tests
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
MIT licensed. Contributions welcome — see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# artoo
|
|
2
|
+
|
|
3
|
+
**Generate and manage artifacts** — self-contained HTML mini-sites that pair
|
|
4
|
+
presentation with the research backing it.
|
|
5
|
+
|
|
6
|
+
There's a burgeoning practice of getting explanations of systems out of LLMs
|
|
7
|
+
as real pages — with navigation, diagrams, and provenance — instead of
|
|
8
|
+
markdown dumps, and of composing reports from multiple assets. artoo is the
|
|
9
|
+
tool layer for that practice:
|
|
10
|
+
|
|
11
|
+
- **Artifacts live anywhere.** An artifact is a directory with an
|
|
12
|
+
`artifact.toml` inside whatever repo owns it. A library's explainer lives
|
|
13
|
+
in that library's repo. One repo can hold many artifacts.
|
|
14
|
+
- **Self-contained, with provenance.** The publishable `site/` renders from
|
|
15
|
+
a `file://` URL — vendored assets, no bundler, no CDN dependencies. Shared
|
|
16
|
+
components come from versioned, hash-pinned site libraries you can upgrade
|
|
17
|
+
deliberately.
|
|
18
|
+
- **Deployment-aware.** artoo understands GitHub Pages (including whether
|
|
19
|
+
your repo serves from `/docs`, a workflow, or a branch), ssh/rsync targets,
|
|
20
|
+
and arbitrary publish commands. Secrets never enter the repo.
|
|
21
|
+
- **Research stays with the piece.** Notebooks, working files, and anything
|
|
22
|
+
`_`-prefixed sit next to the presentation but can never ship — the deploy
|
|
23
|
+
path is deny-by-default.
|
|
24
|
+
- **Generators, not API keys.** Model-powered generators (like the repo
|
|
25
|
+
explainer) delegate to agent CLIs you already have — `claude`, `codex` —
|
|
26
|
+
with cheap tiers for fan-out analysis and strong tiers for synthesis.
|
|
27
|
+
artoo core makes no model calls and holds no keys.
|
|
28
|
+
|
|
29
|
+
## Install
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
uv tool install artoo-artifacts # or: pipx install artoo-artifacts
|
|
33
|
+
artoo --version # the command is `artoo`
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Research-notebook support activates automatically when
|
|
37
|
+
[flip](https://github.com/lavallee/flip) is installed alongside artoo.
|
|
38
|
+
|
|
39
|
+
## Quickstart
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Scaffold an artifact inside any repo
|
|
43
|
+
artoo init site/my-report --kind report --title "Q3 systems report"
|
|
44
|
+
|
|
45
|
+
# See every artifact in the repo
|
|
46
|
+
artoo list
|
|
47
|
+
|
|
48
|
+
# Check health: manifest, firewall, library drift
|
|
49
|
+
artoo status site/my-report
|
|
50
|
+
|
|
51
|
+
# Publish (adapter chosen by the manifest's [deploy] table)
|
|
52
|
+
artoo deploy site/my-report
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Generate a repo explainer
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
artoo generate explainer --repo . --out site/explainer
|
|
59
|
+
artoo deploy site/explainer
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The explainer inventories the repo deterministically, fans out per-module
|
|
63
|
+
analysis to a cheap worker (`codex`), synthesizes the narrative with a strong
|
|
64
|
+
worker (`claude`), renders architecture diagrams, and assembles a multi-page
|
|
65
|
+
site with the built-in design kit. The result is a dated snapshot with a
|
|
66
|
+
colophon saying exactly how it was made.
|
|
67
|
+
|
|
68
|
+
## Status
|
|
69
|
+
|
|
70
|
+
v0.1.0 — alpha. The manifest format, CLI surface, and plugin entry points
|
|
71
|
+
are young and may change before 1.0. See [DESIGN.md](DESIGN.md) for the
|
|
72
|
+
architecture and [CHANGELOG.md](CHANGELOG.md) for history.
|
|
73
|
+
|
|
74
|
+
## Development
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
git clone https://github.com/lavallee/artoo && cd artoo
|
|
78
|
+
uv sync
|
|
79
|
+
uv run pytest -q
|
|
80
|
+
uv run ruff check src tests
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
MIT licensed. Contributions welcome — see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Releasing artoo
|
|
2
|
+
|
|
3
|
+
1. `uv run pytest -q` and `uv run ruff check src tests` pass locally.
|
|
4
|
+
2. Bump the version in **both** places, in lockstep:
|
|
5
|
+
- `pyproject.toml` → `[project] version`
|
|
6
|
+
- `src/artoo/__init__.py` → `__version__`
|
|
7
|
+
3. Update `CHANGELOG.md`: dated heading, Added/Changed/Fixed sections.
|
|
8
|
+
4. Update the landing page (`docs/index.html`) version badge and any new
|
|
9
|
+
capabilities.
|
|
10
|
+
5. Commit a clean `chore(release): X.Y.Z`.
|
|
11
|
+
6. Tag: `git tag -a vX.Y.Z -m "artoo X.Y.Z"` → push `main` and the tag.
|
|
12
|
+
7. `gh release create vX.Y.Z` with focused notes and a compare link.
|
|
13
|
+
8. Publishing the release triggers `.github/workflows/publish.yml`
|
|
14
|
+
(PyPI trusted publishing via the `pypi-artoo-artifacts` environment;
|
|
15
|
+
the distribution is `artoo-artifacts`, import/CLI stay `artoo`). Verify the
|
|
16
|
+
run; re-dispatch with `gh workflow run publish.yml` if needed.
|
|
17
|
+
Fallback: `uv build && uv publish` with a token.
|
|
18
|
+
|
|
19
|
+
Semantic versioning:
|
|
20
|
+
|
|
21
|
+
- **Patch** — fixes, docs; no surface change.
|
|
22
|
+
- **Minor** — new backward-compatible surface (CLI command, adapter,
|
|
23
|
+
entry point, manifest field with a default).
|
|
24
|
+
- **Major** — breaking CLI flags, manifest schema, or entry-point
|
|
25
|
+
signatures. Changes to firewall semantics are always breaking.
|
|
File without changes
|