speckit-specops 0.1.0__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.
@@ -0,0 +1,41 @@
1
+ # Byte-compiled / cache
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Packaging / distribution
7
+ build/
8
+ dist/
9
+ *.egg-info/
10
+ *.egg
11
+ .eggs/
12
+ pip-wheel-metadata/
13
+
14
+ # Virtual environments
15
+ .venv/
16
+ venv/
17
+ env/
18
+
19
+ # Test / coverage / type-check caches
20
+ .pytest_cache/
21
+ .tox/
22
+ .coverage
23
+ .coverage.*
24
+ htmlcov/
25
+ coverage.xml
26
+ .mypy_cache/
27
+ .ruff_cache/
28
+
29
+ # Environment files
30
+ .env
31
+ .env.*
32
+
33
+ # Editors / IDEs
34
+ .idea/
35
+ .vscode/
36
+
37
+ # macOS
38
+ .DS_Store
39
+
40
+ # Claude Code local settings
41
+ .claude/settings.local.json
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Paulo Segundo
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.
@@ -0,0 +1,233 @@
1
+ Metadata-Version: 2.4
2
+ Name: speckit-specops
3
+ Version: 0.1.0
4
+ Summary: A Spec-Driven Development (SDD) process enforcement CLI extending Speckit
5
+ Author-email: Paulo Segundo <paulosegundo@gmail.com>
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Requires-Python: >=3.10
12
+ Requires-Dist: gitpython>=3.1.40
13
+ Requires-Dist: pyyaml>=6.0
14
+ Requires-Dist: typer>=0.9.0
15
+ Provides-Extra: dev
16
+ Requires-Dist: mypy>=1.10.0; extra == 'dev'
17
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
18
+ Requires-Dist: pytest>=7.0; extra == 'dev'
19
+ Requires-Dist: ruff>=0.4.0; extra == 'dev'
20
+ Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
21
+ Description-Content-Type: text/markdown
22
+
23
+ # SpecOps CLI
24
+
25
+ [![CI](https://github.com/paulo2nd/specops/actions/workflows/ci.yml/badge.svg)](https://github.com/paulo2nd/specops/actions/workflows/ci.yml)
26
+ [![PyPI](https://img.shields.io/pypi/v/speckit-specops.svg)](https://pypi.org/project/speckit-specops/)
27
+ [![Python](https://img.shields.io/pypi/pyversions/speckit-specops.svg)](https://pypi.org/project/speckit-specops/)
28
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
29
+
30
+ **SpecOps turns [GitHub Speckit](https://github.com/vgrecov/speckit)'s
31
+ spec-driven workflow into an enforced, auditable process.** It layers an
32
+ agent-guided *atomic development* methodology on top of any Speckit repository —
33
+ a physical state ledger, machine-collected evidence, and token-optimized review —
34
+ **without replacing or forking a single Speckit file.**
35
+
36
+ > Speckit gives your agents great artifacts (spec → plan → tasks → implement).
37
+ > SpecOps makes sure they actually follow them: state is on disk and
38
+ > Git-verifiable, evidence is collected by tooling instead of claimed by the
39
+ > agent, and review rejects as cheaply as possible.
40
+
41
+ ## Why SpecOps?
42
+
43
+ Spec-driven development with AI agents has three recurring failure modes.
44
+ SpecOps addresses each one:
45
+
46
+ | Problem | Without SpecOps | With SpecOps |
47
+ |---|---|---|
48
+ | **Agents hallucinate progress** | "Done ✅" with no proof | Every task is closed with machine-collected evidence (test output, commit hashes, diffs) recorded in the ledger |
49
+ | **State lives in the chat** | Lost on context reset; not auditable | State is a physical `status.yaml` ledger, Git-verifiable and recovery-safe |
50
+ | **Reviews are slow and expensive** | Agent reads the whole repo | `/specops-review` rejects cheapest-first (reconcile → lint/test → out-of-plan files) before reading any code |
51
+
52
+ ## What it adds to Speckit
53
+
54
+ - **📒 Physical state ledger (Repo-as-State).** A structured `status.yaml`
55
+ tracks phase, tasks, evidence, and review cycles. Mutated only through
56
+ `specops` commands — never hand-edited, never held in agent memory.
57
+ - **🔬 Automated evidence collection.** `complete-task --auto` runs your test
58
+ command, harvests commits and diffs, and records them as typed evidence. A
59
+ task cannot be `DONE` without proof.
60
+ - **🔁 A phase state machine wired into the prompts.** `specops init` injects
61
+ directives into the specify, plan, tasks, and implement prompts so the ledger
62
+ is created and phases advance automatically — the human never runs the
63
+ bookkeeping by hand.
64
+ - **✂️ Token-optimized surgical review.** The installed `/specops-review`
65
+ command reviews only in-scope files and stops at the first cheap rejection.
66
+ - **📐 Empirical verification & gates.** `specops consistency` and
67
+ `specops reconcile` are exit-code gates you can drop into CI or agent prompts.
68
+ - **➕ Additive and reversible.** Everything is delivered through
69
+ marker-delimited blocks. Uninstalling restores your Speckit files
70
+ byte-for-byte.
71
+
72
+ ## Install
73
+
74
+ ```bash
75
+ pip install speckit-specops
76
+ ```
77
+
78
+ Installs the `specops` command. Requires Python ≥ 3.10 and Git ≥ 2.30. No
79
+ network I/O after install.
80
+
81
+ ## Quick Start
82
+
83
+ ```bash
84
+ # In a Speckit-initialized repository:
85
+ specops init # inject directives, install /specops-review, create specops.json
86
+ ```
87
+
88
+ That's it. From here you drive Speckit as usual (`/speckit.specify`,
89
+ `/speckit.plan`, `/speckit.tasks`, `/speckit.implement`) and the injected
90
+ directives take care of the ledger and phase transitions. Check state anytime:
91
+
92
+ ```bash
93
+ specops status show
94
+ ```
95
+
96
+ ## How it works
97
+
98
+ SpecOps rides the Speckit lifecycle. Once `specops init` has run, the injected
99
+ directives drive the ledger at each stage seam:
100
+
101
+ | Speckit stage | What SpecOps does |
102
+ |---|---|
103
+ | **specify** | Marks the repo as SpecOps-managed (informational; no ledger yet) |
104
+ | **plan** | Enforces empirical path verification and the `consistency` gate |
105
+ | **tasks** | Creates the ledger (`status init-spec`), advances the phase to `TASKS`, and requires `[SC-xxx]` coverage tags on every task |
106
+ | **implement** | Opens `IMPLEMENT`, runs the evidence-backed ledger loop, then opens `REVIEW` |
107
+ | **review** | `/specops-review` validates the diff and records `APPROVED` / `REJECTED` |
108
+
109
+ The phase machine is `SPECIFY → PLAN → TASKS → IMPLEMENT → REVIEW → DONE`.
110
+ If SpecOps is not installed, the Speckit prompts still work standalone — the
111
+ directives degrade to no-ops.
112
+
113
+ ## Command reference
114
+
115
+ ### `specops init [--non-interactive]`
116
+
117
+ Prepares a Speckit repository in one run: validates (or offers to create) a Git
118
+ repo, detects Speckit, resolves prompt targets from Speckit's integration
119
+ manifests (works with any recorded agent layout — Claude skills, GitHub
120
+ Copilot, etc.), creates/merge-preserves `specops.json`, installs
121
+ `/specops-review`, and injects the directive blocks into the specify, plan,
122
+ tasks, and implement prompts (additive, idempotent, byte-identical restore on
123
+ removal). `--non-interactive` declines all prompts (CI-safe).
124
+
125
+ > **Speckit upgrade note**: a Speckit upgrade may rewrite prompt files and
126
+ > remove the injected blocks. Just re-run `specops init` to re-inject.
127
+
128
+ ### `specops status show`
129
+
130
+ Read-only. Prints ledger state: feature, branch, phase, active task, task counts
131
+ (pending / in progress / done / orphaned), and the review-cycle history.
132
+
133
+ ### `specops status init-spec [<name>]`
134
+
135
+ Creates `<feature_dir>/status.yaml` from the packaged scaffold, syncing task IDs
136
+ from `tasks.md`. Usually run for you by the tasks directive.
137
+
138
+ ### `specops status start-task <task-id>`
139
+
140
+ Marks the task `IN_PROGRESS` and records `started_commit = HEAD`. Enforces the
141
+ single-active-task rule.
142
+
143
+ ### `specops status complete-task <task-id> [--auto | --evidence "CLASS:summary"]`
144
+
145
+ Marks the task `DONE` with exactly one evidence source:
146
+
147
+ - `--auto`: runs `test_command`; on success, harvests `started_commit..HEAD`
148
+ commits + diff as `TEST_REPORT`/`CODE_DIFF` evidence.
149
+ - `--evidence "CLASS:summary"`: caller-supplied, with `CLASS` in
150
+ `CLI_LOG | TEST_REPORT | SCREENSHOT_PATH | CODE_DIFF`.
151
+
152
+ ### `specops status transition-phase <phase> [-r APPROVED|REJECTED]`
153
+
154
+ Advances the phase one step forward. Two transitions require `-r`:
155
+
156
+ ```bash
157
+ specops status transition-phase DONE -r APPROVED # approved → close the feature
158
+ specops status transition-phase IMPLEMENT -r REJECTED # rejected → send back for rework
159
+ ```
160
+
161
+ Entering `DONE` requires the latest review cycle to be `APPROVED`.
162
+
163
+ ### `specops reconcile`
164
+
165
+ Read-only gate. Verifies every ledger commit hash is reachable from `HEAD` and
166
+ every `DONE` task has commits and evidence. Exit 1 on any divergence.
167
+
168
+ ```bash
169
+ specops reconcile || exit 1 # preflight before review
170
+ ```
171
+
172
+ ### `specops consistency`
173
+
174
+ Read-only gate. Verifies every `SC-\d+` in the spec has ≥ 1 task with a matching
175
+ `[SC-xxx]` tag, and every `plan.md` path declaration carries a valid action
176
+ suffix (`(create)`/`(modify)`/`(remove)`). Exit 1 on violation.
177
+
178
+ ### `specops --version`
179
+
180
+ Prints the version and exits. Works anywhere.
181
+
182
+ ## Configuration — `specops.json`
183
+
184
+ | Key | Purpose | Default |
185
+ |---|---|---|
186
+ | `test_command` | Command run by `complete-task --auto` | `pytest` |
187
+ | `lint_command` | Command referenced by the review prompt | `""` |
188
+ | `skills_dir` | Directory the review prompt loads skills from | `.specify/skills` |
189
+
190
+ Unknown keys are preserved on re-init.
191
+
192
+ ## The `/specops-review` command
193
+
194
+ Installed by `specops init` (the name follows the layout's separator, e.g.
195
+ `/specops-review` for Claude skills). Not a CLI command — a packaged prompt that
196
+ drives the review agent cheapest-rejection-first:
197
+
198
+ 1. Load skills from `skills_dir`.
199
+ 2. `specops reconcile` — abort immediately on failure.
200
+ 3. `lint_command` + `test_command` — reject on failure.
201
+ 4. `git status --porcelain` — reject any out-of-plan file without reading code.
202
+ 5. Surgical diff review of in-scope files only.
203
+ 6. Write `revisions/revision-X.md` and record the `APPROVED`/`REJECTED` outcome.
204
+
205
+ ## Language policy
206
+
207
+ All SpecOps operational output (CLI messages, injected assets) is in English.
208
+ Your prose (`spec.md`, `plan.md`, task descriptions) may be in **any language** —
209
+ SpecOps parses only structural tokens (`SC-\d+`, `T\d+`, action suffixes), never
210
+ content.
211
+
212
+ ## Supported Speckit layouts
213
+
214
+ SpecOps resolves prompt targets at runtime from
215
+ `.specify/integrations/<agent>.manifest.json`. Any Speckit integration with a
216
+ recorded manifest is supported; unknown layouts fail closed. Tested with
217
+ Speckit ≥ 0.12 (Claude skills mode, separator `-`).
218
+
219
+ ## Uninstall
220
+
221
+ Remove the appended block from each prompt file, then delete `specops.json` and
222
+ the installed review command. No other files are written; the restore is
223
+ byte-identical.
224
+
225
+ ## Contributing
226
+
227
+ Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup,
228
+ the quality gates, and project principles. SpecOps is at `0.x`; the CLI surface
229
+ and ledger format may still change before `1.0` (see [CHANGELOG.md](CHANGELOG.md)).
230
+
231
+ ## License
232
+
233
+ [MIT](LICENSE) © Paulo Segundo
@@ -0,0 +1,211 @@
1
+ # SpecOps CLI
2
+
3
+ [![CI](https://github.com/paulo2nd/specops/actions/workflows/ci.yml/badge.svg)](https://github.com/paulo2nd/specops/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/speckit-specops.svg)](https://pypi.org/project/speckit-specops/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/speckit-specops.svg)](https://pypi.org/project/speckit-specops/)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
+
8
+ **SpecOps turns [GitHub Speckit](https://github.com/vgrecov/speckit)'s
9
+ spec-driven workflow into an enforced, auditable process.** It layers an
10
+ agent-guided *atomic development* methodology on top of any Speckit repository —
11
+ a physical state ledger, machine-collected evidence, and token-optimized review —
12
+ **without replacing or forking a single Speckit file.**
13
+
14
+ > Speckit gives your agents great artifacts (spec → plan → tasks → implement).
15
+ > SpecOps makes sure they actually follow them: state is on disk and
16
+ > Git-verifiable, evidence is collected by tooling instead of claimed by the
17
+ > agent, and review rejects as cheaply as possible.
18
+
19
+ ## Why SpecOps?
20
+
21
+ Spec-driven development with AI agents has three recurring failure modes.
22
+ SpecOps addresses each one:
23
+
24
+ | Problem | Without SpecOps | With SpecOps |
25
+ |---|---|---|
26
+ | **Agents hallucinate progress** | "Done ✅" with no proof | Every task is closed with machine-collected evidence (test output, commit hashes, diffs) recorded in the ledger |
27
+ | **State lives in the chat** | Lost on context reset; not auditable | State is a physical `status.yaml` ledger, Git-verifiable and recovery-safe |
28
+ | **Reviews are slow and expensive** | Agent reads the whole repo | `/specops-review` rejects cheapest-first (reconcile → lint/test → out-of-plan files) before reading any code |
29
+
30
+ ## What it adds to Speckit
31
+
32
+ - **📒 Physical state ledger (Repo-as-State).** A structured `status.yaml`
33
+ tracks phase, tasks, evidence, and review cycles. Mutated only through
34
+ `specops` commands — never hand-edited, never held in agent memory.
35
+ - **🔬 Automated evidence collection.** `complete-task --auto` runs your test
36
+ command, harvests commits and diffs, and records them as typed evidence. A
37
+ task cannot be `DONE` without proof.
38
+ - **🔁 A phase state machine wired into the prompts.** `specops init` injects
39
+ directives into the specify, plan, tasks, and implement prompts so the ledger
40
+ is created and phases advance automatically — the human never runs the
41
+ bookkeeping by hand.
42
+ - **✂️ Token-optimized surgical review.** The installed `/specops-review`
43
+ command reviews only in-scope files and stops at the first cheap rejection.
44
+ - **📐 Empirical verification & gates.** `specops consistency` and
45
+ `specops reconcile` are exit-code gates you can drop into CI or agent prompts.
46
+ - **➕ Additive and reversible.** Everything is delivered through
47
+ marker-delimited blocks. Uninstalling restores your Speckit files
48
+ byte-for-byte.
49
+
50
+ ## Install
51
+
52
+ ```bash
53
+ pip install speckit-specops
54
+ ```
55
+
56
+ Installs the `specops` command. Requires Python ≥ 3.10 and Git ≥ 2.30. No
57
+ network I/O after install.
58
+
59
+ ## Quick Start
60
+
61
+ ```bash
62
+ # In a Speckit-initialized repository:
63
+ specops init # inject directives, install /specops-review, create specops.json
64
+ ```
65
+
66
+ That's it. From here you drive Speckit as usual (`/speckit.specify`,
67
+ `/speckit.plan`, `/speckit.tasks`, `/speckit.implement`) and the injected
68
+ directives take care of the ledger and phase transitions. Check state anytime:
69
+
70
+ ```bash
71
+ specops status show
72
+ ```
73
+
74
+ ## How it works
75
+
76
+ SpecOps rides the Speckit lifecycle. Once `specops init` has run, the injected
77
+ directives drive the ledger at each stage seam:
78
+
79
+ | Speckit stage | What SpecOps does |
80
+ |---|---|
81
+ | **specify** | Marks the repo as SpecOps-managed (informational; no ledger yet) |
82
+ | **plan** | Enforces empirical path verification and the `consistency` gate |
83
+ | **tasks** | Creates the ledger (`status init-spec`), advances the phase to `TASKS`, and requires `[SC-xxx]` coverage tags on every task |
84
+ | **implement** | Opens `IMPLEMENT`, runs the evidence-backed ledger loop, then opens `REVIEW` |
85
+ | **review** | `/specops-review` validates the diff and records `APPROVED` / `REJECTED` |
86
+
87
+ The phase machine is `SPECIFY → PLAN → TASKS → IMPLEMENT → REVIEW → DONE`.
88
+ If SpecOps is not installed, the Speckit prompts still work standalone — the
89
+ directives degrade to no-ops.
90
+
91
+ ## Command reference
92
+
93
+ ### `specops init [--non-interactive]`
94
+
95
+ Prepares a Speckit repository in one run: validates (or offers to create) a Git
96
+ repo, detects Speckit, resolves prompt targets from Speckit's integration
97
+ manifests (works with any recorded agent layout — Claude skills, GitHub
98
+ Copilot, etc.), creates/merge-preserves `specops.json`, installs
99
+ `/specops-review`, and injects the directive blocks into the specify, plan,
100
+ tasks, and implement prompts (additive, idempotent, byte-identical restore on
101
+ removal). `--non-interactive` declines all prompts (CI-safe).
102
+
103
+ > **Speckit upgrade note**: a Speckit upgrade may rewrite prompt files and
104
+ > remove the injected blocks. Just re-run `specops init` to re-inject.
105
+
106
+ ### `specops status show`
107
+
108
+ Read-only. Prints ledger state: feature, branch, phase, active task, task counts
109
+ (pending / in progress / done / orphaned), and the review-cycle history.
110
+
111
+ ### `specops status init-spec [<name>]`
112
+
113
+ Creates `<feature_dir>/status.yaml` from the packaged scaffold, syncing task IDs
114
+ from `tasks.md`. Usually run for you by the tasks directive.
115
+
116
+ ### `specops status start-task <task-id>`
117
+
118
+ Marks the task `IN_PROGRESS` and records `started_commit = HEAD`. Enforces the
119
+ single-active-task rule.
120
+
121
+ ### `specops status complete-task <task-id> [--auto | --evidence "CLASS:summary"]`
122
+
123
+ Marks the task `DONE` with exactly one evidence source:
124
+
125
+ - `--auto`: runs `test_command`; on success, harvests `started_commit..HEAD`
126
+ commits + diff as `TEST_REPORT`/`CODE_DIFF` evidence.
127
+ - `--evidence "CLASS:summary"`: caller-supplied, with `CLASS` in
128
+ `CLI_LOG | TEST_REPORT | SCREENSHOT_PATH | CODE_DIFF`.
129
+
130
+ ### `specops status transition-phase <phase> [-r APPROVED|REJECTED]`
131
+
132
+ Advances the phase one step forward. Two transitions require `-r`:
133
+
134
+ ```bash
135
+ specops status transition-phase DONE -r APPROVED # approved → close the feature
136
+ specops status transition-phase IMPLEMENT -r REJECTED # rejected → send back for rework
137
+ ```
138
+
139
+ Entering `DONE` requires the latest review cycle to be `APPROVED`.
140
+
141
+ ### `specops reconcile`
142
+
143
+ Read-only gate. Verifies every ledger commit hash is reachable from `HEAD` and
144
+ every `DONE` task has commits and evidence. Exit 1 on any divergence.
145
+
146
+ ```bash
147
+ specops reconcile || exit 1 # preflight before review
148
+ ```
149
+
150
+ ### `specops consistency`
151
+
152
+ Read-only gate. Verifies every `SC-\d+` in the spec has ≥ 1 task with a matching
153
+ `[SC-xxx]` tag, and every `plan.md` path declaration carries a valid action
154
+ suffix (`(create)`/`(modify)`/`(remove)`). Exit 1 on violation.
155
+
156
+ ### `specops --version`
157
+
158
+ Prints the version and exits. Works anywhere.
159
+
160
+ ## Configuration — `specops.json`
161
+
162
+ | Key | Purpose | Default |
163
+ |---|---|---|
164
+ | `test_command` | Command run by `complete-task --auto` | `pytest` |
165
+ | `lint_command` | Command referenced by the review prompt | `""` |
166
+ | `skills_dir` | Directory the review prompt loads skills from | `.specify/skills` |
167
+
168
+ Unknown keys are preserved on re-init.
169
+
170
+ ## The `/specops-review` command
171
+
172
+ Installed by `specops init` (the name follows the layout's separator, e.g.
173
+ `/specops-review` for Claude skills). Not a CLI command — a packaged prompt that
174
+ drives the review agent cheapest-rejection-first:
175
+
176
+ 1. Load skills from `skills_dir`.
177
+ 2. `specops reconcile` — abort immediately on failure.
178
+ 3. `lint_command` + `test_command` — reject on failure.
179
+ 4. `git status --porcelain` — reject any out-of-plan file without reading code.
180
+ 5. Surgical diff review of in-scope files only.
181
+ 6. Write `revisions/revision-X.md` and record the `APPROVED`/`REJECTED` outcome.
182
+
183
+ ## Language policy
184
+
185
+ All SpecOps operational output (CLI messages, injected assets) is in English.
186
+ Your prose (`spec.md`, `plan.md`, task descriptions) may be in **any language** —
187
+ SpecOps parses only structural tokens (`SC-\d+`, `T\d+`, action suffixes), never
188
+ content.
189
+
190
+ ## Supported Speckit layouts
191
+
192
+ SpecOps resolves prompt targets at runtime from
193
+ `.specify/integrations/<agent>.manifest.json`. Any Speckit integration with a
194
+ recorded manifest is supported; unknown layouts fail closed. Tested with
195
+ Speckit ≥ 0.12 (Claude skills mode, separator `-`).
196
+
197
+ ## Uninstall
198
+
199
+ Remove the appended block from each prompt file, then delete `specops.json` and
200
+ the installed review command. No other files are written; the restore is
201
+ byte-identical.
202
+
203
+ ## Contributing
204
+
205
+ Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup,
206
+ the quality gates, and project principles. SpecOps is at `0.x`; the CLI surface
207
+ and ledger format may still change before `1.0` (see [CHANGELOG.md](CHANGELOG.md)).
208
+
209
+ ## License
210
+
211
+ [MIT](LICENSE) © Paulo Segundo
@@ -0,0 +1,67 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "speckit-specops"
7
+ version = "0.1.0"
8
+ description = "A Spec-Driven Development (SDD) process enforcement CLI extending Speckit"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "MIT" }
12
+ authors = [
13
+ { name = "Paulo Segundo", email = "paulosegundo@gmail.com" }
14
+ ]
15
+ classifiers = [
16
+ "Programming Language :: Python :: 3",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Operating System :: OS Independent",
19
+ ]
20
+ dependencies = [
21
+ "typer>=0.9.0",
22
+ "pyyaml>=6.0",
23
+ "gitpython>=3.1.40",
24
+ ]
25
+
26
+ [project.optional-dependencies]
27
+ dev = [
28
+ "pytest>=7.0",
29
+ "ruff>=0.4.0",
30
+ "mypy>=1.10.0",
31
+ "pytest-cov>=5.0",
32
+ "types-PyYAML>=6.0",
33
+ ]
34
+
35
+ [project.scripts]
36
+ specops = "specops.cli:app"
37
+
38
+ [tool.hatch.build.targets.wheel]
39
+ packages = ["src/specops"]
40
+
41
+ [tool.hatch.build]
42
+ include = [
43
+ "src/specops/**",
44
+ ]
45
+
46
+ [tool.ruff]
47
+ target-version = "py310"
48
+ line-length = 100
49
+
50
+ [tool.ruff.lint]
51
+ select = ["E", "F", "W", "I", "UP", "B", "SIM"]
52
+ ignore = []
53
+
54
+ [tool.mypy]
55
+ python_version = "3.10"
56
+ disallow_untyped_defs = true
57
+ warn_unused_ignores = true
58
+ check_untyped_defs = true
59
+ exclude = ["tests/"]
60
+
61
+ [[tool.mypy.overrides]]
62
+ module = "git.*"
63
+ ignore_missing_imports = true
64
+
65
+ [tool.pytest.ini_options]
66
+ addopts = "--cov=specops --cov-report=term-missing --cov-fail-under=85"
67
+ testpaths = ["tests"]
@@ -0,0 +1,6 @@
1
+ import importlib.metadata
2
+
3
+ try:
4
+ __version__ = importlib.metadata.version("specops-cli")
5
+ except importlib.metadata.PackageNotFoundError:
6
+ __version__ = "0.0.0.dev0"