@hraness/peopleblade 0.1.1 → 0.2.1

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
@@ -10,10 +10,12 @@ and sync are optional.
10
10
  - macOS or Linux for the currently tested local workflows
11
11
  - Provider-specific setup only for live sources you choose to import
12
12
 
13
+ Installation includes the pinned runtime dependencies Zod 4.4.3 and Effect 3.22.1.
14
+
13
15
  ## Install
14
16
 
15
17
  ```bash
16
- bun add --global @hraness/peopleblade@0.1.1
18
+ bun add --global @hraness/peopleblade@0.2.1
17
19
  peopleblade --version
18
20
  peopleblade init
19
21
  peopleblade stats --json
@@ -41,12 +43,12 @@ The package does not install Wrench, browser automation, KB, native model runtim
41
43
  or provider credentials. Beeper, Google, and WhatsApp live sync commands delegate
42
44
  through a separately reviewed `wrench` executable on `PATH` (or the absolute
43
45
  `PEOPLEBLADE_WRENCH_EXECUTABLE` path). PeopleBlade bundles only the pinned Wrench
44
- 0.16.7 client validators needed to fence requests and receipts; it does not bundle
46
+ 0.16.8 client validators needed to fence requests and receipts; it does not bundle
45
47
  or silently download Wrench's execution runtime.
46
48
 
47
- PeopleBlade 0.1.1 contains the reviewed Wrench-backed Beeper, Google, and WhatsApp
49
+ PeopleBlade 0.2.1 contains the reviewed Wrench-backed Beeper, Google, and WhatsApp
48
50
  live sync commands. Running them requires the separately installed public
49
- `@hraness/wrench` 0.16.7 package. Beeper support is bounded to account-aware
51
+ `@hraness/wrench` 0.16.8 package. Beeper support is bounded to account-aware
50
52
  `contacts.list@3` reads, `contacts.search@1`, `messaging.search@2`, and the separate
51
53
  body-free interaction exporter. `contacts.search@1` executes the official Beeper
52
54
  CLI 0.6.2 executable pinned by Wrench; `contacts.list@3` and `messaging.search@2`
@@ -54,21 +56,72 @@ use Wrench's bounded Desktop-loopback read paths. The exporter is macOS arm64 on
54
56
  and reports lower-bound interaction counts from complete one-to-one conversations
55
57
  only. See
56
58
  [peopleblade.com/sources](https://peopleblade.com/sources) for the complete provider
57
- guide. PeopleBlade calls no
59
+ guide. A database previously synced by PeopleBlade 0.1.1 through Wrench 0.16.7
60
+ must run `peopleblade beeper rebind --auth beeper-main --confirm --json` once after
61
+ installing Wrench 0.16.8. The command appends reviewed metadata for the same source
62
+ identity only after both complete account inventories match. Do not force-bind
63
+ Wrench unless its authenticated Desktop target changed. PeopleBlade calls no
58
64
  Beeper interface directly and exposes none of Wrench's Beeper send or action
59
65
  operations. Archive imports, Apple Contacts, iMessage, notes, identity review,
60
66
  backups, and optional PeopleBlade cloud commands do not require Wrench.
61
67
 
68
+ ## Browse and edit locally
69
+
70
+ ```bash
71
+ peopleblade capabilities --json
72
+ peopleblade query --search "Ada" --sort name --direction asc --json
73
+ peopleblade people show 12 --json
74
+ peopleblade ui
75
+ ```
76
+
77
+ `capabilities` is offline discovery, not proof that a provider is configured.
78
+ `query` supports source, email, phone and do-not-contact filters, up to 100 rows
79
+ per page, source facets, and `nextOffset` continuation. Pages are a live view;
80
+ imports and identity reviews can move rows between requests. `list` retains its
81
+ legacy shape for existing clients.
82
+
83
+ `ui` starts a local workspace on a random `127.0.0.1` port. Open the printed URL
84
+ and select its owner-only access file. The capability stays in tab memory; the
85
+ page loads no remote assets and performs no provider or cloud calls. Ctrl+C
86
+ stops the workspace and invalidates access. A process running as your OS user
87
+ can access your local files; this is not a sandbox against that process.
88
+
89
+ The workspace supports contact details, note search, Markdown creation/editing,
90
+ safe preview, history and draft recovery. Note edits append immutable user
91
+ revisions; original source content and attribution remain intact. No raw HTML
92
+ or remote images are rendered. Notes never enter cloud sync or agent packets.
93
+
94
+ ```bash
95
+ peopleblade notes show 42 --json
96
+ peopleblade notes update 42 --expected-revision 0 \
97
+ --expected-context CONTEXT_SHA256 --request-id REQUEST_UUID \
98
+ --body-file /private/path/note.md --json
99
+ peopleblade notes history 42 --json
100
+ ```
101
+
102
+ Read the revision and context digest from `notes show`. Use a fresh UUID for a
103
+ new edit; retry an uncertain edit with the same UUID and exact input. Stale
104
+ content or identity context fails without overwriting a newer edit. `--body-file -`
105
+ reads bounded UTF-8 stdin. `--title` changes the title, `--clear-title` clears it,
106
+ and omission retains the title from the expected revision.
107
+
108
+ The versioned `research prepare` envelope can be filled and passed directly to
109
+ `research apply`. Keep its subject and instructions unchanged; fill only `result`.
110
+ The envelope binds this database and its current identity evidence. The strict
111
+ legacy three-field input remains supported. JSON-mode errors are one structured
112
+ `peopleblade.error.v1` object on stderr; successful results stay on stdout.
113
+
62
114
  ## Privacy boundary
63
115
 
64
116
  PeopleBlade's provider import paths never retain, search, enrich from, or upload
65
117
  message text. The optional cloud projection excludes source records, raw archives,
66
- local paths, provider credentials, and message bodies. Ambiguous identity links
118
+ local paths, provider credentials, note bodies and revisions, and message bodies. Ambiguous identity links
67
119
  remain reviewable instead of being silently merged.
68
120
 
69
121
  This npm artifact contains only the bundled local CLI, its pinned Wrench client
70
122
  validators and executable bridge, SQLite migrations, and package documentation.
71
- It does not contain the Wrench execution runtime, PeopleBlade web server, billing
123
+ It includes the self-contained loopback workspace, but not the Wrench execution
124
+ runtime, hosted PeopleBlade web server, billing
72
125
  implementation, operational tooling, tests, or private product documentation.
73
126
 
74
127
  ## Update or remove
@@ -1,8 +1,8 @@
1
1
  # Third-party notices
2
2
 
3
3
  The PeopleBlade CLI bundle includes reviewed client-boundary code from
4
- `@hraness/wrench` 0.16.7 (commit
5
- `a2b321081335ac28e5df0ccbb67ebea0424d49f5`) and message-bundle contract code
4
+ `@hraness/wrench` 0.16.8 (commit
5
+ `b0cf2ecbc1113fcc8ef673a824be475c3d7bbb46`) and message-bundle contract code
6
6
  from `@hraness/message-like-me` 0.7.0. Those portions are provided under the
7
7
  following license. The PeopleBlade CLI package has its own MIT grant in
8
8
  `LICENSE`; this notice preserves the attribution for the bundled portions.
package/dist/cli.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  import { accessSync, constants, realpathSync } from "node:fs";
4
4
  import { isAbsolute, resolve } from "node:path";
5
5
 
6
+ const reviewedWrenchVersion = "0.16.8";
6
7
  const configured = process.env.PEOPLEBLADE_WRENCH_EXECUTABLE;
7
8
  const executable = configured === undefined
8
9
  ? Bun.which("wrench")
@@ -32,6 +33,36 @@ if (process.argv[1] !== undefined && canonicalExecutable === realpathSync(proces
32
33
  process.exit(127);
33
34
  }
34
35
 
36
+ let versionProbe: ReturnType<typeof Bun.spawnSync> | null = null;
37
+ try {
38
+ versionProbe = Bun.spawnSync([canonicalExecutable, "--version"], {
39
+ cwd: process.cwd(),
40
+ env: process.env,
41
+ stdin: "ignore",
42
+ stdout: "pipe",
43
+ stderr: "pipe",
44
+ timeout: 5_000,
45
+ killSignal: "SIGKILL",
46
+ maxBuffer: 1_024,
47
+ });
48
+ } catch {
49
+ // Collapse process, timeout, and output-limit failures into one public error.
50
+ }
51
+ if (
52
+ versionProbe === null
53
+ || versionProbe.exitCode !== 0
54
+ || versionProbe.signalCode !== undefined
55
+ || versionProbe.exitedDueToTimeout === true
56
+ || versionProbe.exitedDueToMaxBuffer === true
57
+ || versionProbe.stdout?.toString() !== `${reviewedWrenchVersion}\n`
58
+ || versionProbe.stderr?.byteLength !== 0
59
+ ) {
60
+ console.error(
61
+ `PeopleBlade Wrench-backed sources require the exact reviewed Wrench ${reviewedWrenchVersion} executable.`,
62
+ );
63
+ process.exit(126);
64
+ }
65
+
35
66
  const child = Bun.spawn([canonicalExecutable, ...process.argv.slice(2)], {
36
67
  cwd: process.cwd(),
37
68
  env: process.env,