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.
Files changed (95) hide show
  1. wn_dev_std-2026.6.27/.github/pull_request_template.md +10 -0
  2. wn_dev_std-2026.6.27/.github/workflows/ci.yml +35 -0
  3. wn_dev_std-2026.6.27/.github/workflows/pr-hygiene.yml +117 -0
  4. wn_dev_std-2026.6.27/.github/workflows/release.yml +43 -0
  5. wn_dev_std-2026.6.27/.gitignore +20 -0
  6. wn_dev_std-2026.6.27/AGENTS.md +80 -0
  7. wn_dev_std-2026.6.27/CHANGELOG.md +90 -0
  8. wn_dev_std-2026.6.27/CODE_OF_CONDUCT.md +8 -0
  9. wn_dev_std-2026.6.27/CONTRIBUTING.md +36 -0
  10. wn_dev_std-2026.6.27/LICENSE +21 -0
  11. wn_dev_std-2026.6.27/PKG-INFO +379 -0
  12. wn_dev_std-2026.6.27/README.md +331 -0
  13. wn_dev_std-2026.6.27/SECURITY.md +10 -0
  14. wn_dev_std-2026.6.27/docs/architecture.html +81 -0
  15. wn_dev_std-2026.6.27/docs/contracts/command_manifest.v0.json +47 -0
  16. wn_dev_std-2026.6.27/docs/contracts/exceptions.schema.v0.json +25 -0
  17. wn_dev_std-2026.6.27/docs/contracts/interface_manifest.v0.json +119 -0
  18. wn_dev_std-2026.6.27/docs/contracts/wn_dev_std_config.schema.v0.json +94 -0
  19. wn_dev_std-2026.6.27/docs/design/audit-standard.html +129 -0
  20. wn_dev_std-2026.6.27/docs/design/cli.html +82 -0
  21. wn_dev_std-2026.6.27/docs/design/cpp-standard.html +145 -0
  22. wn_dev_std-2026.6.27/docs/design/csharp-standard.html +58 -0
  23. wn_dev_std-2026.6.27/docs/design/documentation-standard.html +109 -0
  24. wn_dev_std-2026.6.27/docs/design/javascript-standard.html +254 -0
  25. wn_dev_std-2026.6.27/docs/design/mixed-mode.html +89 -0
  26. wn_dev_std-2026.6.27/docs/design/python-standard.html +128 -0
  27. wn_dev_std-2026.6.27/docs/design/zephyr-standard.html +79 -0
  28. wn_dev_std-2026.6.27/docs/releases/2026-06-04.md +17 -0
  29. wn_dev_std-2026.6.27/docs/releases/2026-06-07.md +13 -0
  30. wn_dev_std-2026.6.27/docs/releases/2026-06-09.md +14 -0
  31. wn_dev_std-2026.6.27/docs/releases/2026-06-10.md +13 -0
  32. wn_dev_std-2026.6.27/docs/releases/2026-06-12.md +17 -0
  33. wn_dev_std-2026.6.27/docs/releases/2026-06-14.md +15 -0
  34. wn_dev_std-2026.6.27/docs/releases/2026-06-22.md +15 -0
  35. wn_dev_std-2026.6.27/docs/releases/2026-06-27.md +14 -0
  36. wn_dev_std-2026.6.27/docs/setup.html +74 -0
  37. wn_dev_std-2026.6.27/docs/templates/cpp/.clang-format +13 -0
  38. wn_dev_std-2026.6.27/docs/templates/cpp/.clang-tidy +14 -0
  39. wn_dev_std-2026.6.27/docs/templates/cpp/signoff.toml +32 -0
  40. wn_dev_std-2026.6.27/docs/templates/github/pr-hygiene.yml +117 -0
  41. wn_dev_std-2026.6.27/docs/templates/github/pull_request_template.md +10 -0
  42. wn_dev_std-2026.6.27/docs/templates/zephyr/.clang-format +8 -0
  43. wn_dev_std-2026.6.27/docs/templates/zephyr/.clang-tidy +12 -0
  44. wn_dev_std-2026.6.27/docs/templates/zephyr/signoff.toml +37 -0
  45. wn_dev_std-2026.6.27/pyproject.toml +140 -0
  46. wn_dev_std-2026.6.27/src/wn_dev_std/__init__.py +47 -0
  47. wn_dev_std-2026.6.27/src/wn_dev_std/__main__.py +3 -0
  48. wn_dev_std-2026.6.27/src/wn_dev_std/_version.py +3 -0
  49. wn_dev_std-2026.6.27/src/wn_dev_std/check_profiles.py +208 -0
  50. wn_dev_std-2026.6.27/src/wn_dev_std/checks.py +759 -0
  51. wn_dev_std-2026.6.27/src/wn_dev_std/cli/__init__.py +1 -0
  52. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/__init__.py +1 -0
  53. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/audit.py +75 -0
  54. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/check.py +25 -0
  55. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log.py +30 -0
  56. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log_create.py +50 -0
  57. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log_list.py +88 -0
  58. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/log_show.py +78 -0
  59. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan.py +32 -0
  60. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_common.py +101 -0
  61. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_create.py +59 -0
  62. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_list.py +87 -0
  63. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_show.py +89 -0
  64. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_status.py +42 -0
  65. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/plan_step.py +111 -0
  66. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/standard.py +68 -0
  67. wn_dev_std-2026.6.27/src/wn_dev_std/cli/commands/version.py +71 -0
  68. wn_dev_std-2026.6.27/src/wn_dev_std/cli/main.py +53 -0
  69. wn_dev_std-2026.6.27/src/wn_dev_std/cli/types.py +20 -0
  70. wn_dev_std-2026.6.27/src/wn_dev_std/compatibility_pruning.py +233 -0
  71. wn_dev_std-2026.6.27/src/wn_dev_std/config.py +85 -0
  72. wn_dev_std-2026.6.27/src/wn_dev_std/cpp_policy.py +42 -0
  73. wn_dev_std-2026.6.27/src/wn_dev_std/design_doc_status.py +98 -0
  74. wn_dev_std-2026.6.27/src/wn_dev_std/native_complexity.py +108 -0
  75. wn_dev_std-2026.6.27/src/wn_dev_std/plan_hygiene.py +596 -0
  76. wn_dev_std-2026.6.27/src/wn_dev_std/plan_mutation.py +406 -0
  77. wn_dev_std-2026.6.27/src/wn_dev_std/plan_reader.py +25 -0
  78. wn_dev_std-2026.6.27/src/wn_dev_std/pr_hygiene.py +168 -0
  79. wn_dev_std-2026.6.27/src/wn_dev_std/root_discovery.py +102 -0
  80. wn_dev_std-2026.6.27/src/wn_dev_std/secret_hygiene.py +34 -0
  81. wn_dev_std-2026.6.27/src/wn_dev_std/standards.py +756 -0
  82. wn_dev_std-2026.6.27/tests/L0_foundation/STRATUM.toml +38 -0
  83. wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_001_cli_entrypoint.py +125 -0
  84. wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_002_public_interfaces.py +840 -0
  85. wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_003_plan_hygiene.py +385 -0
  86. wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_004_plan_read_commands.py +204 -0
  87. wn_dev_std-2026.6.27/tests/L0_foundation/test_L0_005_plan_mutation_commands.py +211 -0
  88. wn_dev_std-2026.6.27/tests/L99_signoff/STRATUM.toml +57 -0
  89. wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_001_release_metadata.py +58 -0
  90. wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_002_docs_contracts.py +63 -0
  91. wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_003_quality_tools.py +34 -0
  92. wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_004_repo_hygiene.py +234 -0
  93. wn_dev_std-2026.6.27/tests/L99_signoff/test_L99_005_python_signoff.py +18 -0
  94. wn_dev_std-2026.6.27/tests/rack.toml +48 -0
  95. wn_dev_std-2026.6.27/tests/support_scripts/py_signoff.py +252 -0
@@ -0,0 +1,10 @@
1
+ Linked issue:
2
+
3
+ ## Summary
4
+
5
+
6
+ ## Validation
7
+
8
+
9
+ PR title and commit subjects must use Conventional Commit form, for example
10
+ `fix: handle missing board outline`.
@@ -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,20 @@
1
+ .env
2
+ .env.*
3
+ !.env.example
4
+
5
+ .venv/
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ .pyright/
9
+ __pycache__/
10
+ *.py[cod]
11
+
12
+ build/
13
+ dist/
14
+ *.egg-info/
15
+
16
+ rack_results/
17
+ tests/rack_results/
18
+
19
+ .coverage
20
+ htmlcov/
@@ -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.