codebatch 1.0.0__tar.gz → 1.0.2__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 (151) hide show
  1. {codebatch-1.0.0 → codebatch-1.0.2}/.github/workflows/ci.yml +5 -3
  2. codebatch-1.0.2/.github/workflows/dogfood.yml +165 -0
  3. {codebatch-1.0.0 → codebatch-1.0.2}/.github/workflows/publish.yml +2 -0
  4. {codebatch-1.0.0 → codebatch-1.0.2}/CHANGELOG.md +37 -0
  5. {codebatch-1.0.0 → codebatch-1.0.2}/PKG-INFO +1 -1
  6. {codebatch-1.0.0 → codebatch-1.0.2}/pyproject.toml +1 -1
  7. codebatch-1.0.2/site/astro.config.mjs +24 -0
  8. {codebatch-1.0.0 → codebatch-1.0.2}/site/package-lock.json +1431 -33
  9. {codebatch-1.0.0 → codebatch-1.0.2}/site/package.json +1 -0
  10. codebatch-1.0.2/site/src/content/docs/handbook/commands.md +130 -0
  11. codebatch-1.0.2/site/src/content/docs/handbook/getting-started.md +151 -0
  12. codebatch-1.0.2/site/src/content/docs/handbook/index.md +52 -0
  13. codebatch-1.0.2/site/src/content/docs/handbook/reference.md +134 -0
  14. codebatch-1.0.2/site/src/content/docs/handbook/usage.md +160 -0
  15. codebatch-1.0.2/site/src/content.config.ts +7 -0
  16. {codebatch-1.0.0 → codebatch-1.0.2}/site/src/site-config.ts +1 -1
  17. codebatch-1.0.2/site/src/styles/starlight-custom.css +17 -0
  18. codebatch-1.0.2/src/codebatch/__init__.py +9 -0
  19. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/cli.py +88 -1
  20. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/common.py +4 -2
  21. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/tasks/lint.py +511 -0
  22. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/workflow.py +100 -22
  23. codebatch-1.0.2/tests/test_lint_js.py +386 -0
  24. codebatch-1.0.2/tests/test_parallel.py +206 -0
  25. codebatch-1.0.2/tests/test_store_stats.py +92 -0
  26. codebatch-1.0.2/tests/test_version.py +38 -0
  27. codebatch-1.0.0/site/astro.config.mjs +0 -13
  28. codebatch-1.0.0/src/codebatch/__init__.py +0 -3
  29. {codebatch-1.0.0 → codebatch-1.0.2}/.github/workflows/pages.yml +0 -0
  30. {codebatch-1.0.0 → codebatch-1.0.2}/.gitignore +0 -0
  31. {codebatch-1.0.0 → codebatch-1.0.2}/.polyglot-cache.json +0 -0
  32. {codebatch-1.0.0 → codebatch-1.0.2}/.spec_baseline_hash +0 -0
  33. {codebatch-1.0.0 → codebatch-1.0.2}/Dockerfile +0 -0
  34. {codebatch-1.0.0 → codebatch-1.0.2}/LICENSE +0 -0
  35. {codebatch-1.0.0 → codebatch-1.0.2}/README.es.md +0 -0
  36. {codebatch-1.0.0 → codebatch-1.0.2}/README.fr.md +0 -0
  37. {codebatch-1.0.0 → codebatch-1.0.2}/README.hi.md +0 -0
  38. {codebatch-1.0.0 → codebatch-1.0.2}/README.it.md +0 -0
  39. {codebatch-1.0.0 → codebatch-1.0.2}/README.ja.md +0 -0
  40. {codebatch-1.0.0 → codebatch-1.0.2}/README.md +0 -0
  41. {codebatch-1.0.0 → codebatch-1.0.2}/README.pt-BR.md +0 -0
  42. {codebatch-1.0.0 → codebatch-1.0.2}/README.zh.md +0 -0
  43. {codebatch-1.0.0 → codebatch-1.0.2}/SCORECARD.md +0 -0
  44. {codebatch-1.0.0 → codebatch-1.0.2}/SECURITY.md +0 -0
  45. {codebatch-1.0.0 → codebatch-1.0.2}/SHIP_GATE.md +0 -0
  46. {codebatch-1.0.0 → codebatch-1.0.2}/SPEC.md +0 -0
  47. {codebatch-1.0.0 → codebatch-1.0.2}/assets/logo.png +0 -0
  48. {codebatch-1.0.0 → codebatch-1.0.2}/docs/GATES.md +0 -0
  49. {codebatch-1.0.0 → codebatch-1.0.2}/docs/INTEGRATION.md +0 -0
  50. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE2_ACCEPTANCE.md +0 -0
  51. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE2_CHARTER.md +0 -0
  52. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE2_RULES.md +0 -0
  53. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE3_CHARTER.md +0 -0
  54. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE3_GATES.md +0 -0
  55. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE6_CHARTER.md +0 -0
  56. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE7_CHARTER.md +0 -0
  57. {codebatch-1.0.0 → codebatch-1.0.2}/docs/PHASE8_CHARTER.md +0 -0
  58. {codebatch-1.0.0 → codebatch-1.0.2}/docs/TASKS.md +0 -0
  59. {codebatch-1.0.0 → codebatch-1.0.2}/docs/index.md +0 -0
  60. {codebatch-1.0.0 → codebatch-1.0.2}/llms.txt +0 -0
  61. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/api.schema.json +0 -0
  62. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/batch.schema.json +0 -0
  63. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/chunk-manifest.schema.json +0 -0
  64. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/error.schema.json +0 -0
  65. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/event-record.schema.json +0 -0
  66. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/files-index-record.schema.json +0 -0
  67. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/gate-result.schema.json +0 -0
  68. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/output-record.schema.json +0 -0
  69. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/plan.schema.json +0 -0
  70. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/snapshot.schema.json +0 -0
  71. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/state.schema.json +0 -0
  72. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/store.schema.json +0 -0
  73. {codebatch-1.0.0 → codebatch-1.0.2}/schemas/task.schema.json +0 -0
  74. {codebatch-1.0.0 → codebatch-1.0.2}/scripts/check_no_network.py +0 -0
  75. {codebatch-1.0.0 → codebatch-1.0.2}/scripts/check_spec_protected.py +0 -0
  76. {codebatch-1.0.0 → codebatch-1.0.2}/scripts/check_truth_stores.py +0 -0
  77. {codebatch-1.0.0 → codebatch-1.0.2}/site/src/pages/index.astro +0 -0
  78. {codebatch-1.0.0 → codebatch-1.0.2}/site/src/styles/global.css +0 -0
  79. {codebatch-1.0.0 → codebatch-1.0.2}/site/tsconfig.json +0 -0
  80. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/__main__.py +0 -0
  81. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/batch.py +0 -0
  82. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/cache.py +0 -0
  83. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/cache_meta.py +0 -0
  84. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/cas.py +0 -0
  85. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/errors.py +0 -0
  86. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/gates/__init__.py +0 -0
  87. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/gates/definitions.py +0 -0
  88. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/gates/registry.py +0 -0
  89. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/gates/result.py +0 -0
  90. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/gates/runner.py +0 -0
  91. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/index_build.py +0 -0
  92. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/paths.py +0 -0
  93. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/query.py +0 -0
  94. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/registry.py +0 -0
  95. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/runner.py +0 -0
  96. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/snapshot.py +0 -0
  97. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/store.py +0 -0
  98. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/tasks/__init__.py +0 -0
  99. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/tasks/analyze.py +0 -0
  100. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/tasks/parse.py +0 -0
  101. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/tasks/symbols.py +0 -0
  102. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/ui/__init__.py +0 -0
  103. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/ui/diff.py +0 -0
  104. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/ui/format.py +0 -0
  105. {codebatch-1.0.0 → codebatch-1.0.2}/src/codebatch/ui/pager.py +0 -0
  106. {codebatch-1.0.0 → codebatch-1.0.2}/tests/README.md +0 -0
  107. {codebatch-1.0.0 → codebatch-1.0.2}/tests/conftest.py +0 -0
  108. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus/binary.bin +0 -0
  109. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus/crlf_example.txt +0 -0
  110. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus/emoji_/360/237/216/211.md" +0 -0
  111. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus/empty.txt +0 -0
  112. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus/hello.py +0 -0
  113. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus/unicode_/350/267/257/345/276/204.txt" +0 -0
  114. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus-windows-only/CaseA.cs +0 -0
  115. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus-windows-only/casea.cs.expected +0 -0
  116. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/corpus_lint/messy.py +0 -0
  117. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/golden/snapshot/files.index.jsonl +0 -0
  118. {codebatch-1.0.0 → codebatch-1.0.2}/tests/fixtures/golden/snapshot/snapshot.json +0 -0
  119. {codebatch-1.0.0 → codebatch-1.0.2}/tests/golden/ui/json_basic.json +0 -0
  120. {codebatch-1.0.0 → codebatch-1.0.2}/tests/golden/ui/jsonl_basic.jsonl +0 -0
  121. {codebatch-1.0.0 → codebatch-1.0.2}/tests/golden/ui/table_basic.txt +0 -0
  122. {codebatch-1.0.0 → codebatch-1.0.2}/tests/golden/ui/table_no_header.txt +0 -0
  123. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_analyze_task.py +0 -0
  124. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_batch.py +0 -0
  125. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_cache_perf.py +0 -0
  126. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_cas.py +0 -0
  127. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_diff_commands.py +0 -0
  128. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_diff_engine.py +0 -0
  129. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_e2e_acceptance.py +0 -0
  130. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_errors.py +0 -0
  131. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_explain.py +0 -0
  132. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_gate_cli.py +0 -0
  133. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_gates.py +0 -0
  134. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_index_build.py +0 -0
  135. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_inspect.py +0 -0
  136. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_lint_task.py +0 -0
  137. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_parse_task.py +0 -0
  138. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_paths.py +0 -0
  139. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_phase2_gates.py +0 -0
  140. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_phase6_gates.py +0 -0
  141. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_phase7_gates.py +0 -0
  142. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_phase8_gates.py +0 -0
  143. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_query.py +0 -0
  144. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_runner.py +0 -0
  145. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_schema_validation.py +0 -0
  146. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_snapshot.py +0 -0
  147. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_store.py +0 -0
  148. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_symbols_task.py +0 -0
  149. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_ui_format.py +0 -0
  150. {codebatch-1.0.0 → codebatch-1.0.2}/tests/test_workflow.py +0 -0
  151. {codebatch-1.0.0 → codebatch-1.0.2}/uv.lock +0 -0
