get-claudia 1.60.1 → 1.61.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/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to Claudia will be documented in this file.
4
4
 
5
+ ## 1.61.0 (2026-05-22)
6
+
7
+ ### Launch from anywhere, upgrade from anywhere
8
+
9
+ This release adds a `claudia` shell command (and `update-claudia`) so you no longer have to remember where you installed Claudia or `cd` there before launching or upgrading. New installs and upgrades wire the helper into `~/.zshrc` and `~/.bashrc` automatically. After upgrading once via `npx get-claudia .`, future upgrades are just `update-claudia` from any directory.
10
+
11
+ ### Added
12
+
13
+ - **`claudia` shell command for launching from anywhere.** New installs (and upgrades) get a `claudia` shell function written to `~/.claudia/shell-init.sh` and sourced from `~/.zshrc` and `~/.bashrc`. From any directory, `claudia` cd's to your install folder and launches `claude`. All `claude` flags pass through (`claudia --resume`, `claudia -c "morning brief"`, etc). The folder path is stored in `~/.claudia/claudia-home`; edit it if you move your install. The installer is idempotent: re-running won't double-add to your rc files. The shell function is a smart router that delegates known npm-CLI subcommands (`setup`, `system-health`, `google`, `doctor`) back to the `claudia` binary when it's on PATH, so existing workflows keep working.
14
+ - **`claudia yolo` subcommand.** Sugar for `claude --dangerously-skip-permissions` (cd's first, then passes through any additional flags). Same routing logic — `claudia yolo --resume` works.
15
+ - **`update-claudia` command (also `claudia update`).** Runs `npx get-claudia <your-install-path>` from any directory by reading the stored path from `~/.claudia/claudia-home`. No more "wait, where did I install Claudia?" before upgrading. Both forms are aliases for the same logic.
16
+ - **`~/.claudia/claudia-home`.** Single-line file with the absolute path of the user's Claudia install. Written by the installer; read by the shell function. Move your install? Edit this file.
17
+
18
+ ### Fixed
19
+
20
+ - **ASCII greeting logo: row 1 (hair top) realigned over face** (in `template-v2/CLAUDE.md`). The top hair row was indented 6 leading spaces while the face row below it starts at column 0, so the hair appeared shifted ~4 characters to the right. Now sits correctly above the face. Existing installs see the fix on next upgrade.
21
+ - **Installer no longer treats flag-looking arguments as install targets.** Previously, `npx get-claudia --help` (or any unrecognized `--flag`) was interpreted as the install path and would create a `./--help/` directory with templates copied into it. Now: `--help`/`-h` prints a proper usage message and exits, `--version`/`-V` prints the version, and any other leading-dash argument prints `Error: unrecognized argument: <flag>` and exits 1 without touching the filesystem.
22
+
5
23
  ## 1.60.1 (2026-05-22)
6
24
 
7
25
  ### Two bug fixes from the fixing-phase pass
package/bin/index.js CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  resolveBakPath,
15
15
  applyResolution,
16
16
  } from './manifest-lib.js';
17
+ import { writeShellInit, appendShellRC } from './shell-init.js';
17
18
 
18
19
  const __filename = fileURLToPath(import.meta.url);
19
20
  const __dirname = dirname(__filename);
@@ -63,6 +64,30 @@ function getVersion() {
63
64
  }
64
65
  }
65
66
 
67
+ function printUsage(version) {
68
+ console.log(`get-claudia v${version}
69
+
70
+ Usage:
71
+ npx get-claudia [target-dir] Install or upgrade Claudia (default: ./claudia)
72
+ npx get-claudia . Install or upgrade in the current directory
73
+ npx get-claudia upgrade Same as \`.\` (in-place upgrade)
74
+ npx get-claudia google Set up Google Workspace integration
75
+
76
+ Flags:
77
+ --skip-memory Skip memory daemon setup
78
+ --dev Dev mode (load daemon from local source)
79
+ --yes, -y Non-interactive (auto-confirm prompts)
80
+ --help, -h Show this help and exit
81
+ --version, -V Print version and exit
82
+
83
+ After install, from any directory:
84
+ claudia cd to your install folder, launch claude
85
+ claudia yolo Launch claude --dangerously-skip-permissions
86
+ claudia update Upgrade Claudia (no need to cd first)
87
+ update-claudia Alias for \`claudia update\`
88
+ `);
89
+ }
90
+
66
91
  // Simple y/n prompt. Returns true if user confirms (or non-TTY / --yes flag).
