codex-coach 0.1.0
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/.codex-plugin/plugin.json +25 -0
- package/LICENSE +21 -0
- package/README.md +97 -0
- package/assets/brand/codex-coach-icon.png +0 -0
- package/assets/brand/codex-coach-icon.svg +49 -0
- package/assets/brand/codex-coach-logo.png +0 -0
- package/assets/brand/codex-coach-logo.svg +62 -0
- package/assets/examples/how-it-works.png +0 -0
- package/assets/examples/how-it-works.svg +71 -0
- package/assets/examples/project-capsules.png +0 -0
- package/assets/examples/project-capsules.svg +59 -0
- package/assets/examples/prompt-lint.png +0 -0
- package/assets/examples/prompt-lint.svg +54 -0
- package/bin/codex-coach.js +53 -0
- package/install.ps1 +18 -0
- package/install.sh +50 -0
- package/package.json +38 -0
- package/pyproject.toml +31 -0
- package/skills/codex-coach/SKILL.md +71 -0
- package/skills/codex-coach/agents/openai.yaml +8 -0
- package/skills/codex-coach/references/config-suggestions.md +35 -0
- package/skills/codex-coach/references/privacy.md +25 -0
- package/skills/codex-coach/references/prompt-rubric.md +21 -0
- package/src/codex_coach/__init__.py +3 -0
- package/src/codex_coach/cli.py +146 -0
- package/src/codex_coach/install.py +230 -0
- package/src/codex_coach/parser.py +395 -0
- package/src/codex_coach/paths.py +49 -0
- package/src/codex_coach/prompts.py +151 -0
- package/src/codex_coach/redaction.py +35 -0
- package/src/codex_coach/reports.py +284 -0
- package/src/codex_coach/timeutil.py +49 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codex-coach",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first Codex usage coach that analyzes logs and suggests workflow improvements.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Codex Coach Contributors"
|
|
7
|
+
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"keywords": ["codex", "coach", "usage", "prompting", "productivity"],
|
|
10
|
+
"skills": "./skills/",
|
|
11
|
+
"interface": {
|
|
12
|
+
"displayName": "Codex Coach",
|
|
13
|
+
"shortDescription": "Analyze local Codex habits and suggest better usage patterns.",
|
|
14
|
+
"longDescription": "Codex Coach reads local Codex session logs, creates redacted weekly reports, and suggests reviewable custom instruction or project-context improvements without uploading private data.",
|
|
15
|
+
"developerName": "Codex Coach Contributors",
|
|
16
|
+
"category": "Productivity",
|
|
17
|
+
"capabilities": ["Local", "Analyze", "Read"],
|
|
18
|
+
"defaultPrompt": [
|
|
19
|
+
"Coach my Codex usage",
|
|
20
|
+
"Show my weekly report",
|
|
21
|
+
"Suggest instruction changes"
|
|
22
|
+
],
|
|
23
|
+
"brandColor": "#22C55E"
|
|
24
|
+
}
|
|
25
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Codex Coach Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Codex Coach
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Codex Coach is a local-first usage coach for Codex users. It reads Codex session logs on your machine, generates redacted habit reports, and suggests reviewable improvements to your Codex configuration and project instructions.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
With npm:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install -g codex-coach
|
|
13
|
+
codex-coach install
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
From a checkout:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
./install.sh
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Windows PowerShell:
|
|
23
|
+
|
|
24
|
+
```powershell
|
|
25
|
+
.\install.ps1
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The installer adds the `codex-coach` command when possible, copies the Codex plugin/skill into your local Codex plugin directory, and writes a default config under `~/.codex-coach/`.
|
|
29
|
+
|
|
30
|
+
Install options:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
./install.sh --weekly # default weekly report
|
|
34
|
+
./install.sh --daily # opt-in daily scheduled report
|
|
35
|
+
./install.sh --no-schedule # manual-only
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
.\install.ps1 -Daily
|
|
40
|
+
.\install.ps1 -NoSchedule
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Use
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
codex-coach doctor
|
|
47
|
+
codex-coach scan --since 7d
|
|
48
|
+
codex-coach report --since 7d
|
|
49
|
+
codex-coach report --since 7d --mode expert
|
|
50
|
+
codex-coach suggest-config
|
|
51
|
+
codex-coach lint-prompt "fix the failing auth test and verify pytest passes"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Inside Codex, ask:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
Coach my Codex usage
|
|
58
|
+
Show my weekly Codex Coach report
|
|
59
|
+
Suggest custom instruction changes
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Privacy Model
|
|
63
|
+
|
|
64
|
+
- Local only by default.
|
|
65
|
+
- Reads `~/.codex/sessions/**/*.jsonl` and `~/.codex/archived_sessions/*.jsonl`.
|
|
66
|
+
- Reports do not include full prompt text or source code.
|
|
67
|
+
- Suggestions are written as review files and are never applied automatically.
|
|
68
|
+
|
|
69
|
+
## Outputs
|
|
70
|
+
|
|
71
|
+
- `~/.codex-coach/reports/latest.md`
|
|
72
|
+
- `~/.codex-coach/reports/weekly-YYYY-MM-DD.md`
|
|
73
|
+
- `~/.codex-coach/facts/latest.json`
|
|
74
|
+
- `~/.codex-coach/suggestions/*.patch.md`
|
|
75
|
+
|
|
76
|
+
## Coaching Features
|
|
77
|
+
|
|
78
|
+
- Project capsules: redacted per-project workflow summaries with suggested local instructions.
|
|
79
|
+
- Prompt rewrites: safe templates for vague prompts without storing full prompt text.
|
|
80
|
+
- Confidence-scored suggestions: low, medium, or high confidence improvement notes.
|
|
81
|
+
- Beginner and expert report modes.
|
|
82
|
+
- Skill opportunities: repeated workflow patterns that may deserve a reusable Codex skill.
|
|
83
|
+
- Real-time prompt linting through `codex-coach lint-prompt`.
|
|
84
|
+
|
|
85
|
+
## Visual Examples
|
|
86
|
+
|
|
87
|
+

|
|
88
|
+
|
|
89
|
+

|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
## Brand Assets
|
|
94
|
+
|
|
95
|
+
- Wide logo: `assets/brand/codex-coach-logo.png`
|
|
96
|
+
- Square icon: `assets/brand/codex-coach-icon.png`
|
|
97
|
+
- Editable SVG sources live beside each PNG.
|
|
Binary file
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Codex Coach icon</title>
|
|
3
|
+
<desc id="desc">A loud neon square logo with a terminal prompt, target ring, and lightning bolt.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="80" y1="80" x2="944" y2="944" gradientUnits="userSpaceOnUse">
|
|
6
|
+
<stop offset="0" stop-color="#09090b"/>
|
|
7
|
+
<stop offset="0.44" stop-color="#111827"/>
|
|
8
|
+
<stop offset="1" stop-color="#020617"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
<linearGradient id="hot" x1="116" y1="122" x2="914" y2="900" gradientUnits="userSpaceOnUse">
|
|
11
|
+
<stop offset="0" stop-color="#f97316"/>
|
|
12
|
+
<stop offset="0.38" stop-color="#facc15"/>
|
|
13
|
+
<stop offset="0.65" stop-color="#22c55e"/>
|
|
14
|
+
<stop offset="1" stop-color="#ec4899"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
<linearGradient id="bolt" x1="453" y1="196" x2="679" y2="769" gradientUnits="userSpaceOnUse">
|
|
17
|
+
<stop offset="0" stop-color="#facc15"/>
|
|
18
|
+
<stop offset="0.48" stop-color="#22c55e"/>
|
|
19
|
+
<stop offset="1" stop-color="#06b6d4"/>
|
|
20
|
+
</linearGradient>
|
|
21
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
22
|
+
<feGaussianBlur stdDeviation="18" result="blur"/>
|
|
23
|
+
<feColorMatrix in="blur" type="matrix" values="0 0 0 0 0.15 0 0 0 0 1 0 0 0 0 0.48 0 0 0 0.8 0" result="greenGlow"/>
|
|
24
|
+
<feMerge>
|
|
25
|
+
<feMergeNode in="greenGlow"/>
|
|
26
|
+
<feMergeNode in="SourceGraphic"/>
|
|
27
|
+
</feMerge>
|
|
28
|
+
</filter>
|
|
29
|
+
<pattern id="grid" width="44" height="44" patternUnits="userSpaceOnUse">
|
|
30
|
+
<path d="M44 0H0V44" fill="none" stroke="#334155" stroke-width="2" opacity="0.28"/>
|
|
31
|
+
</pattern>
|
|
32
|
+
<pattern id="stripes" width="48" height="48" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
|
|
33
|
+
<rect width="16" height="48" fill="#f97316" opacity="0.9"/>
|
|
34
|
+
<rect x="16" width="32" height="48" fill="#020617" opacity="0.65"/>
|
|
35
|
+
</pattern>
|
|
36
|
+
</defs>
|
|
37
|
+
<rect width="1024" height="1024" rx="108" fill="url(#bg)"/>
|
|
38
|
+
<rect x="36" y="36" width="952" height="952" rx="88" fill="none" stroke="url(#hot)" stroke-width="24"/>
|
|
39
|
+
<rect x="70" y="70" width="884" height="884" rx="64" fill="url(#grid)" opacity="0.95"/>
|
|
40
|
+
<path d="M92 186H932L887 270H137Z" fill="url(#stripes)" opacity="0.9"/>
|
|
41
|
+
<path d="M114 802H910" stroke="#ec4899" stroke-width="20" stroke-linecap="round" opacity="0.85"/>
|
|
42
|
+
<circle cx="512" cy="512" r="315" fill="#020617" stroke="#22c55e" stroke-width="16" opacity="0.94"/>
|
|
43
|
+
<circle cx="512" cy="512" r="226" fill="none" stroke="#facc15" stroke-width="10" stroke-dasharray="24 18" opacity="0.95"/>
|
|
44
|
+
<circle cx="512" cy="512" r="126" fill="none" stroke="#ec4899" stroke-width="10" opacity="0.9"/>
|
|
45
|
+
<path d="M442 198L334 559H488L430 828L706 430H548L604 198Z" fill="url(#bolt)" filter="url(#glow)"/>
|
|
46
|
+
<path d="M247 386L342 478L247 570" fill="none" stroke="#f8fafc" stroke-width="52" stroke-linecap="round" stroke-linejoin="round"/>
|
|
47
|
+
<path d="M647 621H817" stroke="#f8fafc" stroke-width="52" stroke-linecap="round"/>
|
|
48
|
+
<text x="512" y="936" text-anchor="middle" font-family="Arial Black, Impact, sans-serif" font-size="72" font-weight="900" fill="#f8fafc" letter-spacing="6">COACH</text>
|
|
49
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Codex Coach wide logo</title>
|
|
3
|
+
<desc id="desc">A bold neon brand banner for Codex Coach with a terminal icon and coaching workflow tagline.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1200" y2="630" gradientUnits="userSpaceOnUse">
|
|
6
|
+
<stop offset="0" stop-color="#030712"/>
|
|
7
|
+
<stop offset="0.48" stop-color="#111827"/>
|
|
8
|
+
<stop offset="1" stop-color="#020617"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
<linearGradient id="blast" x1="92" y1="70" x2="1120" y2="562" gradientUnits="userSpaceOnUse">
|
|
11
|
+
<stop offset="0" stop-color="#f97316"/>
|
|
12
|
+
<stop offset="0.24" stop-color="#facc15"/>
|
|
13
|
+
<stop offset="0.52" stop-color="#22c55e"/>
|
|
14
|
+
<stop offset="0.78" stop-color="#06b6d4"/>
|
|
15
|
+
<stop offset="1" stop-color="#ec4899"/>
|
|
16
|
+
</linearGradient>
|
|
17
|
+
<linearGradient id="textHot" x1="462" y1="147" x2="1120" y2="366" gradientUnits="userSpaceOnUse">
|
|
18
|
+
<stop offset="0" stop-color="#f8fafc"/>
|
|
19
|
+
<stop offset="0.55" stop-color="#bbf7d0"/>
|
|
20
|
+
<stop offset="1" stop-color="#f9a8d4"/>
|
|
21
|
+
</linearGradient>
|
|
22
|
+
<filter id="glow" x="-20%" y="-40%" width="140%" height="180%">
|
|
23
|
+
<feGaussianBlur stdDeviation="12" result="blur"/>
|
|
24
|
+
<feMerge>
|
|
25
|
+
<feMergeNode in="blur"/>
|
|
26
|
+
<feMergeNode in="SourceGraphic"/>
|
|
27
|
+
</feMerge>
|
|
28
|
+
</filter>
|
|
29
|
+
<pattern id="grid" width="38" height="38" patternUnits="userSpaceOnUse">
|
|
30
|
+
<path d="M38 0H0V38" fill="none" stroke="#475569" stroke-width="1.4" opacity="0.28"/>
|
|
31
|
+
</pattern>
|
|
32
|
+
<pattern id="stripes" width="42" height="42" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
|
|
33
|
+
<rect width="14" height="42" fill="#f97316" opacity="0.9"/>
|
|
34
|
+
<rect x="14" width="28" height="42" fill="#020617" opacity="0.55"/>
|
|
35
|
+
</pattern>
|
|
36
|
+
</defs>
|
|
37
|
+
<rect width="1200" height="630" rx="0" fill="url(#bg)"/>
|
|
38
|
+
<rect width="1200" height="630" fill="url(#grid)"/>
|
|
39
|
+
<path d="M0 0H1200V104H0Z" fill="url(#stripes)" opacity="0.82"/>
|
|
40
|
+
<path d="M0 526H1200V630H0Z" fill="url(#stripes)" opacity="0.5"/>
|
|
41
|
+
<rect x="42" y="44" width="1116" height="542" rx="30" fill="none" stroke="url(#blast)" stroke-width="8"/>
|
|
42
|
+
<circle cx="245" cy="314" r="184" fill="#020617" stroke="#22c55e" stroke-width="12"/>
|
|
43
|
+
<circle cx="245" cy="314" r="126" fill="none" stroke="#facc15" stroke-width="7" stroke-dasharray="20 14"/>
|
|
44
|
+
<path d="M209 136L142 350H241L203 501L382 255H282L318 136Z" fill="#facc15" filter="url(#glow)"/>
|
|
45
|
+
<path d="M104 268L174 332L104 396" fill="none" stroke="#f8fafc" stroke-width="37" stroke-linecap="round" stroke-linejoin="round"/>
|
|
46
|
+
<path d="M279 402H405" stroke="#f8fafc" stroke-width="37" stroke-linecap="round"/>
|
|
47
|
+
<text x="480" y="252" font-family="Arial Black, Impact, sans-serif" font-size="110" font-weight="900" fill="url(#textHot)" letter-spacing="2">CODEX</text>
|
|
48
|
+
<text x="480" y="358" font-family="Arial Black, Impact, sans-serif" font-size="110" font-weight="900" fill="#22c55e" letter-spacing="3" filter="url(#glow)">COACH</text>
|
|
49
|
+
<text x="485" y="422" font-family="Arial, Helvetica, sans-serif" font-size="28" font-weight="800" fill="#f8fafc" letter-spacing="5">LOCAL-FIRST USAGE COACH</text>
|
|
50
|
+
<g font-family="Arial Black, Impact, sans-serif" font-size="24" font-weight="900">
|
|
51
|
+
<rect x="482" y="462" width="154" height="50" rx="8" fill="#22c55e"/>
|
|
52
|
+
<text x="559" y="496" text-anchor="middle" fill="#020617">SCAN</text>
|
|
53
|
+
<path d="M650 487H718" stroke="#facc15" stroke-width="8" stroke-linecap="round"/>
|
|
54
|
+
<path d="M718 487L697 469V505Z" fill="#facc15"/>
|
|
55
|
+
<rect x="737" y="462" width="174" height="50" rx="8" fill="#facc15"/>
|
|
56
|
+
<text x="824" y="496" text-anchor="middle" fill="#020617">REPORT</text>
|
|
57
|
+
<path d="M925 487H993" stroke="#ec4899" stroke-width="8" stroke-linecap="round"/>
|
|
58
|
+
<path d="M993 487L972 469V505Z" fill="#ec4899"/>
|
|
59
|
+
<rect x="1011" y="462" width="104" height="50" rx="8" fill="#ec4899"/>
|
|
60
|
+
<text x="1063" y="496" text-anchor="middle" fill="#fff">LEVEL UP</text>
|
|
61
|
+
</g>
|
|
62
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="760" viewBox="0 0 1400 760" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">How Codex Coach works</title>
|
|
3
|
+
<desc id="desc">A four-step workflow showing local Codex logs becoming a redacted report and reviewable suggestions.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1400" y2="760" gradientUnits="userSpaceOnUse">
|
|
6
|
+
<stop offset="0" stop-color="#020617"/>
|
|
7
|
+
<stop offset="1" stop-color="#111827"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
<linearGradient id="hot" x1="110" y1="110" x2="1288" y2="640" gradientUnits="userSpaceOnUse">
|
|
10
|
+
<stop offset="0" stop-color="#f97316"/>
|
|
11
|
+
<stop offset="0.38" stop-color="#22c55e"/>
|
|
12
|
+
<stop offset="0.72" stop-color="#06b6d4"/>
|
|
13
|
+
<stop offset="1" stop-color="#ec4899"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
16
|
+
<feGaussianBlur stdDeviation="10" result="blur"/>
|
|
17
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
18
|
+
</filter>
|
|
19
|
+
<style>
|
|
20
|
+
.title{font:900 52px Arial Black,Impact,sans-serif;fill:#f8fafc;letter-spacing:1px}
|
|
21
|
+
.label{font:900 30px Arial Black,Impact,sans-serif;fill:#f8fafc}
|
|
22
|
+
.body{font:700 23px Arial,Helvetica,sans-serif;fill:#cbd5e1}
|
|
23
|
+
.mono{font:700 22px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;fill:#bbf7d0}
|
|
24
|
+
.card{fill:#030712;stroke:#334155;stroke-width:3}
|
|
25
|
+
</style>
|
|
26
|
+
</defs>
|
|
27
|
+
<rect width="1400" height="760" fill="url(#bg)"/>
|
|
28
|
+
<rect x="32" y="32" width="1336" height="696" rx="26" fill="none" stroke="url(#hot)" stroke-width="7"/>
|
|
29
|
+
<text x="76" y="104" class="title">RAW LOGS -> BETTER CODEX SESSIONS</text>
|
|
30
|
+
<g transform="translate(82 176)">
|
|
31
|
+
<rect class="card" width="260" height="368" rx="12"/>
|
|
32
|
+
<rect x="0" y="0" width="260" height="10" fill="#f97316"/>
|
|
33
|
+
<text x="28" y="62" class="label">1. LOCAL LOGS</text>
|
|
34
|
+
<text x="28" y="112" class="mono">~/.codex/sessions</text>
|
|
35
|
+
<text x="28" y="150" class="mono">archived_sessions</text>
|
|
36
|
+
<path d="M34 210H226M34 250H180M34 290H216" stroke="#64748b" stroke-width="10" stroke-linecap="round"/>
|
|
37
|
+
<text x="28" y="340" class="body">No cloud account.</text>
|
|
38
|
+
</g>
|
|
39
|
+
<path d="M372 360H472" stroke="#facc15" stroke-width="11" stroke-linecap="round" filter="url(#glow)"/>
|
|
40
|
+
<path d="M472 360L441 334V386Z" fill="#facc15"/>
|
|
41
|
+
<g transform="translate(502 176)">
|
|
42
|
+
<rect class="card" width="260" height="368" rx="12"/>
|
|
43
|
+
<rect x="0" y="0" width="260" height="10" fill="#22c55e"/>
|
|
44
|
+
<text x="28" y="62" class="label">2. SCAN</text>
|
|
45
|
+
<text x="28" y="112" class="mono">codex-coach</text>
|
|
46
|
+
<text x="28" y="150" class="mono">report --since 7d</text>
|
|
47
|
+
<circle cx="130" cy="248" r="72" fill="none" stroke="#22c55e" stroke-width="12"/>
|
|
48
|
+
<path d="M101 248L126 273L171 219" fill="none" stroke="#f8fafc" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
|
|
49
|
+
<text x="28" y="340" class="body">Deterministic parser.</text>
|
|
50
|
+
</g>
|
|
51
|
+
<path d="M792 360H892" stroke="#06b6d4" stroke-width="11" stroke-linecap="round" filter="url(#glow)"/>
|
|
52
|
+
<path d="M892 360L861 334V386Z" fill="#06b6d4"/>
|
|
53
|
+
<g transform="translate(922 176)">
|
|
54
|
+
<rect class="card" width="260" height="368" rx="12"/>
|
|
55
|
+
<rect x="0" y="0" width="260" height="10" fill="#06b6d4"/>
|
|
56
|
+
<text x="28" y="62" class="label">3. REPORT</text>
|
|
57
|
+
<text x="28" y="112" class="body">Prompt quality</text>
|
|
58
|
+
<text x="28" y="150" class="body">Verification habits</text>
|
|
59
|
+
<text x="28" y="188" class="body">Project capsules</text>
|
|
60
|
+
<rect x="30" y="228" width="200" height="24" fill="#22c55e"/>
|
|
61
|
+
<rect x="30" y="270" width="150" height="24" fill="#facc15"/>
|
|
62
|
+
<rect x="30" y="312" width="96" height="24" fill="#ec4899"/>
|
|
63
|
+
</g>
|
|
64
|
+
<path d="M1212 360H1290" stroke="#ec4899" stroke-width="11" stroke-linecap="round" filter="url(#glow)"/>
|
|
65
|
+
<path d="M1290 360L1259 334V386Z" fill="#ec4899"/>
|
|
66
|
+
<g transform="translate(1090 594)">
|
|
67
|
+
<rect x="-16" y="-16" width="244" height="82" rx="10" fill="#ec4899"/>
|
|
68
|
+
<text x="106" y="34" text-anchor="middle" font-family="Arial Black,Impact,sans-serif" font-size="28" fill="#fff">LEVEL UP</text>
|
|
69
|
+
</g>
|
|
70
|
+
<text x="82" y="662" font-family="Arial,Helvetica,sans-serif" font-size="30" font-weight="900" fill="#f8fafc">Output: redacted facts, weekly report, and review-only config suggestions.</text>
|
|
71
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="760" viewBox="0 0 1400 760" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Project capsules example</title>
|
|
3
|
+
<desc id="desc">A dashboard-style illustration of Codex Coach project capsules and suggested local instructions.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1400" y2="760" gradientUnits="userSpaceOnUse">
|
|
6
|
+
<stop offset="0" stop-color="#020617"/>
|
|
7
|
+
<stop offset="0.55" stop-color="#0f172a"/>
|
|
8
|
+
<stop offset="1" stop-color="#111827"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
<linearGradient id="hot" x1="70" y1="80" x2="1320" y2="690" gradientUnits="userSpaceOnUse">
|
|
11
|
+
<stop offset="0" stop-color="#22c55e"/>
|
|
12
|
+
<stop offset="0.5" stop-color="#06b6d4"/>
|
|
13
|
+
<stop offset="1" stop-color="#ec4899"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<style>
|
|
16
|
+
.title{font:900 56px Arial Black,Impact,sans-serif;fill:#f8fafc}
|
|
17
|
+
.label{font:900 30px Arial Black,Impact,sans-serif;fill:#f8fafc}
|
|
18
|
+
.body{font:800 24px Arial,Helvetica,sans-serif;fill:#cbd5e1}
|
|
19
|
+
.mono{font:800 23px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;fill:#bbf7d0}
|
|
20
|
+
</style>
|
|
21
|
+
</defs>
|
|
22
|
+
<rect width="1400" height="760" fill="url(#bg)"/>
|
|
23
|
+
<rect x="36" y="36" width="1328" height="688" rx="24" fill="none" stroke="url(#hot)" stroke-width="7"/>
|
|
24
|
+
<text x="74" y="108" class="title">PROJECT CAPSULES: MEMORY AT A GLANCE</text>
|
|
25
|
+
<g transform="translate(74 176)">
|
|
26
|
+
<rect width="382" height="420" rx="12" fill="#030712" stroke="#22c55e" stroke-width="4"/>
|
|
27
|
+
<rect x="0" y="0" width="382" height="12" fill="#22c55e"/>
|
|
28
|
+
<text x="28" y="62" class="label">referiate [hash]</text>
|
|
29
|
+
<text x="28" y="114" class="body">Workflow</text>
|
|
30
|
+
<text x="28" y="152" class="mono">terminal diagnosis</text>
|
|
31
|
+
<text x="28" y="218" class="body">Habit found</text>
|
|
32
|
+
<text x="28" y="256" class="mono">verify live endpoint</text>
|
|
33
|
+
<text x="28" y="322" class="body">Suggested instruction</text>
|
|
34
|
+
<path d="M28 356H332M28 388H282" stroke="#22c55e" stroke-width="10" stroke-linecap="round"/>
|
|
35
|
+
</g>
|
|
36
|
+
<g transform="translate(510 176)">
|
|
37
|
+
<rect width="382" height="420" rx="12" fill="#030712" stroke="#06b6d4" stroke-width="4"/>
|
|
38
|
+
<rect x="0" y="0" width="382" height="12" fill="#06b6d4"/>
|
|
39
|
+
<text x="28" y="62" class="label">app-ui [hash]</text>
|
|
40
|
+
<text x="28" y="114" class="body">Workflow</text>
|
|
41
|
+
<text x="28" y="152" class="mono">browser verification</text>
|
|
42
|
+
<text x="28" y="218" class="body">Habit found</text>
|
|
43
|
+
<text x="28" y="256" class="mono">screenshots help</text>
|
|
44
|
+
<text x="28" y="322" class="body">Suggested instruction</text>
|
|
45
|
+
<path d="M28 356H320M28 388H240" stroke="#06b6d4" stroke-width="10" stroke-linecap="round"/>
|
|
46
|
+
</g>
|
|
47
|
+
<g transform="translate(946 176)">
|
|
48
|
+
<rect width="382" height="420" rx="12" fill="#030712" stroke="#ec4899" stroke-width="4"/>
|
|
49
|
+
<rect x="0" y="0" width="382" height="12" fill="#ec4899"/>
|
|
50
|
+
<text x="28" y="62" class="label">long-run [hash]</text>
|
|
51
|
+
<text x="28" y="114" class="body">Workflow</text>
|
|
52
|
+
<text x="28" y="152" class="mono">multi-step assets</text>
|
|
53
|
+
<text x="28" y="218" class="body">Habit found</text>
|
|
54
|
+
<text x="28" y="256" class="mono">checkpoint often</text>
|
|
55
|
+
<text x="28" y="322" class="body">Skill opportunity</text>
|
|
56
|
+
<path d="M28 356H328M28 388H262" stroke="#ec4899" stroke-width="10" stroke-linecap="round"/>
|
|
57
|
+
</g>
|
|
58
|
+
<text x="74" y="666" font-family="Arial,Helvetica,sans-serif" font-size="30" font-weight="900" fill="#f8fafc">Review snippets first. Codex Coach never auto-edits AGENTS.md.</text>
|
|
59
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="760" viewBox="0 0 1400 760" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Prompt lint example</title>
|
|
3
|
+
<desc id="desc">A before and after example showing a vague Codex prompt being rewritten into a clearer prompt.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1400" y2="760" gradientUnits="userSpaceOnUse">
|
|
6
|
+
<stop offset="0" stop-color="#09090b"/>
|
|
7
|
+
<stop offset="1" stop-color="#020617"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
10
|
+
<feGaussianBlur stdDeviation="9" result="blur"/>
|
|
11
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
12
|
+
</filter>
|
|
13
|
+
<style>
|
|
14
|
+
.title{font:900 58px Arial Black,Impact,sans-serif;fill:#f8fafc}
|
|
15
|
+
.label{font:900 34px Arial Black,Impact,sans-serif;fill:#f8fafc}
|
|
16
|
+
.mono{font:800 29px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
|
|
17
|
+
.body{font:800 28px Arial,Helvetica,sans-serif;fill:#e2e8f0}
|
|
18
|
+
.small{font:800 22px Arial,Helvetica,sans-serif;fill:#94a3b8}
|
|
19
|
+
</style>
|
|
20
|
+
</defs>
|
|
21
|
+
<rect width="1400" height="760" fill="url(#bg)"/>
|
|
22
|
+
<rect x="36" y="36" width="1328" height="688" rx="24" fill="none" stroke="#22c55e" stroke-width="7"/>
|
|
23
|
+
<text x="74" y="112" class="title">PROMPT LINT: MAKE THE ASK UNMISSABLE</text>
|
|
24
|
+
<g transform="translate(74 186)">
|
|
25
|
+
<rect width="346" height="368" rx="14" fill="#18080b" stroke="#ef4444" stroke-width="5"/>
|
|
26
|
+
<rect x="24" y="24" width="116" height="42" rx="6" fill="#ef4444"/>
|
|
27
|
+
<text x="82" y="55" text-anchor="middle" font-family="Arial Black,Impact,sans-serif" font-size="24" fill="#fff">BEFORE</text>
|
|
28
|
+
<text x="34" y="138" class="mono" fill="#fecaca">fix</text>
|
|
29
|
+
<path d="M34 208H300M34 254H246M34 300H278" stroke="#7f1d1d" stroke-width="12" stroke-linecap="round"/>
|
|
30
|
+
<text x="34" y="342" class="small">Missing target and success state</text>
|
|
31
|
+
</g>
|
|
32
|
+
<path d="M454 370H574" stroke="#facc15" stroke-width="13" stroke-linecap="round" filter="url(#glow)"/>
|
|
33
|
+
<path d="M574 370L535 338V402Z" fill="#facc15"/>
|
|
34
|
+
<g transform="translate(610 186)">
|
|
35
|
+
<rect width="238" height="368" rx="14" fill="#141006" stroke="#facc15" stroke-width="5"/>
|
|
36
|
+
<circle cx="119" cy="144" r="76" fill="none" stroke="#facc15" stroke-width="12"/>
|
|
37
|
+
<path d="M86 144H152M119 111V177" stroke="#facc15" stroke-width="11" stroke-linecap="round"/>
|
|
38
|
+
<text x="119" y="270" text-anchor="middle" class="label">LINT</text>
|
|
39
|
+
<text x="119" y="316" text-anchor="middle" class="small">score + rewrite</text>
|
|
40
|
+
</g>
|
|
41
|
+
<path d="M882 370H1002" stroke="#22c55e" stroke-width="13" stroke-linecap="round" filter="url(#glow)"/>
|
|
42
|
+
<path d="M1002 370L963 338V402Z" fill="#22c55e"/>
|
|
43
|
+
<g transform="translate(1038 186)">
|
|
44
|
+
<rect width="286" height="368" rx="14" fill="#03150b" stroke="#22c55e" stroke-width="5"/>
|
|
45
|
+
<rect x="24" y="24" width="98" height="42" rx="6" fill="#22c55e"/>
|
|
46
|
+
<text x="73" y="55" text-anchor="middle" font-family="Arial Black,Impact,sans-serif" font-size="24" fill="#020617">AFTER</text>
|
|
47
|
+
<text x="30" y="124" class="mono" fill="#bbf7d0">Fix login in</text>
|
|
48
|
+
<text x="30" y="164" class="mono" fill="#bbf7d0">auth.py because</text>
|
|
49
|
+
<text x="30" y="204" class="mono" fill="#bbf7d0">401 appears.</text>
|
|
50
|
+
<text x="30" y="264" class="mono" fill="#bbf7d0">Success means</text>
|
|
51
|
+
<text x="30" y="304" class="mono" fill="#bbf7d0">pytest passes.</text>
|
|
52
|
+
</g>
|
|
53
|
+
<text x="74" y="646" class="body">Command: codex-coach lint-prompt "fix"</text>
|
|
54
|
+
</svg>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const { spawnSync } = require("node:child_process");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
|
|
7
|
+
const root = path.resolve(__dirname, "..");
|
|
8
|
+
const src = path.join(root, "src");
|
|
9
|
+
const existingPythonPath = process.env.PYTHONPATH;
|
|
10
|
+
const env = {
|
|
11
|
+
...process.env,
|
|
12
|
+
PYTHONPATH: existingPythonPath ? `${src}${path.delimiter}${existingPythonPath}` : src,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function run(candidate) {
|
|
16
|
+
const result = spawnSync(candidate.command, candidate.args.concat(["-m", "codex_coach.cli"], process.argv.slice(2)), {
|
|
17
|
+
stdio: "inherit",
|
|
18
|
+
env,
|
|
19
|
+
windowsHide: false,
|
|
20
|
+
});
|
|
21
|
+
if (result.error) {
|
|
22
|
+
return { ok: false, error: result.error };
|
|
23
|
+
}
|
|
24
|
+
process.exit(result.status === null ? 1 : result.status);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const configuredPython = process.env.PYTHON;
|
|
28
|
+
const candidates = configuredPython
|
|
29
|
+
? [{ command: configuredPython, args: [] }]
|
|
30
|
+
: process.platform === "win32"
|
|
31
|
+
? [
|
|
32
|
+
{ command: "py", args: ["-3"] },
|
|
33
|
+
{ command: "python", args: [] },
|
|
34
|
+
{ command: "python3", args: [] },
|
|
35
|
+
]
|
|
36
|
+
: [
|
|
37
|
+
{ command: "python3", args: [] },
|
|
38
|
+
{ command: "python", args: [] },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const errors = [];
|
|
42
|
+
for (const candidate of candidates) {
|
|
43
|
+
const result = run(candidate);
|
|
44
|
+
if (!result.ok) {
|
|
45
|
+
errors.push(`${candidate.command}: ${result.error.message}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
console.error("codex-coach requires Python 3.10+ on PATH.");
|
|
50
|
+
if (errors.length) {
|
|
51
|
+
console.error(errors.join("\n"));
|
|
52
|
+
}
|
|
53
|
+
process.exit(1);
|
package/install.ps1
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
param(
|
|
2
|
+
[switch]$Daily,
|
|
3
|
+
[switch]$Weekly,
|
|
4
|
+
[switch]$NoSchedule
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
$ErrorActionPreference = "Stop"
|
|
8
|
+
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
9
|
+
$Schedule = if ($NoSchedule) { "none" } elseif ($Daily) { "daily" } else { "weekly" }
|
|
10
|
+
$Python = if ($env:PYTHON) { $env:PYTHON } else { "python" }
|
|
11
|
+
|
|
12
|
+
$env:PYTHONPATH = "$ScriptDir/src" + $(if ($env:PYTHONPATH) { ";$env:PYTHONPATH" } else { "" })
|
|
13
|
+
& $Python -m codex_coach.cli install --source-root "$ScriptDir" --schedule "$Schedule"
|
|
14
|
+
|
|
15
|
+
Write-Host ""
|
|
16
|
+
Write-Host "Codex Coach installed."
|
|
17
|
+
Write-Host "Restart Codex, then ask: Coach my Codex usage"
|
|
18
|
+
Write-Host "CLI: codex-coach doctor"
|
package/install.sh
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
|
5
|
+
SCHEDULE="weekly"
|
|
6
|
+
|
|
7
|
+
while [ "$#" -gt 0 ]; do
|
|
8
|
+
case "$1" in
|
|
9
|
+
--daily)
|
|
10
|
+
SCHEDULE="daily"
|
|
11
|
+
;;
|
|
12
|
+
--weekly)
|
|
13
|
+
SCHEDULE="weekly"
|
|
14
|
+
;;
|
|
15
|
+
--no-schedule)
|
|
16
|
+
SCHEDULE="none"
|
|
17
|
+
;;
|
|
18
|
+
*)
|
|
19
|
+
echo "unknown option: $1" >&2
|
|
20
|
+
echo "usage: ./install.sh [--weekly|--daily|--no-schedule]" >&2
|
|
21
|
+
exit 2
|
|
22
|
+
;;
|
|
23
|
+
esac
|
|
24
|
+
shift
|
|
25
|
+
done
|
|
26
|
+
|
|
27
|
+
PYTHON_BIN="${PYTHON:-python3}"
|
|
28
|
+
|
|
29
|
+
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
|
|
30
|
+
echo "python3 is required to install Codex Coach" >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
PYTHONPATH="$SCRIPT_DIR/src${PYTHONPATH:+:$PYTHONPATH}" "$PYTHON_BIN" -m codex_coach.cli install \
|
|
35
|
+
--source-root "$SCRIPT_DIR" \
|
|
36
|
+
--schedule "$SCHEDULE"
|
|
37
|
+
|
|
38
|
+
cat <<'MSG'
|
|
39
|
+
|
|
40
|
+
Codex Coach installed.
|
|
41
|
+
|
|
42
|
+
Next:
|
|
43
|
+
1. Make sure ~/.local/bin is on PATH.
|
|
44
|
+
2. Restart Codex.
|
|
45
|
+
3. Ask: Coach my Codex usage
|
|
46
|
+
|
|
47
|
+
CLI:
|
|
48
|
+
codex-coach doctor
|
|
49
|
+
codex-coach report --since 7d
|
|
50
|
+
MSG
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codex-coach",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-first Codex usage coach and plugin",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Codex Coach Contributors",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"bin": {
|
|
9
|
+
"codex-coach": "bin/codex-coach.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"assets/",
|
|
13
|
+
"bin/",
|
|
14
|
+
"src/",
|
|
15
|
+
"skills/",
|
|
16
|
+
".codex-plugin/",
|
|
17
|
+
"install.sh",
|
|
18
|
+
"install.ps1",
|
|
19
|
+
"pyproject.toml",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"keywords": [
|
|
24
|
+
"codex",
|
|
25
|
+
"coach",
|
|
26
|
+
"ai",
|
|
27
|
+
"developer-tools",
|
|
28
|
+
"prompting",
|
|
29
|
+
"productivity"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"test": "python3 -m unittest discover -s tests",
|
|
36
|
+
"pack:check": "npm pack --dry-run"
|
|
37
|
+
}
|
|
38
|
+
}
|