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.
@@ -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
+ ![Codex Coach logo](https://cdn.jsdelivr.net/npm/codex-coach@0.1.0/assets/brand/codex-coach-logo.png)
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
+ ![How Codex Coach works](https://cdn.jsdelivr.net/npm/codex-coach@0.1.0/assets/examples/how-it-works.png)
88
+
89
+ ![Prompt lint example](https://cdn.jsdelivr.net/npm/codex-coach@0.1.0/assets/examples/prompt-lint.png)
90
+
91
+ ![Project capsules example](https://cdn.jsdelivr.net/npm/codex-coach@0.1.0/assets/examples/project-capsules.png)
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.
@@ -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>
@@ -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 -&gt; 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>
@@ -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
+ }