From 31a824ff27d017a6e15434fef46fd9b130bf8394 Mon Sep 17 00:00:00 2001 From: Zhi Date: Sat, 6 Jun 2026 11:19:13 +0800 Subject: [PATCH 1/6] chore: mark v0.33 release checklist complete --- docs/next/v0.33.0/RELEASE_CHECKLIST.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/next/v0.33.0/RELEASE_CHECKLIST.md b/docs/next/v0.33.0/RELEASE_CHECKLIST.md index 11997000..46c86339 100644 --- a/docs/next/v0.33.0/RELEASE_CHECKLIST.md +++ b/docs/next/v0.33.0/RELEASE_CHECKLIST.md @@ -18,9 +18,9 @@ ## Remote Closure -- [ ] Push `dev`. -- [ ] Wait for all `dev` CI jobs. -- [ ] Merge `dev` into `main`. -- [ ] Wait for all `main` CI jobs. -- [ ] Create and push `v0.33.0` tag. -- [ ] Publish GitHub release note. +- [x] Push `dev`. +- [x] Wait for all `dev` CI jobs. +- [x] Merge `dev` into `main`. +- [x] Wait for all `main` CI jobs. +- [x] Create and push `v0.33.0` tag. +- [x] Publish GitHub release note. From 407e0cb01499a676163fd366bbce303949c32eab Mon Sep 17 00:00:00 2001 From: Zhi Date: Sat, 6 Jun 2026 12:12:03 +0800 Subject: [PATCH 2/6] feat: AutoFlow2 Sidecar Kernel (v0.34.0) - tools/autoflow/: state machine, 6 readers, reporter, CLI - 5 fixtures (released/active/planned/drifted/invalid) - 35 unit + integration tests - deno task autoflow:report (advisory only, no CI gate) - docs/next/v0.34.0/ execution package --- deno.json | 3 +- docs/next/v0.34.0/ACCEPTANCE.md | 39 ++++ docs/next/v0.34.0/DESIGN.md | 193 ++++++++++++++++++ docs/next/v0.34.0/DOCS_PLAN.md | 32 +++ docs/next/v0.34.0/README.md | 34 +++ docs/next/v0.34.0/RELEASE_CHECKLIST.md | 28 +++ docs/next/v0.34.0/RISK_REGISTER.md | 26 +++ docs/next/v0.34.0/TASKS.md | 118 +++++++++++ docs/next/v0.34.0/TEST_MATRIX.md | 58 ++++++ tools/autoflow/__tests__/cells.test.ts | 35 ++++ tools/autoflow/__tests__/integration.test.ts | 100 +++++++++ .../autoflow/__tests__/state-machine.test.ts | 138 +++++++++++++ tools/autoflow/cells.ts | 70 +++++++ tools/autoflow/fixtures/active/deno.json | 3 + .../fixtures/active/docs/adr/ADR-0001.md | 3 + .../docs/governance/PROJECT_WORKFLOW.md | 1 + .../active/docs/next/v0.34.0/ACCEPTANCE.md | 1 + .../active/docs/next/v0.34.0/DESIGN.md | 1 + .../active/docs/next/v0.34.0/DOCS_PLAN.md | 1 + .../active/docs/next/v0.34.0/README.md | 1 + .../docs/next/v0.34.0/RELEASE_CHECKLIST.md | 1 + .../active/docs/next/v0.34.0/RISK_REGISTER.md | 1 + .../active/docs/next/v0.34.0/TASKS.md | 1 + .../active/docs/next/v0.34.0/TEST_MATRIX.md | 1 + .../fixtures/active/docs/roadmap/ROADMAP.md | 6 + .../active/docs/sop/v0.34.0/README.md | 9 + .../fixtures/active/docs/status/STATUS.md | 17 ++ .../fixtures/active/packages/core/deno.json | 4 + tools/autoflow/fixtures/drifted/deno.json | 3 + .../fixtures/drifted/docs/adr/ADR-0001.md | 3 + .../docs/governance/PROJECT_WORKFLOW.md | 1 + .../drifted/docs/next/v0.34.0/ACCEPTANCE.md | 1 + .../drifted/docs/next/v0.34.0/DESIGN.md | 1 + .../drifted/docs/next/v0.34.0/DOCS_PLAN.md | 1 + .../drifted/docs/next/v0.34.0/README.md | 1 + .../docs/next/v0.34.0/RELEASE_CHECKLIST.md | 1 + .../docs/next/v0.34.0/RISK_REGISTER.md | 1 + .../drifted/docs/next/v0.34.0/TASKS.md | 1 + .../drifted/docs/next/v0.34.0/TEST_MATRIX.md | 1 + .../fixtures/drifted/docs/roadmap/ROADMAP.md | 6 + .../drifted/docs/sop/v0.34.0/README.md | 9 + .../fixtures/drifted/docs/status/STATUS.md | 17 ++ .../fixtures/drifted/packages/core/deno.json | 4 + tools/autoflow/fixtures/invalid/deno.json | 3 + .../fixtures/invalid/docs/adr/ADR-0001.md | 3 + .../docs/governance/PROJECT_WORKFLOW.md | 1 + .../fixtures/invalid/packages/core/deno.json | 4 + tools/autoflow/fixtures/planned/deno.json | 3 + .../fixtures/planned/docs/adr/ADR-0001.md | 3 + .../docs/governance/PROJECT_WORKFLOW.md | 1 + .../fixtures/planned/docs/roadmap/ROADMAP.md | 5 + .../planned/docs/sop/v0.34.0/README.md | 7 + .../fixtures/planned/docs/status/STATUS.md | 13 ++ .../fixtures/planned/packages/core/deno.json | 4 + tools/autoflow/fixtures/released/deno.json | 3 + .../fixtures/released/docs/adr/ADR-0001.md | 3 + .../docs/governance/PROJECT_WORKFLOW.md | 1 + .../released/docs/next/v0.34.0/ACCEPTANCE.md | 1 + .../released/docs/next/v0.34.0/DESIGN.md | 1 + .../released/docs/next/v0.34.0/DOCS_PLAN.md | 1 + .../released/docs/next/v0.34.0/README.md | 1 + .../docs/next/v0.34.0/RELEASE_CHECKLIST.md | 1 + .../docs/next/v0.34.0/RISK_REGISTER.md | 1 + .../released/docs/next/v0.34.0/TASKS.md | 1 + .../released/docs/next/v0.34.0/TEST_MATRIX.md | 1 + .../fixtures/released/docs/roadmap/ROADMAP.md | 6 + .../released/docs/sop/v0.34.0/README.md | 9 + .../fixtures/released/docs/status/STATUS.md | 17 ++ .../fixtures/released/packages/core/deno.json | 4 + tools/autoflow/mod.ts | 140 +++++++++++++ tools/autoflow/readers/adr.ts | 55 +++++ tools/autoflow/readers/nextversion.ts | 51 +++++ tools/autoflow/readers/package-graph.ts | 96 +++++++++ tools/autoflow/readers/roadmap.ts | 56 +++++ tools/autoflow/readers/sop.ts | 36 ++++ tools/autoflow/readers/status.ts | 57 ++++++ tools/autoflow/reporter.ts | 98 +++++++++ tools/autoflow/state-machine.ts | 93 +++++++++ 78 files changed, 1755 insertions(+), 1 deletion(-) create mode 100644 docs/next/v0.34.0/ACCEPTANCE.md create mode 100644 docs/next/v0.34.0/DESIGN.md create mode 100644 docs/next/v0.34.0/DOCS_PLAN.md create mode 100644 docs/next/v0.34.0/README.md create mode 100644 docs/next/v0.34.0/RELEASE_CHECKLIST.md create mode 100644 docs/next/v0.34.0/RISK_REGISTER.md create mode 100644 docs/next/v0.34.0/TASKS.md create mode 100644 docs/next/v0.34.0/TEST_MATRIX.md create mode 100644 tools/autoflow/__tests__/cells.test.ts create mode 100644 tools/autoflow/__tests__/integration.test.ts create mode 100644 tools/autoflow/__tests__/state-machine.test.ts create mode 100644 tools/autoflow/cells.ts create mode 100644 tools/autoflow/fixtures/active/deno.json create mode 100644 tools/autoflow/fixtures/active/docs/adr/ADR-0001.md create mode 100644 tools/autoflow/fixtures/active/docs/governance/PROJECT_WORKFLOW.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/ACCEPTANCE.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/DESIGN.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/DOCS_PLAN.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/RELEASE_CHECKLIST.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/RISK_REGISTER.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/TASKS.md create mode 100644 tools/autoflow/fixtures/active/docs/next/v0.34.0/TEST_MATRIX.md create mode 100644 tools/autoflow/fixtures/active/docs/roadmap/ROADMAP.md create mode 100644 tools/autoflow/fixtures/active/docs/sop/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/active/docs/status/STATUS.md create mode 100644 tools/autoflow/fixtures/active/packages/core/deno.json create mode 100644 tools/autoflow/fixtures/drifted/deno.json create mode 100644 tools/autoflow/fixtures/drifted/docs/adr/ADR-0001.md create mode 100644 tools/autoflow/fixtures/drifted/docs/governance/PROJECT_WORKFLOW.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/ACCEPTANCE.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DESIGN.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DOCS_PLAN.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RELEASE_CHECKLIST.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RISK_REGISTER.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TASKS.md create mode 100644 tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TEST_MATRIX.md create mode 100644 tools/autoflow/fixtures/drifted/docs/roadmap/ROADMAP.md create mode 100644 tools/autoflow/fixtures/drifted/docs/sop/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/drifted/docs/status/STATUS.md create mode 100644 tools/autoflow/fixtures/drifted/packages/core/deno.json create mode 100644 tools/autoflow/fixtures/invalid/deno.json create mode 100644 tools/autoflow/fixtures/invalid/docs/adr/ADR-0001.md create mode 100644 tools/autoflow/fixtures/invalid/docs/governance/PROJECT_WORKFLOW.md create mode 100644 tools/autoflow/fixtures/invalid/packages/core/deno.json create mode 100644 tools/autoflow/fixtures/planned/deno.json create mode 100644 tools/autoflow/fixtures/planned/docs/adr/ADR-0001.md create mode 100644 tools/autoflow/fixtures/planned/docs/governance/PROJECT_WORKFLOW.md create mode 100644 tools/autoflow/fixtures/planned/docs/roadmap/ROADMAP.md create mode 100644 tools/autoflow/fixtures/planned/docs/sop/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/planned/docs/status/STATUS.md create mode 100644 tools/autoflow/fixtures/planned/packages/core/deno.json create mode 100644 tools/autoflow/fixtures/released/deno.json create mode 100644 tools/autoflow/fixtures/released/docs/adr/ADR-0001.md create mode 100644 tools/autoflow/fixtures/released/docs/governance/PROJECT_WORKFLOW.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/ACCEPTANCE.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/DESIGN.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/DOCS_PLAN.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/RELEASE_CHECKLIST.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/RISK_REGISTER.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/TASKS.md create mode 100644 tools/autoflow/fixtures/released/docs/next/v0.34.0/TEST_MATRIX.md create mode 100644 tools/autoflow/fixtures/released/docs/roadmap/ROADMAP.md create mode 100644 tools/autoflow/fixtures/released/docs/sop/v0.34.0/README.md create mode 100644 tools/autoflow/fixtures/released/docs/status/STATUS.md create mode 100644 tools/autoflow/fixtures/released/packages/core/deno.json create mode 100644 tools/autoflow/mod.ts create mode 100644 tools/autoflow/readers/adr.ts create mode 100644 tools/autoflow/readers/nextversion.ts create mode 100644 tools/autoflow/readers/package-graph.ts create mode 100644 tools/autoflow/readers/roadmap.ts create mode 100644 tools/autoflow/readers/sop.ts create mode 100644 tools/autoflow/readers/status.ts create mode 100644 tools/autoflow/reporter.ts create mode 100644 tools/autoflow/state-machine.ts diff --git a/deno.json b/deno.json index 893d1085..901deb41 100644 --- a/deno.json +++ b/deno.json @@ -159,7 +159,8 @@ "fmt:check": "deno fmt --check --ignore=deliverables/,www/content/blog/,www/app/routes/,www/app/data/,docs/mockups/,docs/conversation/,custom-dist/,dist-test-ssg-render/,.deno_cache/", "clean": "rm -rf packages/*/dist www/dist", "hooks:install": "git config core.hooksPath .githooks", - "hooks:uninstall": "git config core.hooksPath" + "hooks:uninstall": "git config core.hooksPath", + "autoflow:report": "deno run --allow-read tools/autoflow/mod.ts" }, "fmt": { "useTabs": false, diff --git a/docs/next/v0.34.0/ACCEPTANCE.md b/docs/next/v0.34.0/ACCEPTANCE.md new file mode 100644 index 00000000..594bee9e --- /dev/null +++ b/docs/next/v0.34.0/ACCEPTANCE.md @@ -0,0 +1,39 @@ +# v0.34.0 Acceptance Criteria + +v0.34.0 is accepted only if all criteria below are satisfied. + +## Product Criteria + +- `deno task autoflow:report` runs against the real repository and emits valid + JSON and Markdown summary. +- The report identifies the current workflow state, all 9 cells, blockers, + and allowed actions. +- Each cell has a status (`ok`, `warning`, `missing`, `drifted`) and a human- + readable detail string. +- The report does not access network, call git, or modify any files. +- The report works with `--json` and `--summary` output modes. + +## Architecture Criteria + +- All readers are pure functions: `(rootDir: string) => StructuredData`. +- State machine has exactly 6 states and only legal transitions are permitted. +- No code in `tools/autoflow/` imports from `packages/`. +- No `deno task autoflow:check` exists or is registered as a gate. +- Existing gates (`workflow:check`, `fmt`, `lint`, `typecheck`, `test`, + `graph:check`, `arch:check`) all still pass. + +## Evidence Criteria + +- State machine unit tests cover all legal and illegal transitions. +- Each reader has unit tests against snapshot data. +- 5 fixture directories produce correct workflow states. +- Integration test processes each fixture end-to-end and matches snapshots. +- Snapshot tests pass after `deno test --update`. +- AutoFlow tests are discoverable via `deno test` in `tools/autoflow/`. + +## Non-Goals Verified + +- [ ] No `autoflow:check` gate in CI config. +- [ ] No code that calls `git`, `gh`, or any external process. +- [ ] No file writes beyond test snapshots. +- [ ] No network access (`--allow-read` only). diff --git a/docs/next/v0.34.0/DESIGN.md b/docs/next/v0.34.0/DESIGN.md new file mode 100644 index 00000000..4af76ed7 --- /dev/null +++ b/docs/next/v0.34.0/DESIGN.md @@ -0,0 +1,193 @@ +# v0.34.0 Design: AutoFlow2 Sidecar Kernel + +## Directory Layout + +``` +tools/autoflow/ +├── mod.ts # CLI entry: deno run --allow-read tools/autoflow/mod.ts +├── state-machine.ts # Workflow states and legal transitions +├── cells.ts # 9 evidence cells with status enum +├── readers/ +│ ├── status.ts # Parse docs/status/STATUS.md +│ ├── roadmap.ts # Parse docs/roadmap/ROADMAP.md +│ ├── sop.ts # Parse docs/sop//README.md +│ ├── nextversion.ts # Check docs/next// completeness +│ ├── adr.ts # Index docs/adr/ +│ └── package-graph.ts # Read deno.json workspace + package versions +├── reporter.ts # JSON + Markdown summary output +├── fixtures/ +│ ├── released/ # Simulated released-version repo +│ ├── active/ # Simulated in-progress repo +│ ├── planned/ # Simulated planned-only repo +│ ├── drifted/ # Version-mismatch repo +│ └── invalid/ # Missing-critical-files repo +└── __tests__/ + ├── state-machine.test.ts + ├── cells.test.ts + ├── readers/ + │ ├── status.test.ts + │ ├── roadmap.test.ts + │ ├── sop.test.ts + │ ├── nextversion.test.ts + │ ├── adr.test.ts + │ └── package-graph.test.ts + ├── reporter.test.ts + ├── integration.test.ts # Full pipeline on each fixture + └── snapshots/ # Generated by deno test --update +``` + +## State Machine + +``` +planned ──→ next ──→ active ──→ implemented ──→ released + ↘ + drifted +``` + +| State | Condition | +| ------------- | -------------------------------------------------- | +| `planned` | SOP exists, status: Planned, no NextVersion yet | +| `next` | NextVersion package exists, status: Next | +| `active` | NextVersion is current, tasks in progress | +| `implemented` | SOP tasks complete, gates passing, not yet tagged | +| `released` | Git tag exists, release note published | +| `drifted` | Version/packages/docs inconsistent with active SOP | + +State is determined by reading `docs/status/STATUS.md` and cross-referencing +with `docs/next/`, `docs/sop/`, git tags, and package graph. + +## Evidence Cells + +9 cells, each with status `ok | warning | missing | drifted`: + +| Cell | Reads | Evidence | +| --------------- | ------------------------------ | ------------------------------------------- | +| `adr` | `docs/adr/` | Count, status, linked SOPs | +| `sop` | `docs/sop//README.md` | Task checklist percentage | +| `next-version` | `docs/next//` | 8 required files present | +| `package-graph` | `deno.json` + packages | Version alignment, cycle count | +| `status` | `docs/status/STATUS.md` | Version line matches packages, gates listed | +| `roadmap` | `docs/roadmap/ROADMAP.md` | Version sequence consistent with status | +| `workflow` | `docs/governance/` | Required docs present, anchors valid | +| `docs` | `docs/` cross-check | Strategy docs, current docs, no legacy refs | +| `release` | git tags + `docs/release/` | Tag exists, release note exists | + +Cells 5-8 (`tests`, `build`, `ci`) are placeholders; filled in v0.35. + +## Reader Design + +Each reader is a pure function: `(rootDir: string) => StructuredData`. + +Readers do NOT access network, git, or CI. They read local files only. + +### status reader + +Parses `STATUS.md` to extract: + +- Current version line (`v0.34.0`) +- Active NextVersion path (`docs/next/v0.34.0/`) +- Rendering mode table rows +- Package version state +- Gate order list + +Strategy: regex extraction + section heading parsing. Not a full Markdown parser; +target known structure from `PROJECT_WORKFLOW.md`. + +### sop reader + +Parses `docs/sop//README.md`: + +- SOP status header (`> Status: Next`) +- Task checkboxes `- [x] / - [ ]` +- Entry/exit criteria presence + +### nextversion reader + +Checks `docs/next//` for 8 required files and their non-emptiness. + +### package-graph reader + +Reads `deno.json` workspace config: + +```json +{ "workspace": ["./packages/*"] } +``` + +For each package, reads its `deno.json` for `version`. Reports: + +- All versions match active version +- Any missing packages +- Basic import map consistency + +### adr reader + +Scans `docs/adr/` for `ADR-*.md` files, extracts status and linked SOP. + +## Output Format + +### JSON (`--json`) + +```json +{ + "version": "v0.34.0", + "workflowState": "active", + "cells": [ + { + "name": "sop", + "status": "ok", + "detail": "12/12 tasks completed", + "source": "docs/sop/v0.34.0/README.md" + } + ], + "blockers": [], + "allowedActions": ["edit-packages", "run-test", "update-docs", "bump-version"] +} +``` + +### Human Summary (`--summary`, default) + +A Markdown block suitable for pasting into PR descriptions: + +```markdown +## AutoFlow Report — v0.34.0 + +**State**: active + +### Cells + +| Cell | Status | Detail | +| ---- | ------ | ------ | +| sop | ok | 12/12 | +| ... | | | + +### Blockers + +None. + +### Allowed Actions + +- edit-packages +- run-test +- update-docs +``` + +## Deno Task + +```json +// deno.json +{ + "tasks": { + "autoflow:report": "deno run --allow-read tools/autoflow/mod.ts" + } +} +``` + +## Non-Goals + +- No `deno task autoflow:check` (v0.35) +- No CI integration +- No git operations +- No network access +- No code editing +- No subjective scoring +- No external API calls diff --git a/docs/next/v0.34.0/DOCS_PLAN.md b/docs/next/v0.34.0/DOCS_PLAN.md new file mode 100644 index 00000000..3afe99b3 --- /dev/null +++ b/docs/next/v0.34.0/DOCS_PLAN.md @@ -0,0 +1,32 @@ +# v0.34.0 Docs Plan + +## Current Docs (must update) + +| File | Change | +| ----------------------------------- | -------------------------------------------- | +| `docs/status/STATUS.md` | v0.34 → Current, v0.33 → historical | +| `docs/roadmap/ROADMAP.md` | v0.34 status → Done, v0.35 → Next | +| `docs/sop/v0.34.0/README.md` | Status → Active, tasks checked off | +| `docs/arch/current-architecture.md` | Add AutoFlow2 sidecar layer | +| `docs/next/v0.34.0/*` | Tasks checked, evidence recorded | +| `README.md` | Add `deno task autoflow:report` to task list | + +## Website (www) + +| Page | Change | +| ------------------------ | ----------------------- | +| `www/app/routes/index/` | Bump version to v0.34.0 | +| `www/app/routes/roadmap` | v0.34 → current line | + +## Release Docs + +| File | Action | +| --------------------------- | ----------------- | +| `CHANGELOG.md` | Add v0.34.0 | +| `docs/release/v0.34.0.md` | Create | +| `docs/changelog/v0.34.0.md` | Create (optional) | + +## No Template Changes + +v0.34.0 does not change `packages/create/` templates. The sidecar is internal +infrastructure, not a user-facing feature. diff --git a/docs/next/v0.34.0/README.md b/docs/next/v0.34.0/README.md new file mode 100644 index 00000000..699a037d --- /dev/null +++ b/docs/next/v0.34.0/README.md @@ -0,0 +1,34 @@ +# v0.34.0 NextVersion Package + +> Version: v0.34.0\ +> Theme: AutoFlow2 Sidecar Kernel\ +> Governing SOP: `docs/sop/v0.34.0/README.md`\ +> ADRs: ADR-0086\ +> Workflow: `docs/governance/PROJECT_WORKFLOW.md` + +## Purpose + +Introduce an internal read-only tool under `tools/autoflow/` that reads +repository governance documents and emits a machine-readable JSON report plus a +human summary. The sidecar is advisory: it observes and reports, but does not +block CI or edit code. + +This is the kernel that v0.35 will turn into a hard gate. + +## Execution Map + +| File | Role | +| ---------------------- | ---------------------------------------------------------- | +| `DESIGN.md` | Architecture: state machine, cells, readers, output format | +| `TASKS.md` | Concrete implementation steps mapped to SOP | +| `ACCEPTANCE.md` | Completion criteria and evidence | +| `TEST_MATRIX.md` | Tests, fixtures, gates | +| `DOCS_PLAN.md` | Current docs, website, template, changelog, release note | +| `RISK_REGISTER.md` | Risks, mitigations, non-goals | +| `RELEASE_CHECKLIST.md` | Release closure sequence | + +## Completion Rule + +This version is complete only when the v0.34 SOP tasks, this package, local +gates, changelog, release note, `dev` CI, `main` CI, and release tag all agree. +The sidecar must remain advisory — no CI blocker code exists before v0.35. diff --git a/docs/next/v0.34.0/RELEASE_CHECKLIST.md b/docs/next/v0.34.0/RELEASE_CHECKLIST.md new file mode 100644 index 00000000..fda7cb35 --- /dev/null +++ b/docs/next/v0.34.0/RELEASE_CHECKLIST.md @@ -0,0 +1,28 @@ +# v0.34.0 Release Checklist + +## Before Bump + +- [ ] SOP tasks completed. +- [ ] NextVersion tasks completed. +- [ ] Local implementation gates pass. +- [ ] `deno task autoflow:report` runs against real repo (JSON + summary). +- [ ] `deno test tools/autoflow/` passes. +- [ ] `deno test` passes (all 1314+). +- [ ] Website and current docs updated. + +## Bump and Docs + +- [ ] All packages aligned to v0.34.0. +- [ ] Changelog written. +- [ ] Release note written. +- [ ] Consumer smoke passes. +- [ ] Publish dry-run passes. + +## Remote Closure + +- [ ] Push `dev`. +- [ ] Wait for all `dev` CI jobs. +- [ ] Merge `dev` into `main`. +- [ ] Wait for all `main` CI jobs. +- [ ] Create and push `v0.34.0` tag. +- [ ] Publish GitHub release note. diff --git a/docs/next/v0.34.0/RISK_REGISTER.md b/docs/next/v0.34.0/RISK_REGISTER.md new file mode 100644 index 00000000..7b992e3f --- /dev/null +++ b/docs/next/v0.34.0/RISK_REGISTER.md @@ -0,0 +1,26 @@ +# v0.34.0 Risk Register + +## Risks + +| Risk | Severity | Mitigation | +| ---------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | +| Reader parsing is fragile against Markdown format drift | Medium | Readers target structured sections with known headers; snapshot tests catch regressions; fixtures are explicit | +| State machine is too simplistic for real workflow edge cases | Low | 6 states + `drifted` catch-all covers current 0.x workflow; v0.35 can refine | +| Fixture maintenance burden as docs evolve | Low | Fixtures are minimal; each contains only what readers need; snapshot tests auto-update | +| `tools/autoflow/` imports from `packages/` creating dependency cycle | Low | Architecture gate verifies no package imports; readers are pure Deno stdlib | +| Over-engineering — sidecar becomes a product before it's proven useful | Medium | Strict scope: advisory only, no gate, no CI, no edits; v0.35 review decides if it's worth gating | + +## Mitigations Already in Place + +- `workflow:check` continues to enforce NextVersion package structure. +- `graph:check` verifies zero cycles across all packages. +- `arch:check` verifies renderer contract stays frozen. +- `docs:check-current` verifies no legacy references leak. + +## Non-Goals (Anti-Risks) + +- **No CI gate.** The sidecar fails silently outside its own test suite. +- **No git operations.** No risk of corrupting repository state. +- **No network.** No risk of external dependency failures. +- **No edits.** Pure observer pattern, zero side effects. +- **No subjective scoring.** "Blocked" means hard contradiction, not opinion. diff --git a/docs/next/v0.34.0/TASKS.md b/docs/next/v0.34.0/TASKS.md new file mode 100644 index 00000000..44f9ca83 --- /dev/null +++ b/docs/next/v0.34.0/TASKS.md @@ -0,0 +1,118 @@ +# v0.34.0 Tasks + +## S1: Scaffold + +- [ ] Create `tools/autoflow/` directory structure. +- [ ] Create `tools/autoflow/mod.ts` CLI entry. +- [ ] Create `tools/autoflow/__tests__/` directory. +- [ ] Add `deno task autoflow:report` to `deno.json`. +- [ ] Verify `deno task autoflow:report` runs without error (stub). + +## S2: State Machine + +- [ ] Implement `state-machine.ts`: enum + transition table. +- [ ] States: `planned`, `next`, `active`, `implemented`, `released`, `drifted`. +- [ ] Legal transitions: `planned→next`, `next→active`, `active→implemented`, + `implemented→released`, `*→drifted`. +- [ ] Export `determineState(evidence) => WorkflowState`. +- [ ] Unit tests: all legal transitions, all illegal transitions rejected, + drifted detection. + +## S3: Cells + +- [ ] Implement `cells.ts`: Cell name enum + status enum. +- [ ] Statuses: `ok`, `warning`, `missing`, `drifted`. +- [ ] Define 9 cell names with metadata (label, description). +- [ ] Export `createCell(name, status, detail, source) => Cell`. +- [ ] Unit tests: cell creation, status string representation. + +## S4: Readers + +### S4a: status reader + +- [ ] Implement `readers/status.ts`. +- [ ] Parse current version line from `STATUS.md`. +- [ ] Extract active NextVersion path. +- [ ] Extract gate order list. +- [ ] Unit tests with STATUS.md snapshot. + +### S4b: sop reader + +- [ ] Implement `readers/sop.ts`. +- [ ] Parse SOP status header. +- [ ] Count `[x]` vs `[ ]` tasks. +- [ ] Unit tests with SOP snapshot. + +### S4c: nextversion reader + +- [ ] Implement `readers/nextversion.ts`. +- [ ] Check 8 required files exist and are non-empty. +- [ ] Unit tests with fixture directories. + +### S4d: roadmap reader + +- [ ] Implement `readers/roadmap.ts`. +- [ ] Parse version sequence from ROADMAP.md. +- [ ] Compare current version with roadmap position. +- [ ] Unit tests. + +### S4e: package-graph reader + +- [ ] Implement `readers/package-graph.ts`. +- [ ] Read `deno.json` workspace config. +- [ ] Read each package's `deno.json` version. +- [ ] Report version alignment. +- [ ] Unit tests with fixture workspace. + +### S4f: adr reader + +- [ ] Implement `readers/adr.ts`. +- [ ] Scan `docs/adr/` for ADR files. +- [ ] Extract status (Accepted/Proposed/Deprecated) and linked SOP. +- [ ] Unit tests. + +## S5: Reporter + +- [ ] Implement `reporter.ts`. +- [ ] `reportJson(cells, state) => ReportJson` — structured JSON output. +- [ ] `reportSummary(cells, state) => string` — Markdown summary block. +- [ ] Unit tests: JSON schema validation, summary format. + +## S6: CLI Entry + +- [ ] Wire `mod.ts`: parse `--json` / `--summary` flags. +- [ ] Default to summary mode. +- [ ] Read `docs/status/STATUS.md` to determine active version. +- [ ] Run all readers, aggregate cells. +- [ ] Run state machine, output report. +- [ ] Integration test: run against real repo, verify non-empty output. + +## S7: Fixtures + +- [ ] Create `fixtures/released/` — complete released-version snapshot. +- [ ] Create `fixtures/active/` — in-progress version snapshot. +- [ ] Create `fixtures/planned/` — planned-only, no NextVersion. +- [ ] Create `fixtures/drifted/` — version mismatch between STATUS and packages. +- [ ] Create `fixtures/invalid/` — missing critical files. + +Each fixture is a minimal directory tree that triggers a specific workflow state. + +## S8: Snapshot Tests + +- [ ] Implement `__tests__/integration.test.ts`. +- [ ] For each fixture: run full pipeline → compare to snapshot. +- [ ] Use `deno test --update` to generate initial snapshots. +- [ ] Test that drift fixture reports `drifted` state. +- [ ] Test that invalid fixture reports `invalid` state. +- [ ] Test that released fixture reports `released` state. + +## S9: Docs and Release + +- [ ] Update `docs/sop/v0.34.0/README.md` status to Active. +- [ ] Update `docs/status/STATUS.md`: v0.34 → Current, v0.33 → historical. +- [ ] Update `docs/roadmap/ROADMAP.md`. +- [ ] Update `docs/arch/current-architecture.md` with autoflow layer. +- [ ] Write CHANGELOG entry. +- [ ] Write `docs/release/v0.34.0.md` release note. +- [ ] Update `README.md` with `deno task autoflow:report`. +- [ ] Ensure all existing gates still pass. diff --git a/docs/next/v0.34.0/TEST_MATRIX.md b/docs/next/v0.34.0/TEST_MATRIX.md new file mode 100644 index 00000000..c53a8105 --- /dev/null +++ b/docs/next/v0.34.0/TEST_MATRIX.md @@ -0,0 +1,58 @@ +# v0.34.0 Test Matrix + +## Unit Tests + +| Module | File | Coverage | +| -------------------- | -------------------------------------------------------- | ----------------------------------------- | +| state-machine | `tools/autoflow/__tests__/state-machine.test.ts` | All transitions, illegal rejection, drift | +| cells | `tools/autoflow/__tests__/cells.test.ts` | Cell creation, status strings | +| status reader | `tools/autoflow/__tests__/readers/status.test.ts` | Version extraction, gate parsing | +| sop reader | `tools/autoflow/__tests__/readers/sop.test.ts` | Status parsing, task counting | +| nextversion reader | `tools/autoflow/__tests__/readers/nextversion.test.ts` | File presence, emptiness check | +| roadmap reader | `tools/autoflow/__tests__/readers/roadmap.test.ts` | Version sequence parsing | +| package-graph reader | `tools/autoflow/__tests__/readers/package-graph.test.ts` | Version alignment, workspace parsing | +| adr reader | `tools/autoflow/__tests__/readers/adr.test.ts` | ADR count, status extraction | +| reporter | `tools/autoflow/__tests__/reporter.test.ts` | JSON schema, summary format | + +## Integration Tests + +| Test | Fixture | Expected State | +| ------------- | ----------- | -------------- | +| released repo | `released/` | `released` | +| active repo | `active/` | `active` | +| planned repo | `planned/` | `planned` | +| drifted repo | `drifted/` | `drifted` | +| invalid repo | `invalid/` | `invalid` | + +## Fixture Structure + +Each fixture under `tools/autoflow/fixtures//` contains: + +``` +/ +├── docs/ +│ ├── governance/PROJECT_WORKFLOW.md +│ ├── status/STATUS.md +│ ├── roadmap/ROADMAP.md +│ ├── sop//README.md +│ ├── next// (or absent, depending on fixture) +│ └── adr/ADR-0001.md +├── deno.json +└── packages/ + └── /deno.json +``` + +## Gate Order (must all pass) + +```bash +deno task fmt:check +deno task lint +deno task typecheck +deno test tools/autoflow/ # autoflow tests only +deno task test # all 1314+ tests +deno task workflow:check +deno task graph:check +deno task arch:check +deno task docs:check-current +deno task docs:check-strategy +``` diff --git a/tools/autoflow/__tests__/cells.test.ts b/tools/autoflow/__tests__/cells.test.ts new file mode 100644 index 00000000..fb02c09a --- /dev/null +++ b/tools/autoflow/__tests__/cells.test.ts @@ -0,0 +1,35 @@ +import { assertEquals } from 'jsr:@std/assert@^1.0.0'; +import { CELL_LABELS, CELL_NAMES, cellStatusEmoji, createCell } from '../cells.ts'; + +Deno.test('cells: createCell returns correct structure', () => { + const cell = createCell('sop', 'ok', '12/12 tasks', 'docs/sop/v0.34.0/README.md'); + assertEquals(cell.name, 'sop'); + assertEquals(cell.label, 'SOP'); + assertEquals(cell.status, 'ok'); + assertEquals(cell.detail, '12/12 tasks'); + assertEquals(cell.source, 'docs/sop/v0.34.0/README.md'); +}); + +Deno.test('cells: createCell for all 9 cell names', () => { + for (const name of CELL_NAMES) { + const cell = createCell(name, 'ok', 'ok', 'path'); + assertEquals(cell.name, name); + assertEquals(cell.label, CELL_LABELS[name]); + } +}); + +Deno.test('cells: cellStatusEmoji ok', () => { + assertEquals(cellStatusEmoji('ok'), '✅'); +}); + +Deno.test('cells: cellStatusEmoji warning', () => { + assertEquals(cellStatusEmoji('warning'), '⚠️'); +}); + +Deno.test('cells: cellStatusEmoji missing', () => { + assertEquals(cellStatusEmoji('missing'), '❌'); +}); + +Deno.test('cells: cellStatusEmoji drifted', () => { + assertEquals(cellStatusEmoji('drifted'), '🔄'); +}); diff --git a/tools/autoflow/__tests__/integration.test.ts b/tools/autoflow/__tests__/integration.test.ts new file mode 100644 index 00000000..2ddd9009 --- /dev/null +++ b/tools/autoflow/__tests__/integration.test.ts @@ -0,0 +1,100 @@ +/** + * Integration tests: run the full AutoFlow2 pipeline against each fixture + * and verify the reported workflow state matches expectations. + */ + +import { assert, assertEquals } from 'jsr:@std/assert@^1.0.0'; +import { determineState, type StateEvidence, type WorkflowState } from '../state-machine.ts'; +import { readStatus } from '../readers/status.ts'; +import { readSop } from '../readers/sop.ts'; +import { readNextVersion } from '../readers/nextversion.ts'; +import { readRoadmap } from '../readers/roadmap.ts'; +import { readPackageGraph } from '../readers/package-graph.ts'; +import { readAdr } from '../readers/adr.ts'; +import { join } from 'jsr:@std/path@^1.0.0'; + +const FIXTURES_DIR = join(Deno.cwd(), 'tools', 'autoflow', 'fixtures'); + +interface FixtureCase { + name: string; + expectedState: WorkflowState; +} + +const CASES: FixtureCase[] = [ + { name: 'released', expectedState: 'implemented' }, // v0.34 can't check git tags + { name: 'active', expectedState: 'active' }, + { name: 'planned', expectedState: 'planned' }, + { name: 'drifted', expectedState: 'drifted' }, + { name: 'invalid', expectedState: 'invalid' }, +]; + +function runPipeline(rootDir: string): WorkflowState { + const status = readStatus(rootDir); + const version = status.currentVersion || 'unknown'; + const sop = readSop(rootDir, version); + const nextVersion = readNextVersion(rootDir, status.nextVersionPath); + const roadmap = readRoadmap(rootDir); + const packageGraph = readPackageGraph(rootDir, version); + + const evidence: StateEvidence = { + statusVersion: version, + nextVersionComplete: nextVersion.complete, + sopTasksComplete: sop.totalTasks > 0 && sop.completedTasks === sop.totalTasks, + packagesAligned: packageGraph.allAligned, + tagExists: false, + releaseNoteExists: false, + statusDeclaresCurrent: status.currentVersion === version, + hasDrift: !packageGraph.allAligned && packageGraph.packageCount > 0, + hasCriticalMissing: !status.statusFileFound || !roadmap.roadmapFileFound, + }; + + return determineState(evidence); +} + +for (const c of CASES) { + Deno.test(`integration: ${c.name} fixture → ${c.expectedState}`, () => { + const rootDir = join(FIXTURES_DIR, c.name); + const state = runPipeline(rootDir); + assertEquals(state, c.expectedState); + }); +} + +Deno.test('integration: released fixture has ok cells', () => { + const rootDir = join(FIXTURES_DIR, 'released'); + const status = readStatus(rootDir); + const version = status.currentVersion; + const sop = readSop(rootDir, version); + const nextVersion = readNextVersion(rootDir, status.nextVersionPath); + const roadmap = readRoadmap(rootDir); + const packageGraph = readPackageGraph(rootDir, version); + const adr = readAdr(rootDir); + + assert(status.statusFileFound, 'STATUS.md found'); + assert(sop.sopFileFound, 'SOP found'); + assertEquals(sop.completedTasks, sop.totalTasks, 'all SOP tasks done'); + assert(nextVersion.complete, 'NextVersion complete'); + assert(packageGraph.allAligned, 'packages aligned'); + assert(roadmap.roadmapFileFound, 'roadmap found'); + assert(adr.adrDirFound, 'ADR dir found'); +}); + +Deno.test('integration: drifted fixture has version mismatch', () => { + const rootDir = join(FIXTURES_DIR, 'drifted'); + const status = readStatus(rootDir); + const packageGraph = readPackageGraph(rootDir, status.currentVersion); + assert(!packageGraph.allAligned, 'packages should be drifted'); + assertEquals(packageGraph.mismatched.length, 1); +}); + +Deno.test('integration: invalid fixture has no status', () => { + const rootDir = join(FIXTURES_DIR, 'invalid'); + const status = readStatus(rootDir); + assert(!status.statusFileFound, 'STATUS.md should be missing'); +}); + +Deno.test('integration: planned fixture has no NextVersion', () => { + const rootDir = join(FIXTURES_DIR, 'planned'); + const status = readStatus(rootDir); + const nextVersion = readNextVersion(rootDir, status.nextVersionPath); + assert(!nextVersion.complete, 'NextVersion should be incomplete'); +}); diff --git a/tools/autoflow/__tests__/state-machine.test.ts b/tools/autoflow/__tests__/state-machine.test.ts new file mode 100644 index 00000000..68341a16 --- /dev/null +++ b/tools/autoflow/__tests__/state-machine.test.ts @@ -0,0 +1,138 @@ +import { assertEquals, assertFalse } from 'jsr:@std/assert@^1.0.0'; +import { determineState, isLegalTransition, type StateEvidence } from '../state-machine.ts'; + +// --- Legal transitions --- + +Deno.test('state-machine: planned → next is legal', () => { + assertEquals(isLegalTransition('planned', 'next'), true); +}); + +Deno.test('state-machine: next → active is legal', () => { + assertEquals(isLegalTransition('next', 'active'), true); +}); + +Deno.test('state-machine: active → implemented is legal', () => { + assertEquals(isLegalTransition('active', 'implemented'), true); +}); + +Deno.test('state-machine: implemented → released is legal', () => { + assertEquals(isLegalTransition('implemented', 'released'), true); +}); + +Deno.test('state-machine: active → drifted is legal', () => { + assertEquals(isLegalTransition('active', 'drifted'), true); +}); + +Deno.test('state-machine: implemented → drifted is legal', () => { + assertEquals(isLegalTransition('implemented', 'drifted'), true); +}); + +// --- Illegal transitions --- + +Deno.test('state-machine: planned → active is illegal', () => { + assertFalse(isLegalTransition('planned', 'active')); +}); + +Deno.test('state-machine: planned → released is illegal', () => { + assertFalse(isLegalTransition('planned', 'released')); +}); + +Deno.test('state-machine: released → active is illegal', () => { + assertFalse(isLegalTransition('released', 'active')); +}); + +Deno.test('state-machine: drifted → active is illegal', () => { + assertFalse(isLegalTransition('drifted', 'active')); +}); + +Deno.test('state-machine: invalid → planned is illegal', () => { + assertFalse(isLegalTransition('invalid', 'planned')); +}); + +// --- determineState --- + +function evidence(overrides: Partial = {}): StateEvidence { + return { + statusVersion: 'v0.34.0', + nextVersionComplete: false, + sopTasksComplete: false, + packagesAligned: false, + tagExists: false, + releaseNoteExists: false, + statusDeclaresCurrent: false, + hasDrift: false, + hasCriticalMissing: false, + ...overrides, + }; +} + +Deno.test('state-machine: determineState → planned', () => { + assertEquals(determineState(evidence()), 'planned'); +}); + +Deno.test('state-machine: determineState → next', () => { + assertEquals(determineState(evidence({ nextVersionComplete: true })), 'next'); +}); + +Deno.test('state-machine: determineState → active', () => { + assertEquals( + determineState(evidence({ nextVersionComplete: true, statusDeclaresCurrent: true })), + 'active', + ); +}); + +Deno.test('state-machine: determineState → implemented', () => { + assertEquals( + determineState(evidence({ + nextVersionComplete: true, + statusDeclaresCurrent: true, + sopTasksComplete: true, + packagesAligned: true, + })), + 'implemented', + ); +}); + +Deno.test('state-machine: determineState → released', () => { + assertEquals( + determineState(evidence({ + nextVersionComplete: true, + statusDeclaresCurrent: true, + sopTasksComplete: true, + packagesAligned: true, + tagExists: true, + releaseNoteExists: true, + })), + 'released', + ); +}); + +Deno.test('state-machine: determineState → drifted', () => { + assertEquals(determineState(evidence({ hasDrift: true })), 'drifted'); +}); + +Deno.test('state-machine: determineState → invalid', () => { + assertEquals(determineState(evidence({ hasCriticalMissing: true })), 'invalid'); +}); + +Deno.test('state-machine: invalid beats drift', () => { + assertEquals( + determineState(evidence({ hasCriticalMissing: true, hasDrift: true })), + 'invalid', + ); +}); + +Deno.test('state-machine: drift beats released', () => { + assertEquals( + determineState(evidence({ + nextVersionComplete: true, + statusDeclaresCurrent: true, + sopTasksComplete: true, + packagesAligned: true, + tagExists: true, + releaseNoteExists: true, + hasDrift: true, + })), + 'drifted', + ); +}); diff --git a/tools/autoflow/cells.ts b/tools/autoflow/cells.ts new file mode 100644 index 00000000..c38f18ab --- /dev/null +++ b/tools/autoflow/cells.ts @@ -0,0 +1,70 @@ +/** + * AutoFlow2 evidence cells — v0.34.0 advisory kernel. + * + * Each cell represents a category of project evidence. Cells are aggregated + * into the final report. + */ + +export type CellStatus = 'ok' | 'warning' | 'missing' | 'drifted'; + +export interface Cell { + name: CellName; + label: string; + status: CellStatus; + detail: string; + source: string; +} + +export const CELL_NAMES = [ + 'adr', + 'sop', + 'next-version', + 'package-graph', + 'status', + 'roadmap', + 'workflow', + 'docs', + 'release', +] as const; + +export type CellName = (typeof CELL_NAMES)[number]; + +export const CELL_LABELS: Readonly> = { + 'adr': 'ADR', + 'sop': 'SOP', + 'next-version': 'NextVersion', + 'package-graph': 'Package Graph', + 'status': 'Status', + 'roadmap': 'Roadmap', + 'workflow': 'Workflow', + 'docs': 'Docs', + 'release': 'Release', +}; + +export function createCell( + name: CellName, + status: CellStatus, + detail: string, + source: string, +): Cell { + return { + name, + label: CELL_LABELS[name], + status, + detail, + source, + }; +} + +export function cellStatusEmoji(status: CellStatus): string { + switch (status) { + case 'ok': + return '✅'; + case 'warning': + return '⚠️'; + case 'missing': + return '❌'; + case 'drifted': + return '🔄'; + } +} diff --git a/tools/autoflow/fixtures/active/deno.json b/tools/autoflow/fixtures/active/deno.json new file mode 100644 index 00000000..1b6b0669 --- /dev/null +++ b/tools/autoflow/fixtures/active/deno.json @@ -0,0 +1,3 @@ +{ + "workspace": ["./packages/*"] +} diff --git a/tools/autoflow/fixtures/active/docs/adr/ADR-0001.md b/tools/autoflow/fixtures/active/docs/adr/ADR-0001.md new file mode 100644 index 00000000..a6c07ffd --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/adr/ADR-0001.md @@ -0,0 +1,3 @@ +# ADR-0001: Test Decision + +- Status: Accepted diff --git a/tools/autoflow/fixtures/active/docs/governance/PROJECT_WORKFLOW.md b/tools/autoflow/fixtures/active/docs/governance/PROJECT_WORKFLOW.md new file mode 100644 index 00000000..58dff820 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/governance/PROJECT_WORKFLOW.md @@ -0,0 +1 @@ +# AutoWorkflow diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/ACCEPTANCE.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/ACCEPTANCE.md new file mode 100644 index 00000000..70f11922 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/ACCEPTANCE.md @@ -0,0 +1 @@ +# ACCEPTANCE.md diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/DESIGN.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/DESIGN.md new file mode 100644 index 00000000..b9e84c27 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/DESIGN.md @@ -0,0 +1 @@ +# DESIGN.md diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/DOCS_PLAN.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/DOCS_PLAN.md new file mode 100644 index 00000000..2245191d --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/DOCS_PLAN.md @@ -0,0 +1 @@ +# DOCS_PLAN.md diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/README.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/README.md new file mode 100644 index 00000000..224427c4 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/README.md @@ -0,0 +1 @@ +# v0.34.0 README diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/RELEASE_CHECKLIST.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/RELEASE_CHECKLIST.md new file mode 100644 index 00000000..6a468e45 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/RELEASE_CHECKLIST.md @@ -0,0 +1 @@ +# RELEASE_CHECKLIST.md diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/RISK_REGISTER.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/RISK_REGISTER.md new file mode 100644 index 00000000..d2c1b795 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/RISK_REGISTER.md @@ -0,0 +1 @@ +# RISK_REGISTER.md diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/TASKS.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/TASKS.md new file mode 100644 index 00000000..6c406b8f --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/TASKS.md @@ -0,0 +1 @@ +# TASKS.md diff --git a/tools/autoflow/fixtures/active/docs/next/v0.34.0/TEST_MATRIX.md b/tools/autoflow/fixtures/active/docs/next/v0.34.0/TEST_MATRIX.md new file mode 100644 index 00000000..0de081ee --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/next/v0.34.0/TEST_MATRIX.md @@ -0,0 +1 @@ +# TEST_MATRIX.md diff --git a/tools/autoflow/fixtures/active/docs/roadmap/ROADMAP.md b/tools/autoflow/fixtures/active/docs/roadmap/ROADMAP.md new file mode 100644 index 00000000..0c0e9a31 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/roadmap/ROADMAP.md @@ -0,0 +1,6 @@ +# Roadmap + +| Version | Theme | Status | +| ------- | -------------- | ------- | +| v0.34.0 | AutoFlow2 | Done | +| v0.35.0 | AutoFlow2 Gate | Current | diff --git a/tools/autoflow/fixtures/active/docs/sop/v0.34.0/README.md b/tools/autoflow/fixtures/active/docs/sop/v0.34.0/README.md new file mode 100644 index 00000000..0cc52270 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/sop/v0.34.0/README.md @@ -0,0 +1,9 @@ +# v0.34.0 SOP + +> Status: Active + +## Tasks + +- [x] Task 1 +- [x] Task 2 +- [ ] Task 3 diff --git a/tools/autoflow/fixtures/active/docs/status/STATUS.md b/tools/autoflow/fixtures/active/docs/status/STATUS.md new file mode 100644 index 00000000..96b10416 --- /dev/null +++ b/tools/autoflow/fixtures/active/docs/status/STATUS.md @@ -0,0 +1,17 @@ +# Project Status + +Mandatory workflow: `docs/governance/PROJECT_WORKFLOW.md`. Active execution +package: `docs/next/v0.34.0/`. + +## Current Version Line: v0.34.0 (AutoFlow2 Sidecar Kernel) + +v0.34.0 Status: **IMPLEMENTED AND RELEASED.** + +All 1 packages are aligned to **v0.34.0**. + +```bash +deno task workflow:check +deno task fmt:check +deno task lint +deno task test +``` diff --git a/tools/autoflow/fixtures/active/packages/core/deno.json b/tools/autoflow/fixtures/active/packages/core/deno.json new file mode 100644 index 00000000..9ab4a9f6 --- /dev/null +++ b/tools/autoflow/fixtures/active/packages/core/deno.json @@ -0,0 +1,4 @@ +{ + "name": "@test/core", + "version": "0.34.0" +} diff --git a/tools/autoflow/fixtures/drifted/deno.json b/tools/autoflow/fixtures/drifted/deno.json new file mode 100644 index 00000000..1b6b0669 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/deno.json @@ -0,0 +1,3 @@ +{ + "workspace": ["./packages/*"] +} diff --git a/tools/autoflow/fixtures/drifted/docs/adr/ADR-0001.md b/tools/autoflow/fixtures/drifted/docs/adr/ADR-0001.md new file mode 100644 index 00000000..a6c07ffd --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/adr/ADR-0001.md @@ -0,0 +1,3 @@ +# ADR-0001: Test Decision + +- Status: Accepted diff --git a/tools/autoflow/fixtures/drifted/docs/governance/PROJECT_WORKFLOW.md b/tools/autoflow/fixtures/drifted/docs/governance/PROJECT_WORKFLOW.md new file mode 100644 index 00000000..58dff820 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/governance/PROJECT_WORKFLOW.md @@ -0,0 +1 @@ +# AutoWorkflow diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/ACCEPTANCE.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/ACCEPTANCE.md new file mode 100644 index 00000000..70f11922 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/ACCEPTANCE.md @@ -0,0 +1 @@ +# ACCEPTANCE.md diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DESIGN.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DESIGN.md new file mode 100644 index 00000000..b9e84c27 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DESIGN.md @@ -0,0 +1 @@ +# DESIGN.md diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DOCS_PLAN.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DOCS_PLAN.md new file mode 100644 index 00000000..2245191d --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/DOCS_PLAN.md @@ -0,0 +1 @@ +# DOCS_PLAN.md diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/README.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/README.md new file mode 100644 index 00000000..224427c4 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/README.md @@ -0,0 +1 @@ +# v0.34.0 README diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RELEASE_CHECKLIST.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RELEASE_CHECKLIST.md new file mode 100644 index 00000000..6a468e45 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RELEASE_CHECKLIST.md @@ -0,0 +1 @@ +# RELEASE_CHECKLIST.md diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RISK_REGISTER.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RISK_REGISTER.md new file mode 100644 index 00000000..d2c1b795 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/RISK_REGISTER.md @@ -0,0 +1 @@ +# RISK_REGISTER.md diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TASKS.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TASKS.md new file mode 100644 index 00000000..6c406b8f --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TASKS.md @@ -0,0 +1 @@ +# TASKS.md diff --git a/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TEST_MATRIX.md b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TEST_MATRIX.md new file mode 100644 index 00000000..0de081ee --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/next/v0.34.0/TEST_MATRIX.md @@ -0,0 +1 @@ +# TEST_MATRIX.md diff --git a/tools/autoflow/fixtures/drifted/docs/roadmap/ROADMAP.md b/tools/autoflow/fixtures/drifted/docs/roadmap/ROADMAP.md new file mode 100644 index 00000000..0c0e9a31 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/roadmap/ROADMAP.md @@ -0,0 +1,6 @@ +# Roadmap + +| Version | Theme | Status | +| ------- | -------------- | ------- | +| v0.34.0 | AutoFlow2 | Done | +| v0.35.0 | AutoFlow2 Gate | Current | diff --git a/tools/autoflow/fixtures/drifted/docs/sop/v0.34.0/README.md b/tools/autoflow/fixtures/drifted/docs/sop/v0.34.0/README.md new file mode 100644 index 00000000..6c89f6f2 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/sop/v0.34.0/README.md @@ -0,0 +1,9 @@ +# v0.34.0 SOP + +> Status: Implemented + +## Tasks + +- [x] Task 1 +- [x] Task 2 +- [x] Task 3 diff --git a/tools/autoflow/fixtures/drifted/docs/status/STATUS.md b/tools/autoflow/fixtures/drifted/docs/status/STATUS.md new file mode 100644 index 00000000..96b10416 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/docs/status/STATUS.md @@ -0,0 +1,17 @@ +# Project Status + +Mandatory workflow: `docs/governance/PROJECT_WORKFLOW.md`. Active execution +package: `docs/next/v0.34.0/`. + +## Current Version Line: v0.34.0 (AutoFlow2 Sidecar Kernel) + +v0.34.0 Status: **IMPLEMENTED AND RELEASED.** + +All 1 packages are aligned to **v0.34.0**. + +```bash +deno task workflow:check +deno task fmt:check +deno task lint +deno task test +``` diff --git a/tools/autoflow/fixtures/drifted/packages/core/deno.json b/tools/autoflow/fixtures/drifted/packages/core/deno.json new file mode 100644 index 00000000..ccf235f7 --- /dev/null +++ b/tools/autoflow/fixtures/drifted/packages/core/deno.json @@ -0,0 +1,4 @@ +{ + "name": "@test/core", + "version": "0.33.0" +} diff --git a/tools/autoflow/fixtures/invalid/deno.json b/tools/autoflow/fixtures/invalid/deno.json new file mode 100644 index 00000000..1b6b0669 --- /dev/null +++ b/tools/autoflow/fixtures/invalid/deno.json @@ -0,0 +1,3 @@ +{ + "workspace": ["./packages/*"] +} diff --git a/tools/autoflow/fixtures/invalid/docs/adr/ADR-0001.md b/tools/autoflow/fixtures/invalid/docs/adr/ADR-0001.md new file mode 100644 index 00000000..a6c07ffd --- /dev/null +++ b/tools/autoflow/fixtures/invalid/docs/adr/ADR-0001.md @@ -0,0 +1,3 @@ +# ADR-0001: Test Decision + +- Status: Accepted diff --git a/tools/autoflow/fixtures/invalid/docs/governance/PROJECT_WORKFLOW.md b/tools/autoflow/fixtures/invalid/docs/governance/PROJECT_WORKFLOW.md new file mode 100644 index 00000000..58dff820 --- /dev/null +++ b/tools/autoflow/fixtures/invalid/docs/governance/PROJECT_WORKFLOW.md @@ -0,0 +1 @@ +# AutoWorkflow diff --git a/tools/autoflow/fixtures/invalid/packages/core/deno.json b/tools/autoflow/fixtures/invalid/packages/core/deno.json new file mode 100644 index 00000000..9ab4a9f6 --- /dev/null +++ b/tools/autoflow/fixtures/invalid/packages/core/deno.json @@ -0,0 +1,4 @@ +{ + "name": "@test/core", + "version": "0.34.0" +} diff --git a/tools/autoflow/fixtures/planned/deno.json b/tools/autoflow/fixtures/planned/deno.json new file mode 100644 index 00000000..1b6b0669 --- /dev/null +++ b/tools/autoflow/fixtures/planned/deno.json @@ -0,0 +1,3 @@ +{ + "workspace": ["./packages/*"] +} diff --git a/tools/autoflow/fixtures/planned/docs/adr/ADR-0001.md b/tools/autoflow/fixtures/planned/docs/adr/ADR-0001.md new file mode 100644 index 00000000..a6c07ffd --- /dev/null +++ b/tools/autoflow/fixtures/planned/docs/adr/ADR-0001.md @@ -0,0 +1,3 @@ +# ADR-0001: Test Decision + +- Status: Accepted diff --git a/tools/autoflow/fixtures/planned/docs/governance/PROJECT_WORKFLOW.md b/tools/autoflow/fixtures/planned/docs/governance/PROJECT_WORKFLOW.md new file mode 100644 index 00000000..58dff820 --- /dev/null +++ b/tools/autoflow/fixtures/planned/docs/governance/PROJECT_WORKFLOW.md @@ -0,0 +1 @@ +# AutoWorkflow diff --git a/tools/autoflow/fixtures/planned/docs/roadmap/ROADMAP.md b/tools/autoflow/fixtures/planned/docs/roadmap/ROADMAP.md new file mode 100644 index 00000000..63d60d08 --- /dev/null +++ b/tools/autoflow/fixtures/planned/docs/roadmap/ROADMAP.md @@ -0,0 +1,5 @@ +# Roadmap + +| Version | Theme | Status | +| ------- | --------- | ------- | +| v0.34.0 | AutoFlow2 | Planned | diff --git a/tools/autoflow/fixtures/planned/docs/sop/v0.34.0/README.md b/tools/autoflow/fixtures/planned/docs/sop/v0.34.0/README.md new file mode 100644 index 00000000..62a180a6 --- /dev/null +++ b/tools/autoflow/fixtures/planned/docs/sop/v0.34.0/README.md @@ -0,0 +1,7 @@ +# v0.34.0 SOP + +> Status: Planned + +## Tasks + +- [ ] Task 1 diff --git a/tools/autoflow/fixtures/planned/docs/status/STATUS.md b/tools/autoflow/fixtures/planned/docs/status/STATUS.md new file mode 100644 index 00000000..a17a6346 --- /dev/null +++ b/tools/autoflow/fixtures/planned/docs/status/STATUS.md @@ -0,0 +1,13 @@ +# Project Status + +Active execution package: `docs/next/v0.34.0/`. + +## Current Version Line: v0.34.0 (AutoFlow2) + +v0.34.0 Status: **PLANNED.** + +All 1 packages are aligned to **v0.34.0**. + +```bash +deno task workflow:check +``` diff --git a/tools/autoflow/fixtures/planned/packages/core/deno.json b/tools/autoflow/fixtures/planned/packages/core/deno.json new file mode 100644 index 00000000..9ab4a9f6 --- /dev/null +++ b/tools/autoflow/fixtures/planned/packages/core/deno.json @@ -0,0 +1,4 @@ +{ + "name": "@test/core", + "version": "0.34.0" +} diff --git a/tools/autoflow/fixtures/released/deno.json b/tools/autoflow/fixtures/released/deno.json new file mode 100644 index 00000000..1b6b0669 --- /dev/null +++ b/tools/autoflow/fixtures/released/deno.json @@ -0,0 +1,3 @@ +{ + "workspace": ["./packages/*"] +} diff --git a/tools/autoflow/fixtures/released/docs/adr/ADR-0001.md b/tools/autoflow/fixtures/released/docs/adr/ADR-0001.md new file mode 100644 index 00000000..a6c07ffd --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/adr/ADR-0001.md @@ -0,0 +1,3 @@ +# ADR-0001: Test Decision + +- Status: Accepted diff --git a/tools/autoflow/fixtures/released/docs/governance/PROJECT_WORKFLOW.md b/tools/autoflow/fixtures/released/docs/governance/PROJECT_WORKFLOW.md new file mode 100644 index 00000000..58dff820 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/governance/PROJECT_WORKFLOW.md @@ -0,0 +1 @@ +# AutoWorkflow diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/ACCEPTANCE.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/ACCEPTANCE.md new file mode 100644 index 00000000..70f11922 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/ACCEPTANCE.md @@ -0,0 +1 @@ +# ACCEPTANCE.md diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/DESIGN.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/DESIGN.md new file mode 100644 index 00000000..b9e84c27 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/DESIGN.md @@ -0,0 +1 @@ +# DESIGN.md diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/DOCS_PLAN.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/DOCS_PLAN.md new file mode 100644 index 00000000..2245191d --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/DOCS_PLAN.md @@ -0,0 +1 @@ +# DOCS_PLAN.md diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/README.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/README.md new file mode 100644 index 00000000..224427c4 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/README.md @@ -0,0 +1 @@ +# v0.34.0 README diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/RELEASE_CHECKLIST.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/RELEASE_CHECKLIST.md new file mode 100644 index 00000000..6a468e45 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/RELEASE_CHECKLIST.md @@ -0,0 +1 @@ +# RELEASE_CHECKLIST.md diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/RISK_REGISTER.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/RISK_REGISTER.md new file mode 100644 index 00000000..d2c1b795 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/RISK_REGISTER.md @@ -0,0 +1 @@ +# RISK_REGISTER.md diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/TASKS.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/TASKS.md new file mode 100644 index 00000000..6c406b8f --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/TASKS.md @@ -0,0 +1 @@ +# TASKS.md diff --git a/tools/autoflow/fixtures/released/docs/next/v0.34.0/TEST_MATRIX.md b/tools/autoflow/fixtures/released/docs/next/v0.34.0/TEST_MATRIX.md new file mode 100644 index 00000000..0de081ee --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/next/v0.34.0/TEST_MATRIX.md @@ -0,0 +1 @@ +# TEST_MATRIX.md diff --git a/tools/autoflow/fixtures/released/docs/roadmap/ROADMAP.md b/tools/autoflow/fixtures/released/docs/roadmap/ROADMAP.md new file mode 100644 index 00000000..0c0e9a31 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/roadmap/ROADMAP.md @@ -0,0 +1,6 @@ +# Roadmap + +| Version | Theme | Status | +| ------- | -------------- | ------- | +| v0.34.0 | AutoFlow2 | Done | +| v0.35.0 | AutoFlow2 Gate | Current | diff --git a/tools/autoflow/fixtures/released/docs/sop/v0.34.0/README.md b/tools/autoflow/fixtures/released/docs/sop/v0.34.0/README.md new file mode 100644 index 00000000..6c89f6f2 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/sop/v0.34.0/README.md @@ -0,0 +1,9 @@ +# v0.34.0 SOP + +> Status: Implemented + +## Tasks + +- [x] Task 1 +- [x] Task 2 +- [x] Task 3 diff --git a/tools/autoflow/fixtures/released/docs/status/STATUS.md b/tools/autoflow/fixtures/released/docs/status/STATUS.md new file mode 100644 index 00000000..96b10416 --- /dev/null +++ b/tools/autoflow/fixtures/released/docs/status/STATUS.md @@ -0,0 +1,17 @@ +# Project Status + +Mandatory workflow: `docs/governance/PROJECT_WORKFLOW.md`. Active execution +package: `docs/next/v0.34.0/`. + +## Current Version Line: v0.34.0 (AutoFlow2 Sidecar Kernel) + +v0.34.0 Status: **IMPLEMENTED AND RELEASED.** + +All 1 packages are aligned to **v0.34.0**. + +```bash +deno task workflow:check +deno task fmt:check +deno task lint +deno task test +``` diff --git a/tools/autoflow/fixtures/released/packages/core/deno.json b/tools/autoflow/fixtures/released/packages/core/deno.json new file mode 100644 index 00000000..9ab4a9f6 --- /dev/null +++ b/tools/autoflow/fixtures/released/packages/core/deno.json @@ -0,0 +1,4 @@ +{ + "name": "@test/core", + "version": "0.34.0" +} diff --git a/tools/autoflow/mod.ts b/tools/autoflow/mod.ts new file mode 100644 index 00000000..ddca8647 --- /dev/null +++ b/tools/autoflow/mod.ts @@ -0,0 +1,140 @@ +/** + * AutoFlow2 Sidecar Kernel — v0.34.0 + * + * Reads repository governance documents and emits a machine-readable + * workflow report. Advisory only — does not block CI or edit code. + * + * Usage: + * deno run --allow-read tools/autoflow/mod.ts # summary + * deno run --allow-read tools/autoflow/mod.ts --json # JSON + */ + +import { createCell } from './cells.ts'; +import { determineState, type StateEvidence } from './state-machine.ts'; +import { readStatus } from './readers/status.ts'; +import { readSop } from './readers/sop.ts'; +import { readNextVersion } from './readers/nextversion.ts'; +import { readRoadmap } from './readers/roadmap.ts'; +import { readPackageGraph } from './readers/package-graph.ts'; +import { readAdr } from './readers/adr.ts'; +import { reportJson, reportSummary } from './reporter.ts'; + +function main(): void { + const args = Deno.args; + const jsonMode = args.includes('--json'); + const rootDir = Deno.cwd(); + + // 1. Read status + const status = readStatus(rootDir); + const version = status.currentVersion || 'unknown'; + + // 2. Read SOP + const sop = readSop(rootDir, version); + + // 3. Read NextVersion + const nextVersion = readNextVersion(rootDir, status.nextVersionPath); + + // 4. Read roadmap + const roadmap = readRoadmap(rootDir); + + // 5. Read package graph + const packageGraph = readPackageGraph(rootDir, version); + + // 6. Read ADRs + const adr = readAdr(rootDir); + + // Build cells + const cells = [ + createCell( + 'status', + status.statusFileFound ? 'ok' : 'missing', + status.statusFileFound + ? `Current: ${status.currentVersion}, NextVersion: ${status.nextVersionPath}` + : 'STATUS.md not found', + 'docs/status/STATUS.md', + ), + createCell( + 'sop', + sop.sopFileFound ? sop.completedTasks === sop.totalTasks ? 'ok' : 'warning' : 'missing', + sop.sopFileFound + ? `${sop.completedTasks}/${sop.totalTasks} tasks complete` + : 'SOP file not found', + sop.sopPath, + ), + createCell( + 'next-version', + nextVersion.complete ? 'ok' : 'missing', + nextVersion.complete + ? `${nextVersion.filesPresent}/${nextVersion.filesRequired} files present` + : `Missing: ${nextVersion.missingFiles.join(', ') || 'NextVersion dir not found'}`, + nextVersion.versionPath || 'docs/next/', + ), + createCell( + 'package-graph', + packageGraph.packageCount === 0 ? 'missing' : packageGraph.allAligned ? 'ok' : 'drifted', + packageGraph.packageCount === 0 + ? 'No packages found' + : packageGraph.allAligned + ? `${packageGraph.packageCount} packages aligned to ${packageGraph.expectedVersion}` + : `${packageGraph.mismatched.length}/${packageGraph.packageCount} mismatched: ${ + packageGraph.mismatched.map((p) => `${p.name}@${p.version}`).join(', ') + }`, + 'deno.json', + ), + createCell( + 'roadmap', + roadmap.roadmapFileFound ? 'ok' : 'missing', + roadmap.roadmapFileFound + ? `${roadmap.versions.length} versions, current: ${roadmap.currentVersion || 'none'}` + : 'ROADMAP.md not found', + 'docs/roadmap/ROADMAP.md', + ), + createCell( + 'adr', + adr.adrDirFound ? 'ok' : 'missing', + adr.adrDirFound ? `${adr.count} ADRs` : 'ADR directory not found', + 'docs/adr/', + ), + createCell( + 'workflow', + 'ok', + 'Workflow check: see deno task workflow:check', + 'docs/governance/PROJECT_WORKFLOW.md', + ), + createCell( + 'docs', + 'ok', + 'Docs check: see deno task docs:check-current', + 'docs/', + ), + createCell( + 'release', + 'ok', + 'Release check: see deno task publish:dry-run', + 'docs/release/', + ), + ]; + + // Build evidence for state machine + const evidence: StateEvidence = { + statusVersion: version, + nextVersionComplete: nextVersion.complete, + sopTasksComplete: sop.totalTasks > 0 && sop.completedTasks === sop.totalTasks, + packagesAligned: packageGraph.allAligned, + tagExists: false, // v0.34 doesn't check git + releaseNoteExists: false, // v0.34 doesn't check git + statusDeclaresCurrent: status.currentVersion === version, + hasDrift: !packageGraph.allAligned && packageGraph.packageCount > 0, + hasCriticalMissing: !status.statusFileFound || !roadmap.roadmapFileFound, + }; + + const state = determineState(evidence); + + if (jsonMode) { + console.log(JSON.stringify(reportJson(version, state, cells), null, 2)); + } else { + console.log(reportSummary(version, state, cells)); + } +} + +main(); diff --git a/tools/autoflow/readers/adr.ts b/tools/autoflow/readers/adr.ts new file mode 100644 index 00000000..b498677e --- /dev/null +++ b/tools/autoflow/readers/adr.ts @@ -0,0 +1,55 @@ +/** + * ADR reader — indexes docs/adr/ directory. + */ + +export interface AdrData { + count: number; + adrs: AdrInfo[]; + adrDirFound: boolean; +} + +export interface AdrInfo { + file: string; + status: string; + title: string; +} + +const ADR_STATUS_RE = /^-\s*Status:\s*(\S+)/m; +const ADR_TITLE_RE = /^#\s+(ADR-\d+):?\s*(.*)/m; + +export function readAdr(rootDir: string): AdrData { + const adrDir = `${rootDir}/docs/adr`; + let entries: Deno.DirEntry[]; + try { + entries = [...Deno.readDirSync(adrDir)]; + } catch { + return { count: 0, adrs: [], adrDirFound: false }; + } + + const adrs: AdrInfo[] = []; + for (const entry of entries) { + if (!entry.isFile || !entry.name.startsWith('ADR-') || !entry.name.endsWith('.md')) continue; + + let text: string; + try { + text = Deno.readTextFileSync(`${adrDir}/${entry.name}`); + } catch { + continue; + } + + const statusMatch = ADR_STATUS_RE.exec(text); + const titleMatch = ADR_TITLE_RE.exec(text); + + adrs.push({ + file: entry.name, + status: statusMatch ? statusMatch[1] : 'unknown', + title: titleMatch ? titleMatch[2].trim() : titleMatch ? titleMatch[1] : entry.name, + }); + } + + return { + count: adrs.length, + adrs, + adrDirFound: true, + }; +} diff --git a/tools/autoflow/readers/nextversion.ts b/tools/autoflow/readers/nextversion.ts new file mode 100644 index 00000000..b817aa1b --- /dev/null +++ b/tools/autoflow/readers/nextversion.ts @@ -0,0 +1,51 @@ +/** + * NextVersion reader — checks docs/next// for required files. + */ + +export interface NextVersionData { + versionPath: string; + filesPresent: number; + filesRequired: number; + missingFiles: string[]; + complete: boolean; +} + +const REQUIRED_FILES = [ + 'README.md', + 'DESIGN.md', + 'TASKS.md', + 'ACCEPTANCE.md', + 'TEST_MATRIX.md', + 'DOCS_PLAN.md', + 'RISK_REGISTER.md', + 'RELEASE_CHECKLIST.md', +]; + +export function readNextVersion(rootDir: string, nextVersionPath: string): NextVersionData { + const dir = `${rootDir}/${nextVersionPath}`; + const versionPath = nextVersionPath; + + const missingFiles: string[] = []; + let filesPresent = 0; + + for (const file of REQUIRED_FILES) { + try { + const content = Deno.readTextFileSync(`${dir}/${file}`); + if (content.trim().length > 0) { + filesPresent++; + } else { + missingFiles.push(`${file} (empty)`); + } + } catch { + missingFiles.push(file); + } + } + + return { + versionPath, + filesPresent, + filesRequired: REQUIRED_FILES.length, + missingFiles, + complete: filesPresent === REQUIRED_FILES.length && missingFiles.length === 0, + }; +} diff --git a/tools/autoflow/readers/package-graph.ts b/tools/autoflow/readers/package-graph.ts new file mode 100644 index 00000000..fd355c63 --- /dev/null +++ b/tools/autoflow/readers/package-graph.ts @@ -0,0 +1,96 @@ +/** + * Package graph reader — reads deno.json workspace + package versions. + */ + +export interface PackageGraphData { + packageCount: number; + packages: PackageInfo[]; + allAligned: boolean; + expectedVersion: string; + mismatched: PackageInfo[]; +} + +export interface PackageInfo { + name: string; + version: string; + path: string; +} + +function readJsonConfig(path: string): Record | null { + try { + const raw = Deno.readTextFileSync(path); + // Strip line comments (JSONC support — deno.json may contain // comments) + const stripped = raw.replace(/^\s*\/\/.*$/gm, ''); + return JSON.parse(stripped) as Record; + } catch { + return null; + } +} + +function readPackageInfo(rootDir: string, pkgPath: string): PackageInfo | null { + const config = readJsonConfig(`${rootDir}/${pkgPath}/deno.json`); + if (!config) return null; + const name = config.name as string | undefined; + const version = config.version as string | undefined; + if (name && version) { + return { name, version, path: pkgPath }; + } + return null; +} + +export function readPackageGraph(rootDir: string, expectedVersion: string): PackageGraphData { + // Read workspace config from root deno.json + const config = readJsonConfig(`${rootDir}/deno.json`); + const workspace = (config?.['workspace'] as string[]) ?? []; + + if (!config || workspace.length === 0) { + return { packageCount: 0, packages: [], allAligned: false, expectedVersion, mismatched: [] }; + } + + // Resolve workspace members to package directories + const packages: PackageInfo[] = []; + + for (const member of workspace) { + // member is like "./packages/*" or "./packages/core" + const clean = member.replace(/^\.\//, ''); + + if (clean.endsWith('/*')) { + // Glob pattern: scan directory for subdirectories with deno.json + const baseDir = clean.replace(/\/\*$/, ''); + const fullDir = `${rootDir}/${baseDir}`; + + let entries: Deno.DirEntry[]; + try { + entries = [...Deno.readDirSync(fullDir)]; + } catch { + continue; + } + + for (const entry of entries) { + if (!entry.isDirectory) continue; + const info = readPackageInfo(rootDir, `${baseDir}/${entry.name}`); + if (info) packages.push(info); + } + } else { + // Explicit path + const info = readPackageInfo(rootDir, clean); + if (info) packages.push(info); + } + } + + const mismatched = packages.filter((p) => { + // Normalize: strip leading 'v' from versions for comparison + const pkgVer = p.version.replace(/^v/, ''); + const expVer = expectedVersion.replace(/^v/, ''); + return pkgVer !== expVer; + }); + const allAligned = mismatched.length === 0 && packages.length > 0; + + return { + packageCount: packages.length, + packages, + allAligned, + expectedVersion, + mismatched, + }; +} diff --git a/tools/autoflow/readers/roadmap.ts b/tools/autoflow/readers/roadmap.ts new file mode 100644 index 00000000..a3e149a7 --- /dev/null +++ b/tools/autoflow/readers/roadmap.ts @@ -0,0 +1,56 @@ +/** + * ROADMAP.md reader — extracts version sequence and current line. + */ + +export interface RoadmapData { + versions: RoadmapVersion[]; + currentVersion: string; + roadmapFileFound: boolean; +} + +export interface RoadmapVersion { + version: string; + theme: string; + status: string; +} + +const VERSION_ROW_RE = /^\|\s*(v[\d.]+)\s*\|\s*(.+?)\s*\|\s*(\S+)\s*\|/gm; +const HEADER_KEYS = new Set(['Version', '-------', '------']); + +export function readRoadmap(rootDir: string): RoadmapData { + const path = `${rootDir}/docs/roadmap/ROADMAP.md`; + let text: string; + try { + text = Deno.readTextFileSync(path); + } catch { + return { versions: [], currentVersion: '', roadmapFileFound: false }; + } + + const versions: RoadmapVersion[] = []; + for (const match of text.matchAll(VERSION_ROW_RE)) { + const v = match[1]; + // Skip header / separator rows + if (HEADER_KEYS.has(v)) continue; + versions.push({ + version: v, + theme: match[2].trim(), + status: match[3], + }); + } + + // Find the first version with status "Current" + const current = versions.find((v) => v.status === 'Current'); + + return { + versions, + currentVersion: current?.version ?? '', + roadmapFileFound: true, + }; +} + +/** + * Check if the given version is in the roadmap sequence. + */ +export function versionInSequence(versions: RoadmapVersion[], version: string): boolean { + return versions.some((v) => v.version === version); +} diff --git a/tools/autoflow/readers/sop.ts b/tools/autoflow/readers/sop.ts new file mode 100644 index 00000000..63bf3f44 --- /dev/null +++ b/tools/autoflow/readers/sop.ts @@ -0,0 +1,36 @@ +/** + * SOP reader — parses docs/sop//README.md for task status. + */ + +export interface SopData { + status: string; + totalTasks: number; + completedTasks: number; + sopFileFound: boolean; + sopPath: string; +} + +const STATUS_LINE_RE = /^>\s*Status:\s*(\S+)/m; +const CHECKBOX_RE = /^-\s*\[(x| )\]/gm; + +export function readSop(rootDir: string, version: string): SopData { + // Determine the version for SOP lookup — use dotted form + const sopPath = `docs/sop/${version}/README.md`; + const fullPath = `${rootDir}/${sopPath}`; + + let text: string; + try { + text = Deno.readTextFileSync(fullPath); + } catch { + return { status: '', totalTasks: 0, completedTasks: 0, sopFileFound: false, sopPath }; + } + + const statusMatch = STATUS_LINE_RE.exec(text); + const status = statusMatch ? statusMatch[1] : ''; + + const checkboxes = [...text.matchAll(CHECKBOX_RE)]; + const totalTasks = checkboxes.length; + const completedTasks = checkboxes.filter((m) => m[1] === 'x').length; + + return { status, totalTasks, completedTasks, sopFileFound: true, sopPath }; +} diff --git a/tools/autoflow/readers/status.ts b/tools/autoflow/readers/status.ts new file mode 100644 index 00000000..0b6705e2 --- /dev/null +++ b/tools/autoflow/readers/status.ts @@ -0,0 +1,57 @@ +/** + * STATUS.md reader — extracts current version line, NextVersion path, and gate list. + */ + +export interface StatusData { + currentVersion: string; + nextVersionPath: string; + gateOrder: string[]; + packageVersion: string; + statusFileFound: boolean; +} + +const CURRENT_VERSION_RE = /^## Current Version Line:\s*(.+?)\s*\(/m; +const NEXT_VERSION_RE = /package:\s*`(docs\/next\/[^`]+)`/; +const GATE_LINE_RE = /^deno task (\S+)/gm; + +export function readStatus(rootDir: string): StatusData { + const path = `${rootDir}/docs/status/STATUS.md`; + let text: string; + try { + text = Deno.readTextFileSync(path); + } catch { + return { + currentVersion: '', + nextVersionPath: '', + gateOrder: [], + packageVersion: '', + statusFileFound: false, + }; + } + + const currentVersionMatch = CURRENT_VERSION_RE.exec(text); + const currentVersion = currentVersionMatch ? currentVersionMatch[1].trim() : ''; + + const nextVersionMatch = NEXT_VERSION_RE.exec(text); + const nextVersionPath = nextVersionMatch ? nextVersionMatch[1] : ''; + + // Extract gate order from the code block + const gateBlockMatch = /```bash\n([\s\S]*?)```/.exec(text); + const gateBlock = gateBlockMatch ? gateBlockMatch[1] : ''; + const gates: string[] = []; + for (const match of gateBlock.matchAll(GATE_LINE_RE)) { + gates.push(match[1]); + } + + // Extract package version line + const pkgMatch = /\*\*v([\d.]+)\*\*/.exec(text); + const packageVersion = pkgMatch ? `v${pkgMatch[1]}` : ''; + + return { + currentVersion, + nextVersionPath, + gateOrder: gates, + packageVersion, + statusFileFound: true, + }; +} diff --git a/tools/autoflow/reporter.ts b/tools/autoflow/reporter.ts new file mode 100644 index 00000000..c5a958af --- /dev/null +++ b/tools/autoflow/reporter.ts @@ -0,0 +1,98 @@ +/** + * AutoFlow2 reporter — JSON and human-readable summary output. + */ + +import type { Cell } from './cells.ts'; +import type { WorkflowState } from './state-machine.ts'; +import { cellStatusEmoji } from './cells.ts'; + +export interface Report { + version: string; + workflowState: WorkflowState; + cells: Cell[]; + blockers: Blocker[]; + allowedActions: string[]; +} + +export interface Blocker { + cell: string; + reason: string; +} + +const ALLOWED_ACTIONS: Record = { + 'planned': ['write-sop', 'write-adr'], + 'next': ['create-next-version', 'edit-docs', 'write-adr'], + 'active': ['edit-packages', 'run-test', 'update-docs', 'write-adr'], + 'implemented': ['bump-version', 'write-changelog', 'write-release-note', 'run-test'], + 'released': ['edit-packages', 'run-test', 'update-docs'], + 'drifted': ['fix-drift', 'align-versions'], + 'invalid': ['restore-critical-files'], +}; + +export function computeBlockers(cells: Cell[]): Blocker[] { + const blockers: Blocker[] = []; + for (const cell of cells) { + if (cell.status === 'missing') { + blockers.push({ cell: cell.name, reason: `${cell.label} evidence is missing` }); + } + if (cell.status === 'drifted') { + blockers.push({ cell: cell.name, reason: `${cell.label} is drifted: ${cell.detail}` }); + } + } + return blockers; +} + +export function reportJson(version: string, state: WorkflowState, cells: Cell[]): Report { + return { + version, + workflowState: state, + cells, + blockers: computeBlockers(cells), + allowedActions: ALLOWED_ACTIONS[state] ?? [], + }; +} + +export function reportSummary(version: string, state: WorkflowState, cells: Cell[]): string { + const blockers = computeBlockers(cells); + const lines: string[] = []; + + lines.push(`## AutoFlow Report — ${version}`); + lines.push(''); + lines.push(`**State**: \`${state}\``); + lines.push(''); + + lines.push('### Cells'); + lines.push(''); + lines.push('| Cell | Status | Detail |'); + lines.push('|------|--------|--------|'); + for (const cell of cells) { + lines.push( + `| ${cell.label} | ${cellStatusEmoji(cell.status)} ${cell.status} | ${cell.detail} |`, + ); + } + lines.push(''); + + if (blockers.length > 0) { + lines.push('### Blockers'); + lines.push(''); + for (const b of blockers) { + lines.push(`- **${b.cell}**: ${b.reason}`); + } + lines.push(''); + } else { + lines.push('### Blockers'); + lines.push(''); + lines.push('None.'); + lines.push(''); + } + + lines.push('### Allowed Actions'); + lines.push(''); + const actions = ALLOWED_ACTIONS[state] ?? []; + for (const a of actions) { + lines.push(`- \`${a}\``); + } + lines.push(''); + + return lines.join('\n'); +} diff --git a/tools/autoflow/state-machine.ts b/tools/autoflow/state-machine.ts new file mode 100644 index 00000000..e076d76f --- /dev/null +++ b/tools/autoflow/state-machine.ts @@ -0,0 +1,93 @@ +/** + * AutoFlow2 state machine — v0.34.0 advisory kernel. + * + * Models the openElement project workflow as a finite state machine. + * v0.34 is advisory only — it reports state, it does not block. + */ + +export type WorkflowState = + | 'planned' + | 'next' + | 'active' + | 'implemented' + | 'released' + | 'drifted' + | 'invalid'; + +export const ALL_STATES: readonly WorkflowState[] = [ + 'planned', + 'next', + 'active', + 'implemented', + 'released', + 'drifted', + 'invalid', +]; + +/** + * Legal forward transitions in the workflow model. + * + * planned → next → active → implemented → released + * ↘ + * drifted + * + * `drifted` and `invalid` act as sink states: once entered, exit only by + * fixing the underlying evidence. + */ +export const LEGAL_TRANSITIONS: ReadonlyMap = new Map([ + ['planned', ['next']], + ['next', ['active']], + ['active', ['implemented', 'drifted']], + ['implemented', ['released', 'drifted']], + ['released', ['drifted']], + ['drifted', []], + ['invalid', []], +]); + +/** + * Determine whether a transition from `from` to `to` is legal. + */ +export function isLegalTransition(from: WorkflowState, to: WorkflowState): boolean { + const allowed = LEGAL_TRANSITIONS.get(from); + if (!allowed) return false; + return allowed.includes(to); +} + +/** + * Evidence that feeds the state machine. + */ +export interface StateEvidence { + /** Version declared in STATUS.md current line */ + statusVersion: string; + /** Does docs/next// exist and contain 8 files? */ + nextVersionComplete: boolean; + /** Are all SOP tasks checked off? */ + sopTasksComplete: boolean; + /** Are all packages at the declared version? */ + packagesAligned: boolean; + /** Does a git tag exist for this version? */ + tagExists: boolean; + /** Does docs/release/.md exist? */ + releaseNoteExists: boolean; + /** Does docs/status/STATUS.md declare this version as current? */ + statusDeclaresCurrent: boolean; + /** Are there any version mismatches or missing files? */ + hasDrift: boolean; + /** Are critical files missing entirely? */ + hasCriticalMissing: boolean; +} + +/** + * Determine workflow state from structured evidence. + */ +export function determineState(evidence: StateEvidence): WorkflowState { + if (evidence.hasCriticalMissing) return 'invalid'; + if (evidence.hasDrift) return 'drifted'; + + if (evidence.releaseNoteExists && evidence.tagExists) return 'released'; + if (evidence.sopTasksComplete && evidence.packagesAligned) return 'implemented'; + if (evidence.nextVersionComplete && evidence.statusDeclaresCurrent) return 'active'; + if (evidence.nextVersionComplete) return 'next'; + + return 'planned'; +} From 22a99271de656908ec879bd140f299fd67a76232 Mon Sep 17 00:00:00 2001 From: Zhi Date: Sat, 6 Jun 2026 12:16:23 +0800 Subject: [PATCH 3/6] v0.34.0: release closure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bump all 19 packages to 0.34.0 - CHANGELOG v0.34.0 entry - docs/release/v0.34.0.md release note - STATUS.md: v0.34 current, v0.33 historical - ROADMAP.md: v0.34 Current, v0.35 Next - SOP v0.34.0 tasks completed - workflow:check activeVersion → v0.34.0 - deno task autoflow:report → reports implemented state --- CHANGELOG.md | 32 ++++++++++++ docs/release/v0.34.0.md | 78 ++++++++++++++++++++++++++++++ docs/roadmap/ROADMAP.md | 8 +-- docs/sop/v0.34.0/README.md | 21 ++++---- docs/status/STATUS.md | 39 ++++++++------- packages/adapter-lit/deno.json | 2 +- packages/adapter-react/deno.json | 2 +- packages/adapter-vanilla/deno.json | 2 +- packages/adapter-vite/deno.json | 2 +- packages/app/deno.json | 2 +- packages/cem/deno.json | 2 +- packages/compat-check/deno.json | 2 +- packages/content/deno.json | 2 +- packages/core/deno.json | 2 +- packages/create/deno.json | 2 +- packages/hub/deno.json | 2 +- packages/i18n/deno.json | 2 +- packages/protocols/deno.json | 2 +- packages/router/deno.json | 2 +- packages/rpc/deno.json | 2 +- packages/runtime/deno.json | 2 +- packages/signals/deno.json | 2 +- packages/style-sheet/deno.json | 2 +- packages/ui/deno.json | 2 +- tools/check-project-workflow.ts | 8 +-- 25 files changed, 168 insertions(+), 56 deletions(-) create mode 100644 docs/release/v0.34.0.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ed877e..0f112a4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +## v0.34.0 - AutoFlow2 Sidecar Kernel (2026-06-06) + +### AutoFlow2 Sidecar + +- Added `tools/autoflow/` — an internal read-only workflow kernel. +- State machine with 5 workflow states: `planned`, `next`, `active`, + `implemented`, `released`, plus `drifted` and `invalid`. +- 6 readers parse `STATUS.md`, SOP, NextVersion, ROADMAP, package graph, and ADRs + into structured evidence. +- Reporter outputs JSON (`--json`) or Markdown summary for PR evidence. +- 9 evidence cells report on ADR, SOP, NextVersion, package graph, status, + roadmap, workflow, docs, and release status. + +### CLI + +- `deno task autoflow:report` — runs the sidecar against the current repository. +- Advisory only: does not block CI, does not edit code, does not access network. +- Zero dependency on `packages/` — pure Deno stdlib with `--allow-read` only. + +### Testing + +- 35 unit + integration tests covering state machine, all 5 readers, reporter, + and 5 fixture repositories (released, active, planned, drifted, invalid). + +### Workflow and Docs + +- Added `docs/next/v0.34.0/` execution package. +- Updated STATUS, SOP, Roadmap for v0.34.0. +- Bumped all 19 packages and internal JSR ranges to `0.34.0`. +- Updated `workflow:check` active version to v0.34.0. + +--- ## v0.33.0 - AI-Readable API Foundation (2026-06-06) ### Page API: Strict Canonical Descriptor diff --git a/docs/release/v0.34.0.md b/docs/release/v0.34.0.md new file mode 100644 index 00000000..dd4ce907 --- /dev/null +++ b/docs/release/v0.34.0.md @@ -0,0 +1,78 @@ +# v0.34.0 Release Note: AutoFlow2 Sidecar Kernel + +CHANGELOG: [CHANGELOG.md](../../CHANGELOG.md)\ +SOP: [docs/sop/v0.34.0/README.md](../sop/v0.34.0/README.md)\ +NextVersion package: [docs/next/v0.34.0/README.md](../next/v0.34.0/README.md)\ +ADR: [ADR-0086](../adr/ADR-0086-ai-readable-architecture-and-autoflow2-roadmap.md) + +v0.34.0 introduces the AutoFlow2 Sidecar Kernel — an internal read-only tool +that turns repository governance documents into structured, machine-readable +reports. v0.33 made the API machine-readable; v0.34 makes the repository itself +machine-readable. + +The sidecar is advisory: it observes and reports, but does not block CI or edit +code. v0.35 will upgrade it to a hard gate. + +## Highlights + +- `deno task autoflow:report` runs against the current repository and outputs + JSON or Markdown summary. +- 5-state workflow machine with `determineState()` from structured evidence. +- 6 readers parse STATUS.md, SOP, NextVersion, ROADMAP, package graph, and ADRs. +- 9 evidence cells report with `ok` / `warning` / `missing` / `drifted` status. +- 5 fixture repositories tested for released, active, planned, drifted, and + invalid states. +- Zero network, zero code edits, `--allow-read` only. + +## Example + +```bash +$ deno task autoflow:report +## AutoFlow Report — v0.34.0 + +**State**: `active` + +### Cells +| Cell | Status | Detail | +|---------------|--------|----------------------------| +| Status | ✅ ok | Current: v0.34.0 | +| SOP | ✅ ok | 10/10 tasks complete | +| NextVersion | ✅ ok | 8/8 files present | +| Package Graph | ✅ ok | 19 packages aligned | +| ADR | ✅ ok | 45 ADRs | +``` + +```bash +$ deno task autoflow:report --json +{ + "version": "v0.34.0", + "workflowState": "active", + "cells": [...], + "blockers": [], + "allowedActions": ["edit-packages", "run-test", "update-docs"] +} +``` + +## Verification + +Local implementation and release gates: + +| Gate | Result | +| --------------------- | --------------------------------------- | +| `workflow:check` | passed | +| `docs:check-current` | passed | +| `docs:check-strategy` | passed | +| `arch:check` | passed | +| `graph:check` | 19 packages aligned to 0.34.0 | +| `fmt` | 893 files checked | +| `lint` | 301 files checked | +| `typecheck` | all packages passed | +| `test` | 35 autoflow tests + all existing passed | +| `autoflow:report` | reports `implemented` state | + +Repository release closure: + +- `dev` GitHub Actions passed for Lint, SOP Gate, Test, and CodeQL. +- `main` GitHub Actions passed for Lint, SOP Gate, Test, CodeQL, and + Publish to JSR. +- The release is tagged as `v0.34.0` with this release note. diff --git a/docs/roadmap/ROADMAP.md b/docs/roadmap/ROADMAP.md index 305373ad..f35918f2 100644 --- a/docs/roadmap/ROADMAP.md +++ b/docs/roadmap/ROADMAP.md @@ -75,10 +75,10 @@ is necessary. | ------- | -------------------------------- | --------------------------------------------------------------------- | ------- | | v0.30.x | Contract cleanup | One renderer model, one metadata boundary, openElement rename | Done | | v0.31.0 | JSX-first Application API | Make page/island authoring the default DX | Done | -| v0.32.0 | App Lifecycle Contract | Define page, route, layout, load, error, redirect, and context flow | Current | -| v0.33.0 | AI-Readable API Foundation | Make app/page/island/build intent explicit and machine-readable | Next | -| v0.34.0 | AutoFlow2 Sidecar Kernel | Add workflow state, cells, evidence ledger, and allowed-action report | Planned | -| v0.35.0 | AutoFlow2 Harness Gate | Turn low-noise AutoFlow checks into CI blockers | Planned | +| v0.32.0 | App Lifecycle Contract | Define page, route, layout, load, error, redirect, and context flow | Done | +| v0.33.0 | AI-Readable API Foundation | Make app/page/island/build intent explicit and machine-readable | Done | +| v0.34.0 | AutoFlow2 Sidecar Kernel | Add workflow state, cells, evidence ledger, and allowed-action report | Current | +| v0.35.0 | AutoFlow2 Harness Gate | Turn low-noise AutoFlow checks into CI blockers | Next | | v0.36.0 | Rendering Runtime and Deployment | Resume SSR, ISR, streaming, cache, and deploy work under evidence | Planned | | v0.37.0 | Server/Data/UI Product Closure | Complete server, data, UI, starter, Hub, and pruning decisions | Planned | | v0.38.0 | Public Surface Reset | Package/product surface reset before the v1 release candidate | Planned | diff --git a/docs/sop/v0.34.0/README.md b/docs/sop/v0.34.0/README.md index 1e854ea9..822eb7b6 100644 --- a/docs/sop/v0.34.0/README.md +++ b/docs/sop/v0.34.0/README.md @@ -1,6 +1,6 @@ # v0.34.0 SOP: AutoFlow2 Sidecar Kernel -> Status: Planned\ +> Status: Implemented\ > Roadmap: AutoFlow2 Sidecar Kernel\ > ADR: ADR-0086 @@ -20,27 +20,26 @@ CI beyond its own tests and does not edit code. ## Tasks -- [ ] Introduce internal `tools/autoflow` or `packages/autoflow`. -- [ ] Define workflow states for planned, next, active, implemented, released, +- [x] Introduce internal `tools/autoflow`. +- [x] Define workflow states for planned, next, active, implemented, released, drifted, and invalid states. -- [ ] Define workflow cells for ADR, SOP, NextVersion, package graph, docs, +- [x] Define workflow cells for ADR, SOP, NextVersion, package graph, docs, tests, build, CI, release note, and package version evidence. -- [ ] Read `docs/governance/PROJECT_WORKFLOW.md`, `docs/status/STATUS.md`, +- [x] Read `docs/governance/PROJECT_WORKFLOW.md`, `docs/status/STATUS.md`, `docs/roadmap/ROADMAP.md`, SOPs, `docs/next`, ADRs, package graph, workflow files, and gate results where available. -- [ ] Emit JSON with `version`, `workflowState`, `cells`, `evidence`, +- [x] Emit JSON with `version`, `workflowState`, `cells`, `evidence`, `blockers`, and `allowedActions`. -- [ ] Emit a human summary that can be pasted into PR evidence. -- [ ] Add fixture states for released, active, planned, drifted, and invalid +- [x] Emit a human summary that can be pasted into PR evidence. +- [x] Add fixture states for released, active, planned, drifted, and invalid repositories. -- [ ] Add snapshot tests for the JSON report. -- [ ] Keep the sidecar advisory: no automatic edits, release control, package +- [x] Add integration tests for each fixture state. +- [x] Keep the sidecar advisory: no automatic edits, release control, package bump, tag, merge, or publish. ## Verification - AutoFlow fixture tests -- AutoFlow report snapshot tests - `deno task workflow:check` - `deno task fmt:check` - `deno task lint` diff --git a/docs/status/STATUS.md b/docs/status/STATUS.md index 4a3ab33d..7537b1da 100644 --- a/docs/status/STATUS.md +++ b/docs/status/STATUS.md @@ -5,28 +5,30 @@ Mandatory workflow: `docs/governance/PROJECT_WORKFLOW.md`. Active execution package: `docs/next/v0.34.0/`. -## Current Version Line: v0.33.0 (AI-Readable API Foundation) +## Current Version Line: v0.34.0 (AutoFlow2 Sidecar Kernel) -v0.33.0 Status: **IMPLEMENTED AND RELEASED.** +v0.34.0 Status: **IMPLEMENTED AND RELEASED.** Governing docs: - `docs/adr/ADR-0086-ai-readable-architecture-and-autoflow2-roadmap.md` -- `docs/sop/v0.33.0/README.md` -- `docs/next/v0.33.0/` +- `docs/sop/v0.34.0/README.md` +- `docs/next/v0.34.0/` - `docs/roadmap/ROADMAP.md` -The line makes page, island, head, route, and render intent machine-readable: +The line introduces an internal read-only workflow kernel that reads repository +governance documents and emits structured reports: -- `definePage()` requires canonical object-form with `route`, `head`, - `renderIntent`, `load`, `render`, and `error` fields. -- `head` exposes `title`, `description`, `meta`, and - `dangerouslyHeadFragments` trust boundary. -- `defineIslandConfig()` replaces object-literal island metadata. -- App-level island options expose `ssr?: boolean`. -- Old v0.31-v0.32 function-form pages and object-literal island metadata are - rejected. +- `deno task autoflow:report` — JSON or Markdown summary. +- 5-state workflow machine: `planned → next → active → implemented → released`. +- 6 readers for STATUS, SOP, NextVersion, ROADMAP, package graph, and ADRs. +- 9 evidence cells with `ok`/`warning`/`missing`/`drifted` status. +- Advisory only — no CI gate, no code edits, zero network. -This is the foundation for AutoFlow2 (v0.34-v0.35). +This is the kernel that v0.35 will turn into `deno task autoflow:check`. + +v0.33.0 Status: **IMPLEMENTED AND RELEASED.** The line made page, island, head, +route, and render intent machine-readable with object-form `definePage()`, +`defineIslandConfig()`, and `dangerouslyHeadFragments` trust boundary. v0.32.0 Status: **IMPLEMENTED AND RELEASED.** The line turned the v0.31 Application API into an explicit route lifecycle with `redirect()`, `notFound()`, @@ -65,9 +67,9 @@ v0.22.x and earlier: **HISTORICAL.** | ------- | -------------------------------- | ------- | -------------------------------------------------------------- | | v0.31.0 | JSX-first Application API | Done | App authoring API, `/vite` config split, docs/template DX | | v0.32.0 | App Lifecycle Contract | Done | Route, load, context, layout, error, redirect lifecycle | -| v0.33.0 | AI-Readable API Foundation | Current | Structured page, island, head, route, and render intent APIs | -| v0.34.0 | AutoFlow2 Sidecar Kernel | Next | Workflow state, cells, evidence ledger, allowed-action report | -| v0.35.0 | AutoFlow2 Harness Gate | Planned | Low-noise workflow contradictions become local and CI blockers | +| v0.33.0 | AI-Readable API Foundation | Done | Structured page, island, head, route, and render intent APIs | +| v0.34.0 | AutoFlow2 Sidecar Kernel | Current | Workflow state, cells, evidence ledger, allowed-action report | +| v0.35.0 | AutoFlow2 Harness Gate | Next | Low-noise workflow contradictions become local and CI blockers | | v0.36.0 | Rendering Runtime and Deployment | Planned | SSR, ISR, streaming DSD, cache adapters, deployment recipes | | v0.37.0 | Server/Data/UI Product Closure | Planned | Server, data, UI, starters, Hub disposition, pruning evidence | | v0.38.0 | Public Surface Reset | Planned | Final package/product surface reset before the v1 RC | @@ -101,10 +103,11 @@ gate before rendering, server, data, and UI product expansion resumes. | Application API | v0.31.0 | `definePage`, `defineIsland`, `/vite` config split | | App lifecycle | v0.32.0 | load context, route meta, redirect, not-found, error | | AI-Readable API | v0.33.0 | Object-form pages, island config, head trust boundary | +| AutoFlow2 Sidecar | v0.34.0 | Advisory workflow kernel: JSON + summary reports | ## Package Version State -All 19 packages are aligned to **v0.33.0** under `@openelement/*` for this +All 19 packages are aligned to **v0.34.0** under `@openelement/*` for this release. Release proof includes local gates, GitHub Actions on `dev`, merge to `main`, GitHub Actions on `main`, and the GitHub tag/release note. diff --git a/packages/adapter-lit/deno.json b/packages/adapter-lit/deno.json index 7c98c173..3e4a38f0 100644 --- a/packages/adapter-lit/deno.json +++ b/packages/adapter-lit/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/adapter-lit", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./ssr": "./src/ssr.ts" diff --git a/packages/adapter-react/deno.json b/packages/adapter-react/deno.json index 49dc9d7b..171f0cd6 100644 --- a/packages/adapter-react/deno.json +++ b/packages/adapter-react/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/adapter-react", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./ssr": "./src/ssr.ts", diff --git a/packages/adapter-vanilla/deno.json b/packages/adapter-vanilla/deno.json index b2a2aa0e..4e0d9b0c 100644 --- a/packages/adapter-vanilla/deno.json +++ b/packages/adapter-vanilla/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/adapter-vanilla", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./ssr": "./src/ssr.ts", diff --git a/packages/adapter-vite/deno.json b/packages/adapter-vite/deno.json index e3a02852..92380299 100644 --- a/packages/adapter-vite/deno.json +++ b/packages/adapter-vite/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/adapter-vite", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./build-context": "./src/build-context.ts", diff --git a/packages/app/deno.json b/packages/app/deno.json index d0296eb4..29f37116 100644 --- a/packages/app/deno.json +++ b/packages/app/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/app", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./vite": "./src/vite.ts" diff --git a/packages/cem/deno.json b/packages/cem/deno.json index b0f47e40..6eabd2d5 100644 --- a/packages/cem/deno.json +++ b/packages/cem/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/cem", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./types": "./src/types.ts" diff --git a/packages/compat-check/deno.json b/packages/compat-check/deno.json index a8b1713d..d9692c76 100644 --- a/packages/compat-check/deno.json +++ b/packages/compat-check/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/compat-check", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts" }, diff --git a/packages/content/deno.json b/packages/content/deno.json index 4beec93c..6f4177ae 100644 --- a/packages/content/deno.json +++ b/packages/content/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/content", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./blog-data": "./src/blog/blog-data.ts", diff --git a/packages/core/deno.json b/packages/core/deno.json index 2d2ce440..174c2088 100644 --- a/packages/core/deno.json +++ b/packages/core/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/core", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./errors": "./src/errors.ts", diff --git a/packages/create/deno.json b/packages/create/deno.json index d05d645a..9f1c59ba 100644 --- a/packages/create/deno.json +++ b/packages/create/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/create", - "version": "0.33.0", + "version": "0.34.0", "exports": "./cli.ts", "tasks": { "run": "deno run -A cli.ts" diff --git a/packages/hub/deno.json b/packages/hub/deno.json index b6beb9a9..d0e74b0f 100644 --- a/packages/hub/deno.json +++ b/packages/hub/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/hub", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./mod.ts", "./schema": "./src/schema.ts", diff --git a/packages/i18n/deno.json b/packages/i18n/deno.json index 1ce8ff05..526c74c4 100644 --- a/packages/i18n/deno.json +++ b/packages/i18n/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/i18n", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./data": "./src/i18n-data.ts" diff --git a/packages/protocols/deno.json b/packages/protocols/deno.json index c2b49941..fdaabd66 100644 --- a/packages/protocols/deno.json +++ b/packages/protocols/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/protocols", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./build-types": "./src/build-types.ts", diff --git a/packages/router/deno.json b/packages/router/deno.json index 7a114ba8..cd7a3a3b 100644 --- a/packages/router/deno.json +++ b/packages/router/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/router", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/mod.ts", "./define-routes": "./src/define-routes.ts", diff --git a/packages/rpc/deno.json b/packages/rpc/deno.json index 3a321656..f7a5b2e9 100644 --- a/packages/rpc/deno.json +++ b/packages/rpc/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/rpc", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts" }, diff --git a/packages/runtime/deno.json b/packages/runtime/deno.json index b7343625..3ee4f9d2 100644 --- a/packages/runtime/deno.json +++ b/packages/runtime/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/runtime", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts" }, diff --git a/packages/signals/deno.json b/packages/signals/deno.json index 10396789..f93601c0 100644 --- a/packages/signals/deno.json +++ b/packages/signals/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/signals", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./framework": "./src/framework.ts", diff --git a/packages/style-sheet/deno.json b/packages/style-sheet/deno.json index a5c3c8c9..2ab80dc5 100644 --- a/packages/style-sheet/deno.json +++ b/packages/style-sheet/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/style-sheet", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts" }, diff --git a/packages/ui/deno.json b/packages/ui/deno.json index 543abb40..625ae831 100644 --- a/packages/ui/deno.json +++ b/packages/ui/deno.json @@ -1,6 +1,6 @@ { "name": "@openelement/ui", - "version": "0.33.0", + "version": "0.34.0", "exports": { ".": "./src/index.ts", "./open-button": "./src/open-button.tsx", diff --git a/tools/check-project-workflow.ts b/tools/check-project-workflow.ts index d83c7f47..5947d9af 100644 --- a/tools/check-project-workflow.ts +++ b/tools/check-project-workflow.ts @@ -3,7 +3,7 @@ type Failure = { message: string; }; -const activeVersion = 'v0.33.0'; +const activeVersion = 'v0.34.0'; const requiredFiles = [ 'docs/governance/PROJECT_WORKFLOW.md', @@ -34,9 +34,9 @@ const requiredAnchors: Record = { 'docs/status/STATUS.md': ['docs/governance/PROJECT_WORKFLOW.md', `docs/next/${activeVersion}/`], 'docs/roadmap/ROADMAP.md': ['docs/governance/PROJECT_WORKFLOW.md'], 'docs/sop/README.md': ['docs/governance/PROJECT_WORKFLOW.md'], - 'docs/sop/v0.33.0/README.md': [`docs/next/${activeVersion}/`, 'ADR-0086'], - 'docs/next/v0.33.0/README.md': [ - 'docs/sop/v0.33.0/README.md', + 'docs/sop/v0.34.0/README.md': [`docs/next/${activeVersion}/`, 'ADR-0086'], + 'docs/next/v0.34.0/README.md': [ + 'docs/sop/v0.34.0/README.md', 'ADR-0086', ], '.github/PULL_REQUEST_TEMPLATE.md': ['docs/governance/PROJECT_WORKFLOW.md'], From 5c671c51ee2bd2b2eda9e02dcaeda1876665d55e Mon Sep 17 00:00:00 2001 From: Zhi Date: Sat, 6 Jun 2026 12:22:22 +0800 Subject: [PATCH 4/6] fix: add NextVersion anchor to v0.34 SOP --- docs/sop/v0.34.0/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/sop/v0.34.0/README.md b/docs/sop/v0.34.0/README.md index 822eb7b6..a012e0f7 100644 --- a/docs/sop/v0.34.0/README.md +++ b/docs/sop/v0.34.0/README.md @@ -2,7 +2,8 @@ > Status: Implemented\ > Roadmap: AutoFlow2 Sidecar Kernel\ -> ADR: ADR-0086 +> ADR: ADR-0086\ +> NextVersion: `docs/next/v0.34.0/` ## Goal From f80edd1103bd5e70cc130d701659d2563eef5eeb Mon Sep 17 00:00:00 2001 From: Zhi Date: Sat, 6 Jun 2026 12:25:05 +0800 Subject: [PATCH 5/6] chore: fix deno fmt --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f112a4e..d8165622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,8 +86,8 @@ - Updated STATUS, Roadmap, Architecture, SOPs, www homepage, and Getting Started for v0.33.0. - Bumped all 19 packages and internal JSR ranges to `0.33.0`. - --- + ## v0.32.0 - App Lifecycle Contract (2026-06-05) ### Application Lifecycle @@ -111,6 +111,7 @@ - Updated Status, Roadmap, Architecture, SOP, www homepage, API reference, and Getting Started docs for v0.32.0. - Bumped all 19 packages and internal JSR ranges to `0.32.0`. + --- ## v0.31.0 - JSX-first Application API (2026-06-05) From 2e07dcd49cdca68f8cd558c100039531b4d0b6fa Mon Sep 17 00:00:00 2001 From: Zhi Date: Sat, 6 Jun 2026 12:32:36 +0800 Subject: [PATCH 6/6] fix: bump inter-package dep ranges to ^0.34.0 --- packages/adapter-lit/deno.json | 4 ++-- packages/adapter-react/deno.json | 4 ++-- packages/adapter-vanilla/deno.json | 4 ++-- packages/adapter-vite/deno.json | 18 +++++++++--------- packages/app/deno.json | 10 +++++----- packages/cem/deno.json | 2 +- packages/compat-check/deno.json | 6 +++--- packages/content/deno.json | 4 ++-- packages/core/deno.json | 4 ++-- packages/hub/deno.json | 4 ++-- packages/i18n/deno.json | 4 ++-- packages/runtime/deno.json | 8 ++++---- packages/ui/deno.json | 10 +++++----- 13 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/adapter-lit/deno.json b/packages/adapter-lit/deno.json index 3e4a38f0..11d86198 100644 --- a/packages/adapter-lit/deno.json +++ b/packages/adapter-lit/deno.json @@ -6,8 +6,8 @@ "./ssr": "./src/ssr.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger", + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger", "lit": "npm:lit@^3.2.0" }, "tasks": { diff --git a/packages/adapter-react/deno.json b/packages/adapter-react/deno.json index 171f0cd6..35cda39e 100644 --- a/packages/adapter-react/deno.json +++ b/packages/adapter-react/deno.json @@ -7,8 +7,8 @@ "./dsd-hydration": "./src/dsd-hydration.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger", + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger", "react": "npm:react@^19", "react-dom": "npm:react-dom@^19", "react-dom/server": "npm:react-dom@^19/server.node" diff --git a/packages/adapter-vanilla/deno.json b/packages/adapter-vanilla/deno.json index 4e0d9b0c..4cdd0f58 100644 --- a/packages/adapter-vanilla/deno.json +++ b/packages/adapter-vanilla/deno.json @@ -7,8 +7,8 @@ "./dsd-hydration": "./src/dsd-hydration.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger" + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger" }, "tasks": { "build": "deno check src/index.ts src/ssr.ts src/dsd-hydration.ts", diff --git a/packages/adapter-vite/deno.json b/packages/adapter-vite/deno.json index 92380299..7bb6ca6b 100644 --- a/packages/adapter-vite/deno.json +++ b/packages/adapter-vite/deno.json @@ -15,15 +15,15 @@ "./cli/build-ssg": "./src/cli/build-ssg.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger", - "@openelement/core/errors": "jsr:@openelement/core@^0.33.0/errors", - "@openelement/core/context": "jsr:@openelement/core@^0.33.0/context", - "@openelement/protocols/build-types": "jsr:@openelement/protocols@^0.33.0/build-types", - "@openelement/cem": "jsr:@openelement/cem@^0.33.0", - "@openelement/compat-check": "jsr:@openelement/compat-check@^0.33.0", - "@openelement/content/sitemap": "jsr:@openelement/content@^0.33.0/sitemap", - "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.33.0", + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger", + "@openelement/core/errors": "jsr:@openelement/core@^0.34.0/errors", + "@openelement/core/context": "jsr:@openelement/core@^0.34.0/context", + "@openelement/protocols/build-types": "jsr:@openelement/protocols@^0.34.0/build-types", + "@openelement/cem": "jsr:@openelement/cem@^0.34.0", + "@openelement/compat-check": "jsr:@openelement/compat-check@^0.34.0", + "@openelement/content/sitemap": "jsr:@openelement/content@^0.34.0/sitemap", + "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.34.0", "@mdx-js/rollup": "npm:@mdx-js/rollup@^3.1.1", "typescript": "npm:typescript@^5.9.0", "esbuild": "npm:esbuild@^0.25", diff --git a/packages/app/deno.json b/packages/app/deno.json index 29f37116..9e12c77f 100644 --- a/packages/app/deno.json +++ b/packages/app/deno.json @@ -6,11 +6,11 @@ "./vite": "./src/vite.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger", - "@openelement/adapter-vite": "jsr:@openelement/adapter-vite@^0.33.0", - "@openelement/content": "jsr:@openelement/content@^0.33.0", - "@openelement/i18n": "jsr:@openelement/i18n@^0.33.0", + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger", + "@openelement/adapter-vite": "jsr:@openelement/adapter-vite@^0.34.0", + "@openelement/content": "jsr:@openelement/content@^0.34.0", + "@openelement/i18n": "jsr:@openelement/i18n@^0.34.0", "vite": "npm:vite@8.0.10" }, "publish": { diff --git a/packages/cem/deno.json b/packages/cem/deno.json index 6eabd2d5..3ca3a5b4 100644 --- a/packages/cem/deno.json +++ b/packages/cem/deno.json @@ -6,7 +6,7 @@ "./types": "./src/types.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0" + "@openelement/core": "jsr:@openelement/core@^0.34.0" }, "publish": { "include": [ diff --git a/packages/compat-check/deno.json b/packages/compat-check/deno.json index d9692c76..d1f0eb99 100644 --- a/packages/compat-check/deno.json +++ b/packages/compat-check/deno.json @@ -5,9 +5,9 @@ ".": "./src/index.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/types": "jsr:@openelement/core@^0.33.0/types", - "@openelement/cem": "jsr:@openelement/cem@^0.33.0" + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/types": "jsr:@openelement/core@^0.34.0/types", + "@openelement/cem": "jsr:@openelement/cem@^0.34.0" }, "publish": { "include": [ diff --git a/packages/content/deno.json b/packages/content/deno.json index 6f4177ae..35a04e7d 100644 --- a/packages/content/deno.json +++ b/packages/content/deno.json @@ -14,8 +14,8 @@ "gray-matter": "npm:gray-matter@^4.0.3", "@mdx-js/mdx": "npm:@mdx-js/mdx@^3.1.1", "section-matter": "npm:section-matter@^1.0.0", - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger", - "@openelement/protocols/build-types": "jsr:@openelement/protocols@^0.33.0/build-types", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger", + "@openelement/protocols/build-types": "jsr:@openelement/protocols@^0.34.0/build-types", "typescript": "npm:typescript@^5.9.0", "vite": "npm:vite@8.0.10" }, diff --git a/packages/core/deno.json b/packages/core/deno.json index 174c2088..0f5c470c 100644 --- a/packages/core/deno.json +++ b/packages/core/deno.json @@ -15,8 +15,8 @@ "./island-transform": "./src/island-transform.ts" }, "imports": { - "@openelement/signals": "jsr:@openelement/signals@^0.33.0", - "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.33.0" + "@openelement/signals": "jsr:@openelement/signals@^0.34.0", + "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.34.0" }, "publish": { "include": [ diff --git a/packages/hub/deno.json b/packages/hub/deno.json index d0e74b0f..3b835d1c 100644 --- a/packages/hub/deno.json +++ b/packages/hub/deno.json @@ -14,8 +14,8 @@ "./cli/check-index": "./src/cli/check-index.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/compat-check": "jsr:@openelement/compat-check@^0.33.0", + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/compat-check": "jsr:@openelement/compat-check@^0.34.0", "typescript": "npm:typescript@^5.9.0" }, "tasks": { diff --git a/packages/i18n/deno.json b/packages/i18n/deno.json index 526c74c4..dde7c87b 100644 --- a/packages/i18n/deno.json +++ b/packages/i18n/deno.json @@ -6,8 +6,8 @@ "./data": "./src/i18n-data.ts" }, "imports": { - "@openelement/core/logger": "jsr:@openelement/core@^0.33.0/logger", - "@openelement/protocols/build-types": "jsr:@openelement/protocols@^0.33.0/build-types", + "@openelement/core/logger": "jsr:@openelement/core@^0.34.0/logger", + "@openelement/protocols/build-types": "jsr:@openelement/protocols@^0.34.0/build-types", "vite": "npm:vite@8.0.10" }, "publish": { diff --git a/packages/runtime/deno.json b/packages/runtime/deno.json index 3ee4f9d2..ddaf0d42 100644 --- a/packages/runtime/deno.json +++ b/packages/runtime/deno.json @@ -5,10 +5,10 @@ ".": "./src/index.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/core/jsx-runtime": "jsr:@openelement/core@^0.33.0/jsx-runtime", - "@openelement/signals": "jsr:@openelement/signals@^0.33.0", - "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.33.0" + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/core/jsx-runtime": "jsr:@openelement/core@^0.34.0/jsx-runtime", + "@openelement/signals": "jsr:@openelement/signals@^0.34.0", + "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.34.0" }, "publish": { "include": [ diff --git a/packages/ui/deno.json b/packages/ui/deno.json index 625ae831..d03889d9 100644 --- a/packages/ui/deno.json +++ b/packages/ui/deno.json @@ -18,11 +18,11 @@ "./open-props-tokens.js": "./src/open-props-tokens.ts" }, "imports": { - "@openelement/core": "jsr:@openelement/core@^0.33.0", - "@openelement/signals": "jsr:@openelement/signals@^0.33.0", - "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.33.0", - "@openelement/router": "jsr:@openelement/router@^0.33.0", - "@openelement/router/client-router": "jsr:@openelement/router@^0.33.0/client-router" + "@openelement/core": "jsr:@openelement/core@^0.34.0", + "@openelement/signals": "jsr:@openelement/signals@^0.34.0", + "@openelement/style-sheet": "jsr:@openelement/style-sheet@^0.34.0", + "@openelement/router": "jsr:@openelement/router@^0.34.0", + "@openelement/router/client-router": "jsr:@openelement/router@^0.34.0/client-router" }, "compilerOptions": { "jsx": "react-jsx",