gator-command 1.1.0__tar.gz → 1.1.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.
- gator_command-1.1.2/PKG-INFO +98 -0
- gator_command-1.1.2/PYPI_README.md +74 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/pyproject.toml +2 -2
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/__init__.py +1 -1
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.js +7 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/fleet.js +22 -4
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-dashboard.py +51 -6
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator_core.py +68 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize.py +9 -1
- gator_command-1.1.2/src/gator_command.egg-info/PKG-INFO +98 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/SOURCES.txt +1 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_packaging.py +2 -2
- gator_command-1.1.0/PKG-INFO +0 -122
- gator_command-1.1.0/src/gator_command.egg-info/PKG-INFO +0 -122
- {gator_command-1.1.0 → gator_command-1.1.2}/LICENSE +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/README.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/setup.cfg +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/cli.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/crawler.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.css +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.html +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/audit.js +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/repo.js +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/settings.js +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/updates.js +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/enforcer-prompt.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/extract-claude-sessions.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/extract-codex-sessions.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/extract-gemini-sessions.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-audit.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-charter-draft.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-charter-lint.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-charter-verify.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-deploy.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-drift.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-enforce.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-fleet-intel.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-fleet-report.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-init-command-post.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-init.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-machine-id.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-policy-status.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-pulse.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-repo-status.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-session-common.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-session-sink.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-sessions.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-update.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-version.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator_remote.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator_runtime.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize-actions.sh +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize-lib.sh +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize-post.sh +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize.sh +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/generate_markdown.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/generate_wiki.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/graph_health.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex-lint.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex-lint.sh +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex_formatters.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex_state.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/spawn.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/blueprints/README.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/charterignore +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/charters/README.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/charters/_template.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/commands/commit.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/commands/init.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/commands/update.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/constitution.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/field-guides/README.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/gator-start-up.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/charter-alignment.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/enforcer-review.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/field-guide-generation.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/knowledge-capture.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/significance-check.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/concierge-responses.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/dangerous-patterns.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/dashboard-operations.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/enforcer-configuration.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/example-project.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/failure-modes-and-self-correction.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/git-workflow.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/identity-and-ownership.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/refactor-approach.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/what-gator-requires-from-a-model.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/why-navigation-coding-feels-different.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/workflow-profiles.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/__pycache__/enforcer-review.cpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/__pycache__/gator-approve.cpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/__pycache__/gator-init.cpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/__pycache__/gator-pre-commit.cpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/__pycache__/gator-update.cpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/enforcer-prompt.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/enforcer-review.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-approve.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-enforce.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-init.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-pre-commit.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-pulse.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-update.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-version.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator_core.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/__pycache__/commit-msgcpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/__pycache__/post-commitcpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/__pycache__/pre-commitcpython-313.pyc +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/commit-msg +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/post-commit +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/pre-commit +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/sessions/.gitignore +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/vault/.gitkeep +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/whiteboard.md +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/dependency_links.txt +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/entry_points.txt +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/top_level.txt +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_audit.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_audit_integration.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_charter_lint.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_deploy.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_drift.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_fleet_intel.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_fleet_report.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_gator_core.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_gatorize.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_hooks.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_init.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_memex_state.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_pre_commit.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_remote.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_session_sink.py +0 -0
- {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_sessions.py +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gator-command
|
|
3
|
+
Version: 1.1.2
|
|
4
|
+
Summary: Git-native governance for AI-assisted engineering
|
|
5
|
+
Author-email: Cumberland Laboratories <support@cumberlandlaboratories.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/cumberland-laboratories/gator
|
|
8
|
+
Project-URL: Repository, https://github.com/cumberland-laboratories/gator
|
|
9
|
+
Keywords: governance,ai,git,charters,audit,compliance
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
# Gator Command
|
|
26
|
+
|
|
27
|
+
**Git-native governance for AI-assisted engineering.**
|
|
28
|
+
|
|
29
|
+
Gator turns your repo into an intelligence surface. The AI agent builds structured maps of your codebase (charters), a strategic operations brief (pulse), and project assessments — all committed to Git. A deterministic pre-commit gate blocks commits when the agent changes code without updating the map.
|
|
30
|
+
|
|
31
|
+
Local-first. Git-native. Works with Claude Code, Codex, Gemini CLI. MIT licensed.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install pipx # if you don't have pipx yet
|
|
37
|
+
pipx ensurepath # add to PATH (restart terminal after)
|
|
38
|
+
|
|
39
|
+
pipx install gator-command
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Quick Start
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cd /path/to/your/repo
|
|
46
|
+
|
|
47
|
+
gator gatorize . # install governance into this repo
|
|
48
|
+
gator init # start a governed session
|
|
49
|
+
gator dashboard # open the intelligence console
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The agent reads the governance layer and orients to your project. Your first `git commit` fires the hooks.
|
|
53
|
+
|
|
54
|
+
## Upgrade
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pipx upgrade gator-command
|
|
58
|
+
|
|
59
|
+
cd /path/to/your/repo
|
|
60
|
+
gator gatorize . # refresh templates and hooks
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Your content is always preserved. Only templates and scripts refresh.
|
|
64
|
+
|
|
65
|
+
## Commands
|
|
66
|
+
|
|
67
|
+
| Command | What it does |
|
|
68
|
+
|---------|-------------|
|
|
69
|
+
| `gator gatorize <path>` | Install or upgrade governance in a repo |
|
|
70
|
+
| `gator init` | Start a governed session (repairs hooks if needed) |
|
|
71
|
+
| `gator dashboard` | Open the intelligence console |
|
|
72
|
+
| `gator pulse` | Generate the strategic operations brief |
|
|
73
|
+
| `gator audit` | Run governance audit |
|
|
74
|
+
| `gator version` | Show installed version |
|
|
75
|
+
|
|
76
|
+
## What Gator Provides
|
|
77
|
+
|
|
78
|
+
- **Repo intelligence** — charters map code structure, pulse summarizes momentum, assessments provide AI-generated evaluation. All committed to Git.
|
|
79
|
+
- **Governance enforcement** — a deterministic pre-commit hook that blocks commits when code changes without charter updates. No LLM in the gate. Configurable: strict, warn, or off.
|
|
80
|
+
- **Dashboard** — a local web console for browsing your governance layer, session history, and project state. Full file history with git version navigation.
|
|
81
|
+
- **Session persistence** — the governance layer carries project context across sessions and across models. Switch from Claude to Codex mid-project without losing architectural understanding.
|
|
82
|
+
|
|
83
|
+
## How It Works
|
|
84
|
+
|
|
85
|
+
1. `gator gatorize .` installs a `.gator/` folder into your repo with governance scaffolding
|
|
86
|
+
2. AI agents read the constitution and charters to understand your codebase
|
|
87
|
+
3. Every `git commit` runs a deterministic hook that validates charter-alongside-code
|
|
88
|
+
4. Session snippets capture what context produced each commit
|
|
89
|
+
5. `gator dashboard` makes it all browsable in a local web UI
|
|
90
|
+
|
|
91
|
+
## Links
|
|
92
|
+
|
|
93
|
+
- [Source code](https://github.com/cumberland-laboratories/gator)
|
|
94
|
+
- [MIT License](https://github.com/cumberland-laboratories/gator/blob/main/LICENSE)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
Built by [Cumberland Laboratories](https://github.com/cumberland-laboratories)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Gator Command
|
|
2
|
+
|
|
3
|
+
**Git-native governance for AI-assisted engineering.**
|
|
4
|
+
|
|
5
|
+
Gator turns your repo into an intelligence surface. The AI agent builds structured maps of your codebase (charters), a strategic operations brief (pulse), and project assessments — all committed to Git. A deterministic pre-commit gate blocks commits when the agent changes code without updating the map.
|
|
6
|
+
|
|
7
|
+
Local-first. Git-native. Works with Claude Code, Codex, Gemini CLI. MIT licensed.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install pipx # if you don't have pipx yet
|
|
13
|
+
pipx ensurepath # add to PATH (restart terminal after)
|
|
14
|
+
|
|
15
|
+
pipx install gator-command
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
cd /path/to/your/repo
|
|
22
|
+
|
|
23
|
+
gator gatorize . # install governance into this repo
|
|
24
|
+
gator init # start a governed session
|
|
25
|
+
gator dashboard # open the intelligence console
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The agent reads the governance layer and orients to your project. Your first `git commit` fires the hooks.
|
|
29
|
+
|
|
30
|
+
## Upgrade
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pipx upgrade gator-command
|
|
34
|
+
|
|
35
|
+
cd /path/to/your/repo
|
|
36
|
+
gator gatorize . # refresh templates and hooks
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Your content is always preserved. Only templates and scripts refresh.
|
|
40
|
+
|
|
41
|
+
## Commands
|
|
42
|
+
|
|
43
|
+
| Command | What it does |
|
|
44
|
+
|---------|-------------|
|
|
45
|
+
| `gator gatorize <path>` | Install or upgrade governance in a repo |
|
|
46
|
+
| `gator init` | Start a governed session (repairs hooks if needed) |
|
|
47
|
+
| `gator dashboard` | Open the intelligence console |
|
|
48
|
+
| `gator pulse` | Generate the strategic operations brief |
|
|
49
|
+
| `gator audit` | Run governance audit |
|
|
50
|
+
| `gator version` | Show installed version |
|
|
51
|
+
|
|
52
|
+
## What Gator Provides
|
|
53
|
+
|
|
54
|
+
- **Repo intelligence** — charters map code structure, pulse summarizes momentum, assessments provide AI-generated evaluation. All committed to Git.
|
|
55
|
+
- **Governance enforcement** — a deterministic pre-commit hook that blocks commits when code changes without charter updates. No LLM in the gate. Configurable: strict, warn, or off.
|
|
56
|
+
- **Dashboard** — a local web console for browsing your governance layer, session history, and project state. Full file history with git version navigation.
|
|
57
|
+
- **Session persistence** — the governance layer carries project context across sessions and across models. Switch from Claude to Codex mid-project without losing architectural understanding.
|
|
58
|
+
|
|
59
|
+
## How It Works
|
|
60
|
+
|
|
61
|
+
1. `gator gatorize .` installs a `.gator/` folder into your repo with governance scaffolding
|
|
62
|
+
2. AI agents read the constitution and charters to understand your codebase
|
|
63
|
+
3. Every `git commit` runs a deterministic hook that validates charter-alongside-code
|
|
64
|
+
4. Session snippets capture what context produced each commit
|
|
65
|
+
5. `gator dashboard` makes it all browsable in a local web UI
|
|
66
|
+
|
|
67
|
+
## Links
|
|
68
|
+
|
|
69
|
+
- [Source code](https://github.com/cumberland-laboratories/gator)
|
|
70
|
+
- [MIT License](https://github.com/cumberland-laboratories/gator/blob/main/LICENSE)
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
Built by [Cumberland Laboratories](https://github.com/cumberland-laboratories)
|
|
@@ -4,9 +4,9 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "gator-command"
|
|
7
|
-
version = "1.1.
|
|
7
|
+
version = "1.1.2"
|
|
8
8
|
description = "Git-native governance for AI-assisted engineering"
|
|
9
|
-
readme = "
|
|
9
|
+
readme = "PYPI_README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
11
11
|
requires-python = ">=3.9"
|
|
12
12
|
authors = [
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""Gator Command — Git-native governance for AI-assisted engineering."""
|
|
2
|
-
__version__ = "1.1.
|
|
2
|
+
__version__ = "1.1.2"
|
{gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.js
RENAMED
|
@@ -405,6 +405,13 @@
|
|
|
405
405
|
|
|
406
406
|
state.standalone = !!(state.data && state.data.standalone);
|
|
407
407
|
|
|
408
|
+
// Hide Audit tab in standalone mode (no data model without command post)
|
|
409
|
+
if (state.standalone) {
|
|
410
|
+
document.querySelectorAll('.sidebar-item[data-view="audit"]').forEach(el => {
|
|
411
|
+
el.style.display = "none";
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
|
|
408
415
|
// Check for ?repo= query param
|
|
409
416
|
const params = new URLSearchParams(window.location.search);
|
|
410
417
|
const preloadRepo = params.get("repo");
|
{gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/fleet.js
RENAMED
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
let html = `
|
|
127
127
|
<div class="view-header">
|
|
128
128
|
<span class="view-title">Fleet</span>
|
|
129
|
-
<span class="view-subtitle">${repos.length} registered</span>
|
|
129
|
+
<span class="view-subtitle">${repos.length} repo${repos.length !== 1 ? "s" : ""} registered (standalone)</span>
|
|
130
130
|
</div>
|
|
131
131
|
|
|
132
132
|
<div class="section">
|
|
@@ -134,7 +134,10 @@
|
|
|
134
134
|
<thead>
|
|
135
135
|
<tr>
|
|
136
136
|
<th>Repo</th>
|
|
137
|
-
<th>
|
|
137
|
+
<th>Branch</th>
|
|
138
|
+
<th>Charters</th>
|
|
139
|
+
<th>Hooks</th>
|
|
140
|
+
<th>Enforcement</th>
|
|
138
141
|
<th>Status</th>
|
|
139
142
|
</tr>
|
|
140
143
|
</thead>
|
|
@@ -143,6 +146,14 @@
|
|
|
143
146
|
|
|
144
147
|
for (const repo of repos) {
|
|
145
148
|
const accIcon = repo.accessible ? "" : ' <span title="Not accessible" class="muted">!</span>';
|
|
149
|
+
const branch = repo.branch ? escHtml(repo.branch) : '<span class="muted">-</span>';
|
|
150
|
+
const charters = repo.charters != null ? repo.charters : '<span class="muted">-</span>';
|
|
151
|
+
const hooks = repo.hook_status === "ok" ? '<span style="color:var(--color-healthy)">ok</span>'
|
|
152
|
+
: repo.hook_status ? '<span style="color:var(--color-drifted)">' + escHtml(repo.hook_status) + '</span>'
|
|
153
|
+
: '<span class="muted">-</span>';
|
|
154
|
+
const enforcement = repo.config && repo.config.enforcement_level
|
|
155
|
+
? escHtml(repo.config.enforcement_level)
|
|
156
|
+
: '<span class="muted">strict</span>';
|
|
146
157
|
const statusCell = `<td class="status-cell"><button class="update-btn" data-repo="${escHtml(repo.name)}" ${repo.accessible ? "" : "disabled"}>Check Status</button><span class="status-result"></span></td>`;
|
|
147
158
|
|
|
148
159
|
html += `
|
|
@@ -151,14 +162,21 @@
|
|
|
151
162
|
<button class="link-btn" onclick="window.gatorNavToRepo('${escHtml(repo.name)}')">${escHtml(repo.name)}</button>
|
|
152
163
|
${accIcon}
|
|
153
164
|
</td>
|
|
154
|
-
<td
|
|
165
|
+
<td>${branch}</td>
|
|
166
|
+
<td>${charters}</td>
|
|
167
|
+
<td>${hooks}</td>
|
|
168
|
+
<td>${enforcement}</td>
|
|
155
169
|
${statusCell}
|
|
156
170
|
</tr>
|
|
157
171
|
`;
|
|
158
172
|
}
|
|
159
173
|
|
|
160
174
|
if (repos.length === 0) {
|
|
161
|
-
html += `<tr><td colspan="
|
|
175
|
+
html += `<tr><td colspan="6" class="muted" style="text-align:center;padding:24px">
|
|
176
|
+
No repos registered yet.<br><br>
|
|
177
|
+
<code style="font-size:12px;">gator gatorize /path/to/repo</code> — install governance + register<br>
|
|
178
|
+
<code style="font-size:12px;">gator dashboard --add-repo /path/to/repo</code> — register an existing gatorized repo
|
|
179
|
+
</td></tr>`;
|
|
162
180
|
}
|
|
163
181
|
|
|
164
182
|
html += `</tbody></table></div>`;
|
|
@@ -47,12 +47,20 @@ from gator_core import get_version, find_command_post, parse_registry # noqa: E
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def _load_registry_repos():
|
|
50
|
-
"""Load repo list from
|
|
50
|
+
"""Load repo list from fleet registry or machine-local dashboard registry."""
|
|
51
51
|
cp = find_command_post()
|
|
52
52
|
if cp:
|
|
53
53
|
repos = parse_registry(cp)
|
|
54
54
|
return repos
|
|
55
|
-
# No command post — try
|
|
55
|
+
# No command post — try machine-local dashboard registry
|
|
56
|
+
try:
|
|
57
|
+
from gator_core import read_dashboard_registry
|
|
58
|
+
local_repos = read_dashboard_registry()
|
|
59
|
+
if local_repos:
|
|
60
|
+
return local_repos
|
|
61
|
+
except ImportError:
|
|
62
|
+
pass
|
|
63
|
+
# Legacy fallback: registry.md near this script
|
|
56
64
|
registry_path = COMMAND_POST_ROOT / "gator-command" / "registry.md"
|
|
57
65
|
if not registry_path.exists():
|
|
58
66
|
return []
|
|
@@ -328,20 +336,36 @@ def collect_fast_data():
|
|
|
328
336
|
|
|
329
337
|
|
|
330
338
|
def collect_standalone_data():
|
|
331
|
-
"""Standalone startup:
|
|
339
|
+
"""Standalone startup: per-repo governance data from gator-repo-status."""
|
|
332
340
|
global _REGISTRY_REPOS
|
|
333
341
|
repos = []
|
|
334
342
|
for r in _REGISTRY_REPOS:
|
|
335
343
|
repo_path = r.get("path", "")
|
|
336
344
|
accessible = bool(repo_path and Path(repo_path).is_dir())
|
|
337
|
-
|
|
345
|
+
repo_data = {
|
|
338
346
|
"name": r.get("name", ""),
|
|
339
347
|
"path": repo_path,
|
|
340
348
|
"remote": r.get("remote", ""),
|
|
341
|
-
"registered": r.get("registered", ""),
|
|
349
|
+
"registered": r.get("registered", r.get("added_at", "")),
|
|
342
350
|
"status": r.get("status", "current"),
|
|
343
351
|
"accessible": accessible,
|
|
344
|
-
}
|
|
352
|
+
}
|
|
353
|
+
if accessible:
|
|
354
|
+
# Enrich with repo-status (gator-repo-status-v1 schema)
|
|
355
|
+
status = run_json("gator-repo-status", "--path", repo_path, timeout=15)
|
|
356
|
+
if status and not status.get("error"):
|
|
357
|
+
repo_data.update({
|
|
358
|
+
"branch": status.get("branch", ""),
|
|
359
|
+
"charters": status.get("charter_count", 0),
|
|
360
|
+
"charter_coverage_pct": status.get("charter_coverage_pct", 0),
|
|
361
|
+
"hook_status": status.get("hook_status", "unknown"),
|
|
362
|
+
"config": status.get("config", {}),
|
|
363
|
+
"topology": status.get("topology", "standalone"),
|
|
364
|
+
"last_governed_commit": status.get("last_governed_commit"),
|
|
365
|
+
"session_summary_count": status.get("session_summary_count", 0),
|
|
366
|
+
"override_events": status.get("override_events", []),
|
|
367
|
+
})
|
|
368
|
+
repos.append(repo_data)
|
|
345
369
|
return {
|
|
346
370
|
"standalone": True,
|
|
347
371
|
"generated_at": datetime.now(tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
@@ -1206,6 +1230,8 @@ def main():
|
|
|
1206
1230
|
help="Write self-contained HTML to stdout and exit",
|
|
1207
1231
|
)
|
|
1208
1232
|
parser.add_argument("--repo", help="Pre-load Repo view for this repo name on open")
|
|
1233
|
+
parser.add_argument("--add-repo", metavar="PATH", help="Register a repo in the local dashboard")
|
|
1234
|
+
parser.add_argument("--remove-repo", metavar="NAME", help="Remove a repo from the local dashboard")
|
|
1209
1235
|
args = parser.parse_args()
|
|
1210
1236
|
|
|
1211
1237
|
if args.snapshot:
|
|
@@ -1213,6 +1239,25 @@ def main():
|
|
|
1213
1239
|
sys.stdout.buffer.write(build_snapshot().encode("utf-8"))
|
|
1214
1240
|
return
|
|
1215
1241
|
|
|
1242
|
+
# Registry management (no server needed)
|
|
1243
|
+
if args.add_repo:
|
|
1244
|
+
from gator_core import add_dashboard_repo
|
|
1245
|
+
repo_path = Path(args.add_repo).resolve()
|
|
1246
|
+
if not repo_path.is_dir():
|
|
1247
|
+
print(f" Error: directory not found: {args.add_repo}", file=sys.stderr)
|
|
1248
|
+
sys.exit(1)
|
|
1249
|
+
add_dashboard_repo(repo_path)
|
|
1250
|
+
print(f" Added to dashboard: {repo_path.name} ({repo_path})")
|
|
1251
|
+
return
|
|
1252
|
+
|
|
1253
|
+
if args.remove_repo:
|
|
1254
|
+
from gator_core import remove_dashboard_repo
|
|
1255
|
+
if remove_dashboard_repo(args.remove_repo):
|
|
1256
|
+
print(f" Removed from dashboard: {args.remove_repo}")
|
|
1257
|
+
else:
|
|
1258
|
+
print(f" Not found in dashboard: {args.remove_repo}")
|
|
1259
|
+
return
|
|
1260
|
+
|
|
1216
1261
|
global _HAS_COMMAND_POST, _REGISTRY_REPOS
|
|
1217
1262
|
|
|
1218
1263
|
version = get_version() or "unknown"
|
|
@@ -340,6 +340,74 @@ def parse_registry(command_post):
|
|
|
340
340
|
return repos
|
|
341
341
|
|
|
342
342
|
|
|
343
|
+
# ---------------------------------------------------------------------------
|
|
344
|
+
# Machine-local dashboard registry
|
|
345
|
+
# ---------------------------------------------------------------------------
|
|
346
|
+
|
|
347
|
+
DASHBOARD_REGISTRY = Path.home() / ".gator" / "dashboard-repos.json"
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def read_dashboard_registry():
|
|
351
|
+
"""Read the machine-local dashboard repo registry.
|
|
352
|
+
|
|
353
|
+
Returns list of repo dicts [{name, path, added_at, source}, ...].
|
|
354
|
+
Returns empty list if the file doesn't exist or is invalid.
|
|
355
|
+
"""
|
|
356
|
+
if not DASHBOARD_REGISTRY.exists():
|
|
357
|
+
return []
|
|
358
|
+
try:
|
|
359
|
+
data = json.loads(DASHBOARD_REGISTRY.read_text(encoding="utf-8"))
|
|
360
|
+
return data.get("repos", [])
|
|
361
|
+
except (json.JSONDecodeError, OSError):
|
|
362
|
+
return []
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def write_dashboard_registry(repos):
|
|
366
|
+
"""Write the machine-local dashboard repo registry."""
|
|
367
|
+
DASHBOARD_REGISTRY.parent.mkdir(parents=True, exist_ok=True)
|
|
368
|
+
data = {
|
|
369
|
+
"schema": "gator-dashboard-registry-v1",
|
|
370
|
+
"repos": repos,
|
|
371
|
+
}
|
|
372
|
+
DASHBOARD_REGISTRY.write_text(
|
|
373
|
+
json.dumps(data, indent=2, default=str) + "\n",
|
|
374
|
+
encoding="utf-8",
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def add_dashboard_repo(repo_path):
|
|
379
|
+
"""Add a repo to the local dashboard registry. Idempotent by path."""
|
|
380
|
+
repo_path = Path(repo_path).resolve()
|
|
381
|
+
repos = read_dashboard_registry()
|
|
382
|
+
|
|
383
|
+
# Check if already registered (by resolved path)
|
|
384
|
+
path_str = str(repo_path)
|
|
385
|
+
for r in repos:
|
|
386
|
+
if str(Path(r["path"]).resolve()) == path_str:
|
|
387
|
+
return # already registered
|
|
388
|
+
|
|
389
|
+
from datetime import datetime, timezone
|
|
390
|
+
repos.append({
|
|
391
|
+
"name": repo_path.name,
|
|
392
|
+
"path": path_str,
|
|
393
|
+
"added_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
394
|
+
"source": "gatorize",
|
|
395
|
+
})
|
|
396
|
+
write_dashboard_registry(repos)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def remove_dashboard_repo(name_or_path):
|
|
400
|
+
"""Remove a repo from the local dashboard registry by name or path."""
|
|
401
|
+
repos = read_dashboard_registry()
|
|
402
|
+
filtered = [r for r in repos
|
|
403
|
+
if r.get("name") != name_or_path
|
|
404
|
+
and str(Path(r.get("path", "")).resolve()) != str(Path(name_or_path).resolve())]
|
|
405
|
+
if len(filtered) < len(repos):
|
|
406
|
+
write_dashboard_registry(filtered)
|
|
407
|
+
return True
|
|
408
|
+
return False
|
|
409
|
+
|
|
410
|
+
|
|
343
411
|
# ---------------------------------------------------------------------------
|
|
344
412
|
# Git helpers
|
|
345
413
|
# ---------------------------------------------------------------------------
|
|
@@ -749,7 +749,15 @@ def action_install_product_source(target):
|
|
|
749
749
|
|
|
750
750
|
|
|
751
751
|
def action_register(target):
|
|
752
|
-
"""Add repo to
|
|
752
|
+
"""Add repo to registries (command-post and local dashboard)."""
|
|
753
|
+
# Always register in machine-local dashboard registry
|
|
754
|
+
try:
|
|
755
|
+
from gator_core import add_dashboard_repo
|
|
756
|
+
add_dashboard_repo(target)
|
|
757
|
+
except Exception:
|
|
758
|
+
pass # non-critical — dashboard registry is a convenience
|
|
759
|
+
|
|
760
|
+
# Command-post registry (only if command post exists)
|
|
753
761
|
registry = COMMAND_POST / "gator-command" / "registry.md"
|
|
754
762
|
repo_name = target.name
|
|
755
763
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gator-command
|
|
3
|
+
Version: 1.1.2
|
|
4
|
+
Summary: Git-native governance for AI-assisted engineering
|
|
5
|
+
Author-email: Cumberland Laboratories <support@cumberlandlaboratories.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/cumberland-laboratories/gator
|
|
8
|
+
Project-URL: Repository, https://github.com/cumberland-laboratories/gator
|
|
9
|
+
Keywords: governance,ai,git,charters,audit,compliance
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
# Gator Command
|
|
26
|
+
|
|
27
|
+
**Git-native governance for AI-assisted engineering.**
|
|
28
|
+
|
|
29
|
+
Gator turns your repo into an intelligence surface. The AI agent builds structured maps of your codebase (charters), a strategic operations brief (pulse), and project assessments — all committed to Git. A deterministic pre-commit gate blocks commits when the agent changes code without updating the map.
|
|
30
|
+
|
|
31
|
+
Local-first. Git-native. Works with Claude Code, Codex, Gemini CLI. MIT licensed.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install pipx # if you don't have pipx yet
|
|
37
|
+
pipx ensurepath # add to PATH (restart terminal after)
|
|
38
|
+
|
|
39
|
+
pipx install gator-command
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Quick Start
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cd /path/to/your/repo
|
|
46
|
+
|
|
47
|
+
gator gatorize . # install governance into this repo
|
|
48
|
+
gator init # start a governed session
|
|
49
|
+
gator dashboard # open the intelligence console
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The agent reads the governance layer and orients to your project. Your first `git commit` fires the hooks.
|
|
53
|
+
|
|
54
|
+
## Upgrade
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pipx upgrade gator-command
|
|
58
|
+
|
|
59
|
+
cd /path/to/your/repo
|
|
60
|
+
gator gatorize . # refresh templates and hooks
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Your content is always preserved. Only templates and scripts refresh.
|
|
64
|
+
|
|
65
|
+
## Commands
|
|
66
|
+
|
|
67
|
+
| Command | What it does |
|
|
68
|
+
|---------|-------------|
|
|
69
|
+
| `gator gatorize <path>` | Install or upgrade governance in a repo |
|
|
70
|
+
| `gator init` | Start a governed session (repairs hooks if needed) |
|
|
71
|
+
| `gator dashboard` | Open the intelligence console |
|
|
72
|
+
| `gator pulse` | Generate the strategic operations brief |
|
|
73
|
+
| `gator audit` | Run governance audit |
|
|
74
|
+
| `gator version` | Show installed version |
|
|
75
|
+
|
|
76
|
+
## What Gator Provides
|
|
77
|
+
|
|
78
|
+
- **Repo intelligence** — charters map code structure, pulse summarizes momentum, assessments provide AI-generated evaluation. All committed to Git.
|
|
79
|
+
- **Governance enforcement** — a deterministic pre-commit hook that blocks commits when code changes without charter updates. No LLM in the gate. Configurable: strict, warn, or off.
|
|
80
|
+
- **Dashboard** — a local web console for browsing your governance layer, session history, and project state. Full file history with git version navigation.
|
|
81
|
+
- **Session persistence** — the governance layer carries project context across sessions and across models. Switch from Claude to Codex mid-project without losing architectural understanding.
|
|
82
|
+
|
|
83
|
+
## How It Works
|
|
84
|
+
|
|
85
|
+
1. `gator gatorize .` installs a `.gator/` folder into your repo with governance scaffolding
|
|
86
|
+
2. AI agents read the constitution and charters to understand your codebase
|
|
87
|
+
3. Every `git commit` runs a deterministic hook that validates charter-alongside-code
|
|
88
|
+
4. Session snippets capture what context produced each commit
|
|
89
|
+
5. `gator dashboard` makes it all browsable in a local web UI
|
|
90
|
+
|
|
91
|
+
## Links
|
|
92
|
+
|
|
93
|
+
- [Source code](https://github.com/cumberland-laboratories/gator)
|
|
94
|
+
- [MIT License](https://github.com/cumberland-laboratories/gator/blob/main/LICENSE)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
Built by [Cumberland Laboratories](https://github.com/cumberland-laboratories)
|
|
@@ -33,7 +33,7 @@ class TestCLIDispatch:
|
|
|
33
33
|
capture_output=True, text=True, timeout=10,
|
|
34
34
|
)
|
|
35
35
|
assert result.returncode == 0
|
|
36
|
-
assert "1.
|
|
36
|
+
assert "1." in result.stdout # version starts with 1.x
|
|
37
37
|
|
|
38
38
|
def test_scripts_dir_resolvable(self):
|
|
39
39
|
"""The CLI can find its scripts directory."""
|
|
@@ -162,7 +162,7 @@ class TestInstalledArtifact:
|
|
|
162
162
|
capture_output=True, text=True, timeout=10,
|
|
163
163
|
)
|
|
164
164
|
assert result.returncode == 0
|
|
165
|
-
assert "1.
|
|
165
|
+
assert "1." in result.stdout # version starts with 1.x
|
|
166
166
|
|
|
167
167
|
def test_gator_help(self, installed_venv):
|
|
168
168
|
"""gator --help works via the real entry point."""
|