@@ -46,9 +46,11 @@ jobs:
46
46
  python -m pip install --upgrade pip
47
47
  pip install -e ".[dev]"
48
48
 
49
- - name: Run tests
49
+ - name: Run tests with coverage
50
50
  run: |
51
- python -m pytest tests/ -v --tb=short
51
+ python -m pytest tests/ -v --tb=short \
52
+ --cov=codebatch --cov-report=term-missing --cov-report=json \
53
+ --cov-fail-under=70
52
54
 
53
55
  gates:
54
56
  runs-on: ubuntu-latest
@@ -159,7 +161,7 @@ jobs:
159
161
 
160
162
  - name: Run ruff check
161
163
  run: |
162
- ruff check src/ tests/ || true
164
+ ruff check src/ tests/
163
165
 
164
166
  - name: Run ruff format check
165
167
  run: |
@@ -0,0 +1,165 @@
1
+ name: Dogfood
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "src/**"
8
+ - "pyproject.toml"
9
+ - ".github/workflows/dogfood.yml"
10
+ workflow_dispatch:
11
+
12
+ concurrency:
13
+ group: dogfood-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ dogfood:
18
+ runs-on: ubuntu-latest
19
+ if: github.ref == 'refs/heads/main'
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+ - run: pip install -e .
26
+
27
+ # --- Scenario: init-and-run-pipeline ---
28
+ # Exercise the real product: initialize a store and list pipelines
29
+
30
+ - name: "Step: init-store"
31
+ id: init_store
32
+ run: |
33
+ codebatch init /tmp/cb-store
34
+ if [ $? -eq 0 ]; then
35
+ echo "status=pass" >> "$GITHUB_OUTPUT"
36
+ else
37
+ echo "status=fail" >> "$GITHUB_OUTPUT"
38
+ fi
39
+
40
+ - name: "Step: list-pipelines"
41
+ id: list_pipelines
42
+ run: |
43
+ codebatch pipelines --json 2>&1 | tee /tmp/pipelines.log
44
+ if [ $? -eq 0 ]; then
45
+ echo "status=pass" >> "$GITHUB_OUTPUT"
46
+ else
47
+ echo "status=fail" >> "$GITHUB_OUTPUT"
48
+ fi
49
+
50
+ - name: "Step: verify-output"
51
+ id: verify_output
52
+ run: |
53
+ if [ -s /tmp/pipelines.log ]; then
54
+ echo "status=pass" >> "$GITHUB_OUTPUT"
55
+ else
56
+ echo "status=fail" >> "$GITHUB_OUTPUT"
57
+ fi
58
+
59
+ # --- Verdict ---
60
+
61
+ - name: Determine overall verdict
62
+ id: verdict
63
+ run: |
64
+ I="${{ steps.init_store.outputs.status }}"
65
+ L="${{ steps.list_pipelines.outputs.status }}"
66
+ V="${{ steps.verify_output.outputs.status }}"
67
+ if [ "$I" = "pass" ] && [ "$L" = "pass" ] && [ "$V" = "pass" ]; then
68
+ echo "verdict=pass" >> "$GITHUB_OUTPUT"
69
+ else
70
+ echo "verdict=fail" >> "$GITHUB_OUTPUT"
71
+ fi
72
+
73
+ # --- Build + dispatch ---
74
+
75
+ - name: Build submission
76
+ run: |
77
+ FINISHED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
78
+ cat > /tmp/submission.json << 'INNER_EOF'
79
+ {
80
+ "schema_version": "1.0.0",
81
+ "run_id": "code-batch-RUN_ID-ATTEMPT",
82
+ "repo": "REPO_SLUG",
83
+ "ref": {
84
+ "branch": "REF_NAME",
85
+ "commit_sha": "COMMIT_SHA"
86
+ },
87
+ "source": {
88
+ "provider": "github",
89
+ "workflow": "dogfood.yml",
90
+ "provider_run_id": "PROVIDER_RUN_ID",
91
+ "attempt": ATTEMPT_NUM,
92
+ "run_url": "RUN_URL_PLACEHOLDER",
93
+ "actor": "ACTOR_NAME"
94
+ },
95
+ "timing": {
96
+ "started_at": "STARTED_PLACEHOLDER",
97
+ "finished_at": "FINISHED_PLACEHOLDER",
98
+ "duration_ms": 0
99
+ },
100
+ "ci_checks": [],
101
+ "scenario_results": [
102
+ {
103
+ "scenario_id": "init-and-run-pipeline",
104
+ "scenario_name": "Initialize store and list pipelines",
105
+ "scenario_version": "1.0.0",
106
+ "product_surface": "cli",
107
+ "execution_mode": "bot",
108
+ "verdict": "VERDICT_PLACEHOLDER",
109
+ "step_results": [
110
+ { "step_id": "init-store", "status": "INIT_STATUS" },
111
+ { "step_id": "list-pipelines", "status": "LIST_STATUS" },
112
+ { "step_id": "verify-output", "status": "VERIFY_STATUS" }
113
+ ],
114
+ "evidence": [
115
+ {
116
+ "kind": "log",
117
+ "url": "RUN_URL_PLACEHOLDER",
118
+ "description": "CI run log with init and pipeline list output"
119
+ }
120
+ ],
121
+ "notes": "Bot-driven store init and pipeline listing"
122
+ }
123
+ ],
124
+ "overall_verdict": "VERDICT_PLACEHOLDER",
125
+ "notes": "Phase 2 rollout: code-batch CLI dogfood."
126
+ }
127
+ INNER_EOF
128
+
129
+ sed -i "s|REPO_SLUG|${GITHUB_REPOSITORY}|g" /tmp/submission.json
130
+ sed -i "s|REF_NAME|${GITHUB_REF_NAME}|g" /tmp/submission.json
131
+ sed -i "s|COMMIT_SHA|${GITHUB_SHA}|g" /tmp/submission.json
132
+ sed -i "s|PROVIDER_RUN_ID|${GITHUB_RUN_ID}|g" /tmp/submission.json
133
+ sed -i "s|ATTEMPT_NUM|${GITHUB_RUN_ATTEMPT}|g" /tmp/submission.json
134
+ sed -i "s|RUN_URL_PLACEHOLDER|https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}|g" /tmp/submission.json
135
+ sed -i "s|ACTOR_NAME|${GITHUB_ACTOR}|g" /tmp/submission.json
136
+ sed -i "s|STARTED_PLACEHOLDER|${{ github.event.head_commit.timestamp || github.event.repository.pushed_at }}|g" /tmp/submission.json
137
+ sed -i "s|FINISHED_PLACEHOLDER|${FINISHED_AT}|g" /tmp/submission.json
138
+ sed -i "s|code-batch-RUN_ID-ATTEMPT|code-batch-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}|g" /tmp/submission.json
139
+ sed -i "s|VERDICT_PLACEHOLDER|${{ steps.verdict.outputs.verdict }}|g" /tmp/submission.json
140
+ sed -i "s|INIT_STATUS|${{ steps.init_store.outputs.status }}|g" /tmp/submission.json
141
+ sed -i "s|LIST_STATUS|${{ steps.list_pipelines.outputs.status }}|g" /tmp/submission.json
142
+ sed -i "s|VERIFY_STATUS|${{ steps.verify_output.outputs.status }}|g" /tmp/submission.json
143
+
144
+ jq empty /tmp/submission.json
145
+ echo "Submission built:"
146
+ jq '.run_id, .overall_verdict' /tmp/submission.json
147
+
148
+ - name: Dispatch to dogfood-labs
149
+ env:
150
+ GH_TOKEN: ${{ secrets.DOGFOOD_TOKEN }}
151
+ run: |
152
+ SUBMISSION=$(cat /tmp/submission.json)
153
+ RUN_ID=$(echo "$SUBMISSION" | jq -r '.run_id')
154
+
155
+ if [ -z "$GH_TOKEN" ]; then
156
+ echo "::warning::DOGFOOD_TOKEN not set — skipping dispatch"
157
+ exit 0
158
+ fi
159
+
160
+ jq -n --argjson sub "$SUBMISSION" \
161
+ '{"event_type":"dogfood_submission","client_payload":{"submission":$sub}}' \
162
+ | gh api repos/mcp-tool-shop-org/dogfood-labs/dispatches \
163
+ --input - --silent
164
+
165
+ echo "Dispatched $RUN_ID to dogfood-labs"
@@ -135,4 +135,6 @@ jobs:
135
135
 
