polymath-society 0.2.4
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/LICENSE +52 -0
- package/README.md +311 -0
- package/dist/DATA-MAP.md +109 -0
- package/dist/cli.js +24136 -0
- package/dist/engine/closing-rubric.md +50 -0
- package/dist/engine/exp-allfacets.js +16832 -0
- package/dist/engine/exp-person.js +16922 -0
- package/dist/engine/exp-pipeline.js +16700 -0
- package/dist/engine/feel-seen-rubric.md +192 -0
- package/dist/engine/ingest-export.js +1423 -0
- package/dist/engine/peak-demos.js +16752 -0
- package/dist/engine/person-dimension-summary.js +16744 -0
- package/dist/engine/person-facet-lines.js +16784 -0
- package/dist/engine/person-headline.js +16733 -0
- package/dist/engine/person-report.js +16845 -0
- package/dist/engine/person-self-image.js +16689 -0
- package/dist/engine/public-report-guidelines.md +80 -0
- package/dist/engine/public-report.js +17284 -0
- package/dist/engine/run-analysis.js +16035 -0
- package/dist/engine/run-tagger.js +16092 -0
- package/dist/engine/top-companies.md +41 -0
- package/dist/engine/writing-well.md +56 -0
- package/dist/index.js +22021 -0
- package/dist/pipeline/TECHNIQUES.md +406 -0
- package/dist/pipeline/WRITING.md +48 -0
- package/dist/pipeline/coding-agglomerate.js +15876 -0
- package/dist/pipeline/coding-aggregate.js +440 -0
- package/dist/pipeline/coding-build.js +1168 -0
- package/dist/pipeline/coding-coaching.js +16893 -0
- package/dist/pipeline/coding-day-digest.js +15869 -0
- package/dist/pipeline/coding-delegation.js +16292 -0
- package/dist/pipeline/coding-expertise.js +15925 -0
- package/dist/pipeline/coding-flow.js +313 -0
- package/dist/pipeline/coding-frontier-detail.js +15878 -0
- package/dist/pipeline/coding-frontier.js +51 -0
- package/dist/pipeline/coding-gap-dist.js +293 -0
- package/dist/pipeline/coding-gap.js +17108 -0
- package/dist/pipeline/coding-grade.js +16195 -0
- package/dist/pipeline/coding-nutshell.js +15725 -0
- package/dist/pipeline/coding-projects.js +104 -0
- package/dist/pipeline/coding-walkthrough.js +15947 -0
- package/dist/web/app.js +12024 -0
- package/dist/web/index.html +1 -0
- package/dist/web/styles.css +1 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
Copyright (c) 2026 Akshay Iyer (Flomi Inc. / Polymath Society). All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
PROPRIETARY AND CONFIDENTIAL — SOURCE-AVAILABLE, NOT OPEN SOURCE.
|
|
4
|
+
|
|
5
|
+
This software, in both source and compiled/bundled form, together with its
|
|
6
|
+
structure, rubrics, prompts, methods, and output formats (collectively, the
|
|
7
|
+
"Software"), is the proprietary and confidential property of the copyright
|
|
8
|
+
holder. Publication to the npm registry is for distribution and execution
|
|
9
|
+
convenience only; it does NOT place the Software in the public domain, does NOT
|
|
10
|
+
make it open source, and grants NO rights except the limited license below.
|
|
11
|
+
|
|
12
|
+
1. LIMITED LICENSE TO RUN. Subject to your continuous compliance with this
|
|
13
|
+
License, the copyright holder grants you a personal, non-exclusive,
|
|
14
|
+
non-transferable, non-sublicensable, royalty-free, and REVOCABLE license to
|
|
15
|
+
download and execute the UNMODIFIED published package, as distributed on npm,
|
|
16
|
+
on machines you own or control, solely to analyze your own data and view the
|
|
17
|
+
resulting reports. This is the only right granted.
|
|
18
|
+
|
|
19
|
+
2. PROHIBITED. Except as expressly permitted in Section 1, and except to the
|
|
20
|
+
narrow extent a restriction below is unenforceable under applicable law, you
|
|
21
|
+
may NOT, in whole or in part:
|
|
22
|
+
- copy, reproduce, host, or store the Software (beyond the transient copies
|
|
23
|
+
automatically made by npm and Node.js to run it under Section 1);
|
|
24
|
+
- modify, adapt, translate, or create derivative works of the Software;
|
|
25
|
+
- redistribute, republish, sublicense, sell, rent, lease, lend, or
|
|
26
|
+
otherwise make the Software available to any third party;
|
|
27
|
+
- reverse engineer, decompile, disassemble, deobfuscate, or otherwise
|
|
28
|
+
attempt to derive the source code, rubrics, prompts, or methods from the
|
|
29
|
+
distributed bundles;
|
|
30
|
+
- use the Software, its outputs, its rubrics, its prompts, or its methods
|
|
31
|
+
to design, train, build, or operate a competing or substantially similar
|
|
32
|
+
product or service;
|
|
33
|
+
- remove, obscure, or alter any proprietary or attribution notices.
|
|
34
|
+
|
|
35
|
+
3. RESERVATION. All rights not expressly granted in Section 1 are reserved by
|
|
36
|
+
the copyright holder. This License grants no rights in any trademark, and no
|
|
37
|
+
patent license except as strictly necessary to exercise Section 1.
|
|
38
|
+
|
|
39
|
+
4. TERMINATION. This License terminates automatically and immediately upon any
|
|
40
|
+
breach, and may be revoked by the copyright holder at any time. On
|
|
41
|
+
termination you must cease all use and delete all copies.
|
|
42
|
+
|
|
43
|
+
5. NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
44
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
45
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO
|
|
46
|
+
EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER
|
|
47
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM,
|
|
48
|
+
OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR ITS USE.
|
|
49
|
+
|
|
50
|
+
Any unauthorized use is a violation of applicable copyright and other laws and
|
|
51
|
+
may result in legal action. For any use beyond Section 1, contact the copyright
|
|
52
|
+
holder for written permission.
|
package/README.md
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# polymath-society
|
|
2
|
+
|
|
3
|
+
> **Proprietary — All Rights Reserved (source-available, not open source).** You may run the unmodified npm package to analyze your own data; copying, modifying, redistributing, reverse-engineering the bundles, or using its methods to build a competing product is prohibited. See [LICENSE](./LICENSE).
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
A **local app** for understanding how you work from your own **Claude Code** and
|
|
7
|
+
**Codex** agent logs — parallelism, flow-state, throughput, per-project
|
|
8
|
+
contributions, and (opt-in) AI-graded judgment criteria.
|
|
9
|
+
|
|
10
|
+
Three things, in one package:
|
|
11
|
+
|
|
12
|
+
1. **Deterministic metrics** — computed in-process from the JSONL on your disk.
|
|
13
|
+
Zero LLM, zero network. Facts, not judgments. (Instant and free.)
|
|
14
|
+
2. **Local LLM grading** *(opt-in, `--grade`)* — grades abstraction, taste,
|
|
15
|
+
delegation, expertise, and frontier tool-use by invoking the **local
|
|
16
|
+
`claude -p` / `codex` binary you're already logged into**. No API key; it
|
|
17
|
+
spends your own subscription. Your prompts never leave the machine.
|
|
18
|
+
3. **A local web UI** *(`serve`)* — the same warm "Code tab" view the hosted
|
|
19
|
+
Polymath app shows, served on a free port, with **per-section Share**.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## What it reads
|
|
24
|
+
|
|
25
|
+
- `~/.claude/projects/**/*.jsonl` — Claude Code sessions
|
|
26
|
+
- `~/.codex/sessions/**/*.jsonl` — Codex sessions
|
|
27
|
+
|
|
28
|
+
(Override with `CLAUDE_PROJECTS_DIR` / `CODEX_SESSIONS_DIR` env vars.)
|
|
29
|
+
|
|
30
|
+
It separates **your real interactive sessions** from headless agent runs,
|
|
31
|
+
auth-ping sessions, and machine-assembled mega-prompts (the `klass` /
|
|
32
|
+
`klassReason` on every parsed session is transparent and auditable), de-dupes
|
|
33
|
+
resume/fork copies, and then computes everything below over the canonical set.
|
|
34
|
+
|
|
35
|
+
## What it computes
|
|
36
|
+
|
|
37
|
+
| Metric | What it is |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| **sessions** | per-session structural facts: duration, active time, turns, tool counts, models, tokens, modes, renames |
|
|
40
|
+
| **parallelism** | sweep-line concurrency across sessions — max concurrent, minutes spent at each level, per-day overlap, top windows |
|
|
41
|
+
| **day-chart** | per-day Gantt of every conversation's active spans (clipped to local midnight) |
|
|
42
|
+
| **flow** | every 10-minute slot classified in-flow / active-pause / away (rapid rhythm + dictation beat the gaps) |
|
|
43
|
+
| **throughput** | words you actually *typed* per day (pasted code stripped) → a 1–11 score, plus a proven ceiling |
|
|
44
|
+
| **projects** | GitHub-style per-project days / hours / range |
|
|
45
|
+
| **aggregate** | average throughput over substantial days + flow stats (work window, % in flow, when flow peaks) |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Install
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install polymath-society
|
|
53
|
+
# or run the CLI without installing:
|
|
54
|
+
npx coding-analyzer
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## CLI
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
coding-analyzer # human-readable summary of the deterministic profile
|
|
61
|
+
coding-analyzer --json # full profile JSON to stdout
|
|
62
|
+
coding-analyzer --out p.json # write full profile JSON to a file
|
|
63
|
+
|
|
64
|
+
coding-analyzer projects # just the projects/contributions view (JSON)
|
|
65
|
+
coding-analyzer flow # just the per-day flow slots + totals (JSON)
|
|
66
|
+
coding-analyzer aggregate # just the corpus aggregate (JSON)
|
|
67
|
+
|
|
68
|
+
coding-analyzer grade # OPT-IN: AI-grade your sessions on your OWN
|
|
69
|
+
# Claude Code / Codex login (no API key)
|
|
70
|
+
coding-analyzer serve # scrape → (optionally --grade) → open the web UI
|
|
71
|
+
coding-analyzer serve --grade # …including the AI-graded sections
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Flags: `--no-codex` · `--idle <min>` · `--tz <IANA>` · `--span <hours>` ·
|
|
75
|
+
`--json` · `--out <file>` · `--grade` · `--adapter <cli|codex>` · `--model <id>` ·
|
|
76
|
+
`--max-sessions <n>` · `--port <n>` · `--share-url <url>` · `--open`
|
|
77
|
+
|
|
78
|
+
Example summary:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
========== DETERMINISTIC CODING PROFILE ==========
|
|
82
|
+
timezone America/Los_Angeles · idle-gap 5m
|
|
83
|
+
sessions: 106 interactive (canonical) · 1101 agent/excluded · 19 resume-copies dropped
|
|
84
|
+
active work time: 147.5h tool calls: 16,017 subagents: 41 queue-ahead: 2271
|
|
85
|
+
|
|
86
|
+
PARALLELISM
|
|
87
|
+
max concurrent sessions: 6
|
|
88
|
+
|
|
89
|
+
THROUGHPUT
|
|
90
|
+
proven ceiling (≥3 days): 10/11
|
|
91
|
+
AVG over substantial days: 7/11 — 5960 words/day over 30/50 days
|
|
92
|
+
|
|
93
|
+
FLOW
|
|
94
|
+
work window: 12:30pm–6:40pm over 47 active days
|
|
95
|
+
in flow: 63% of active time · 86.5h total (1.8h/day)
|
|
96
|
+
|
|
97
|
+
PROJECTS
|
|
98
|
+
4 projects · 37 active days · 102h
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## The local app (`serve`)
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
coding-analyzer serve # deterministic only — instant, free
|
|
105
|
+
coding-analyzer serve --grade # + AI-graded sections (spends your subscription)
|
|
106
|
+
coding-analyzer serve --grade --open --port 8765
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`serve` scrapes `~/.claude/projects` + `~/.codex/sessions`, optionally grades,
|
|
110
|
+
starts a tiny zero-dependency HTTP server on a free port, and prints the
|
|
111
|
+
clickable `http://localhost:<port>` URL. `--grade` writes its analysis to
|
|
112
|
+
`./.data/coding` under the **current directory** — re-run from the same
|
|
113
|
+
directory and it resumes (already-graded sessions are skipped) instead of
|
|
114
|
+
re-grading from scratch. The page reproduces the hosted app's
|
|
115
|
+
**Code tab** — the same warm palette, cards, contributions heatmap, flow stats,
|
|
116
|
+
throughput scatter, and (when graded) the criterion cards with verbatim receipts.
|
|
117
|
+
|
|
118
|
+
The server exposes:
|
|
119
|
+
|
|
120
|
+
| Route | What |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| `GET /` | the bundled static UI |
|
|
123
|
+
| `GET /profile.json` | the computed profile, organized into the share-contract sections |
|
|
124
|
+
| `GET /meta.json` | `{ version, shareUrl }` for the share bar |
|
|
125
|
+
| `POST /share` | proxies the chosen sections to the share endpoint (server-side — no browser CORS) |
|
|
126
|
+
|
|
127
|
+
### Local LLM grading (no API key)
|
|
128
|
+
|
|
129
|
+
Grading is **opt-in** because it spends your tokens; the deterministic metrics
|
|
130
|
+
stay instant and free. With `--grade`, the package invokes the **local
|
|
131
|
+
`claude -p` (or `codex`) binary you're already logged into** — billed to your
|
|
132
|
+
Claude / ChatGPT subscription, never an API key. On startup it detects whether a
|
|
133
|
+
backend is installed *and* logged in; if not, it prints the exact fix (e.g. *run
|
|
134
|
+
`claude` to log in*) instead of failing obscurely, and `serve` falls back to
|
|
135
|
+
deterministic-only.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
coding-analyzer grade # grade + write graded.json, print means
|
|
139
|
+
coding-analyzer grade --adapter codex # pin the Codex backend
|
|
140
|
+
coding-analyzer grade --max-sessions 20 # cap the token/time budget
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
The five graded criteria — **abstraction, taste, delegation, expertise,
|
|
144
|
+
frontier** — are ported from the main Polymath pipeline (same rubric, 1–11 ladder
|
|
145
|
+
with verbatim quotes, per-conversation ceiling 10). Grading plugs into the
|
|
146
|
+
`analyze()` `gradeProvider` seam (see Library below).
|
|
147
|
+
|
|
148
|
+
### Share — per-section selection
|
|
149
|
+
|
|
150
|
+
Every section in the UI has a checkbox; tick the ones you want and hit **Share
|
|
151
|
+
selected** in the footer bar. The browser sends only the ticked keys to the local
|
|
152
|
+
server, which forwards exactly this contract to the share endpoint:
|
|
153
|
+
|
|
154
|
+
```http
|
|
155
|
+
POST <shareUrl>
|
|
156
|
+
Content-Type: application/json
|
|
157
|
+
|
|
158
|
+
{
|
|
159
|
+
"source": "coding-analyzer",
|
|
160
|
+
"version": "<pkg version>",
|
|
161
|
+
"name": "<optional user-provided name>",
|
|
162
|
+
"sharedAt": "<ISO8601>",
|
|
163
|
+
"sections": { "<key>": <that section's data> }
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`key ∈ { howYouWork, snapshot, workstyle, parallelism, lixiThroughput, topDays,
|
|
168
|
+
abstraction, taste, delegation, expertise, frontier, operate }` — only ticked
|
|
169
|
+
keys appear in `sections`. The endpoint defaults to
|
|
170
|
+
`http://localhost:3100/api/coding-share` (dev) and is overridable with
|
|
171
|
+
`--share-url <url>` or `PS_SHARE_URL`. **TODO:** set the production share URL
|
|
172
|
+
before shipping. The local server does the POST server-side, so the browser never
|
|
173
|
+
hits CORS.
|
|
174
|
+
|
|
175
|
+
### How the bundled UI is produced / rebuilt
|
|
176
|
+
|
|
177
|
+
The UI sources live in `ui/` (`index.html`, `styles.css`, `app.js` — vanilla JS,
|
|
178
|
+
no React/Tailwind; the warm palette tokens and Card/Chip primitives are
|
|
179
|
+
hand-ported to plain CSS). `npm run build` runs `tsc` then `scripts/build-ui.mjs`,
|
|
180
|
+
which **esbuild**-bundles `ui/app.js` → `dist/ui/app.js` (minified, IIFE, zero
|
|
181
|
+
runtime deps) and copies the HTML/CSS. The server serves `dist/ui/`, which ships
|
|
182
|
+
inside the published package. To rebuild only the UI: `npm run build:ui`.
|
|
183
|
+
|
|
184
|
+
## Library
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
import { analyze } from "polymath-society";
|
|
188
|
+
|
|
189
|
+
const profile = await analyze({
|
|
190
|
+
codex: true, // include ~/.codex/sessions (default)
|
|
191
|
+
idleGapMin: 5, // gap that breaks a session into active intervals
|
|
192
|
+
tz: "America/Los_Angeles",
|
|
193
|
+
spanHourMin: 4, // "substantial day" threshold for the throughput avg
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
console.log(profile.concurrency.maxConcurrency);
|
|
197
|
+
console.log(profile.throughput.ceiling); // 1–11, proven on ≥3 days
|
|
198
|
+
console.log(profile.flow.totals.flowFraction);
|
|
199
|
+
console.log(profile.projects.projects);
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Every building block is exported too, so you can compose your own pipeline:
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
import {
|
|
206
|
+
readAllSessions, toSessionRecords, buildConcurrency, buildDayChart,
|
|
207
|
+
markDuplicates, computeFlow, computeProjects, computeAggregate,
|
|
208
|
+
proseWords, throughputScore, throughputCeiling,
|
|
209
|
+
} from "polymath-society";
|
|
210
|
+
|
|
211
|
+
const raw = await readAllSessions();
|
|
212
|
+
const interactive = raw.filter((s) => s.klass === "interactive");
|
|
213
|
+
const records = toSessionRecords(interactive);
|
|
214
|
+
await markDuplicates(records);
|
|
215
|
+
const canon = records.filter((r) => !r.duplicateOf);
|
|
216
|
+
const conc = buildConcurrency(interactive, canon);
|
|
217
|
+
const flow = await computeFlow(canon);
|
|
218
|
+
// …
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Local LLM grading via `analyze()`'s `gradeProvider`
|
|
222
|
+
|
|
223
|
+
`analyze()` is deterministic by default and never calls a model. The grading
|
|
224
|
+
seam is the optional `gradeProvider`: pass one and `analyze()` attaches a
|
|
225
|
+
`graded` block of per-criterion means. The package ships `LocalGradeProvider`,
|
|
226
|
+
which implements that seam by grading on your **local Claude Code / Codex** CLI:
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
import { analyze, LocalGradeProvider } from "polymath-society";
|
|
230
|
+
|
|
231
|
+
const provider = new LocalGradeProvider({
|
|
232
|
+
adapter: "cli", // or "codex"; omit for auto (first installed + logged-in)
|
|
233
|
+
model: "sonnet", // grading model (cli only; codex ignores it)
|
|
234
|
+
maxSessions: 20, // cap the token/time budget
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
const profile = await analyze({ gradeProvider: provider });
|
|
238
|
+
profile.graded; // { abstraction: { mean, n }, taste: { mean, n }, … }
|
|
239
|
+
provider.detail(); // richer per-criterion distributions + per-session takes (UI)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Or supply your own `gradeProvider` (any object with `criteriaMean(records)`) to
|
|
243
|
+
fold in grades from a different pipeline.
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
const profile = await analyze({
|
|
247
|
+
gradeProvider: { criteriaMean: () => ({ taste: { mean: 8.2, n: 40 } }) },
|
|
248
|
+
});
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Serving programmatically
|
|
252
|
+
|
|
253
|
+
```ts
|
|
254
|
+
import { analyze, LocalGradeProvider, buildWebProfile, startServer } from "polymath-society";
|
|
255
|
+
|
|
256
|
+
const provider = new LocalGradeProvider();
|
|
257
|
+
const profile = await analyze({ gradeProvider: provider });
|
|
258
|
+
const web = buildWebProfile(profile, provider.detail());
|
|
259
|
+
const { url } = await startServer({ profile: web, version: "0.2.0", shareUrl: "https://…/api/coding-share" });
|
|
260
|
+
console.log(url);
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Project aliases
|
|
264
|
+
|
|
265
|
+
A session's project is its working directory, so the same project shows up under
|
|
266
|
+
several paths (parent-folder runs, old names). Pass `aliases` to canonicalize:
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
await analyze({
|
|
270
|
+
aliases: [
|
|
271
|
+
{ name: "Polymath", match: ["/polymath-society", "/polymath"], note: "merged old name" },
|
|
272
|
+
],
|
|
273
|
+
});
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Without aliases, the leaf directory name is used.
|
|
277
|
+
|
|
278
|
+
## Configuration
|
|
279
|
+
|
|
280
|
+
| Option (lib) | Flag (CLI) | Env | Default |
|
|
281
|
+
| --- | --- | --- | --- |
|
|
282
|
+
| `codex` | `--no-codex` | | `true` |
|
|
283
|
+
| `idleGapMin` | `--idle` | | `5` |
|
|
284
|
+
| `tz` | `--tz` | `CODING_TZ` | `America/Los_Angeles` |
|
|
285
|
+
| `spanHourMin` | `--span` | | `4` |
|
|
286
|
+
| — | `--port` | | free OS-assigned |
|
|
287
|
+
| — | `--share-url` | `PS_SHARE_URL` | `http://localhost:3100/api/coding-share` |
|
|
288
|
+
| — | `--adapter` | `CODING_ANALYZER_ADAPTER` | auto (`cli` → `codex`) |
|
|
289
|
+
| — | — | `CLAUDE_BIN` / `CODEX_BIN` | resolved from PATH |
|
|
290
|
+
| — | — | `CLAUDE_PROJECTS_DIR` | `~/.claude/projects` |
|
|
291
|
+
| — | — | `CODEX_SESSIONS_DIR` | `~/.codex/sessions` |
|
|
292
|
+
|
|
293
|
+
## Privacy
|
|
294
|
+
|
|
295
|
+
On-device by default. The deterministic library reads local files and returns
|
|
296
|
+
plain objects — no telemetry, no network, no model inference.
|
|
297
|
+
|
|
298
|
+
**Grading** (`--grade`) runs on the **local CLI you're logged into** (`claude -p`
|
|
299
|
+
/ `codex exec`) — your prompts are read from disk and graded on your own
|
|
300
|
+
subscription; nothing is sent to a third party. The **only** outbound network
|
|
301
|
+
call the package ever makes is `POST /share`, and only for the exact sections you
|
|
302
|
+
tick, to the endpoint you configure.
|
|
303
|
+
|
|
304
|
+
## Requirements
|
|
305
|
+
|
|
306
|
+
Node.js ≥ 18, ESM only. Grading additionally needs **Claude Code** or **Codex**
|
|
307
|
+
installed and logged in (`claude` / `codex login`).
|
|
308
|
+
|
|
309
|
+
## License
|
|
310
|
+
|
|
311
|
+
MIT
|
package/dist/DATA-MAP.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# DATA-MAP.md — how an agent traverses this person's local record
|
|
2
|
+
|
|
3
|
+
You are an agent with READ access to the `.data/` directory of a Polymath installation.
|
|
4
|
+
This map tells you what lives where, what the artifacts mean, and how to answer questions
|
|
5
|
+
by going to the source. TRUST THE FILESYSTEM OVER THIS MAP — layouts evolve; `ls`/Glob a
|
|
6
|
+
directory before assuming its contents. Everything is local; nothing you read may be sent
|
|
7
|
+
anywhere, and third parties are referred to by their initials in your replies.
|
|
8
|
+
|
|
9
|
+
## The two corpora
|
|
10
|
+
|
|
11
|
+
1. **Life corpus** — the person's imported chat history (ChatGPT, claude.ai), notes
|
|
12
|
+
(Obsidian, Apple Notes), and the analysis the engine built from them.
|
|
13
|
+
2. **Coding corpus** — their Claude Code / Codex session logs and the deterministic +
|
|
14
|
+
graded analysis built from those.
|
|
15
|
+
|
|
16
|
+
When BOTH exist, the strongest answers cross-reference them: a rule declared in the notes
|
|
17
|
+
can be checked against measured coding behavior; a life event can explain a low-output
|
|
18
|
+
week. Prefer cross-corpus receipts when the question allows it.
|
|
19
|
+
|
|
20
|
+
## Life corpus layout
|
|
21
|
+
|
|
22
|
+
- `.data/signals/index.jsonl` — one JSON per signal. Fields: `docId`, `date` (ISO,
|
|
23
|
+
the field is `date`, NOT `ts`), `source` (`chatgpt` | `claude` | `obsidian` |
|
|
24
|
+
`apple-notes`), `title` (an LLM one-line summary — semantically rich, safe to scan in
|
|
25
|
+
bulk), `paragraph` (a longer summary), `evidence`, `userChars`, `userMessages`.
|
|
26
|
+
THIS IS YOUR PRIMARY INDEX for the life corpus: grep it by date range, theme keywords,
|
|
27
|
+
or source before reading anything heavier. Caveats: notes without dates in their path
|
|
28
|
+
cluster on their import date (a huge one-day spike is an import artifact, not activity);
|
|
29
|
+
a title "touching" a theme is an upper bound, not proof of deliberation.
|
|
30
|
+
- `.data/signals/timeline.json` — the same signals arranged as a timeline.
|
|
31
|
+
- `.data/sources/…` — raw imported conversation content (large). Only dip in when a
|
|
32
|
+
specific conversation matters; quote at most a line or two.
|
|
33
|
+
- `grades/<lens>/_person.json` (under `.data/`, engine output) — the person-level
|
|
34
|
+
aggregation per lens (ocean, agency, reasoning, growth, interpersonal…): facet scores
|
|
35
|
+
with reasoning. `grades/<lens>/*.allfacets.json` — per-conversation grades: score or
|
|
36
|
+
null per facet plus verbatim receipt quotes. A facet with ~0 direct grades while its
|
|
37
|
+
siblings have many means coverage failed, not that the person lacks the trait.
|
|
38
|
+
- `growth-latest.json` / analysis agents' outputs — growth axes (used-to → now milestone
|
|
39
|
+
timelines anchored on the person's deliberate moves), drivers, circumstances.
|
|
40
|
+
|
|
41
|
+
## Coding corpus layout (`.data/coding/`)
|
|
42
|
+
|
|
43
|
+
- `sessions.json` — every session: title, times, `activeMin`, `durationMin`, `humanTurns`,
|
|
44
|
+
tool counts, `klass` (only `interactive` sessions are the person; the rest are machine
|
|
45
|
+
runs), `duplicateOf` (fork copies — skip them or you double-count).
|
|
46
|
+
- `focus.json` — the flow analysis: per-day half-hour cells (`S` in-flow / `N` nudging /
|
|
47
|
+
`G` away), steering runs, run-end boundaries with the person's next messages, gaps,
|
|
48
|
+
false starts, semantic `features` (LLM-clustered workstreams with day maps and flow
|
|
49
|
+
share), and `llm` (causal findings, triggers in/out, priority verdicts, leverage,
|
|
50
|
+
a personalized CLAUDE.md snippet). Flow definition: typed-message gaps ≤6 min sustained
|
|
51
|
+
≥20 min; supervision is "nudging", never flow.
|
|
52
|
+
- `flow.json` — the older, looser engaged-time metric (5-min gap tolerance). The report
|
|
53
|
+
calls this "engaged time", NOT flow. Do not conflate the two.
|
|
54
|
+
- `day-chart.json` — per day, each conversation's active intervals (timestamps).
|
|
55
|
+
- `grades/*.json` — per-session grades against the coding rubric: per criterion a score
|
|
56
|
+
on the 1–11 ladder, the keyed instance, why, and verbatim quotes. 6 is strong-normal;
|
|
57
|
+
10–11 are frontier outliers. Scores across different `rubricVersion` values are not
|
|
58
|
+
comparable.
|
|
59
|
+
- `aggregate.json` (ability ceilings + `bigPicture` nutshell), `expertise.json` (domain
|
|
60
|
+
knowledge map), `gap.json` (ranked technique recommendations), `frontier.json`,
|
|
61
|
+
`delegation-rollup.json`, `projects.json`, `concurrency.json` — each self-describing;
|
|
62
|
+
read the file before citing it.
|
|
63
|
+
|
|
64
|
+
## Raw Claude Code session JSONL (only if an artifact can't answer)
|
|
65
|
+
|
|
66
|
+
`~/.claude/projects/<project>/<sessionId>.jsonl`. If you must read one: only `type:"user"`
|
|
67
|
+
entries are candidate person-text, and you MUST skip `isMeta:true`, injected blocks
|
|
68
|
+
(`<task-notification>`, command wrappers, system reminders), compact-continuation
|
|
69
|
+
summaries, and "[Request interrupted…]" markers; fork copies duplicate whole transcripts
|
|
70
|
+
(dedupe by timestamp+text). Prefer the artifacts — they already did this correctly.
|
|
71
|
+
|
|
72
|
+
## What the gradations mean
|
|
73
|
+
|
|
74
|
+
Engine facets and coding criteria use a 1–11 ladder where each rung has concrete
|
|
75
|
+
requirements (the rubric text in your context is the authority). "Top X%" bands come from
|
|
76
|
+
a single calibration source; do not invent percentile mappings. Confidence markers
|
|
77
|
+
("tentative") mean thin evidence, and honesty about that beats a confident guess.
|
|
78
|
+
|
|
79
|
+
## Traversal recipes
|
|
80
|
+
|
|
81
|
+
- "How often do I X / when did I last X" → grep `signals/index.jsonl` titles by keyword +
|
|
82
|
+
date; count by month; report the shape (spans, spikes, gaps) with dates.
|
|
83
|
+
- "Why did I get this score" → the grades file for that criterion/facet: rung, keyed
|
|
84
|
+
instance, verbatim quote. Name the session/conversation and date.
|
|
85
|
+
- "What was I doing on <date>" → signals index for that date (all sources) +
|
|
86
|
+
`day-chart.json` + `focus.json` day cells. Coding-log silence usually means selling,
|
|
87
|
+
deciding, or living, not idleness — say so when the coding record is empty but the
|
|
88
|
+
life corpus isn't.
|
|
89
|
+
- "Did my habit/rule actually happen" → find declarations in the life corpus, then check
|
|
90
|
+
the MEASURED coding artifacts (start times, flow, features) for execution. Declared vs
|
|
91
|
+
measured is the highest-value answer shape this dataset supports.
|
|
92
|
+
- Anything about loops → count recurrences across months in the index; three receipts or
|
|
93
|
+
it isn't a pattern; one is noise.
|
|
94
|
+
|
|
95
|
+
## Traversal budget
|
|
96
|
+
|
|
97
|
+
You have a hard turn limit. Budget 2-4 lookups per question: one Glob/ls to orient (only
|
|
98
|
+
if needed), one or two Greps on an index, one Read of the specific artifact. Then ANSWER.
|
|
99
|
+
If you have not found the receipt after 4 lookups, answer with what you have and say what
|
|
100
|
+
you could not find. Running out of turns mid-traversal means the person gets nothing.
|
|
101
|
+
|
|
102
|
+
## Answer rules
|
|
103
|
+
|
|
104
|
+
- Receipts on every claim: dates, counts, short quotes (≤2 lines). Never fabricate a
|
|
105
|
+
file, score, session, or quote. If a lookup comes up empty, say "insufficient data".
|
|
106
|
+
- Plain speech, at most one number per sentence, verdicts not questions, no em dashes.
|
|
107
|
+
- Patterns, never psychology: describe what the record shows; the person decides meaning.
|
|
108
|
+
- Be honest about instrument limits: logs under-observe a life. Absence in one corpus is
|
|
109
|
+
not absence in the life; check the other corpus before concluding.
|