wn-dev-std 2026.6.27__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wn_dev_std-2026.6.27/.github/pull_request_template.md +10 -0
- wn_dev_std-2026.6.27/.github/workflows/ci.yml +35 -0
- wn_dev_std-2026.6.27/.github/workflows/pr-hygiene.yml +117 -0
- wn_dev_std-2026.6.27/.github/workflows/release.yml +43 -0
- wn_dev_std-2026.6.27/.gitignore +20 -0
- wn_dev_std-2026.6.27/AGENTS.md +80 -0
- wn_dev_std-2026.6.27/CHANGELOG.md +90 -0
- wn_dev_std-2026.6.27/CODE_OF_CONDUCT.md +8 -0
- wn_dev_std-2026.6.27/CONTRIBUTING.md +36 -0
- wn_dev_std-2026.6.27/LICENSE +21 -0
- wn_dev_std-2026.6.27/PKG-INFO +379 -0
- wn_dev_std-2026.6.27/README.md +331 -0
- wn_dev_std-2026.6.27/SECURITY.md +10 -0
- wn_dev_std-2026.6.27/docs/architecture.html +81 -0
- wn_dev_std-2026.6.27/docs/contracts/command_manifest.v0.json +47 -0
- wn_dev_std-2026.6.27/docs/contracts/exceptions.schema.v0.json +25 -0
- wn_dev_std-2026.6.27/docs/contracts/interface_manifest.v0.json +119 -0
- wn_dev_std-2026.6.27/docs/contracts/wn_dev_std_config.schema.v0.json +94 -0
- wn_dev_std-2026.6.27/docs/design/audit-standard.html +129 -0
- wn_dev_std-2026.6.27/docs/design/cli.html +82 -0
- wn_dev_std-2026.6.27/docs/design/cpp-standard.html +145 -0
- wn_dev_std-2026.6.27/docs/design/csharp-standard.html +58 -0
- wn_dev_std-2026.6.27/docs/design/documentation-standard.html +109 -0
- wn_dev_std-2026.6.27/docs/design/javascript-standard.html +254 -0
- wn_dev_std-2026.6.27/docs/design/mixed-mode.html +89 -0
- wn_dev_std-2026.6.27/docs/design/python-standard.html +128 -0
- wn_dev_std-2026.6.27/docs/design/zephyr-standard.html +79 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-04.md +17 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-07.md +13 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-09.md +14 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-10.md +13 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-12.md +17 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-14.md +15 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-22.md +15 -0
- wn_dev_std-2026.6.27/docs/releases/2026-06-27.md +14 -0
- wn_dev_std-2026.6.27/docs/setup.html +74 -0
- wn_dev_std-2026.6.27/docs/templates/cpp/.clang-format +13 -0
- wn_dev_std-2026.6.27/docs/templates/cpp/.clang-tidy +14 -0
- wn_dev_std-2026.6.27/docs/templates/cpp/signoff.toml +32 -0
- wn_dev_std-2026.6.27/docs/templates/github/pr-hygiene.yml +117 -0
- wn_dev_std-2026.6.27/docs/templates/github/pull_request_template.md +10 -0
- wn_dev_std-2026.6.27/docs/templates/zephyr/.clang-format +8 -0
- wn_dev_std-2026.6.27/docs/templates/zephyr/.clang-tidy +12 -0
- wn_dev_std-2026.6.27/docs/templates/zephyr/signoff.toml +37 -0
- wn_dev_std-2026.6.27/pyproject.toml +140 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/__init__.py +47 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/__main__.py +3 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/_version.py +3 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/check_profiles.py +208 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/checks.py +759 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/__init__.py +1 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/__init__.py +1 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/audit.py +75 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/check.py +25 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log.py +30 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log_create.py +50 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log_list.py +88 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log_show.py +78 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan.py +32 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_common.py +101 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_create.py +59 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_list.py +87 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_show.py +89 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_status.py +42 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_step.py +111 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/standard.py +68 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/version.py +71 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/main.py +53 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cli/types.py +20 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/compatibility_pruning.py +233 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/config.py +85 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/cpp_policy.py +42 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/design_doc_status.py +98 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/native_complexity.py +108 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/plan_hygiene.py +596 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/plan_mutation.py +406 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/plan_reader.py +25 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/pr_hygiene.py +168 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/root_discovery.py +102 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/secret_hygiene.py +34 -0
- wn_dev_std-2026.6.27/src/wn_dev_std/standards.py +756 -0
- wn_dev_std-2026.6.27/tests/L0_foundation/STRATUM.toml +38 -0
- wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_001_cli_entrypoint.py +125 -0
- wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_002_public_interfaces.py +840 -0
- wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_003_plan_hygiene.py +385 -0
- wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_004_plan_read_commands.py +204 -0
- wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_005_plan_mutation_commands.py +211 -0
- wn_dev_std-2026.6.27/tests/L99_signoff/STRATUM.toml +57 -0
- wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_001_release_metadata.py +58 -0
- wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_002_docs_contracts.py +63 -0
- wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_003_quality_tools.py +34 -0
- wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_004_repo_hygiene.py +234 -0
- wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_005_python_signoff.py +18 -0
- wn_dev_std-2026.6.27/tests/rack.toml +48 -0
- wn_dev_std-2026.6.27/tests/support_scripts/py_signoff.py +252 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: ${{ matrix.os }} / Python 3.12
|
|
12
|
+
runs-on: ${{ matrix.os }}
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
- uses: astral-sh/setup-uv@v5
|
|
21
|
+
- name: Sync
|
|
22
|
+
run: uv sync --all-extras
|
|
23
|
+
- name: Run Rack signoff
|
|
24
|
+
run: uv run rack run --all
|
|
25
|
+
- name: Build package
|
|
26
|
+
run: uv run python -m build
|
|
27
|
+
- name: Check package
|
|
28
|
+
run: uv run twine check dist/*
|
|
29
|
+
- name: Installed wheel smoke test
|
|
30
|
+
shell: pwsh
|
|
31
|
+
run: |
|
|
32
|
+
$wheel = Get-ChildItem dist -Filter "*.whl" | Select-Object -First 1
|
|
33
|
+
uv tool install --force $wheel.FullName
|
|
34
|
+
wn-dev-std --version
|
|
35
|
+
wn-dev-std standard
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
name: PR Hygiene
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, edited, synchronize, reopened, ready_for_review]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
issues: read
|
|
10
|
+
pull-requests: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
hygiene:
|
|
14
|
+
name: metadata and commit hygiene
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- name: Check PR metadata and commits
|
|
18
|
+
uses: actions/github-script@v9
|
|
19
|
+
with:
|
|
20
|
+
script: |
|
|
21
|
+
const pr = context.payload.pull_request;
|
|
22
|
+
const owner = context.repo.owner;
|
|
23
|
+
const repo = context.repo.repo;
|
|
24
|
+
const failures = [];
|
|
25
|
+
|
|
26
|
+
const bannedPatterns = [
|
|
27
|
+
{ pattern: /\bclaude\b/i, message: "mentions Claude" },
|
|
28
|
+
{ pattern: /\banthropic\b/i, message: "mentions Anthropic" },
|
|
29
|
+
{ pattern: /\bgenerated\s+with\b/i, message: "uses generated-with attribution" },
|
|
30
|
+
{ pattern: /\bco-authored-by:\s*(claude|anthropic)\b/i, message: "uses AI-vendor co-author attribution" },
|
|
31
|
+
];
|
|
32
|
+
const emojiPattern = /[\p{Extended_Pictographic}\uFE0F]/u;
|
|
33
|
+
const conventionalSubjectPattern = /^(build|chore|ci|deps|docs|feat|fix|perf|refactor|release|revert|style|test)(\([A-Za-z0-9._-]+\))?!?: .+$/;
|
|
34
|
+
|
|
35
|
+
function checkConventionalSubject(label, subject) {
|
|
36
|
+
if (!conventionalSubjectPattern.test(subject || "")) {
|
|
37
|
+
failures.push(`${label} must use Conventional Commit form, for example \`fix: handle missing board outline\`.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function checkText(label, text) {
|
|
42
|
+
const value = text || "";
|
|
43
|
+
if (emojiPattern.test(value)) {
|
|
44
|
+
failures.push(`${label} contains emoji or pictographic symbols.`);
|
|
45
|
+
}
|
|
46
|
+
for (const { pattern, message } of bannedPatterns) {
|
|
47
|
+
if (pattern.test(value)) {
|
|
48
|
+
failures.push(`${label} ${message}.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function issueNumbersFrom(text) {
|
|
54
|
+
const value = text || "";
|
|
55
|
+
const numbers = new Set();
|
|
56
|
+
const sameRepoIssueUrl = new RegExp(
|
|
57
|
+
`https://github\\.com/${owner}/${repo}/issues/(\\d+)`,
|
|
58
|
+
"gi",
|
|
59
|
+
);
|
|
60
|
+
for (const match of value.matchAll(sameRepoIssueUrl)) {
|
|
61
|
+
numbers.add(Number(match[1]));
|
|
62
|
+
}
|
|
63
|
+
for (const match of value.matchAll(/(^|[^\w/])#(\d+)\b/g)) {
|
|
64
|
+
numbers.add(Number(match[2]));
|
|
65
|
+
}
|
|
66
|
+
return [...numbers];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
checkText("PR title", pr.title);
|
|
70
|
+
checkText("PR body", pr.body || "");
|
|
71
|
+
checkConventionalSubject("PR title", pr.title || "");
|
|
72
|
+
|
|
73
|
+
const linkedIssueLine = (pr.body || "")
|
|
74
|
+
.split(/\r?\n/)
|
|
75
|
+
.find((line) => /^Linked issue:/i.test(line));
|
|
76
|
+
const issueNumbers = issueNumbersFrom(linkedIssueLine || "");
|
|
77
|
+
if (!linkedIssueLine || issueNumbers.length === 0) {
|
|
78
|
+
failures.push("PR body must fill in `Linked issue:` with an existing same-repo issue such as `#123`.");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const issueNumber of issueNumbers) {
|
|
82
|
+
try {
|
|
83
|
+
const response = await github.rest.issues.get({
|
|
84
|
+
owner,
|
|
85
|
+
repo,
|
|
86
|
+
issue_number: issueNumber,
|
|
87
|
+
});
|
|
88
|
+
if (response.data.pull_request) {
|
|
89
|
+
failures.push(`#${issueNumber} is a pull request, not an issue.`);
|
|
90
|
+
}
|
|
91
|
+
} catch (error) {
|
|
92
|
+
failures.push(`Linked issue #${issueNumber} does not exist or is not readable.`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const commits = await github.paginate(github.rest.pulls.listCommits, {
|
|
97
|
+
owner,
|
|
98
|
+
repo,
|
|
99
|
+
pull_number: pr.number,
|
|
100
|
+
per_page: 100,
|
|
101
|
+
});
|
|
102
|
+
for (const commit of commits) {
|
|
103
|
+
const message = commit.commit.message || "";
|
|
104
|
+
const subject = message.split(/\r?\n/, 1)[0];
|
|
105
|
+
checkText(`Commit ${commit.sha.slice(0, 7)} message`, message);
|
|
106
|
+
checkConventionalSubject(`Commit ${commit.sha.slice(0, 7)} subject`, subject);
|
|
107
|
+
if (subject.length > 72) {
|
|
108
|
+
failures.push(`Commit ${commit.sha.slice(0, 7)} subject is ${subject.length} characters; keep it at 72 or fewer.`);
|
|
109
|
+
}
|
|
110
|
+
if (/^wip\b/i.test(subject)) {
|
|
111
|
+
failures.push(`Commit ${commit.sha.slice(0, 7)} subject starts with WIP.`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (failures.length > 0) {
|
|
116
|
+
core.setFailed(`PR hygiene failed:\n- ${failures.join("\n- ")}`);
|
|
117
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Release Validation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
validate:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: astral-sh/setup-uv@v5
|
|
16
|
+
- name: Verify tag matches package version
|
|
17
|
+
shell: bash
|
|
18
|
+
run: |
|
|
19
|
+
VERSION="$(uv run python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
|
|
20
|
+
test "v${VERSION}" = "${GITHUB_REF_NAME}"
|
|
21
|
+
- name: Verify release notes mention package version
|
|
22
|
+
shell: bash
|
|
23
|
+
run: |
|
|
24
|
+
VERSION="$(uv run python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
|
|
25
|
+
RELEASE_DATE="$(uv run python -c 'import tomllib; v=tomllib.load(open("pyproject.toml","rb"))["project"]["version"]; y,m,d,*_=map(int,v.split(".")); print(f"{y:04d}-{m:02d}-{d:02d}")')"
|
|
26
|
+
grep -F "## ${VERSION}" CHANGELOG.md
|
|
27
|
+
test -f "docs/releases/${RELEASE_DATE}.md"
|
|
28
|
+
grep -F "\`${VERSION}\`" "docs/releases/${RELEASE_DATE}.md"
|
|
29
|
+
- name: Sync
|
|
30
|
+
run: uv sync --all-extras
|
|
31
|
+
- name: Run Rack signoff
|
|
32
|
+
run: uv run rack run --all
|
|
33
|
+
- name: Build package
|
|
34
|
+
run: uv run python -m build
|
|
35
|
+
- name: Check package
|
|
36
|
+
run: uv run twine check dist/*
|
|
37
|
+
- name: Installed wheel smoke test
|
|
38
|
+
shell: pwsh
|
|
39
|
+
run: |
|
|
40
|
+
$wheel = Get-ChildItem dist -Filter "*.whl" | Select-Object -First 1
|
|
41
|
+
uv tool install --force $wheel.FullName
|
|
42
|
+
wn-dev-std --version
|
|
43
|
+
wn-dev-std check .
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Agent Guide
|
|
2
|
+
|
|
3
|
+
This repository is the reference implementation for Wavenumber development
|
|
4
|
+
standards. Treat it as both production code and an executable example for new
|
|
5
|
+
projects.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
Use `uv` for all Python workflows:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv sync --all-extras
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Do not hand-edit `uv.lock`. Update it with `uv lock` and verify it with
|
|
16
|
+
`uv lock --check`.
|
|
17
|
+
|
|
18
|
+
## Test And Signoff
|
|
19
|
+
|
|
20
|
+
Run the full local signoff before release-facing changes:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv run rack run --all
|
|
24
|
+
uv run python -m build
|
|
25
|
+
uv run twine check dist/*
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Fast development checks can run individual Rack strata:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
uv run rack run L0_foundation
|
|
32
|
+
uv run rack run L99_signoff
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Architecture Boundaries
|
|
36
|
+
|
|
37
|
+
- `src/wn_dev_std/cli/main.py` is the thin CLI entry point.
|
|
38
|
+
- Each public command lives in its own file under
|
|
39
|
+
`src/wn_dev_std/cli/commands/`.
|
|
40
|
+
- Reusable standard data and checks live outside the CLI package.
|
|
41
|
+
- `docs/design/*.html` and `docs/contracts/*` are source-of-truth public
|
|
42
|
+
contracts, not generated scratch output.
|
|
43
|
+
- HTML design docs must declare `data-doc-status` as `draft`, `proposal`,
|
|
44
|
+
`accepted`, or `superseded`; release signoff must review any draft/proposal
|
|
45
|
+
docs before treating them as contract evidence.
|
|
46
|
+
- C++ profile templates live under `docs/templates/cpp/`; keep them aligned
|
|
47
|
+
with `docs/design/cpp-standard.html` and the checker policy.
|
|
48
|
+
|
|
49
|
+
## Release Rules
|
|
50
|
+
|
|
51
|
+
- `main` should represent the latest released/tagged source.
|
|
52
|
+
- Public changes should merge through PRs with required CI.
|
|
53
|
+
- GitHub Release publication triggers release validation for this model repo.
|
|
54
|
+
- Do not publish this repository to PyPI.
|
|
55
|
+
- Date-based versions are standard, for example `2026.6.4`.
|
|
56
|
+
- Same-day follow-up releases append a fourth segment, for example
|
|
57
|
+
`2026.6.4.1`.
|
|
58
|
+
- `CHANGELOG.md` and `docs/releases/<YYYY-MM-DD>.md` must mention the current
|
|
59
|
+
version.
|
|
60
|
+
|
|
61
|
+
## Generated Files
|
|
62
|
+
|
|
63
|
+
Generated files must document their source of truth, regeneration command, and
|
|
64
|
+
release inclusion policy. Do not commit local result directories such as
|
|
65
|
+
`rack_results/`, `dist/`, or `.venv/`.
|
|
66
|
+
|
|
67
|
+
Mixed-mode projects are the exception to the blanket `dist/` rule. They may
|
|
68
|
+
commit grouped runtime artifacts such as `dist/native/<platform>/` and
|
|
69
|
+
`dist/wasm/<target>/` when the artifact policy is documented and covered by
|
|
70
|
+
release signoff. Root-level `dist/` files should remain limited to manifests or
|
|
71
|
+
artifact documentation.
|
|
72
|
+
|
|
73
|
+
C++ projects use Ninja as the default CMake generator, commit `.clang-format`
|
|
74
|
+
and `.clang-tidy`, and enable `CMAKE_EXPORT_COMPILE_COMMANDS=ON` in presets.
|
|
75
|
+
|
|
76
|
+
## Exceptions
|
|
77
|
+
|
|
78
|
+
The default standard is strict. Any exception must have documented rationale,
|
|
79
|
+
scope, and review trigger. Legacy projects may use baselines or ratchets, but
|
|
80
|
+
new code must meet the current standard.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2026.6.27
|
|
4
|
+
|
|
5
|
+
- Add `dev-std log show` for reading one compliant plan work log by globally
|
|
6
|
+
unique log id.
|
|
7
|
+
- Release the first plan/log hygiene workflow slice with stricter plan-root
|
|
8
|
+
Markdown metadata checks, structured plan steps, log attachment validation,
|
|
9
|
+
and read/write helper commands.
|
|
10
|
+
- Document package-scoped plan audits, root discovery, active plan lifecycle,
|
|
11
|
+
and the intended non-destructive boundary for plan/log commands.
|
|
12
|
+
|
|
13
|
+
## 2026.6.22
|
|
14
|
+
|
|
15
|
+
- Add a public PR hygiene standard for linked issues, Conventional Commit PR
|
|
16
|
+
titles and commit subjects, emoji rejection, and AI-vendor attribution
|
|
17
|
+
rejection.
|
|
18
|
+
- Add reusable GitHub workflow and pull request template files under
|
|
19
|
+
`docs/templates/github/`.
|
|
20
|
+
- Add an opt-in `[pr_hygiene]` conformance check that verifies downstream repos
|
|
21
|
+
have installed the public PR hygiene workflow and template.
|
|
22
|
+
|
|
23
|
+
## 2026.6.14
|
|
24
|
+
|
|
25
|
+
- Allow JavaScript profiles to use a foldered canonical standard design doc at
|
|
26
|
+
`docs/design/standards/javascript.html` while preserving the legacy
|
|
27
|
+
`docs/design/javascript-standard.html` path.
|
|
28
|
+
- Add `[documentation.standard_docs].javascript` for projects with deliberate
|
|
29
|
+
custom design-doc layouts.
|
|
30
|
+
- Document the configuration schema and add regression tests for legacy,
|
|
31
|
+
foldered, configured, and missing JavaScript standard doc paths.
|
|
32
|
+
|
|
33
|
+
## 2026.6.12
|
|
34
|
+
|
|
35
|
+
- Add the `zephyr-firmware` profile with west-based build-loop expectations,
|
|
36
|
+
app-owned source signoff, target-toolchain notes, and embedded C/C++
|
|
37
|
+
complexity gates.
|
|
38
|
+
- Add reusable C/C++ and Zephyr `signoff.toml` templates.
|
|
39
|
+
- Make canonical native new-code complexity explicit:
|
|
40
|
+
`max_cyclomatic_complexity = 10`.
|
|
41
|
+
- Add native signoff configuration checks for complexity, file size, function
|
|
42
|
+
size, clang-format mode, clang-tidy mode, and Lizard enforcement.
|
|
43
|
+
- Document the Rack/signoff quality model, including the public `wn-rack` PyPI
|
|
44
|
+
package and the expectation that every project has an `L99_signoff` gate.
|
|
45
|
+
|
|
46
|
+
## 2026.6.10
|
|
47
|
+
|
|
48
|
+
- Allow local root `.env` files to pass `wn-dev-std check` only when Git reports
|
|
49
|
+
them as untracked and ignored.
|
|
50
|
+
- Require C/C++ profiles to expose a Lizard-based native complexity gate under
|
|
51
|
+
`tests/`.
|
|
52
|
+
|
|
53
|
+
## 2026.6.9
|
|
54
|
+
|
|
55
|
+
- Add the C/C++ fixed-width integer spelling rule to the `cpp-library`
|
|
56
|
+
standard.
|
|
57
|
+
- Require C/C++ profiles to configure clang-tidy `google-runtime-int` as an
|
|
58
|
+
error so owned code uses `std::int32_t`, `std::uint32_t`, `std::int64_t`, and
|
|
59
|
+
`std::uint64_t` instead of `short`, `long`, or `long long`.
|
|
60
|
+
|
|
61
|
+
## 2026.6.7
|
|
62
|
+
|
|
63
|
+
- Codify HTML design-doc status markers with `draft`, `proposal`,
|
|
64
|
+
`accepted`, and `superseded` states.
|
|
65
|
+
- Add a `wn-dev-std check` design-doc status gate that fails unmarked or
|
|
66
|
+
invalid HTML design docs and reports draft/proposal docs for release signoff.
|
|
67
|
+
- Add the documentation standard design page and mark the reference design docs
|
|
68
|
+
as accepted.
|
|
69
|
+
|
|
70
|
+
## 2026.6.4
|
|
71
|
+
|
|
72
|
+
- Add the initial working `wn-dev-std` Python package and CLI.
|
|
73
|
+
- Define the first strict Python development baseline with Rack, Ruff, Pyright,
|
|
74
|
+
Hatchling, committed lockfiles, HTML design docs, JSON contracts, and
|
|
75
|
+
release metadata signoff.
|
|
76
|
+
- Add the initial `cpp-library` profile with CMake, Ninja, clang-format,
|
|
77
|
+
clang-tidy, CTest, warnings, sanitizer, ABI, and public/private header rules.
|
|
78
|
+
- Add the initial `python-native-wasm` mixed-mode profile modeled on Geometer
|
|
79
|
+
for packages with CMake/C++, platform wheels, and WASM artifacts.
|
|
80
|
+
- Add the initial `csharp-app` profile for SDK-style C# application and
|
|
81
|
+
host-plugin projects.
|
|
82
|
+
- Add `javascript-web-app` and `python-js-app` profiles for no-build browser
|
|
83
|
+
apps, CSS/JS hygiene ratchets, and FastAPI-style Python-served frontends.
|
|
84
|
+
- Codify checked JavaScript/JSDoc, deterministic `node:test` coverage,
|
|
85
|
+
CSS custom-property tokens, owned `wn-*` Web Components, JS-to-WASM wrapper
|
|
86
|
+
tests, and simple command verbs for no-build web projects.
|
|
87
|
+
- Add configurable compatibility-pruning checks for retired environment
|
|
88
|
+
variables, setup aliases, and other legacy surfaces.
|
|
89
|
+
- Add CI and model release-validation workflows for public Python packages,
|
|
90
|
+
without publishing `wn-dev-std` itself to PyPI.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Code Of Conduct
|
|
2
|
+
|
|
3
|
+
Wavenumber public repositories should be practical, technical, and respectful.
|
|
4
|
+
Contributors are expected to focus on the work, provide clear technical
|
|
5
|
+
context, and avoid personal attacks or harassment.
|
|
6
|
+
|
|
7
|
+
Report conduct concerns through the project maintainers or the security contact
|
|
8
|
+
listed in `SECURITY.md` when the concern involves private disclosure.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thank you for contributing to `wn-dev-std`.
|
|
4
|
+
|
|
5
|
+
## Development Workflow
|
|
6
|
+
|
|
7
|
+
1. Create a branch from `main`.
|
|
8
|
+
2. Make focused changes.
|
|
9
|
+
3. Run signoff:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv sync --all-extras
|
|
13
|
+
uv run rack run --all
|
|
14
|
+
uv run python -m build
|
|
15
|
+
uv run twine check dist/*
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
4. Open a pull request.
|
|
19
|
+
|
|
20
|
+
## Standards Changes
|
|
21
|
+
|
|
22
|
+
Standards changes should update all affected surfaces:
|
|
23
|
+
|
|
24
|
+
- implementation
|
|
25
|
+
- tests
|
|
26
|
+
- `docs/design/*.html`
|
|
27
|
+
- explicit `data-doc-status` markers for HTML design docs
|
|
28
|
+
- `docs/contracts/*`
|
|
29
|
+
- `README.md` when user-facing behavior changes
|
|
30
|
+
- `CHANGELOG.md`
|
|
31
|
+
- `docs/releases/<YYYY-MM-DD>.md` for release-facing changes
|
|
32
|
+
|
|
33
|
+
## Exceptions
|
|
34
|
+
|
|
35
|
+
Strict rules are the default. Exceptions must include rationale, scope, owner or
|
|
36
|
+
review context, and a clear reason the rule cannot currently be met.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Wavenumber
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|