136
136
  - name: Publish to PyPI
137
137
  uses: pypa/gh-action-pypi-publish@release/v1
138
+ with:
139
+ skip-existing: true
138
140
 
@@ -4,6 +4,43 @@ All notable changes to the CodeBatch specification and implementation.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.0.2] - 2026-03-25
8
+
9
+ ### Fixed
10
+ - **`--version` flag** now reads version dynamically from package metadata instead of hardcoded `0.1.0`
11
+ - **CI lint enforcement** — `ruff check` failures now block CI (was silently passing with `|| true`)
12
+ - 5 unused-import lint violations fixed in test files
13
+
14
+ ### Added
15
+ - **`store-stats` command** — shows per-directory disk usage breakdown (objects, snapshots, batches, indexes) with human-readable formatting and `--json` output (9 new tests)
16
+
17
+ ## [1.0.1] - 2026-03-20
18
+
19
+ ### Fixed
20
+ - **Version mismatch** — `__init__.__version__`, `common.VERSION`, and `PRODUCER.version`
21
+ now all derive from `pyproject.toml` via `importlib.metadata`. No more triple-maintenance
22
+ of version strings across `0.1.0` / `0.7.0` / `1.0.0`.
23
+
24
+ ### Added
25
+ - **JS/TS AST-aware lint rules (L101-L103)** — tree-sitter ASTs now get the same
26
+ AST-aware linting as Python:
27
+ - L101: Unused import detection for JS/TS
28
+ - L102: Unused variable detection for JS/TS
29
+ - L103: Variable shadowing detection for JS/TS
30
+ - Wired into `lint_executor` alongside existing Python AST rules
31
+ - **Parallel shard execution** — `WorkflowRunner.run()` and `.resume()` accept
32
+ `max_workers` (default 1 = sequential). When > 1, shards within each task
33
+ execute concurrently via `ThreadPoolExecutor`. Tasks still execute sequentially
34
+ to respect dependency order. Each thread gets its own `ShardRunner` for isolation.
35
+ - **CI coverage reporting** — `pytest-cov` now runs in CI with `--cov-fail-under=70`
36
+ and `--cov-report=term-missing` for visibility into uncovered lines.
37
+
38
+ ### Testing
39
+ - 31 new tests (561 total):
40
+ - 4 version consistency tests (`test_version.py`)
41
+ - 20 JS/TS lint rule tests (`test_lint_js.py`)
42
+ - 7 parallel execution tests (`test_parallel.py`)
43
+
7
44
  ## [1.0.0] - 2026-02-27
