Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,3 @@ body:
label: Mill, Node, OS, Codex, Git, and gh versions
validations:
required: true

17 changes: 17 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
day: monday
groups:
development:
dependency-type: development
open-pull-requests-limit: 5
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 3
1 change: 0 additions & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,3 @@
- [ ] Agent-assisted work is disclosed where applicable.
- [ ] Commits include DCO sign-off.
- [ ] No credentials or private execution evidence are included.

60 changes: 60 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: CI

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
validate:
name: validate
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- name: Set up Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: .node-version
cache: npm
- name: Install without lifecycle scripts
run: npm ci --ignore-scripts
- name: DCO
if: github.event_name == 'pull_request'
run:
node scripts/check-dco.mjs "${{ github.event.pull_request.base.sha }}"
"${{ github.event.pull_request.head.sha }}"
- name: Full native gate
run: npm run check
- name: Production dependency audit
run: npm audit --omit=dev --audit-level=high

dependency-review:
name: dependency-review
if: github.event_name == 'pull_request'
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Review dependency changes
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
with:
fail-on-severity: high
comment-summary-in-pr: never
40 changes: 40 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: CodeQL

on:
pull_request:
push:
branches: [main]
schedule:
- cron: "17 4 * * 1"

permissions:
contents: read
security-events: write

concurrency:
group: codeql-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
codeql:
name: codeql
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@486fec2a3ea2626afcd8c7e9208b4f515078dd7e # codeql-bundle-v2.26.4
with:
languages: javascript-typescript
- name: Set up Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: .node-version
cache: npm
- name: Build
run: npm ci --ignore-scripts && npm run build
- name: Analyze
uses: github/codeql-action/analyze@486fec2a3ea2626afcd8c7e9208b4f515078dd7e # codeql-bundle-v2.26.4
39 changes: 39 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Release

on:
push:
tags: ["v*"]

permissions:
contents: read
id-token: write

concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false

jobs:
publish:
name: publish
runs-on: ubuntu-24.04
timeout-minutes: 20
environment: npm
steps:
- name: Checkout immutable tag
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Node and npm registry
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: .node-version
registry-url: https://registry.npmjs.org
cache: npm
- name: Install without lifecycle scripts
run: npm ci --ignore-scripts
- name: Verify release identity
run: node scripts/verify-release-tag.mjs
- name: Full native gate
run: npm run check
- name: Publish with npm trusted publishing
run: npm publish --provenance --access public
1 change: 1 addition & 0 deletions .node-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24.20.0
5 changes: 5 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
coverage/
dist/
node_modules/
package-lock.json
TEMP_MILL_GREENFIELD_WORK_PLAN_*.md
4 changes: 4 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"proseWrap": "always",
"trailingComma": "all"
}
8 changes: 3 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# AGENTS.md — Mill repository contract

Version: 1.0
Status: normative
Version: 1.0 Status: normative

## Mission

Expand Down Expand Up @@ -77,7 +76,6 @@ iteration, but skipped required checks block promotion.
## Stop conditions

Stop rather than guess when authority, credential ownership, data disclosure,
remote destination, destructive behavior, acceptance oracle, runtime version,
or release identity is ambiguous; when a required check cannot run; or when the
remote destination, destructive behavior, acceptance oracle, runtime version, or
release identity is ambiguous; when a required check cannot run; or when the
same subsystem produces recurring P0/P1 review findings.

44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Changelog

All notable changes follow Keep a Changelog and Semantic Versioning.

## [Unreleased]

### Added

- Pre-alpha `millctl` package foundation with exact-version lock enforcement.
- Stable human and JSON result envelopes.
- Compact executable schemas for repository, product, blueprint, scenario,
outcome, configuration, and lock contracts.
- Non-executing PRD inspection, static repository adoption scan, and truthful
mode-aware doctor command.
- Pinned least-privilege CI, CodeQL, dependency review, DCO, package smoke,
coverage, and trusted-publishing release foundations.

### Changed

- None.

### Deprecated

- None.

### Removed

- None.

### Fixed

- Exact-version recovery, DCO parsing, per-job workflow bounds, JSON usage
errors, malformed-contract classification, operator-tool discovery, Node
readiness, valid `..name` paths, Git-root lock authority, JSON help isolation,
and runtime/JSON Schema parity now honor their documented contracts.

### Security

- Static inspection rejects path escape, symlink targets, oversized inputs,
malformed UTF-8, executable or unclassified Git configuration, incomplete or
over-budget trees, and repository-controlled command execution. Lock markers
fail closed; scan digests include Git hazard and truncation state. Git config
syntax and linked-worktree metadata now fail closed at their parsing and
indirection boundaries, and explicit tool overrides must be absolute.
11 changes: 5 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Contributing

