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.
Files changed (67) hide show
  1. artoo_artifacts-0.1.0/.github/workflows/ci.yml +21 -0
  2. artoo_artifacts-0.1.0/.github/workflows/publish.yml +34 -0
  3. artoo_artifacts-0.1.0/.gitignore +17 -0
  4. artoo_artifacts-0.1.0/.somm/calls.sqlite +0 -0
  5. artoo_artifacts-0.1.0/.somm/service_token +1 -0
  6. artoo_artifacts-0.1.0/CHANGELOG.md +36 -0
  7. artoo_artifacts-0.1.0/CONTRIBUTING.md +36 -0
  8. artoo_artifacts-0.1.0/DESIGN.md +249 -0
  9. artoo_artifacts-0.1.0/LICENSE +21 -0
  10. artoo_artifacts-0.1.0/PKG-INFO +106 -0
  11. artoo_artifacts-0.1.0/README.md +83 -0
  12. artoo_artifacts-0.1.0/RELEASING.md +25 -0
  13. artoo_artifacts-0.1.0/docs/.nojekyll +0 -0
  14. artoo_artifacts-0.1.0/docs/index.html +103 -0
  15. artoo_artifacts-0.1.0/docs/lib/artoo-kit/article.css +170 -0
  16. artoo_artifacts-0.1.0/docs/lib/artoo-kit/base.css +147 -0
  17. artoo_artifacts-0.1.0/docs/lib/artoo-kit/components.css +237 -0
  18. artoo_artifacts-0.1.0/docs/lib/artoo-kit/kit.js +49 -0
  19. artoo_artifacts-0.1.0/docs/lib/artoo-kit/tokens.css +142 -0
  20. artoo_artifacts-0.1.0/pyproject.toml +66 -0
  21. artoo_artifacts-0.1.0/site/landing/artifact.toml +22 -0
  22. artoo_artifacts-0.1.0/site/landing/site/index.html +103 -0
  23. artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/article.css +170 -0
  24. artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/base.css +147 -0
  25. artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/components.css +237 -0
  26. artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/kit.js +49 -0
  27. artoo_artifacts-0.1.0/site/landing/site/lib/artoo-kit/tokens.css +142 -0
  28. artoo_artifacts-0.1.0/src/artoo/__init__.py +8 -0
  29. artoo_artifacts-0.1.0/src/artoo/build.py +47 -0
  30. artoo_artifacts-0.1.0/src/artoo/cli.py +274 -0
  31. artoo_artifacts-0.1.0/src/artoo/deploy/__init__.py +46 -0
  32. artoo_artifacts-0.1.0/src/artoo/deploy/base.py +45 -0
  33. artoo_artifacts-0.1.0/src/artoo/deploy/command.py +53 -0
  34. artoo_artifacts-0.1.0/src/artoo/deploy/github_pages.py +328 -0
  35. artoo_artifacts-0.1.0/src/artoo/deploy/rsync.py +116 -0
  36. artoo_artifacts-0.1.0/src/artoo/discover.py +67 -0
  37. artoo_artifacts-0.1.0/src/artoo/firewall.py +92 -0
  38. artoo_artifacts-0.1.0/src/artoo/generators/__init__.py +33 -0
  39. artoo_artifacts-0.1.0/src/artoo/generators/explainer/__init__.py +362 -0
  40. artoo_artifacts-0.1.0/src/artoo/generators/explainer/inventory.py +245 -0
  41. artoo_artifacts-0.1.0/src/artoo/generators/explainer/prompts.py +141 -0
  42. artoo_artifacts-0.1.0/src/artoo/generators/explainer/templates.py +81 -0
  43. artoo_artifacts-0.1.0/src/artoo/libraries/__init__.py +143 -0
  44. artoo_artifacts-0.1.0/src/artoo/libraries/kit/__init__.py +19 -0
  45. artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/article.css +170 -0
  46. artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/base.css +147 -0
  47. artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/components.css +237 -0
  48. artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/kit.js +49 -0
  49. artoo_artifacts-0.1.0/src/artoo/libraries/kit/assets/tokens.css +142 -0
  50. artoo_artifacts-0.1.0/src/artoo/manifest.py +228 -0
  51. artoo_artifacts-0.1.0/src/artoo/research.py +118 -0
  52. artoo_artifacts-0.1.0/src/artoo/scaffold.py +104 -0
  53. artoo_artifacts-0.1.0/src/artoo/workers.py +143 -0
  54. artoo_artifacts-0.1.0/tests/conftest.py +78 -0
  55. artoo_artifacts-0.1.0/tests/test_build.py +28 -0
  56. artoo_artifacts-0.1.0/tests/test_cli.py +68 -0
  57. artoo_artifacts-0.1.0/tests/test_deploy_command.py +39 -0
  58. artoo_artifacts-0.1.0/tests/test_deploy_github_pages.py +101 -0
  59. artoo_artifacts-0.1.0/tests/test_deploy_rsync.py +54 -0
  60. artoo_artifacts-0.1.0/tests/test_discover.py +38 -0
  61. artoo_artifacts-0.1.0/tests/test_explainer.py +62 -0
  62. artoo_artifacts-0.1.0/tests/test_firewall.py +50 -0
  63. artoo_artifacts-0.1.0/tests/test_inventory.py +47 -0
  64. artoo_artifacts-0.1.0/tests/test_libraries.py +54 -0
  65. artoo_artifacts-0.1.0/tests/test_manifest.py +74 -0
  66. artoo_artifacts-0.1.0/tests/test_workers.py +53 -0
  67. 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
@@ -0,0 +1,17 @@
1
+ # python
2
+ __pycache__/
3
+ *.py[cod]
4
+ .venv/
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+
11
+ # artoo local state (never committed)
12
+ .artoo/targets.toml
13
+
14
+ # editors / os
15
+ .DS_Store
16
+ .idea/
17
+ .vscode/
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