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.
Files changed (134) hide show
  1. gator_command-1.1.2/PKG-INFO +98 -0
  2. gator_command-1.1.2/PYPI_README.md +74 -0
  3. {gator_command-1.1.0 → gator_command-1.1.2}/pyproject.toml +2 -2
  4. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/__init__.py +1 -1
  5. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.js +7 -0
  6. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/fleet.js +22 -4
  7. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-dashboard.py +51 -6
  8. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator_core.py +68 -0
  9. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize.py +9 -1
  10. gator_command-1.1.2/src/gator_command.egg-info/PKG-INFO +98 -0
  11. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/SOURCES.txt +1 -0
  12. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_packaging.py +2 -2
  13. gator_command-1.1.0/PKG-INFO +0 -122
  14. gator_command-1.1.0/src/gator_command.egg-info/PKG-INFO +0 -122
  15. {gator_command-1.1.0 → gator_command-1.1.2}/LICENSE +0 -0
  16. {gator_command-1.1.0 → gator_command-1.1.2}/README.md +0 -0
  17. {gator_command-1.1.0 → gator_command-1.1.2}/setup.cfg +0 -0
  18. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/cli.py +0 -0
  19. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/crawler.py +0 -0
  20. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.css +0 -0
  21. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/dashboard.html +0 -0
  22. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/audit.js +0 -0
  23. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/repo.js +0 -0
  24. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/settings.js +0 -0
  25. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/dashboard/views/updates.js +0 -0
  26. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/enforcer-prompt.md +0 -0
  27. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/extract-claude-sessions.py +0 -0
  28. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/extract-codex-sessions.py +0 -0
  29. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/extract-gemini-sessions.py +0 -0
  30. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-audit.py +0 -0
  31. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-charter-draft.py +0 -0
  32. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-charter-lint.py +0 -0
  33. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-charter-verify.py +0 -0
  34. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-deploy.py +0 -0
  35. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-drift.py +0 -0
  36. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-enforce.py +0 -0
  37. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-fleet-intel.py +0 -0
  38. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-fleet-report.py +0 -0
  39. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-init-command-post.py +0 -0
  40. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-init.py +0 -0
  41. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-machine-id.py +0 -0
  42. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-policy-status.py +0 -0
  43. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-pulse.py +0 -0
  44. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-repo-status.py +0 -0
  45. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-session-common.py +0 -0
  46. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-session-sink.py +0 -0
  47. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-sessions.py +0 -0
  48. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-update.py +0 -0
  49. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator-version.py +0 -0
  50. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator_remote.py +0 -0
  51. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gator_runtime.py +0 -0
  52. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize-actions.sh +0 -0
  53. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize-lib.sh +0 -0
  54. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize-post.sh +0 -0
  55. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/gatorize.sh +0 -0
  56. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/generate_markdown.py +0 -0
  57. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/generate_wiki.py +0 -0
  58. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/graph_health.py +0 -0
  59. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex-lint.py +0 -0
  60. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex-lint.sh +0 -0
  61. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex.py +0 -0
  62. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex_formatters.py +0 -0
  63. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/memex_state.py +0 -0
  64. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/scripts/spawn.py +0 -0
  65. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/blueprints/README.md +0 -0
  66. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/charterignore +0 -0
  67. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/charters/README.md +0 -0
  68. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/charters/_template.md +0 -0
  69. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/commands/commit.md +0 -0
  70. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/commands/init.md +0 -0
  71. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/commands/update.md +0 -0
  72. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/constitution.md +0 -0
  73. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/field-guides/README.md +0 -0
  74. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/gator-start-up.md +0 -0
  75. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/charter-alignment.md +0 -0
  76. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/enforcer-review.md +0 -0
  77. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/field-guide-generation.md +0 -0
  78. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/knowledge-capture.md +0 -0
  79. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/procedures/significance-check.md +0 -0
  80. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/concierge-responses.md +0 -0
  81. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/dangerous-patterns.md +0 -0
  82. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/dashboard-operations.md +0 -0
  83. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/enforcer-configuration.md +0 -0
  84. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/example-project.md +0 -0
  85. {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
  86. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/git-workflow.md +0 -0
  87. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/identity-and-ownership.md +0 -0
  88. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/refactor-approach.md +0 -0
  89. {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
  90. {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
  91. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/reference-notes/workflow-profiles.md +0 -0
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/enforcer-prompt.md +0 -0
  98. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/enforcer-review.py +0 -0
  99. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-approve.py +0 -0
  100. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-enforce.py +0 -0
  101. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-init.py +0 -0
  102. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-pre-commit.py +0 -0
  103. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-pulse.py +0 -0
  104. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-update.py +0 -0
  105. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator-version.py +0 -0
  106. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/gator_core.py +0 -0
  107. {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
  108. {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
  109. {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
  110. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/commit-msg +0 -0
  111. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/post-commit +0 -0
  112. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/scripts/hooks/pre-commit +0 -0
  113. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/sessions/.gitignore +0 -0
  114. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/vault/.gitkeep +0 -0
  115. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command/templates/gator-starter/whiteboard.md +0 -0
  116. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/dependency_links.txt +0 -0
  117. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/entry_points.txt +0 -0
  118. {gator_command-1.1.0 → gator_command-1.1.2}/src/gator_command.egg-info/top_level.txt +0 -0
  119. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_audit.py +0 -0
  120. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_audit_integration.py +0 -0
  121. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_charter_lint.py +0 -0
  122. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_deploy.py +0 -0
  123. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_drift.py +0 -0
  124. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_fleet_intel.py +0 -0
  125. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_fleet_report.py +0 -0
  126. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_gator_core.py +0 -0
  127. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_gatorize.py +0 -0
  128. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_hooks.py +0 -0
  129. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_init.py +0 -0
  130. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_memex_state.py +0 -0
  131. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_pre_commit.py +0 -0
  132. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_remote.py +0 -0
  133. {gator_command-1.1.0 → gator_command-1.1.2}/tests/test_session_sink.py +0 -0
  134. {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.0"
7
+ version = "1.1.2"
8
8
  description = "Git-native governance for AI-assisted engineering"
9
- readme = "README.md"
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.0"
2
+ __version__ = "1.1.2"
@@ -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");
@@ -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>Path</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 class="mono" style="font-size:12px;max-width:300px;overflow:hidden;text-overflow:ellipsis">${escHtml(repo.path || "-")}</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="3" class="muted" style="text-align:center;padding:24px">No repos registered. Run gatorize.sh on a repo to get started.</td></tr>`;
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 the fleet registry file. Works without command post."""
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 to find registry.md near this script
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: minimal payload from registry only. No fleet-report/drift/audit."""
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
- repos.append({
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 registry.md."""
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)
@@ -1,4 +1,5 @@
1
1
  LICENSE
2
+ PYPI_README.md
2
3
  README.md
3
4
  pyproject.toml
4
5
  src/gator_command/__init__.py
@@ -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.0.0" in result.stdout
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.0.0" in result.stdout
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."""