Mill is maintained by David Ahmann. Please discuss large changes before
implementation and keep pull requests to one customer-visible or system
outcome with tests and documentation.
implementation and keep pull requests to one customer-visible or system outcome
with tests and documentation.

Every commit must include a Developer Certificate of Origin sign-off:

Expand All @@ -15,7 +15,6 @@ By signing off, you certify the Developer Certificate of Origin 1.1 at
contributions. Run the complete native gate documented in `AGENTS.md` before
opening a pull request.

Be respectful, disclose generated/agent-assisted work, do not include secrets
or private execution evidence, and follow the repository's authority and
security boundaries.

Be respectful, disclose generated/agent-assisted work, do not include secrets or
private execution evidence, and follow the repository's authority and security
boundaries.
5 changes: 2 additions & 3 deletions GOVERNANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,5 @@ nonbinding. Project status may be `active`, `maintenance`, `archived`, or
`seeking-maintainer`; status changes are documented in the README and a release
note.

External feedback is welcome. Code contributions require DCO sign-off and may
be declined when they widen the v1 boundary or maintenance burden.

External feedback is welcome. Code contributions require DCO sign-off and may be
declined when they widen the v1 boundary or maintenance burden.
38 changes: 30 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
Mill is an experimental local-first software-delivery system for turning an
approved product outcome into a tested, reviewed draft pull request.

The project is pre-alpha. Today this repository contains the product and
architecture contract; implementation is being delivered through five vertical
waves. The intended CLI is `millctl`, published eventually as
`@davidahmann/mill` to avoid collision with the existing `mill` command and npm
package.
The project is pre-alpha. Wave 1 provides an installable source package, compact
schemas, static PRD/repository inspection, and readiness diagnostics. The CLI is
`millctl`, published eventually as `@davidahmann/mill` to avoid collision with
the existing `mill` command and npm package.

Mill's v1 boundary is deliberately narrow:

Expand All @@ -22,12 +21,35 @@ Mill's v1 boundary is deliberately narrow:
See [the PRD](product/PRD.md), [architecture](architecture/ARCHITECTURE.md), and
[development guide](docs/development.md).

## Develop from source

```sh
asdf install
npm ci --ignore-scripts
npm run check
npm run build
node dist/cli.js doctor --mode inspect
node dist/cli.js inspect --prd product/PRD.md
node dist/cli.js adopt --scan-only
```

Use `--json` before the command for the stable machine-readable envelope.
`--json --version` is machine-readable; help is human-only and combining it with
`--json` returns a typed usage error. `doctor` and static adoption never execute
repository-controlled commands. Tool discovery accepts fixed system locations,
trusted non-repository `PATH` entries, the macOS ChatGPT-bundled Codex, and
explicit absolute `MILL_GIT_PATH`, `MILL_CODEX_PATH`, or `MILL_GH_PATH`
overrides. An explicit override is exclusive, and a relative, missing, or
unusable override blocks readiness rather than falling back silently. Static
adoption validates normal and linked-worktree Git metadata, inspects common and
worktree configuration, and blocks syntax it cannot classify without running
repository-controlled commands.

## Status

Not yet installable. No compatibility, security, containment, or release claim
exists until its corresponding clean-room canary passes.
Not published. No Codex execution, GitHub mutation, compatibility, containment,
or release claim exists until its corresponding later-wave canary passes.

## License

Apache-2.0. Contributions require a Developer Certificate of Origin sign-off.

7 changes: 3 additions & 4 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ Report vulnerabilities through GitHub private vulnerability reporting. Do not
open a public issue for an undisclosed vulnerability. David Ahmann coordinates
triage and disclosure on a best-effort basis with no SLA.

Mill does not store provider credentials. Telemetry is off by default. Model
and research calls must disclose the provider and selected data classes before
use. Detailed retention, purge, and support-bundle behavior is a Wave 2 gate.

Mill does not store provider credentials. Telemetry is off by default. Model and
research calls must disclose the provider and selected data classes before use.
Detailed retention, purge, and support-bundle behavior is a Wave 2 gate.
5 changes: 2 additions & 3 deletions SUPPORT.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
# Support

Mill is pre-alpha and provided without an SLA. Use GitHub Issues for
reproducible defects and Discussions for usage questions once those features
are enabled. Use private vulnerability reporting for security issues.
reproducible defects and Discussions for usage questions once those features are
enabled. Use private vulnerability reporting for security issues.

Only combinations listed as supported in a released support matrix are
supported. Everything else is experimental or unsupported.

1 change: 0 additions & 1 deletion WORKFLOW.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,3 @@ For each wave:
Current Factory skills are optional maintainer-side bootstrap tools. Their
prompts, profiles, artifacts, or state are not Mill runtime or product
dependencies. Native repository commands remain sufficient and authoritative.

Loading
Loading