prompt-profile 0.1.4 → 0.2.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/README.md CHANGED
@@ -1,288 +1,230 @@
1
1
  # prompt-profile
2
2
 
3
- Analyze your past prompts from AI coding agents (Claude Code, Codex) locally and generate a
4
- personal profile.
5
-
6
- ![Synthetic sample share card](docs/sample-card.png)
7
-
8
- [Sample HTML report](https://erictsai83.github.io/prompt-profile/sample-report.html)
9
- · [Sample profile JSON](docs/sample-profile.json) (all sample data is hand-written and fictional).
10
-
11
- ### A real report
12
-
13
- The author's own report, from about 1,700 real prompts over six months, published as written:
14
-
15
- - [Full report](https://erictsai83.github.io/prompt-profile/demo/full/report.html): what you see on your own machine, with quotes from
16
- real prompts, suggested rewrites, project names, exact dates and fun facts.
17
- - [Shareable report](https://erictsai83.github.io/prompt-profile/demo/without-personal/report.html): the same profile rendered with
18
- `--exclude personal`: no quotes, rewrites or fun facts, projects shown as "Project A, B…",
19
- dates by month. This is what you would post publicly.
20
-
21
- The share card is the same for both: it never contains quotes or project names. The full report
22
- in every look (`--look`; render only, no new analysis):
23
-
24
- <table>
25
- <tr>
26
- <td width="50%" align="center">
27
- <a href="https://erictsai83.github.io/prompt-profile/demo/full/report.html"><img src="docs/demo/card.png" width="420" alt="Classic card"></a><br>
28
- <a href="https://erictsai83.github.io/prompt-profile/demo/full/report.html">Classic</a> (default)
29
- </td>
30
- <td width="50%" align="center">
31
- <a href="https://erictsai83.github.io/prompt-profile/demo/signal/report.html"><img src="docs/demo/signal/card.png" width="420" alt="Signal card"></a><br>
32
- <a href="https://erictsai83.github.io/prompt-profile/demo/signal/report.html">Signal</a>
33
- </td>
34
- </tr>
35
- <tr>
36
- <td width="50%" align="center">
37
- <a href="https://erictsai83.github.io/prompt-profile/demo/afterhours/report.html"><img src="docs/demo/afterhours/card.png" width="420" alt="Afterhours card"></a><br>
38
- <a href="https://erictsai83.github.io/prompt-profile/demo/afterhours/report.html">Afterhours</a>
39
- </td>
40
- <td width="50%" align="center">
41
- <a href="https://erictsai83.github.io/prompt-profile/demo/studio/report.html"><img src="docs/demo/studio/card.png" width="420" alt="Studio card"></a><br>
42
- <a href="https://erictsai83.github.io/prompt-profile/demo/studio/report.html">Studio</a>
43
- </td>
44
- </tr>
45
- </table>
3
+ Turn your local Claude Code / Codex prompt history into an evidence-backed report of how you
4
+ collaborate with AI. Uses your logged-in `claude` or `codex` CLI: no API key needed.
5
+
6
+ **Analysis sends selected, redacted prompts to your CLI's model service and uses your
7
+ subscription quota.** Reports and analysis caches stay on your computer.
8
+
9
+ ![Fictional sample share card](https://erictsai83.github.io/prompt-profile/sample-card.png)
10
+
11
+ [Full report](https://erictsai83.github.io/prompt-profile/sample-report.html)
12
+ · [Shareable report](https://erictsai83.github.io/prompt-profile/demo/without-personal/report.html)
13
+ · [Template gallery](https://erictsai83.github.io/prompt-profile/demo/templates/index.html)
14
+
15
+ All examples use fictional data.
46
16
 
47
17
  ## Quick start
48
18
 
49
- 1. Install [Claude Code](https://claude.com/claude-code) or [Codex](https://github.com/openai/codex)
50
- and log in once (`claude`, or `codex login`). prompt-profile uses it to analyse your prompts;
51
- **no API key needed**.
52
- 2. Run it (Node.js ≥ 22):
19
+ You need Node.js ≥ 24 and either [Claude Code](https://claude.com/claude-code) or
20
+ [Codex](https://github.com/openai/codex) installed and logged in.
21
+
22
+ ```bash
23
+ npx prompt-profile@latest
24
+ ```
53
25
 
54
- ```bash
55
- npx prompt-profile@latest
56
- ```
26
+ The CLI shows the selected history and estimated calls, then asks for confirmation before
27
+ sending anything. By default it analyses the last two months and opens the finished report
28
+ in your browser. Files are saved under `./prompt-profile-report/`.
57
29
 
58
- `@latest` makes npx fetch the newest version instead of reusing one it cached earlier.
30
+ To inspect your history without calling an LLM (no login required):
59
31
 
60
- 3. It reads your local history, shows how many prompts it found and how many CLI calls the
61
- analysis will take, and asks `Continue?`. The calls use your Claude / ChatGPT subscription
62
- quota. To see what would be sent first, run `npx prompt-profile@latest --dry-run` (calls nothing).
63
- 4. When it is done, the report opens in your browser. Everything is written to
64
- `./prompt-profile-report/`.
32
+ ```bash
33
+ npx prompt-profile@latest stats # local statistics only
34
+ npx prompt-profile@latest --dry-run # export the redacted chunks that would be sent
35
+ ```
65
36
 
66
- Want to look around for free first? `npx prompt-profile@latest stats` shows statistics without any LLM
67
- call.
37
+ Dry-run exports contain your prompt text: keep them private and delete them when done.
38
+ The call estimate is not an upper bound; use `--max-calls` to cap CLI invocations, including
39
+ merges, evidence review and retries.
68
40
 
69
41
  ## Install
70
42
 
43
+ To install or update a global command:
44
+
71
45
  ```bash
72
- npx prompt-profile@latest # run without installing (always the newest version)
73
- npm i -g prompt-profile # or install the `prompt-profile` command
46
+ npm i -g prompt-profile@latest
74
47
  prompt-profile --help
75
- npm i -g prompt-profile@latest # update the installed command
76
48
  ```
77
49
 
78
- No Node.js? Every [GitHub Release](https://github.com/EricTsai83/prompt-profile/releases) has a
79
- standalone executable for macOS (`darwin-arm64` for Apple silicon, `darwin-x64`), Linux
80
- (`linux-x64`, `linux-arm64`) and Windows (`windows-x64`), with a `SHA256SUMS` file. Download the
81
- archive for your platform from the release page, then:
50
+ Without Node.js, download a standalone executable for macOS, Linux or Windows from
51
+ [GitHub Releases](https://github.com/EricTsai83/prompt-profile/releases).
52
+ See the [standalone installation guide](https://github.com/EricTsai83/prompt-profile/blob/main/docs/user-guide.md#standalone-installation)
53
+ for extraction and macOS setup.
82
54
 
83
- ```bash
84
- tar -xzf prompt-profile-<version>-darwin-arm64.tar.gz
85
- ./prompt-profile-<version>-darwin-arm64/prompt-profile
86
- # macOS, if the archive was downloaded with a browser (the binary is not notarised):
87
- xattr -d com.apple.quarantine ./prompt-profile-<version>-darwin-arm64/prompt-profile
88
- ```
55
+ ## What you get
89
56
 
90
- On Windows, `tar -xzf` works in PowerShell too; run `prompt-profile.exe` from the extracted
91
- folder. Move the executable to a folder on your `PATH` to run it as `prompt-profile`.
57
+ - **HTML report**: an offline portrait of your collaboration preferences, supported observations
58
+ and prompt suggestions, plus activity charts, workflow techniques and source evidence.
59
+ - **PNG share cards**: a 1200 × 630 card per language, without prompt quotes.
60
+ - **`profile.json`**: the data used to render the report again without another analysis.
61
+ - **Local history**: successful analyses are kept in a report library; open the output folder's
62
+ `index.html` to browse them.
92
63
 
93
- ## Requirements
64
+ Reports support English and Traditional Chinese; quotes stay in their original language.
65
+ The default is English, or both languages on a Chinese system locale. Each extra language
66
+ normally uses one translation call, with one retry for an incomplete or failed translation.
67
+ A Chinese-only request stops if translation still fails; it does not substitute an English report. To export a PDF, use your browser's Print → Save as PDF.
94
68
 
95
- - Node.js ≥ 22, or the standalone executable (no Node.js needed)
96
- - [Claude Code](https://claude.com/claude-code) (`claude`) or [Codex](https://github.com/openai/codex)
97
- (`codex`) installed and logged in
98
- - **No API key needed**: the analysis runs your own logged-in `claude -p` or `codex exec` in the
99
- background and **uses your subscription quota**. The base call estimate is shown
100
- before confirmation. Intermediate merges and up to two retries per call can add calls;
101
- use `--max-calls` to set a hard limit on CLI invocations, including retries.
69
+ Observations cite verified prompt quotes, but quote matching and model review do not prove an
70
+ interpretation is correct. Small histories may show “Early observations” instead of a role.
71
+ The [radar](docs/ability-scores.md) assesses six AI collaboration abilities from verified quotes in these conversations. Scores describe supported practice, not psychological traits or population ranks; “not assessed” is not a low score.
102
72
 
103
- ## What you get
73
+ New analyses also retain [reusable instruction provenance](docs/instruction-provenance.md): what a skill is documented to do, who selected it for the task, and which historical requirements were supplied.
104
74
 
105
- Written to `./prompt-profile-report/` (change it with `--out`):
106
-
107
- - `report.html`: your private, single-file report that works offline:
108
- - who you are: archetype, a 24-hour clock of your busiest hours, four measured habits with
109
- their definitions, your top traits with a quote each and how widely they are supported
110
- - **how to improve your prompts**: 2–4 suggestions, each with a real prompt of yours and a
111
- suggested rewrite, plus signals such as frequent corrections or very short follow-ups
112
- - **how you work with AI**: a capability map (plan, delegate, extend, verify, ship) with the
113
- skills you used and what each does, subagent types, MCP servers, models, pull requests,
114
- parallel sessions and prompt-writing habits; counted from tool metadata and the skill
115
- descriptions recorded in your transcripts, never tool inputs, outputs or skill arguments
116
- - what changed since your last report, a daily calendar and a weekday × hour heatmap (hover
117
- or tap for the count and main projects), project chapters, the five dimensions, and how it
118
- was measured
119
- - a language switch when there is more than one language
120
-
121
- It shows everything by default, quotes and project folder names included. To share it, leave
122
- parts out with `--exclude` (below).
123
-
124
- - `card.png`: a 1200 × 630 share card in the default language, plus `card.<lang>.png` for each
125
- other language (**omits evidence quotes**)
126
- - `profile.json`: the raw profile data (re-create the report with `prompt-profile render`)
127
-
128
- ### Leaving parts out
129
-
130
- `--exclude` (on the main command and on `render`) takes a comma list:
131
-
132
- | Part | Left out |
133
- | -------------- | ---------------------------------------------------------------------------------------------------- |
134
- | `quotes` | Evidence quotes and the before / after rewrites |
135
- | `projects` | Project names, shown as "Project A, B…", also inside the generated text and on the card |
136
- | `dates` | Exact dates: no daily calendar, the data period by month |
137
- | `coaching` | "Improve your prompts" and "since your last report" |
138
- | `funfacts` | Fun facts |
139
- | `custom-names` | Names and descriptions of your own skills, custom agent types and private MCP servers (only counted) |
140
- | `personal` | All of the above |
75
+ ## Usage
141
76
 
142
77
  ```bash
143
- prompt-profile render prompt-profile-report/profile.json --exclude personal
144
- # → prompt-profile-report/variants/classic-without-personal/report.html; the full report is kept
78
+ prompt-profile --since 6m # 1m / 2m (default) / 3m / 6m / 1y / all
79
+ prompt-profile --engine codex # default: auto, Claude Code first
80
+ prompt-profile --model <name> # choose the analysis model
81
+ prompt-profile --max-calls 60 # cap CLI calls, including retries
82
+ prompt-profile --engine claude --max-cost-usd 1.50 # local stop threshold; may overshoot
83
+ prompt-profile --lang zh-TW,en # first language is the default
84
+ prompt-profile --voice first # I/我; second (you/你) is the default
85
+ prompt-profile --out <dir> # choose the output folder
86
+
87
+ prompt-profile render profile.json --look prism # change the look without LLM calls
88
+ prompt-profile cache clear # delete analysis cache entries
89
+ prompt-profile history --executions # list saved execution records (free)
145
90
  ```
146
91
 
147
- ### The final check
92
+ Seven looks are available: classic (default), signal, afterhours, studio, prism, slate and folio.
93
+ Rendering a new look keeps the original report. Use `--card-hide stats` to hide the card's
94
+ measured summary, or `--avatar` to choose its illustration.
148
95
 
149
- Before anything is written, every displayed text of the profile (generated text, quotes,
150
- rewrites, names, skill descriptions) is checked with the same rules that redact prompts before
151
- the LLM sees them. The terminal says where and which rule — never the matched text:
96
+ See the [user guide](https://github.com/EricTsai83/prompt-profile/blob/main/docs/user-guide.md)
97
+ for all documented options, language behavior, history and recovery. If a run stops, follow the
98
+ printed retry command: completed chunks and merges are cached; later steps may use quota again.
152
99
 
153
- ```
154
- Contains 34 quotes · 8 project names · exact dates · 4 improvements · 3 fun facts
155
- Check 2 masked: email (Traits › 2), home-path (Fun facts › 1)
156
- Before sharing, skim the quotes yourself: the check is rule-based.
157
- ```
100
+ Each analysis saves calls, retries, cache reuse, token coverage and cost provenance, including
101
+ failed executions. The report shows generation usage separately from historical activity.
102
+ See [execution accounting](docs/execution-accounting.md) for recovery, unknown measurements
103
+ and cost-threshold limits.
158
104
 
159
- | | Rules | `--check mask` (default) | `--check warn` | `--check strict` |
160
- | ------------- | ------------------------------------------------------------------------------------------------------- | ------------------------ | -------------- | ------------------------ |
161
- | Secrets | private keys, API tokens, JWTs, bearer tokens, connection strings, `password=`… , random-looking tokens | masked | masked | nothing written (exit 1) |
162
- | Personal data | email, home path, username, internal URL, phone, Taiwan ID, credit card | masked | kept, listed | nothing written (exit 1) |
105
+ ## How much a run uses
163
106
 
164
- `--allow email,phone` skips personal rules (e.g. a public address you want shown); secrets can
165
- never be allowed. The masked profile is what is written: `profile.json`, the report and the
166
- cards agree.
107
+ A run reads everything locally, then analyses a **sample** of the selected history: about
108
+ 20–26 chunks of redacted prompts (roughly 700k characters) once the history is larger than
109
+ that. Time, tokens and cost therefore stop growing with history size; `--full` analyses every
110
+ chunk and scales with the history instead. `--dry-run` prints your own estimate for free.
167
111
 
168
- ## Usage
112
+ ### Measured runs
113
+
114
+ One real history, default settings (last 2 months, sampled, report in Traditional Chinese
115
+ and English), measured on 2026-11-01 with both engines on the same input:
116
+
117
+ | Input | |
118
+ | ------------------ | --------------------------------------------------------------------- |
119
+ | History in range | 4,374 prompts in 613 conversations (Claude Code and Codex) |
120
+ | Analysed (sampled) | 1,499 prompts in 252 conversations: 21 of 68 chunks, ~665k characters |
121
+
122
+ | | Claude Code | Codex |
123
+ | ------------------------- | ---------------------------------- | ------------------------------ |
124
+ | Model | `claude-opus-5-5` (default effort) | `gpt-6.1-sol` (default effort) |
125
+ | CLI calls | 48 (no retries) | 48 (no retries) |
126
+ | Wall time | 25 min | 20.5 min |
127
+ | Tokens in / out | 1.46M / 0.38M | 1.73M / 0.29M |
128
+ | API list-price equivalent | **US$13.8** (reported by the CLI) | **≈ US$6.1** (estimated¹) |
129
+
130
+ ¹ Codex does not report which model answered, so prompt-profile leaves its cost unpriced; the
131
+ estimate applies `gpt-6.1-sol` list prices to the measured tokens and leaves out cache writes,
132
+ which the Codex log does not report.
133
+
134
+ With a subscription these calls use your plan's quota; the dollar figures are what the same
135
+ tokens would cost on the API, not a bill. Another model, `--effort` level or history mix will
136
+ change them.
137
+
138
+ The measured costs above include 21 label calls that new runs no longer make. New costs have not yet been measured.
139
+
140
+ Historical breakdown (before ability scoring; the label stage below has now been removed):
141
+
142
+ | Stage | Calls | What it does | Share of cost (Claude / Codex) |
143
+ | -------------- | -------------------- | -------------------------------------------------------- | ------------------------------ |
144
+ | map | 1 per chunk | reads the redacted prompts and writes cited observations | 52% / 57% |
145
+ | merge | 0–3 | condenses observations when there are too many | 10% / 9% |
146
+ | draft + review | 2 | writes the profile, then checks it against the evidence | 13% / 10% |
147
+ | label | 1 per chunk | counts how often each trait shows (the trait radar) | 24% / 24% |
148
+ | translation | 1 per extra language | translates the generated text | 1% / 1% |
149
+
150
+ ### Scale reference
151
+
152
+ Current base call estimates for the same history at different `--since` ranges (from `--dry-run`, so
153
+ merges and retries come on top):
154
+
155
+ | Range | Prompts after cleaning | Conversations | Chunks analysed / total | Base calls |
156
+ | ------------------ | ---------------------- | ------------- | ----------------------- | ---------- |
157
+ | 2 days | 392 | 29 | 10 / 10 (no sampling) | 13 |
158
+ | 1 week | 1,278 | 195 | 16 / 34 | 19 |
159
+ | 2 weeks | 1,690 | 241 | 18 / 40 | 21 |
160
+ | 1 month | 3,132 | 448 | 23 / 60 | 26 |
161
+ | 2 months (default) | 4,038 | 611 | 21 / 68 | 24 |
162
+ | 6 months | 7,605 | 1,629 | 26 / 111 | 29 |
163
+ | All (7 months) | 7,884 | 1,686 | 25 / 115 | 28 |
164
+
165
+ As a rule of thumb, a sampled run costs about one call per analysed chunk plus a handful, and
166
+ time and cost follow the number of analysed chunks: a history of a few hundred prompts takes
167
+ about half of the measured run above, and anything past ~1,300 prompts costs about the same.
168
+ `--full` on the 6-month history would analyse 111 chunks, about five times the measured run.
169
+
170
+ ## Sharing and privacy
171
+
172
+ **Reports include quotes, project names and exact dates by default.** Cards omit quotes, but
173
+ can still include project names and usage. Create a version with personal sections left out:
169
174
 
170
175
  ```bash
171
- prompt-profile # analyse the last 6 months and write the report
172
- prompt-profile --since 3m # 1m / 3m / 6m / 1y / all (also <n>d, <n>w)
173
- prompt-profile --engine codex # which CLI analyses your prompts (default: auto, Claude Code first)
174
- prompt-profile --model <name> # model passed to claude / codex
175
- prompt-profile --out <dir> # output folder
176
- prompt-profile --max-calls 40 # cap CLI invocations, including merges and retries
177
- prompt-profile --full # no sampling, analyse everything (slower, uses more quota)
178
- prompt-profile --no-cache # do not read the analysis cache
179
- prompt-profile --yes # skip the confirmation (required in non-interactive sessions)
180
- prompt-profile --dry-run # write what would be sent to the LLM into --out, call nothing
181
- prompt-profile --verbose # full errors and LLM call timings
182
- prompt-profile --lang zh-TW,en # report languages, the first is the default (en, zh-TW)
183
- prompt-profile --look signal # classic (default) / signal / afterhours / studio
184
- prompt-profile --card-hide stats,graphic # leave traits / stats / graphic out of card.png
185
-
186
- prompt-profile stats # statistics only, no LLM (free and fast)
187
- prompt-profile render profile.json # re-create the report from an existing profile.json
188
- prompt-profile cache clear # delete the analysis cache
189
-
190
- prompt-profile render profile.json --look studio --card-hide stats
191
- # a new look, written to variants/studio-no-stats/
176
+ prompt-profile render prompt-profile-report/profile.json --exclude personal
192
177
  ```
193
178
 
194
- Looks and `--card-hide` only change how the report and card are drawn: no new analysis and no
195
- LLM calls, and the original report is kept. `--card-hide` changes the share card only; the
196
- private report and `profile.json` still contain everything, including quotes. The card never
197
- contains quotes or project names in any look.
198
-
199
- Languages: without `--lang`, a Chinese system locale gives a Traditional Chinese report with an
200
- English switch (`zh-TW,en`); any other locale gives English. The profile is written in English
201
- and then translated, one extra CLI call per extra language; quotes stay as you wrote them.
202
-
203
- Exit codes: `0` success · `1` error · `2` usage / needs `--yes` · `3` no data · `4` no usable LLM
204
- CLI · `5` rate limited · `130` interrupted (a re-run resumes from the cache).
205
-
206
- ## Privacy
207
-
208
- **Files read** (read-only):
209
-
210
- | Source | Paths (override with an environment variable) |
211
- | ----------- | ------------------------------------------------------------------------------- |
212
- | Claude Code | `~/.claude/projects/*/*.jsonl`, `~/.claude/history.jsonl` (`CLAUDE_CONFIG_DIR`) |
213
- | Codex | `~/.codex/sessions/**/rollout-*.jsonl`, `~/.codex/history.jsonl` (`CODEX_HOME`) |
214
-
215
- **Prompt selection and preprocessing**: adapters select user prompts, excluding recognized system
216
- messages, tool output and sub-agent conversations, then:
217
-
218
- - pasted code / logs are collapsed into `[pasted code: N lines]`
219
- - API keys, tokens, passwords, private keys, connection strings, emails, phone numbers, national
220
- IDs, credit card numbers, internal URLs, UUIDs / hashes, home-folder paths and usernames that
221
- match the supported rules are redacted **before** anything is sent (and before long
222
- prompts are shortened); this is best-effort, not a guarantee that every secret is found
223
- - projects are reduced to their folder name, never the full path
224
- - `prompt-profile --dry-run` previews selected map chunks; generated observations, statistics
225
- used by the final step, system instructions and retry messages are not a complete network dump
226
-
227
- Selected, cleaned and redacted prompt text is sent **off your machine** through your logged-in
228
- CLI to its model service, along with project basenames. Intermediate observations, supporting
229
- quotes and usage statistics are sent during merge/final analysis. Text that does not match a
230
- redaction rule can remain unchanged, including names and confidential prose.
231
-
232
- Reports, `profile.json`, dry-run exports and analysis caches are written locally and are not
233
- uploaded by prompt-profile. They can contain personal information. Created folders use `0700`
234
- and files use `0600`; existing folder permissions are not changed. `cache clear` removes analysis
235
- entries only, and reports deletion errors rather than claiming success. Delete reports and dry-run
236
- exports separately when no longer needed.
237
-
238
- Claude runs with safe mode, tools disabled, strict MCP configuration and disabled hooks. Codex
239
- runs with `--ignore-user-config`, disabled hooks/notifications, a read-only sandbox and an ephemeral
240
- session. Codex still uses your existing login, but user-configured providers and model defaults
241
- are ignored; specify the model with `--model`. Both use fresh temporary working folders.
242
- Administrator policy, environment settings and CLI/provider diagnostics can still apply. These
243
- controls are tested on specific versions, and do not promise zero CLI/provider logs or traffic.
244
- See [runner notes](src/llm/NOTES.md) and the [security policy](SECURITY.md).
245
-
246
- prompt-profile has no telemetry. The report makes no network requests and its fonts ship with
247
- the package. The one exception is the Chinese share card: on first use it downloads Noto Sans TC
248
- (about 11 MB, from a pinned GitHub commit), checks its SHA-256 and caches it; no prompt data is
249
- sent. The borrowed CLI manages its own network requests and provider data retention.
179
+ For a profile in the report library, use the current profile path printed by the CLI.
180
+ The full report is kept; review the exported files before sharing them. Individual exclusions
181
+ such as `quotes`, `projects` and `usage` are also available.
182
+
183
+ - Source histories are read only. Recognized system messages and tool output are excluded;
184
+ pasted code and logs are collapsed before analysis.
185
+ - Supported secrets and personal information are redacted before sending, and report text is
186
+ checked again before writing. These rules can miss confidential prose or unrecognized secrets.
187
+ - Selected prompts, project folder names, intermediate observations and prompt statistics go to
188
+ the model service through your CLI. Token usage, plans and API price estimates stay local;
189
+ price estimates are not your subscription bill.
190
+ - Reports, dry-run exports and caches are local files that can contain personal information.
191
+ Clearing the cache does not delete reports or dry-run exports.
192
+ - prompt-profile has no telemetry. Reports work offline. The Chinese PNG card downloads a
193
+ verified font on first use; the borrowed CLI manages its own network traffic and retention.
194
+
195
+ See [privacy details and output checks](https://github.com/EricTsai83/prompt-profile/blob/main/docs/user-guide.md#privacy)
196
+ for source paths, permissions, CLI isolation and redaction controls.
250
197
 
251
198
  ## FAQ
252
199
 
253
- **How much quota does it use?** By default at most 30 chunks (about 40,000 characters each) are
254
- analysed, plus intermediate merges for large histories and one final call. Each call may retry
255
- twice. The displayed count is a base estimate, not an upper bound; `--max-calls` limits total CLI
256
- invocations rather than tokens, provider requests or money.
257
- Chunks analysed before are read from the cache on the next run.
200
+ **Can I use an API key?** No; analysis uses your logged-in Claude Code or Codex CLI.
258
201
 
259
- **Can I use an API key?** Not at the moment: by design it only borrows your logged-in CLI.
202
+ **Why are some prompts excluded?** Short acknowledgements, resent duplicates, recognized tool
203
+ notifications, repeated templates and command-only sessions are filtered. Each run shows counts.
260
204
 
261
- **Is the report accurate?** Every trait and dimension cites quotes from your prompts, and the
262
- program checks that each quote really exists in them. Invalid and duplicate quotes are removed;
263
- multiple excerpts of one prompt do not count as independent support, and high-confidence traits
264
- require support from multiple sessions. Quote matching does not prove the interpretation is correct.
265
- Dimensions without verified quotes are marked as insufficiently supported.
205
+ **Can it analyse other languages?** Yes. Report text supports English and Traditional Chinese;
206
+ source prompts can be in any language.
266
207
 
267
- **Why are some prompts not counted?** Short acknowledgements ("ok", "continue"), resent duplicates,
268
- notifications sent by the tools themselves, long templates repeated across sessions, and slash
269
- commands of sessions that contain nothing else (scripts and tools) are excluded. Each run shows
270
- how many were excluded.
208
+ ## Development
271
209
 
272
- **My prompts are not in English.** That is fine: prompts in any language are analysed (Chinese
273
- gets extra handling for acknowledgements and corrections). The report comes in English and
274
- Traditional Chinese (`--lang`, see [Usage](#usage)); quotes stay in their original language.
210
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for setup, checks and releases, and
211
+ [AGENTS.md](AGENTS.md) for architecture and repository rules.
275
212
 
276
- prompt-profile is not affiliated with or endorsed by Anthropic or OpenAI.
213
+ ## License
277
214
 
278
- ## Development
215
+ MIT. Not affiliated with or endorsed by Anthropic or OpenAI.
279
216
 
280
- See [CONTRIBUTING.md](CONTRIBUTING.md), [AGENTS.md](AGENTS.md) and [plans/](plans/README.md).
281
- CI covers Linux (Node.js 22/24) and macOS (Node.js 24); Windows is unverified.
282
- CLI behavior was checked with Claude Code 2.1.309 and codex-cli 0.164.0; upgrade the CLI if an
283
- isolation flag is not recognized. `pnpm test:package` checks the installed npm tarball, including
284
- bundled prompts, fonts, WASM rendering and file permissions.
217
+ ### Narration voice
285
218
 
286
- ## License
219
+ `--voice first|second` controls generated descriptive prose in every report language
220
+ and card. It is independent of `--look`. Second person (`you` / `你`) is the default; first
221
+ person uses `I` / `我`.
222
+ Quotes retain their original wording, and suggested sample prompts keep their intended speaker.
287
223
 
288
- MIT
224
+ The selected voice is stored as `profile.voice` and shown in the report. First-person text is
225
+ an AI-authored draft; review it before presenting its claims as your own. Rerun the analysis
226
+ with another `--voice` to generate a coherent version; source-evidence map caches can be reused.
227
+ Changing voice does not add analysis stages or subscription calls beyond the normal run.
228
+ `render` preserves stored prose and voice without calling an LLM; it does not offer a voice
229
+ override or replace pronouns. Legacy profiles without voice metadata retain their original text
230
+ and do not receive an inferred voice label. Interface instructions still address the reader.