67
92
  function confirm(question) {
68
93
  if (!isTTY || process.argv.includes('--yes') || process.argv.includes('-y')) {
@@ -284,6 +309,7 @@ const STEPS = [
284
309
  { id: 'memory', label: 'Memory System' },
285
310
  { id: 'daemon', label: 'Memory Daemon' },
286
311
  { id: 'mcp', label: 'MCP Config' },
312
+ { id: 'shell', label: 'Shell Helper' },
287
313
  { id: 'vault', label: 'Obsidian Vault' },
288
314
  { id: 'health', label: 'Health Check' },
289
315
  ];
@@ -737,6 +763,16 @@ async function checkForNewerVersion(currentVersion) {
737
763
  async function main() {
738
764
  const version = getVersion();
739
765
 
766
+ // Handle --help / --version BEFORE banner, update-check, or any I/O.
767
+ if (process.argv.includes('--help') || process.argv.includes('-h')) {
768
+ printUsage(version);
769
+ process.exit(0);
770
+ }
771
+ if (process.argv.includes('--version') || process.argv.includes('-V')) {
772
+ console.log(version);
773
+ process.exit(0);
774
+ }
775
+
740
776
  // Self-update trampoline: re-exec with latest if we're stale
741
777
  const newerVersion = await checkForNewerVersion(version);
742
778
  if (newerVersion) {
@@ -773,6 +809,16 @@ async function main() {
773
809
  const filteredArgs = args.filter(a => a !== '--no-memory' && a !== '--skip-memory' && a !== '--dev' && a !== '--yes' && a !== '-y');
774
810
  const arg = filteredArgs[0];
775
811
 
812
+ // Reject flag-looking arguments early so they don't get used as install paths
813
+ // (e.g. `npx get-claudia --foo` would otherwise create a ./--foo/ directory).
814
+ // --help and --version are handled at the top of main(); anything else with a
815
+ // leading dash is a typo or unsupported flag.
816
+ if (typeof arg === 'string' && arg.startsWith('-')) {
817
+ console.error(`${colors.red}Error:${colors.reset} unrecognized argument: ${arg}`);
818
+ console.error(`Run ${colors.cyan}npx get-claudia --help${colors.reset} for usage.`);
819
+ process.exit(1);
820
+ }
821
+
776
822
  // ─── Subcommand: get-claudia google ─────────────────────────────────────
777
823
  if (arg === 'google') {
778
824
  await runGoogleSetup();
@@ -1517,13 +1563,35 @@ async function main() {
1517
1563
 
1518
1564
  renderer.stopSpinner();
1519
1565
 
1520
- // Vault step, then completion
1521
- runVaultStep(renderer, () => {
1522
- renderer.render();
1523
- showDbScanResults(dbScan);
1524
- showCompletion(targetDir, isCurrentDir, memoryOk, rootCause, isUpgrade);
1566
+ // Shell helper step, then vault, then completion
1567
+ runShellStep(renderer, targetDir, () => {
1568
+ runVaultStep(renderer, () => {
1569
+ renderer.render();
1570
+ showDbScanResults(dbScan);
1571
+ showCompletion(targetDir, isCurrentDir, memoryOk, rootCause, isUpgrade);
1572
+ });
1525
1573
  });
1526
1574
 
1575
+ // ── Shell helper step ──
1576
+
1577
+ function runShellStep(renderer, targetPath, callback) {
1578
+ renderer.update('shell', 'active', 'installing claudia command...');
1579
+ try {
1580
+ writeShellInit(homedir(), targetPath);
1581
+ const rc = appendShellRC(homedir());
1582
+ if (rc.skipped) {
1583
+ renderer.update('shell', 'done', 'files written (Windows: source manually)');
1584
+ } else if (rc.added.length > 0) {
1585
+ renderer.update('shell', 'done', `added to ${rc.added.length} rc file(s)`);
1586
+ } else {
1587
+ renderer.update('shell', 'done', 'already installed');
1588
+ }
1589
+ } catch (err) {
1590
+ renderer.update('shell', 'warn', `${err.message}`);
1591
+ }
1592
+ callback();
1593
+ }
1594
+
1527
1595
  // ── Vault step ──
1528
1596
 
1529
1597
  function runVaultStep(renderer, callback) {
@@ -1651,6 +1719,7 @@ async function main() {
1651
1719
  console.log('');
1652
1720
  console.log(` ${colors.cyan}${launchCmd}${colors.reset}`);
1653
1721
  console.log('');
1722
+ console.log(` ${colors.dim}Tip: open a new terminal and just type ${colors.reset}${colors.cyan}claudia${colors.reset}${colors.dim} from anywhere.${colors.reset}`);
1654
1723
  console.log(` ${colors.dim}What's new: /morning-brief · /inbox-check · /feedback${colors.reset}`);
1655
1724
  } else {
1656
1725
  // Fresh install: build anticipation for the onboarding
@@ -1661,6 +1730,7 @@ async function main() {
1661
1730
  }
1662
1731
  console.log(` ${colors.cyan}claude${colors.reset}`);
1663
1732
  console.log('');
1733
+ console.log(` ${colors.dim}Or open a new terminal and type ${colors.reset}${colors.cyan}claudia${colors.reset}${colors.dim} from anywhere.${colors.reset}`);
1664
1734
  console.log(` ${colors.dim}She'll introduce herself and learn how you work.${colors.reset}`);
1665
1735
  console.log(` ${colors.dim}Try: ${colors.reset}${colors.cyan}"Say hi"${colors.reset} ${colors.dim}·${colors.reset} ${colors.cyan}/morning-brief${colors.reset} ${colors.dim}·${colors.reset} ${colors.cyan}"Who do I know?"${colors.reset}`);
1666
1736
  }
@@ -0,0 +1,127 @@
1
+ // Shell helper installer for `claudia` command.
2
+ //
3
+ // Writes two files into ~/.claudia/:
4
+ // - claudia-home : single-line file with the absolute path to the user's
5
+ // Claudia install directory (where `claude` should launch).
6
+ // - shell-init.sh : defines the `claudia` shell function (and `claudia yolo`).
7
+ //
8
+ // Then idempotently appends a one-line source to ~/.zshrc and ~/.bashrc so the
9
+ // function is available in every new shell. The marker comment is used to detect
10
+ // existing installs and avoid double-adding.
11
+ //
12
+ // On Windows we only write the files; rc-file plumbing is a no-op since neither
13
+ // zsh nor bash is standard there. The function content is still useful for users
14
+ // running WSL or Git Bash who source it manually.
15
+
16
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
17
+ import { join } from 'path';
18
+
19
+ export const SHELL_INIT_MARKER = '# Claudia shell helpers';
20
+
21
+ const RC_SNIPPET = `
22
+ ${SHELL_INIT_MARKER} (\`claudia\` from anywhere, \`claudia yolo\` skips permissions)
23
+ [ -f "$HOME/.claudia/shell-init.sh" ] && source "$HOME/.claudia/shell-init.sh"
24
+ `;
25
+
26
+ export const SHELL_INIT_CONTENT = `# Claudia shell helpers — sourced from your shell rc.
27
+ # Edit ~/.claudia/claudia-home to change which folder \`claudia\` launches from.
28
+
29
+ _claudia_home() {
30
+ local home_file="$HOME/.claudia/claudia-home"
31
+ if [ ! -f "$home_file" ]; then
32
+ echo "Claudia home not configured. Run: npx get-claudia ." >&2
33
+ return 1
34
+ fi
35
+ local dir
36
+ dir="$(cat "$home_file")"
37
+ if [ ! -d "$dir" ]; then
38
+ echo "Claudia home directory not found: $dir" >&2
39
+ echo "Fix by editing $home_file" >&2
40
+ return 1
41
+ fi
42
+ printf '%s' "$dir"
43
+ }
44
+
45
+ _claudia_cd() {
46
+ local dir
47
+ dir="$(_claudia_home)" || return 1
48
+ cd "$dir"
49
+ }
50
+
51
+ update-claudia() {
52
+ local dir
53
+ dir="$(_claudia_home)" || return 1
54
+ echo "Updating Claudia at $dir ..."
55
+ npx get-claudia "$dir"
56
+ }
57
+
58
+ claudia() {
59
+ case "$1" in
60
+ yolo)
61
+ shift
62
+ _claudia_cd && claude --dangerously-skip-permissions "$@"
63
+ ;;
64
+ update)
65
+ shift
66
+ update-claudia "$@"
67
+ ;;
68
+ setup|system-health|google|doctor|--version|-V|help|--help|-h)
69
+ # Pass known npm-CLI subcommands through to the binary (if installed).
70
+ command claudia "$@"
71
+ ;;
72
+ *)
73
+ _claudia_cd && claude "$@"
74
+ ;;
75
+ esac
76
+ }
77
+ `;
78
+
79
+ // Write ~/.claudia/claudia-home and ~/.claudia/shell-init.sh.
80
+ // Returns { homeFile, initFile } absolute paths for caller logging.
81
+ export function writeShellInit(homeDir, claudiaTargetDir) {
82
+ const claudiaConfigDir = join(homeDir, '.claudia');
83
+ mkdirSync(claudiaConfigDir, { recursive: true });
84
+
85
+ const homeFile = join(claudiaConfigDir, 'claudia-home');
86
+ const initFile = join(claudiaConfigDir, 'shell-init.sh');
87
+
88
+ writeFileSync(homeFile, `${claudiaTargetDir}\n`);
89
+ writeFileSync(initFile, SHELL_INIT_CONTENT);
90
+
91
+ return { homeFile, initFile };
92
+ }
93
+
94
+ // Idempotently append the source line to a single rc file. Creates the file if
95
+ // it doesn't exist (the source line is harmless on its own). Returns one of:
96
+ // 'added' - the source line was just appended
97
+ // 'unchanged' - marker already present, nothing written
98
+ function appendToRc(rcPath) {
99
+ let existing = '';
100
+ if (existsSync(rcPath)) {
101
+ existing = readFileSync(rcPath, 'utf8');
102
+ if (existing.includes(SHELL_INIT_MARKER)) {
103
+ return 'unchanged';
104
+ }
105
+ }
106
+ // Ensure separation from prior content
107
+ const sep = existing.length === 0 || existing.endsWith('\n') ? '' : '\n';
108
+ writeFileSync(rcPath, existing + sep + RC_SNIPPET);
109
+ return 'added';
110
+ }
111
+
112
+ // Append to the user's zsh and bash rc files. Skips on Windows.
113
+ // Returns { added: [...], unchanged: [...] } of rc paths.
114
+ export function appendShellRC(homeDir, platform = process.platform) {
115
+ const result = { added: [], unchanged: [], skipped: false };
116
+ if (platform === 'win32') {
117
+ result.skipped = true;
118
+ return result;
119
+ }
120
+ const rcFiles = [join(homeDir, '.zshrc'), join(homeDir, '.bashrc')];
121
+ for (const rc of rcFiles) {
122
+ const status = appendToRc(rc);
123
+ if (status === 'added') result.added.push(rc);
124
+ else result.unchanged.push(rc);
125
+ }
126
+ return result;
127
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "get-claudia",
3
- "version": "1.60.1",
3
+ "version": "1.61.0",
4
4
  "description": "An AI assistant who learns how you work.",
5
5
  "keywords": [
6
6
  "claudia",
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.60.1",
3
- "generated": "2026-05-23T01:39:21.155Z",
2
+ "version": "1.61.0",
3
+ "generated": "2026-05-23T02:25:12.290Z",
4
4
  "algorithm": "sha256",
5
5
  "files": {
6
6
  ".claude/rules/claudia-principles.md": "939e9720421628e7f2e4c8dfbaa4aeb9c1e18e8c6a5379cd6b772a6835b812e5",
@@ -26,7 +26,6 @@
26
26
  ".claude/skills/capture-meeting/SKILL.md": "815e7587fcd925323c379a6c57e458b3484d034338c1237378641d142c126175",
27
27
  ".claude/skills/capture-meeting/evals/basic.yaml": "47c4eb1479aeda8067bc877cebfe8688c9b2bb3ce09297e42375cdf558f412e3",
28
28
  ".claude/skills/client-health/SKILL.md": "fed639e6f2c4433cab6a6b4b59776985492dda16be3bd1e843c3e94175936655",
29
- ".claude/skills/close-the-loop/SKILL.md": "835af2b0bde5583d1dffa07f261a1ec50e87f99eb39694c00cb7965ccce21942",
30
29
  ".claude/skills/commitment-detector.md": "66f9e919349d1880eb12636cec6f583be1b3fbe3b28f6180ec732d3c284af3b6",
31
30
  ".claude/skills/connector-discovery.md": "a6659f6ed8a182f968cdc9b4a342de9015d5579859310b77ff230ce73397cdc5",
32
31
  ".claude/skills/databases/SKILL.md": "b2ce4ae30aafa2487dabd7befd067976f0092fcef31dea7601e1683ceca0ef50",
@@ -46,7 +45,6 @@
46
45
  ".claude/skills/ingest-sources/SKILL.md": "938b93d299649db156ad19e9a7bd5d09e950f53bc2eaf8a85386f9fdbca350d0",
47
46
  ".claude/skills/ingest-sources/references/extraction-patterns.md": "28d6dc604c4a11eacfe4523e705ad430ba8fe26632bafcccaef656e9618e5aea",
48
47
  ".claude/skills/judgment-awareness.md": "0077129a87f91d295515108f3f9a68ca6874c6e38fc7f2a73a462704fa00ba2d",
49
- ".claude/skills/manuscript-fact-check/SKILL.md": "3dbdeea105740e42b1ff9d5e7245dd37418401b36655169b5a5ab2a4a8d6a383",
50
48
  ".claude/skills/map-connections/SKILL.md": "e8133d5e3de36e32e3858a1ee3918a577855e77ade022933097f87a0100cc9a3",
51
49
  ".claude/skills/meditate/SKILL.md": "1d814f0c52f4309708669139ba4b637bf05a228e2381950ee3851c6145e25cc7",
52
50
  ".claude/skills/meditate/evals/basic.yaml": "daba441b2fd9d1d4afddcff6eaa9673884198b1d0f85d9d06edbe0738012291a",
@@ -78,6 +76,6 @@
78
76
  ".claude/skills/wiki/SKILL.md": "e45e8db6fce1d774e36c93be27e5d9153b3ae474c48db478a4d7ff2b138e42e8",
79
77
  ".claude/skills/wiki/references/citations-and-contradictions.md": "1b16301020fdb5e4840035ca22425ebb03202694e88eb494105ff39e22e03263",
80
78
  ".claude/skills/wiki/references/page-template.md": "b19382ee9366b1e7f8c9f230881ac3c45982b59ffee0d82fe64b103862ba4745",
81
- "CLAUDE.md": "736c5d95f1477ea6ef1c00d3006eeb4b369eb2bd5f3a926e4d78c42f857fa881"
79
+ "CLAUDE.md": "b8244c281afd5cf46544f1f68b4130672d9f6e6bcbcbae7defca3a31c09d4c12"
82
80
  }
83
81
  }
@@ -104,7 +104,7 @@ Uses three shades to approximate the installer's coloring: `▓▓` = hair, `█
104
104
 
105
105
  ```
106
106
 
107
- ▓▓▓▓▓▓▓▓▒▒
107
+ ▓▓▓▓▓▓▓▓▒▒
108
108
  ▓▓██████████▒▒
109
109
  ▓▓██ ██ ██▓▓
110
110
  ██████████
@@ -304,6 +304,27 @@ I use proactive, contextual, and explicit skills. See `.claude/skills/README.md`
304
304
  | My learnings about you | `context/learnings.md` |
305
305
  | Project details | `projects/[project]/overview.md` |
306
306
  | Filed documents | `~/.claudia/files/` (entity-routed) |
307
+ | Shell helper init | `~/.claudia/shell-init.sh` (sourced from `.zshrc`/`.bashrc`) |
308
+ | Install path pointer | `~/.claudia/claudia-home` (one line, absolute path) |
309
+
310
+ ---
311
+
312
+ ## Launching from the Terminal
313
+
314
+ Once installed, the `claudia` shell command works from any directory:
315
+
316
+ | You type | What happens |
317
+ |----------|--------------|
318
+ | `claudia` | cd to your Claudia folder, launch `claude` |
319
+ | `claudia yolo` | cd, launch `claude --dangerously-skip-permissions` |
320
+ | `claudia -c "morning brief"` | cd, launch `claude -c "morning brief"` (any `claude` flag passes through) |
321
+ | `claudia --resume` | cd, launch `claude --resume` |
322
+ | `claudia update` / `update-claudia` | runs `npx get-claudia <your-install-path>` from anywhere — no need to cd first |
323
+ | `claudia setup` / `claudia system-health` | passes through to the npm `claudia` CLI binary |
324
+
325
+ The folder location is stored in `~/.claudia/claudia-home`. Move your install? Edit that file. Re-run `npx get-claudia .` from a new location and it'll update automatically.
326
+
327
+ On Windows the shell function is written to `~/.claudia/shell-init.sh` but not auto-sourced. WSL or Git Bash users can `source ~/.claudia/shell-init.sh` manually (or add it to their rc file).
307
328
 
308
329
  ---
309
330
 
@@ -1,139 +0,0 @@
1
- ---
2
- name: close-the-loop
3
- description: Process a call transcript into the full post-call loop. Files the transcript, drafts a personalized Gmail follow-up in the user's voice, logs commitments, appends a touchpoint to the contact's people file, and archives the source. The Gmail draft is NEVER auto-sent. Use when the user shares a transcript and wants the *whole* post-call workflow run, says "close the loop on this call", "process and draft followup for [person]", "wrap up the call with [person]".
4
- effort-level: medium
5
- invocation: explicit
6
- argument-hint: "[transcript or person name]"
7
- ---
8
-
9
- # Close the Loop
10
-
11
- The full post-call orchestration. One input (a transcript), four artifacts, one drafted external action that stays human.
12
-
13
- This skill is a *chain* on top of two existing skills:
14
-
15
- - It starts where `capture-meeting` ends: transcript filed, commitments extracted, participants identified.
16
- - It extends with the work `follow-up-draft` does: a personalized email built in the user's voice.
17
- - It adds the multi-write fanout: people file touchpoint, commitments ledger append, transcript archive.
18
-
19
- If the user only wants the capture half (no email drafted), route to `capture-meeting`.
20
- If the user only wants the email half (capture already happened), route to `follow-up-draft`.
21
- If they want the whole loop, this is the canonical skill.
22
-
23
- ## When to fire
24
-
25
- Trigger phrases:
26
-
27
- - "Close the loop on this call"
28
- - "Process my call with [person] and draft the followup"
29
- - "Wrap up the call with [person]"
30
- - "I just got off a call with [person] — full workflow"
31
- - A transcript dropped into a designated `transcripts-inbox/` folder when the user has the close-the-loop pattern configured
32
-
33
- Do NOT fire for:
34
-
35
- - General document processing (use `file-document` or `ingest-sources`)
36
- - Pre-meeting prep (use `meeting-prep`)
37
- - Generic email response with no meeting context (use `draft-reply`)
38
-
39
- ## The flow
40
-
41
- | Step | Action | Touches |
42
- |------|--------|---------|
43
- | 1 | File raw transcript via `memory_file` | source preservation |
44
- | 2 | Extract decisions, commitments (yours and theirs), unresolved questions | in-memory reasoning |
45
- | 3 | Read `people/{contact}.md` for relationship context | files |
46
- | 4 | Read recent Gmail history with the contact (tone calibration) | Gmail connector |
47
- | 5 | Read `voice-followup.md` if it exists | files |
48
- | 6 | Draft personalized email in Gmail Drafts | Gmail connector (DRAFT only, never send) |
49
- | 7 | Append dated touchpoint to `people/{contact}.md` | files |
50
- | 8 | Append commitments to `commitments.md` with deadlines | files |
51
- | 9 | Move transcript from `transcripts-inbox/` to `archive/transcripts/{contact}/` | files |
52
- | 10 | Report back: "Draft ready in Gmail. Logged N commitments. Touchpoint added to [contact]'s file." | chat |
53
-
54
- ## The human gate (non-negotiable)
55
-
56
- The email **never sends automatically**. It lands in Gmail Drafts. The user opens, reviews, edits if needed, and hits Send themselves.
57
-
58
- This is not a limitation. It is the design. External communication is always Human-Approved. See `claudia-principles.md` § 1 (Safety First).
59
-
60
- If a future version of this skill ever auto-sends, that is a breaking change that requires an explicit logged decision.
61
-
62
- ## Processing steps
63
-
64
- ### 1. File the source (MANDATORY)
65
-
66
- Same as `capture-meeting`. Call `memory_file` with:
67
-
68
- - `filename`: `YYYY-MM-DD-[contact]-[topic].md`
69
- - `source_type`: `transcript`
70
- - `summary`: brief one-line summary
71
- - `about`: `[contact-slug]`
72
- - `content`: the full raw transcript
73
-
74
- ### 2. Extract via Document Processor
75
-
76
- Dispatch the Document Processor agent (Haiku) with `extraction_type: "memory_operations"`. The agent returns commitments, decisions, and key topics as a structured operations array. Review for accuracy before storing.
77
-
78
- ### 3. Read relationship and voice context
79
-
80
- In parallel:
81
-
82
- - `people/{contact}.md` (if exists; if not, plan a touchpoint entry that will create the file)
83
- - Recent Gmail thread with the contact (last 5 to 10 messages)
84
- - `voice-followup.md` from the user's playground or context folder
85
-
86
- If `voice-followup.md` does not exist, fall back to a neutral professional tone and flag to the user: "I drafted in a neutral voice. Create `voice-followup.md` to personalize."
87
-
88
- ### 4. Draft the email
89
-
90
- Follow the structure from `voice-followup.md`. Default pattern when no voice file:
91
-
92
- - Opening: reference the call directly. No "I wanted to circle back."
93
- - Body beat 1: what *they* said that mattered (one or two sentences).
94
- - Body beat 2: what *you* committed to, with dates.
95
- - Closing: one clear next step with a specific date or window.
96
- - Signoff: "Best," then first name. No "Warm regards." No em dashes.
97
-
98
- Create the draft via the Gmail connector. Do NOT call any send tool. The draft must remain in Drafts.
99
-
100
- ### 5. The multi-write fanout
101
-
102
- In sequence:
103
-
104
- - `memory_batch` with the reviewed memory operations from step 2.
105
- - Append to `people/{contact}.md` under the History section. Newest first. Date-stamped. Format: `### YYYY-MM-DD. [Topic].`
106
- - Append to `commitments.md` under "Active: things I owe" and "Active: things others owe me". Include source attribution: `*(source: call YYYY-MM-DD)*`.
107
- - Move the transcript file from `transcripts-inbox/` to `archive/transcripts/{contact-slug}/`.
108
-
109
- ### 6. Report
110
-
111
- ```
112
- Draft ready in Gmail. Open Drafts to review and send.
113
- Logged {N} commitments to commitments.md ({M} mine, {N-M} theirs).
114
- Touchpoint added to people/{contact}.md.
115
- Transcript archived to archive/transcripts/{contact-slug}/.
116
- ```
117
-
118
- If anything failed (Gmail connector expired, person file write blocked, etc.), report the failure clearly and offer the recovery path. Do not silently proceed.
119
-
120
- ## Failure modes
121
-
122
- | Failure | Recovery |
123
- |---------|----------|
124
- | Transcript has missing speaker labels | List commitments under "Active: unattributed" rather than guessing who owes what |
125
- | No `people/{contact}.md` file exists | Offer to create one with what was learned. Do not auto-create silently. |
126
- | `voice-followup.md` missing | Use neutral tone, flag the gap to the user |
127
- | Gmail connector expired or disconnected | Skip the draft step, log everything else, instruct the user to reconnect Gmail and re-run from step 4 |
128
- | Multiple contacts in the transcript | Ask the user which contact "owns" the followup before drafting. Do not draft to multiple recipients. |
129
-
130
- ## See also
131
-
132
- - `capture-meeting` — the upstream half. Use when no email is needed.
133
- - `follow-up-draft` — the downstream half. Use when capture already happened.
134
- - `meeting-prep` — the inverse. Use before a call, not after.
135
- - `commitment-detector` — proactive sibling. Fires on commitments mentioned in conversation, separate from this skill which processes formal transcripts.
136
-
137
- ## AIAC context
138
-
139
- This is the anchor workflow for the AIAC Cowork course (`~/Downloads/Claude-Cowork-Course/`). Module 3 of the course walks members through building this exact skill from the constituent capture-meeting and follow-up-draft pieces. The course's `voice-followup.md` template is the recommended companion file.
@@ -1,111 +0,0 @@
1
- ---
2
- name: manuscript-fact-check
3
- description: Audit every quote and source claim in a draft manuscript against primary sources before it ships to a publisher, editor, or peer reviewer. Produces a structured per-claim matrix (claim, source verbatim, status, action, correction), applies corrections to the draft, and flags any remaining items that need physical-copy verification. Use when the user says "fact-check this", "verify the sources", "audit this manuscript", "check every quote", "build a fact-check matrix", "verify against primary sources", or before any publisher / editor submission.
4
- effort-level: high
5
- invocation: explicit
6
- argument-hint: "[path to draft or article]"
7
- ---
8
-
9
- # Manuscript Fact-Check
10
-
11
- The pass that runs before a draft ships. Every quote attributed to a source, every research claim, every statistic, verified against the primary source. Drift caught, corrections applied, audit trail preserved.
12
-
13
- This skill exists because Claudia's most catastrophic failure mode in writing work is the subtly-rewritten "quote" that drifts from the original. Editors at credible publishers catch these instantly. The chapter that ships with a misquote loses the editor's trust on page one, and the relationship rarely recovers.
14
-
15
- ## When to fire
16
-
17
- Trigger phrases:
18
-
19
- - "Fact-check this manuscript / chapter / article / paper"
20
- - "Verify the sources in this draft"
21
- - "Audit every quote in [file]"
22
- - "Check the citations before I send this"
23
- - "Build a fact-check matrix for [draft]"
24
- - "Make sure these quotes are accurate against the originals"
25
- - "I'm sending this to [publisher]: verify everything first"
26
-
27
- Do NOT fire for:
28
-
29
- - Polishing prose, restructuring sections, or style edits (different skills)
30
- - Verifying a single fact in conversation (just look it up directly)
31
- - Drafts that contain no quoted sources or specific statistics
32
-
33
- ## The three-tier strategy
34
-
35
- Before any verification begins, classify every claim by tier. The tier determines whether the claim is verified directly by Claudia or delegated to a research-scout agent.
36
-
37
- | Tier | What it is | Why direct verification | Examples |
38
- |------|------------|--------------------------|----------|
39
- | 1 | Quotes the publisher *owns* or that an audience knows verbatim | The publisher's editor will compare letter-by-letter. Any drift kills credibility. Never delegate. | Hill quotes for Napoleon Hill publisher. Bible quotes for theological work. Constitution quotes for legal work. The author's own prior books. |
40
- | 2 | Peer-reviewed research claims | Verifiable through DOI / PubMed / journal archive. Agents are good at this. | Neuroscience studies, meta-analyses, survey data, citation chains. |
41
- | 2.5 | Biographical quotes with retelling drift | Verifiable but commonly distorted in derivative sources. Agents work but must compare to primary source, not Wikipedia. | McCartney "Yesterday" story, Kekulé benzene dream, Jobs interviews, founder origin stories. |
42
-
43
- **Rule:** Tier 1 is verified by Claudia personally via `firecrawl scrape` + `grep` against the primary public-domain text. Tiers 2 and 2.5 are dispatched to parallel research-scout agents with strict "quote verbatim or flag UNVERIFIABLE" instructions.
44
-
45
- ## The flow
46
-
47
- | Step | Action | Touches |
48
- |------|--------|---------|
49
- | 1 | Read the draft. Itemize every claim attributed to a source: direct quotes, paraphrased quotes, statistics, named studies, citations. | In-memory list. |
50
- | 2 | Classify each claim by tier (1, 2, 2.5). | In-memory list. |
51
- | 3 | For Tier 1 claims: identify the primary source (public-domain text, official transcript, the publisher's own catalog). Fetch directly with `firecrawl scrape`. Search the source with `grep` for each quoted phrase. Compare verbatim. | `sources/.firecrawl/` |
52
- | 4 | For Tier 2 and 2.5 claims: dispatch parallel research-scout agents. One agent for academic / peer-reviewed claims, one for biographical / example claims. Provide each agent with the exact manuscript wording and require structured output: claim, source verbatim, match status, confidence, recommended action. | Agent dispatch. |
53
- | 5 | Build the matrix. One row per claim. Columns: Claim (verbatim from manuscript), Source (verbatim from primary), Status (EXACT / PARAPHRASE / DRIFT / UNVERIFIABLE), Confidence (HIGH / MEDIUM / LOW), Action (KEEP / EDIT / FLAG), Notes. Save as `08-Fact-Check-Matrix.md` (or matching number) in the project bundle. | Writes file. |
54
- | 6 | Apply corrections to the manuscript source. For each DRIFT or PARAPHRASE flagged for EDIT: change the manuscript text to match the verified source wording. For each citation correction: update author names, years, page references. | Edits manuscript source. |
55
- | 7 | Re-render derived formats (PDF, DOCX, HTML) from the corrected source. | Re-runs the rendering pipeline. |
56
- | 8 | Report. Summarize what was verified EXACT, what required EDIT (with before / after), what remains FLAGGED for physical-copy verification, and what is now ready for the publisher. Honest about anything that could not be verified. | Chat output. |
57
-
58
- ## Status codes
59
-
60
- | Code | Meaning |
61
- |------|---------|
62
- | **EXACT** | Manuscript wording matches the primary source verbatim. KEEP. |
63
- | **PARAPHRASE** | Manuscript captures the source meaning but rewords slightly. May be acceptable (with quotation marks removed) or require restoration of the verbatim quote. |
64
- | **DRIFT** | Manuscript presents text as a verbatim quote but the wording differs from the source. Always EDIT. |
65
- | **UNVERIFIABLE** | The source could not be reached or the quote could not be located within it. FLAG for the user to verify against a physical copy or alternate source. |
66
-
67
- ## Output format (the matrix)
68
-
69
- Use this structure for each claim in `08-Fact-Check-Matrix.md`:
70
-
71
- ```markdown
72
- ### [Claim ID]. [Brief topic]
73
-
74
- | Field | Content |
75
- |-------|---------|
76
- | **Original claim** | "[verbatim from manuscript]" |
77
- | **Source (verbatim)** | "[verbatim from primary source]" |
78
- | **Status** | EXACT \| PARAPHRASE \| DRIFT \| UNVERIFIABLE |
79
- | **Action** | KEEP \| EDIT \| FLAG |
80
- | **Where it now stands** | "[corrected manuscript text, if action was EDIT]" |
81
- | **Source citation** | [author, title, publisher, year, page] |
82
- | **Notes** | [anything else the editor should know] |
83
- ```
84
-
85
- End the matrix with a summary table and an "Outstanding items requiring action before submission" section that names every UNVERIFIABLE or FLAG claim and what the user must do to resolve it.
86
-
87
- ## Why this skill matters
88
-
89
- For a publisher-facing submission, the editor's first read is a credibility test. A single fabricated quote, a wrong author initial, a confused year, a phrase attributed to one source when it comes from another: any of these tells the editor the rest of the manuscript cannot be trusted. The matrix prevents that. It also gives the editor a verification artifact: when they ask "where did this quote come from?", the answer is in the matrix, with the primary source cited and the verbatim text shown.
90
-
91
- For the writer, the matrix is the audit trail that turns "I think the quote is right" into "I can prove the quote is right."
92
-
93
- ## Known failure modes
94
-
95
- | Failure | What goes wrong | How to handle |
96
- |---------|----------------|---------------|
97
- | Upstream research agents fabricate citations | Agents have produced false author initials, false dates, false page numbers when their search returns weak hits | Always have the agent quote the source verbatim, not paraphrase it. If the verbatim text cannot be produced, status is UNVERIFIABLE, not EXACT. |
98
- | The primary source is paywalled or behind anti-bot | WebFetch returns 403; agent reports the page as unverifiable | Try `firecrawl scrape` first. If still blocked, dispatch a different agent for that specific source. If still no, flag UNVERIFIABLE and ask the user to verify against a physical copy. |
99
- | The quote is widely attributed but the page reference is wrong | The quote is real, the page number is folklore | Mark the quote EXACT and the page number FLAG. The author must verify page references against a physical copy before final submission. |
100
- | The quote is "from" a famous person but only sourced to a later retelling | Common with Tesla, Edison, Twain, Einstein quotes | Skip the quote if the primary source is the person's own late autobiography or a posthumous secondary citation. Note exclusion in the editor's notes. |
101
-
102
- ## AIAC context
103
-
104
- The reference implementation of this skill is the Napoleon Hill "Sixth Sense" chapter fact-check at `~/Downloads/Napoleon-Hill-Sixth-Sense/08-Fact-Check-Matrix.md`. 26 claims audited, ~14 EDITs applied, two FLAGs preserved for physical-copy verification. The chapter was meaningfully strengthened by the pass: at least three errors that would have been caught by a serious editor were caught here first.
105
-
106
- ## See also
107
-
108
- - `auto-research` for iterative draft improvement (different concept: this audits sources, that iterates on prose quality)
109
- - `summarize-doc` for executive summaries (different concept: this verifies an existing draft, that produces a new artifact)
110
- - `ingest-sources` for multi-document processing (related concept: that processes raw inputs, this audits already-cited outputs)
111
- - `capture-meeting` for meeting transcript processing (related concept for transcript-source claims, but different output)