@trac3er/oh-my-god 2.0.1 → 2.0.2
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.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +14 -0
- package/CODE_OF_CONDUCT.md +27 -0
- package/CONTRIBUTING.md +62 -0
- package/OMG-setup.sh +1 -1
- package/README.md +56 -61
- package/SECURITY.md +25 -0
- package/commands/OMG:setup.md +8 -0
- package/hooks/credential_store.py +1 -1
- package/package.json +1 -1
- package/plugins/README.md +5 -0
- package/plugins/core/plugin.json +1 -1
- package/runtime/adoption.py +1 -1
- package/scripts/check-omg-public-ready.py +193 -0
- package/scripts/omg.py +1 -1
- package/settings.json +2 -2
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "OMG - Oh-My-God for Claude Code",
|
|
9
|
-
"version": "2.0.
|
|
9
|
+
"version": "2.0.2",
|
|
10
10
|
"homepage": "https://github.com/trac3er00/OMG",
|
|
11
11
|
"repository": "https://github.com/trac3er00/OMG"
|
|
12
12
|
},
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
{
|
|
15
15
|
"name": "omg",
|
|
16
16
|
"description": "OMG plugin layer for Claude Code with native setup, orchestration, and interop.",
|
|
17
|
-
"version": "2.0.
|
|
17
|
+
"version": "2.0.2",
|
|
18
18
|
"source": "./",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "trac3er00"
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
]
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
|
-
"version": "2.0.
|
|
35
|
+
"version": "2.0.2"
|
|
36
36
|
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.0.2 - 2026-03-06
|
|
4
|
+
|
|
5
|
+
- cleaned the repo for public launch by removing internal planning docs and stale private references
|
|
6
|
+
- added a public-readiness checker plus CI enforcement for docs, links, and community templates
|
|
7
|
+
- rewrote the public docs funnel around install, `/OMG:setup`, `/OMG:crazy`, proof, and contribution guidance
|
|
8
|
+
|
|
9
|
+
## 2.0.1 - 2026-03-06
|
|
10
|
+
|
|
11
|
+
- standardized OMG public identity across docs, package metadata, plugin metadata, and CLI surfaces
|
|
12
|
+
- added native adoption flow through `OMG-setup.sh` and `/OMG:setup` with `OMG-only` and `coexist` modes
|
|
13
|
+
- added public-readiness hygiene checks and contributor-facing repo docs
|
|
14
|
+
- rewrote the public docs funnel around host install, `/OMG:setup`, `/OMG:crazy`, and proof-backed verification
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Standard
|
|
4
|
+
|
|
5
|
+
Treat contributors with respect. Discussions should stay technical, honest, and focused on moving the work forward.
|
|
6
|
+
|
|
7
|
+
Expected behavior:
|
|
8
|
+
|
|
9
|
+
- assume good intent
|
|
10
|
+
- critique ideas directly and respectfully
|
|
11
|
+
- provide evidence for technical claims
|
|
12
|
+
- avoid harassment, intimidation, or discriminatory language
|
|
13
|
+
|
|
14
|
+
Unacceptable behavior:
|
|
15
|
+
|
|
16
|
+
- personal attacks
|
|
17
|
+
- doxxing or privacy violations
|
|
18
|
+
- harassment or sustained disruption
|
|
19
|
+
- abusive, discriminatory, or sexualized language
|
|
20
|
+
|
|
21
|
+
## Enforcement
|
|
22
|
+
|
|
23
|
+
Project maintainers may remove comments, reject contributions, or restrict participation when behavior makes the project unsafe or unproductive.
|
|
24
|
+
|
|
25
|
+
## Scope
|
|
26
|
+
|
|
27
|
+
This applies to issues, pull requests, discussions, and other project communication spaces.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Contributing to OMG
|
|
2
|
+
|
|
3
|
+
Thanks for contributing to OMG.
|
|
4
|
+
|
|
5
|
+
## Local Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
python3 -m venv .venv
|
|
9
|
+
source .venv/bin/activate
|
|
10
|
+
pip install -r requirements.txt
|
|
11
|
+
python3 -m pytest tests -q
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
If you are validating the public launch surface, also run:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
python3 scripts/check-omg-public-ready.py
|
|
18
|
+
python3 scripts/check-omg-standalone-clean.py
|
|
19
|
+
./scripts/verify-standalone.sh
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
1. Create a branch from `main`.
|
|
25
|
+
2. Keep changes surgical and evidence-backed.
|
|
26
|
+
3. Add or update tests before changing behavior.
|
|
27
|
+
4. Run the relevant targeted tests while iterating.
|
|
28
|
+
5. Run `python3 -m pytest tests -q` before opening a PR.
|
|
29
|
+
|
|
30
|
+
## Pull Requests
|
|
31
|
+
|
|
32
|
+
PRs should explain:
|
|
33
|
+
|
|
34
|
+
- what changed
|
|
35
|
+
- why it changed
|
|
36
|
+
- how it was verified
|
|
37
|
+
- any follow-up risk or known limitation
|
|
38
|
+
|
|
39
|
+
Public-surface changes should also mention whether README, proof docs, install docs, and community docs stayed consistent.
|
|
40
|
+
|
|
41
|
+
## Versioning and Releases
|
|
42
|
+
|
|
43
|
+
- OMG uses semantic version tags such as `v2.0.1`.
|
|
44
|
+
- `package.json`, plugin metadata, and release tags must agree before a release is cut.
|
|
45
|
+
- npm publishing is driven by the `publish-npm.yml` workflow on version tags.
|
|
46
|
+
|
|
47
|
+
Before cutting a release, run the checklist in [docs/release-checklist.md](docs/release-checklist.md).
|
|
48
|
+
|
|
49
|
+
## CI Gates
|
|
50
|
+
|
|
51
|
+
The public release path is expected to pass:
|
|
52
|
+
|
|
53
|
+
- compat gate
|
|
54
|
+
- public-readiness hygiene check
|
|
55
|
+
- standalone verification
|
|
56
|
+
- full pytest suite
|
|
57
|
+
|
|
58
|
+
## Scope Guidance
|
|
59
|
+
|
|
60
|
+
- Keep OMC, OMX, and Superpowers mentions limited to compatibility and adoption guidance.
|
|
61
|
+
- Avoid adding public commands that mirror another project's branding or command names.
|
|
62
|
+
- Prefer OMG-native setup and orchestration language in docs and UX.
|
package/OMG-setup.sh
CHANGED
|
@@ -5,7 +5,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
5
5
|
CLAUDE_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"
|
|
6
6
|
BACKUP_TS="$(date +%Y%m%d_%H%M%S)"
|
|
7
7
|
BACKUP_DIR="$CLAUDE_DIR/.omg-backup-$BACKUP_TS"
|
|
8
|
-
VERSION="2.0.
|
|
8
|
+
VERSION="2.0.2"
|
|
9
9
|
|
|
10
10
|
PLUGIN_NAME="omg"
|
|
11
11
|
PLUGIN_MARKETPLACE="omg"
|
package/README.md
CHANGED
|
@@ -1,104 +1,91 @@
|
|
|
1
|
-
# OMG 2.0.
|
|
1
|
+
# OMG 2.0.2
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/trac3er00/OMG/actions/workflows/omg-compat-gate.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@trac3er/oh-my-god)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
OMG upgrades your agent host instead of replacing it. It gives Claude Code, Codex, OpenCode, and other supported CLIs a tighter setup flow, stronger orchestration, native adoption from older plugin stacks, and proof-backed verification.
|
|
4
8
|
|
|
5
9
|
- Brand: `OMG`
|
|
6
10
|
- Repo: `https://github.com/trac3er00/OMG`
|
|
7
11
|
- npm: `@trac3er/oh-my-god`
|
|
8
12
|
- Plugin id: `omg`
|
|
9
13
|
- Marketplace id: `omg`
|
|
10
|
-
- Version: `2.0.
|
|
11
|
-
|
|
12
|
-
## The Front Door
|
|
13
|
-
|
|
14
|
-
OMG keeps the public journey small:
|
|
15
|
-
|
|
16
|
-
1. Install for your host.
|
|
17
|
-
2. Run `/OMG:setup`.
|
|
18
|
-
3. Run `/OMG:crazy <goal>`.
|
|
19
|
-
|
|
20
|
-
Everything else is still available, but `setup` and `crazy` are the native OMG entrypoints.
|
|
14
|
+
- Version: `2.0.2`
|
|
21
15
|
|
|
22
|
-
##
|
|
16
|
+
## Why OMG
|
|
23
17
|
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
- `coexist`: advanced. OMG preserves other ecosystems where possible and avoids destructive overlap.
|
|
29
|
-
- Presets reduce feature-flag sprawl:
|
|
30
|
-
- `safe`
|
|
31
|
-
- `balanced`
|
|
32
|
-
- `interop`
|
|
33
|
-
- `labs`
|
|
34
|
-
- Keeps `compat` available for legacy skill routing without making it the main onboarding story.
|
|
18
|
+
- Small front door: install, run `/OMG:setup`, then `/OMG:crazy <goal>`.
|
|
19
|
+
- Multi-host support: Claude Code, Codex, OpenCode, Gemini CLI, and Kimi CLI.
|
|
20
|
+
- Native adoption: setup detects OMC, OMX, and Superpowers-style environments without exposing copycat public migration commands.
|
|
21
|
+
- Proof-first delivery: verification, provider coverage, HUD artifacts, and transcripts are published instead of implied.
|
|
35
22
|
|
|
36
|
-
|
|
23
|
+

|
|
37
24
|
|
|
38
|
-
|
|
39
|
-
- Codex
|
|
40
|
-
- OpenCode
|
|
41
|
-
- Gemini CLI
|
|
42
|
-
- Kimi CLI
|
|
25
|
+
## Quickstart
|
|
43
26
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
## Install
|
|
47
|
-
|
|
48
|
-
### npm
|
|
27
|
+
Install with npm:
|
|
49
28
|
|
|
50
29
|
```bash
|
|
51
30
|
npm install @trac3er/oh-my-god
|
|
52
31
|
```
|
|
53
32
|
|
|
54
|
-
|
|
33
|
+
Or clone and run the setup manager:
|
|
55
34
|
|
|
56
35
|
```bash
|
|
57
36
|
git clone https://github.com/trac3er00/OMG
|
|
58
37
|
cd OMG
|
|
59
38
|
chmod +x OMG-setup.sh
|
|
60
|
-
./OMG-setup.sh install
|
|
39
|
+
./OMG-setup.sh install --mode=omg-only --preset=balanced
|
|
61
40
|
```
|
|
62
41
|
|
|
63
|
-
|
|
42
|
+
Then run:
|
|
64
43
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
44
|
+
```text
|
|
45
|
+
/OMG:setup
|
|
46
|
+
/OMG:crazy stabilize auth and dashboard flows
|
|
47
|
+
```
|
|
68
48
|
|
|
69
|
-
|
|
49
|
+
Success looks like:
|
|
70
50
|
|
|
71
|
-
|
|
51
|
+
- supported hosts are detected
|
|
52
|
+
- `.mcp.json` is configured
|
|
53
|
+
- `.omg/state/adoption-report.json` is written when another ecosystem is present
|
|
54
|
+
- OMG reports the selected preset and next step
|
|
72
55
|
|
|
73
|
-
|
|
74
|
-
- It writes an adoption report to `.omg/state/adoption-report.json`.
|
|
75
|
-
- It recommends `OMG-only` and keeps `coexist` available when you want a non-destructive landing.
|
|
56
|
+
## Install Guides
|
|
76
57
|
|
|
77
|
-
|
|
58
|
+
- Claude Code: [docs/install/claude-code.md](docs/install/claude-code.md)
|
|
59
|
+
- Codex: [docs/install/codex.md](docs/install/codex.md)
|
|
60
|
+
- OpenCode: [docs/install/opencode.md](docs/install/opencode.md)
|
|
78
61
|
|
|
79
|
-
##
|
|
62
|
+
## Native Adoption
|
|
63
|
+
|
|
64
|
+
OMG uses native setup language instead of public migration commands.
|
|
65
|
+
|
|
66
|
+
- `OMG-only`: recommended. OMG becomes the primary hooks, HUD, MCP, and orchestration layer.
|
|
67
|
+
- `coexist`: advanced. OMG preserves non-conflicting third-party surfaces and records overlap instead of overwriting it.
|
|
68
|
+
- Presets: `safe`, `balanced`, `interop`, `labs`.
|
|
80
69
|
|
|
81
|
-
|
|
70
|
+
Compatibility references to OMC, OMX, and Superpowers are documented here: [docs/migration/native-adoption.md](docs/migration/native-adoption.md)
|
|
82
71
|
|
|
83
|
-
|
|
84
|
-
- verification status
|
|
85
|
-
- provider coverage
|
|
86
|
-
- adoption evidence
|
|
87
|
-
- HUD artifact
|
|
88
|
-
- sample transcripts
|
|
72
|
+
## Proof
|
|
89
73
|
|
|
90
|
-
Current local verification for this release: `
|
|
74
|
+
Current local verification for this release: `2452 passed, 2 skipped` on March 6, 2026.
|
|
91
75
|
|
|
92
|
-
|
|
76
|
+
- Verification and provider matrix: [docs/proof.md](docs/proof.md)
|
|
77
|
+
- Sample setup transcript: [docs/transcripts/setup.md](docs/transcripts/setup.md)
|
|
78
|
+
- Sample crazy transcript: [docs/transcripts/crazy.md](docs/transcripts/crazy.md)
|
|
79
|
+
- Release process: [docs/release-checklist.md](docs/release-checklist.md)
|
|
93
80
|
|
|
94
|
-
##
|
|
81
|
+
## Command Surface
|
|
95
82
|
|
|
96
|
-
Primary:
|
|
83
|
+
Primary entry points:
|
|
97
84
|
|
|
98
85
|
- `/OMG:setup`
|
|
99
86
|
- `/OMG:crazy`
|
|
100
87
|
|
|
101
|
-
Advanced:
|
|
88
|
+
Advanced surfaces stay available for deeper workflows:
|
|
102
89
|
|
|
103
90
|
- `/OMG:teams`
|
|
104
91
|
- `/OMG:ccg`
|
|
@@ -106,6 +93,14 @@ Advanced:
|
|
|
106
93
|
- `/OMG:ship`
|
|
107
94
|
- `/OMG:security-review`
|
|
108
95
|
|
|
96
|
+
## Contributing
|
|
97
|
+
|
|
98
|
+
Public contributions are welcome.
|
|
99
|
+
|
|
100
|
+
- Contribution guide: [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
101
|
+
- Security reporting: [SECURITY.md](SECURITY.md)
|
|
102
|
+
- Changelog: [CHANGELOG.md](CHANGELOG.md)
|
|
103
|
+
|
|
109
104
|
## Positioning
|
|
110
105
|
|
|
111
106
|
OMG is a plugin and orchestration layer for supported CLIs. It is not a base-model training project. The goal is to make frontier agent hosts tighter, safer, more interoperable, and more verifiable than the default experience.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
Please use GitHub's private vulnerability reporting for this repository if it is enabled.
|
|
6
|
+
|
|
7
|
+
If private reporting is not available, do not open a public issue with exploit details. Open a minimal issue asking for a private contact path through the maintainer's GitHub profile instead.
|
|
8
|
+
|
|
9
|
+
Include:
|
|
10
|
+
|
|
11
|
+
- affected version
|
|
12
|
+
- impact
|
|
13
|
+
- reproduction steps
|
|
14
|
+
- proof of concept if safe to share privately
|
|
15
|
+
- suggested mitigation if known
|
|
16
|
+
|
|
17
|
+
## Response Expectations
|
|
18
|
+
|
|
19
|
+
- We will triage reports before public discussion.
|
|
20
|
+
- We may ask for additional reproduction details.
|
|
21
|
+
- Coordinated disclosure is preferred over immediate public disclosure.
|
|
22
|
+
|
|
23
|
+
## Supported Versions
|
|
24
|
+
|
|
25
|
+
Security fixes are prioritized for the latest released version.
|
package/commands/OMG:setup.md
CHANGED
|
@@ -69,3 +69,11 @@ The command emits a final summary that includes:
|
|
|
69
69
|
- selected preset
|
|
70
70
|
- selected adoption mode
|
|
71
71
|
- adoption report path
|
|
72
|
+
|
|
73
|
+
## Public Path
|
|
74
|
+
|
|
75
|
+
The public OMG journey is:
|
|
76
|
+
|
|
77
|
+
1. install for your host
|
|
78
|
+
2. run `/OMG:setup`
|
|
79
|
+
3. run `/OMG:crazy <goal>`
|
|
@@ -8,7 +8,7 @@ at .omg/state/credentials.meta.
|
|
|
8
8
|
CLI: python hooks/credential_store.py {add,list,remove,rotate} [options]
|
|
9
9
|
|
|
10
10
|
Feature flag: OMG_MULTI_CREDENTIAL_ENABLED (default off)
|
|
11
|
-
Design
|
|
11
|
+
Design note: encrypted credentials live in OMG-managed state under .omg/state
|
|
12
12
|
"""
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
package/package.json
CHANGED
package/plugins/README.md
CHANGED
|
@@ -47,3 +47,8 @@ plugins/
|
|
|
47
47
|
## Adoption Notes
|
|
48
48
|
|
|
49
49
|
Public migration commands are intentionally avoided. OMG uses `/OMG:setup` and `OMG-setup.sh` to detect and adopt older ecosystems internally, while `compat` remains focused on legacy skill routing.
|
|
50
|
+
|
|
51
|
+
## Public Docs
|
|
52
|
+
|
|
53
|
+
- Install guides live in [docs/install/claude-code.md](../docs/install/claude-code.md), [docs/install/codex.md](../docs/install/codex.md), and [docs/install/opencode.md](../docs/install/opencode.md).
|
|
54
|
+
- Proof surface lives in [docs/proof.md](../docs/proof.md).
|
package/plugins/core/plugin.json
CHANGED
package/runtime/adoption.py
CHANGED
|
@@ -11,7 +11,7 @@ CANONICAL_REPO_URL = "https://github.com/trac3er00/OMG"
|
|
|
11
11
|
CANONICAL_PACKAGE_NAME = "@trac3er/oh-my-god"
|
|
12
12
|
CANONICAL_PLUGIN_ID = "omg"
|
|
13
13
|
CANONICAL_MARKETPLACE_ID = "omg"
|
|
14
|
-
CANONICAL_VERSION = "2.0.
|
|
14
|
+
CANONICAL_VERSION = "2.0.2"
|
|
15
15
|
|
|
16
16
|
VALID_ADOPTION_MODES = ("omg-only", "coexist")
|
|
17
17
|
VALID_PRESETS = ("safe", "balanced", "interop", "labs")
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Check that the repo is safe and polished enough for a public launch."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import re
|
|
9
|
+
|
|
10
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
11
|
+
|
|
12
|
+
REQUIRED_PUBLIC_DOCS = [
|
|
13
|
+
"README.md",
|
|
14
|
+
"CONTRIBUTING.md",
|
|
15
|
+
"SECURITY.md",
|
|
16
|
+
"CODE_OF_CONDUCT.md",
|
|
17
|
+
"CHANGELOG.md",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
REQUIRED_COMMUNITY_TEMPLATES = [
|
|
21
|
+
".github/ISSUE_TEMPLATE/bug_report.yml",
|
|
22
|
+
".github/ISSUE_TEMPLATE/feature_request.yml",
|
|
23
|
+
".github/pull_request_template.md",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
PUBLIC_DOC_GLOBS = [
|
|
27
|
+
"README.md",
|
|
28
|
+
"CONTRIBUTING.md",
|
|
29
|
+
"SECURITY.md",
|
|
30
|
+
"CODE_OF_CONDUCT.md",
|
|
31
|
+
"CHANGELOG.md",
|
|
32
|
+
"docs/**/*.md",
|
|
33
|
+
"plugins/README.md",
|
|
34
|
+
".github/**/*.md",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
TEXT_GLOBS = [
|
|
38
|
+
"README.md",
|
|
39
|
+
"CONTRIBUTING.md",
|
|
40
|
+
"SECURITY.md",
|
|
41
|
+
"CODE_OF_CONDUCT.md",
|
|
42
|
+
"CHANGELOG.md",
|
|
43
|
+
"docs/**/*.md",
|
|
44
|
+
"commands/**/*.md",
|
|
45
|
+
"plugins/**/*.md",
|
|
46
|
+
"agents/**/*.md",
|
|
47
|
+
"rules/**/*.md",
|
|
48
|
+
"runtime/**/*.py",
|
|
49
|
+
"hooks/**/*.py",
|
|
50
|
+
"scripts/**/*.py",
|
|
51
|
+
".github/workflows/**/*.yml",
|
|
52
|
+
".github/workflows/**/*.yaml",
|
|
53
|
+
"OMG-setup.sh",
|
|
54
|
+
"install.sh",
|
|
55
|
+
"package.json",
|
|
56
|
+
"settings.json",
|
|
57
|
+
".claude-plugin/**/*.json",
|
|
58
|
+
"plugins/**/*.json",
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
MARKDOWN_LINK_RE = re.compile(r"!\[[^\]]*\]\(([^)]+)\)|\[[^\]]+\]\(([^)]+)\)")
|
|
62
|
+
ALLOW_PATTERN_REFERENCES = {
|
|
63
|
+
ROOT / "scripts" / "check-omg-public-ready.py",
|
|
64
|
+
}
|
|
65
|
+
ALLOW_DEPRECATED_MARKETPLACE = {
|
|
66
|
+
ROOT / "OMG-setup.sh",
|
|
67
|
+
ROOT / "scripts" / "check-omg-public-ready.py",
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _iter_files(root: Path, globs: list[str]) -> list[Path]:
|
|
72
|
+
files: list[Path] = []
|
|
73
|
+
for pattern in globs:
|
|
74
|
+
files.extend(path for path in root.glob(pattern) if path.is_file())
|
|
75
|
+
return sorted(set(files))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _read(path: Path) -> str:
|
|
79
|
+
return path.read_text(encoding="utf-8")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _find_text_violations(root: Path) -> list[str]:
|
|
83
|
+
violations: list[str] = []
|
|
84
|
+
for path in _iter_files(root, TEXT_GLOBS):
|
|
85
|
+
rel = path.relative_to(root)
|
|
86
|
+
content = _read(path)
|
|
87
|
+
if "/Users/" in content:
|
|
88
|
+
if path not in ALLOW_PATTERN_REFERENCES:
|
|
89
|
+
violations.append(f"{rel}: absolute local path found in public repo content")
|
|
90
|
+
if ".sisyphus/" in content:
|
|
91
|
+
if path not in ALLOW_PATTERN_REFERENCES:
|
|
92
|
+
violations.append(f"{rel}: stale internal path reference found (.sisyphus/)")
|
|
93
|
+
if "trac3er00/OAL" in content:
|
|
94
|
+
if path not in ALLOW_PATTERN_REFERENCES:
|
|
95
|
+
violations.append(f"{rel}: old repo identifier found (trac3er00/OAL)")
|
|
96
|
+
if "oh-advanced-layer" in content:
|
|
97
|
+
if path not in ALLOW_DEPRECATED_MARKETPLACE:
|
|
98
|
+
violations.append(f"{rel}: deprecated marketplace identifier found (oh-advanced-layer)")
|
|
99
|
+
return violations
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _find_missing_docs(root: Path) -> list[str]:
|
|
103
|
+
violations: list[str] = []
|
|
104
|
+
for rel in REQUIRED_PUBLIC_DOCS:
|
|
105
|
+
if not (root / rel).exists():
|
|
106
|
+
violations.append(f"{rel}: missing required public doc")
|
|
107
|
+
return violations
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _find_missing_templates(root: Path) -> list[str]:
|
|
111
|
+
violations: list[str] = []
|
|
112
|
+
for rel in REQUIRED_COMMUNITY_TEMPLATES:
|
|
113
|
+
if not (root / rel).exists():
|
|
114
|
+
violations.append(f"{rel}: missing required community template")
|
|
115
|
+
return violations
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _find_internal_docs(root: Path) -> list[str]:
|
|
119
|
+
plans_dir = root / "docs" / "plans"
|
|
120
|
+
if plans_dir.exists():
|
|
121
|
+
return [f"{plans_dir.relative_to(root)}: internal planning docs must not ship in public branch"]
|
|
122
|
+
return []
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _normalize_link_target(raw: str) -> str:
|
|
126
|
+
target = raw.strip()
|
|
127
|
+
if target.startswith("<") and target.endswith(">"):
|
|
128
|
+
target = target[1:-1].strip()
|
|
129
|
+
return target
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _is_relative_markdown_link(target: str) -> bool:
|
|
133
|
+
if not target:
|
|
134
|
+
return False
|
|
135
|
+
if target.startswith("#"):
|
|
136
|
+
return False
|
|
137
|
+
lowered = target.lower()
|
|
138
|
+
return not (
|
|
139
|
+
lowered.startswith("http://")
|
|
140
|
+
or lowered.startswith("https://")
|
|
141
|
+
or lowered.startswith("mailto:")
|
|
142
|
+
or lowered.startswith("data:")
|
|
143
|
+
or lowered.startswith("file:")
|
|
144
|
+
or target.startswith("/")
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _link_target_exists(doc_path: Path, target: str) -> bool:
|
|
149
|
+
file_part = target.split("#", 1)[0].split("?", 1)[0]
|
|
150
|
+
if not file_part:
|
|
151
|
+
return True
|
|
152
|
+
resolved = (doc_path.parent / file_part).resolve()
|
|
153
|
+
return resolved.exists()
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _find_broken_markdown_links(root: Path) -> list[str]:
|
|
157
|
+
violations: list[str] = []
|
|
158
|
+
for path in _iter_files(root, PUBLIC_DOC_GLOBS):
|
|
159
|
+
rel = path.relative_to(root)
|
|
160
|
+
content = _read(path)
|
|
161
|
+
for match in MARKDOWN_LINK_RE.finditer(content):
|
|
162
|
+
target = _normalize_link_target(match.group(1) or match.group(2) or "")
|
|
163
|
+
if not _is_relative_markdown_link(target):
|
|
164
|
+
continue
|
|
165
|
+
if not _link_target_exists(path, target):
|
|
166
|
+
violations.append(f"{rel}: broken markdown link -> {target}")
|
|
167
|
+
return violations
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def main() -> int:
|
|
171
|
+
parser = argparse.ArgumentParser(description="Check OMG public-readiness hygiene")
|
|
172
|
+
parser.add_argument("--root", default=str(ROOT))
|
|
173
|
+
args = parser.parse_args()
|
|
174
|
+
root = Path(args.root).resolve()
|
|
175
|
+
|
|
176
|
+
violations = []
|
|
177
|
+
violations.extend(_find_missing_docs(root))
|
|
178
|
+
violations.extend(_find_missing_templates(root))
|
|
179
|
+
violations.extend(_find_internal_docs(root))
|
|
180
|
+
violations.extend(_find_text_violations(root))
|
|
181
|
+
violations.extend(_find_broken_markdown_links(root))
|
|
182
|
+
violations = sorted(set(violations))
|
|
183
|
+
|
|
184
|
+
if violations:
|
|
185
|
+
print(json.dumps({"status": "error", "violations": violations}, indent=2))
|
|
186
|
+
return 1
|
|
187
|
+
|
|
188
|
+
print(json.dumps({"status": "ok", "message": "public readiness check passed"}, indent=2))
|
|
189
|
+
return 0
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
if __name__ == "__main__":
|
|
193
|
+
raise SystemExit(main())
|
package/scripts/omg.py
CHANGED
package/settings.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
-
"_comment": "OMG 2.0.
|
|
3
|
+
"_comment": "OMG 2.0.2 - project-level config with hook registrations, presets, and feature flags.",
|
|
4
4
|
"permissions": {
|
|
5
5
|
"allow": [
|
|
6
6
|
"Agent",
|
|
@@ -262,7 +262,7 @@
|
|
|
262
262
|
]
|
|
263
263
|
},
|
|
264
264
|
"_omg": {
|
|
265
|
-
"_version": "2.0.
|
|
265
|
+
"_version": "2.0.2",
|
|
266
266
|
"preset": "safe",
|
|
267
267
|
"default_mode": "ulw+ralph",
|
|
268
268
|
"vision_auto": true,
|