8
45
 
9
46
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codebatch
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: Content-addressed batch execution engine
5
5
  Author-email: mcp-tool-shop <64996768+mcp-tool-shop@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codebatch"
7
- version = "1.0.0"
7
+ version = "1.0.2"
8
8
  description = "Content-addressed batch execution engine"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -0,0 +1,24 @@
1
+ // @ts-check
2
+ import { defineConfig } from 'astro/config';
3
+ import starlight from '@astrojs/starlight';
4
+ import tailwindcss from '@tailwindcss/vite';
5
+
6
+ export default defineConfig({
7
+ site: 'https://mcp-tool-shop-org.github.io',
8
+ base: '/code-batch',
9
+ integrations: [
10
+ starlight({
11
+ title: 'Code Batch',
12
+ description: 'Code Batch handbook',
13
+ social: [
14
+ { icon: 'github', label: 'GitHub', href: 'https://github.com/mcp-tool-shop-org/code-batch' },
15
+ ],
16
+ sidebar: [
17
+ { label: 'Handbook', autogenerate: { directory: 'handbook' } },
18
+ ],
19
+ customCss: ['./src/styles/starlight-custom.css'],
20
+ disable404Route: true,
21
+ }),
22
+ ],
23
+ vite: { plugins: [tailwindcss()] },
24
+ });