@ghostpaw/affinity 0.4.1 → 0.6.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 +345 -113
- package/SKILL.md +101 -260
- package/dist/cli.js +4928 -1505
- package/dist/index.cjs +2955 -753
- package/dist/index.d.cts +874 -95
- package/dist/index.d.ts +874 -95
- package/dist/index.js +2955 -753
- package/dist/mcp-server.js +3664 -1235
- package/dist/mcp.cjs +3270 -1067
- package/dist/mcp.d.cts +3 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.js +3272 -1069
- package/package.json +1 -1
- package/skills/affinity/SKILL.md +101 -260
- package/skills/affinity/references/identify-and-locate-contacts.md +9 -0
- package/skills/affinity/references/import-history-without-faking-evidence.md +25 -0
- package/skills/affinity/references/manage-promises-and-agreements.md +8 -0
- package/skills/affinity/references/manage-recurring-dates-and-reminders.md +8 -0
- package/skills/affinity/references/record-direct-evidence-well.md +18 -0
- package/skills/affinity/references/record-observations-and-referrals.md +10 -0
- package/skills/affinity/references/review-radar-progression-and-graph.md +13 -0
- package/skills/affinity/references/tools.md +489 -0
package/SKILL.md
CHANGED
|
@@ -2,278 +2,113 @@
|
|
|
2
2
|
name: affinity
|
|
3
3
|
description: "Search and maintain local contacts, identities, relationships, events, commitments, and recurring dates. Use when recording relationship evidence or reviewing a social CRM."
|
|
4
4
|
license: "MIT"
|
|
5
|
-
compatibility: "
|
|
5
|
+
compatibility: "The release binary needs no runtime. MCP stdio or ghostpaw-affinity CLI."
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# affinity
|
|
9
9
|
|
|
10
|
+
## CLI cheat sheet
|
|
11
|
+
|
|
12
|
+
Install: `curl -fsSL https://raw.githubusercontent.com/GhostPawJS/affinity/main/install.sh | sh`
|
|
13
|
+
Windows: `irm https://raw.githubusercontent.com/GhostPawJS/affinity/main/install.ps1 | iex`
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
export GHOSTPAW_AFFINITY_DB=/abs/path/affinity.db
|
|
17
|
+
# Or --db; default ~/.ghostpaw/affinity.db. Piped output is JSON; --compact omits empty receipt arrays.
|
|
18
|
+
# Version: --version includes variant; scripts should use --version --short for exact semver matching.
|
|
19
|
+
# --version --json (or version --json) returns name, version, variant, target (null outside a binary).
|
|
20
|
+
# Missing DB reads exit 3 and create nothing; the first write creates it. MCP creates on startup.
|
|
21
|
+
# JSON: --input - reads stdin; @existing-file loads a value, @@x escapes @x. Use stdin/@file for E2BIG.
|
|
22
|
+
# Arrays accept JSON, comma lists or repeats. Tag filters accept gastro-radar or tag:gastro-radar. Use per-command --help for action flags.
|
|
23
|
+
# Exit: 0 ok/no_op, 1 tool error, 2 usage/invalid input, 3 not found/clarification, 4 conflict, 70 internal.
|
|
24
|
+
# Dates: epoch ms, ISO with offset/Z, YYYY-MM-DD, DD.MM.YYYY, today, tomorrow, +3d, -2d.
|
|
25
|
+
# CLI and MCP use the same grammar, including yesterday. Keywords use the local date.
|
|
26
|
+
# Date-only occurredAt uses UTC midnight; dueAt uses UTC end of day; calendar days are preserved.
|
|
27
|
+
# Read occurredOn/dueOn/occursOn for days; *Iso stays UTC. Future events warn and do not count yet.
|
|
28
|
+
# Commitments and resolutions do not reset recency; radar drift means gap > 1.5 times cadence.
|
|
29
|
+
ghostpaw-affinity contact create '{"name":"Fox","kind":"human","bootstrapOwner":true}'
|
|
30
|
+
ghostpaw-affinity search "Jana" # Search names, identities, tags, attributes, roles and events before creating.
|
|
31
|
+
ghostpaw-affinity contact create '{"name":"Jana Petersen","kind":"human"}' --if-exists return
|
|
32
|
+
ghostpaw-affinity identity add --contact '{"contactId":2}' --input '{"type":"email","value":"jana@x.de"}'
|
|
33
|
+
ghostpaw-affinity relationship tie --from '{"contactId":2}' --to '{"contactId":3}' --kind works_at --role Founder
|
|
34
|
+
ghostpaw-affinity relationship add --from '{"contactId":1}' --to '{"contactId":2}' --kind professional --role lead
|
|
35
|
+
ghostpaw-affinity event record --kind interaction --input '{"type":"conversation","occurredAt":"today","summary":"Call re pilot","significance":6,"participants":[{"contactId":2,"role":"recipient","directionality":"mutual"}]}'
|
|
36
|
+
ghostpaw-affinity commitment record --input '{"commitmentType":"promise","occurredAt":"today","dueAt":"+3d","summary":"Send proposal","significance":6,"participants":[{"contactId":2,"role":"recipient"}]}'
|
|
37
|
+
ghostpaw-affinity commitment resolve --commitment-event-id 6 --resolution kept
|
|
38
|
+
ghostpaw-affinity date add --input '{"target":{"kind":"contact","contact":{"contactId":2}},"recurrenceKind":"birthday","anchorMonth":11,"anchorDay":3,"summary":"Jana bday","significance":4}'
|
|
39
|
+
ghostpaw-affinity attribute set --target '{"kind":"contact","contact":{"contactId":2}}' --name pipeline_stage --value '"proposal"'
|
|
40
|
+
ghostpaw-affinity attribute set --target '{"kind":"contact","contact":{"contactId":2}}' --name tag:gastro-radar --value null
|
|
41
|
+
ghostpaw-affinity show contact_profile --contact '{"contactId":2}'
|
|
42
|
+
ghostpaw-affinity review events.contact_journal --with-content --channel bluesky --contact '{"contactId":2}'
|
|
43
|
+
ghostpaw-affinity search --scope events "record id"
|
|
44
|
+
ghostpaw-affinity review links.radar
|
|
45
|
+
ghostpaw-affinity review commitments.open
|
|
46
|
+
ghostpaw-affinity review dates.upcoming --horizon-days 14
|
|
47
|
+
ghostpaw-affinity review contacts.list --tag gastro-radar
|
|
48
|
+
ghostpaw-affinity review contacts.list --attribute pipeline_stage=proposal
|
|
49
|
+
ghostpaw-affinity review contacts.duplicates
|
|
50
|
+
ghostpaw-affinity contact merge --winner '{"contactId":2}' --loser '{"contactId":8}' --reason-summary "same person"
|
|
51
|
+
ghostpaw-affinity duplicate dismiss --left '{"contactId":5}' --right '{"contactId":10}' --reason '"different people"'
|
|
52
|
+
ghostpaw-affinity contact revise '{"contactId":3}' --patch '{"name":"New Name"}'
|
|
53
|
+
ghostpaw-affinity contact lifecycle '{"contactId":9}' dormant
|
|
54
|
+
ghostpaw-affinity relationship state --link '{"linkId":7}' --state dormant
|
|
55
|
+
ghostpaw-affinity event revise --event-id 12 --patch '{"summary":"Corrected"}'
|
|
56
|
+
ghostpaw-affinity event delete --event-id 12 --confirm
|
|
57
|
+
ghostpaw-affinity contact export --contact '{"contactId":2}'
|
|
58
|
+
ghostpaw-affinity contact delete --contact '{"contactId":2}' --confirm
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Batch imports: use `ghostpaw-affinity batch --chunk 500 < import.jsonl` with {tool,args} lines. See `ghostpaw-affinity skill import-history-without-faking-evidence`.
|
|
62
|
+
|
|
63
|
+
For bots and agents: run `ghostpaw-affinity mcp` for MCP stdio, or use this CLI with `--json`. Read a guide with `ghostpaw-affinity skill <guide>`.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Appendix: MCP and tool calls
|
|
67
|
+
|
|
10
68
|
Affinity is a local relationship model and social CRM. Search before creating contacts. Inspect before revising or merging. Record direct evidence honestly, keep identities and structural ties distinct from social links, and ask for clarification when a target is ambiguous. Review commitments and recurring dates regularly. Derived scores guide attention and do not prove relationship quality.
|
|
11
69
|
|
|
12
|
-
|
|
70
|
+
### Calling tools
|
|
13
71
|
|
|
14
72
|
MCP: connect to ghostpaw-affinity, then call a tool by name with its JSON arguments.
|
|
15
73
|
|
|
16
|
-
CLI: `ghostpaw-affinity call <tool> '<JSON object>'` or `ghostpaw-affinity <tool> --parameter value
|
|
74
|
+
CLI: `ghostpaw-affinity call <tool> '<JSON object>'` or `ghostpaw-affinity <tool> --parameter value`.
|
|
17
75
|
|
|
18
76
|
Inspect schemas with `ghostpaw-affinity describe <tool>`. Use `--db <path>` to select a database.
|
|
19
77
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Search contacts by name
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
| link | object | no | Optional target link locator. |
|
|
55
|
-
| contactIds | array | no | Optional contact-id subset. |
|
|
56
|
-
| kind | string | no | Optional contact kind or link kind filter, depending on the view. |
|
|
57
|
-
| lifecycleState | string | no | active, dormant, merged, lost. Optional contact lifecycle-state filter. |
|
|
58
|
-
| linkState | string | no | active, dormant, strained, broken, archived. Optional link state filter. |
|
|
59
|
-
| includeOwner | boolean | no | Whether owner contacts are included. |
|
|
60
|
-
| includeDormant | boolean | no | Whether dormant rows are included. |
|
|
61
|
-
| includeArchived | boolean | no | Whether archived links are included. |
|
|
62
|
-
| includeObserved | boolean | no | Whether observed links are included. |
|
|
63
|
-
| eventTypes | array | no | Optional event-type filter. |
|
|
64
|
-
| momentKind | string | no | breakthrough, rupture, reconciliation, milestone, turning_point. Optional moment kind filter. |
|
|
65
|
-
| commitmentType | string | no | promise, agreement. Optional commitment type filter. |
|
|
66
|
-
| recurrenceKind | string | no | birthday, anniversary, renewal, memorial, custom_yearly. Optional recurrence-kind filter. |
|
|
67
|
-
| horizonDays | integer | no | Optional horizon-days filter. |
|
|
68
|
-
| exactOnly | boolean | no | Whether duplicate review is exact-only. |
|
|
69
|
-
| minScore | number | no | Optional duplicate minimum score. |
|
|
70
|
-
| includeDismissed | boolean | no | Whether dismissed pairs are included in duplicate review (marked with dismissed flag). |
|
|
71
|
-
| since | integer | no | Optional lower timestamp bound. |
|
|
72
|
-
| until | integer | no | Optional upper timestamp bound. |
|
|
73
|
-
| limit | integer | no | Optional result limit. |
|
|
74
|
-
| offset | integer | no | Optional result offset. |
|
|
75
|
-
|
|
76
|
-
## inspect_affinity_item
|
|
77
|
-
|
|
78
|
-
Inspect one exact affinity item such as the owner profile, a contact profile, or one link detail.
|
|
79
|
-
|
|
80
|
-
Use when: Use this when you already know the exact item you want to inspect in depth.
|
|
81
|
-
|
|
82
|
-
Not for: Do not use this for search-style discovery or dashboard-like list reviews.
|
|
83
|
-
|
|
84
|
-
Read-only.
|
|
85
|
-
|
|
86
|
-
| Parameter | Type | Required | Values / description |
|
|
87
|
-
| --- | --- | --- | --- |
|
|
88
|
-
| kind | string | yes | owner_profile, contact_profile, link. What to inspect. |
|
|
89
|
-
| contact | object | no | Target contact. Required when kind=contact_profile. Provide contactId or identity. |
|
|
90
|
-
| link | object | no | Target link. Required when kind=link. Provide linkId or endpoints. |
|
|
91
|
-
| topLinksLimit | integer | no | Optional top-links cap. |
|
|
92
|
-
| recentEventsLimit | integer | no | Optional recent-events cap. |
|
|
93
|
-
|
|
94
|
-
## manage_contact
|
|
95
|
-
|
|
96
|
-
Create a contact, revise one contact's core fields, or change lifecycle state. ALWAYS search_affinity first before creating — duplicates corrupt the graph.
|
|
97
|
-
|
|
98
|
-
Use when: Use this for contact creation and lifecycle-safe contact maintenance.
|
|
99
|
-
|
|
100
|
-
Not for: Do not use this for identities, links, attributes, or merges.
|
|
101
|
-
|
|
102
|
-
Writes: writes_state.
|
|
103
|
-
|
|
104
|
-
| Parameter | Type | Required | Values / description |
|
|
105
|
-
| --- | --- | --- | --- |
|
|
106
|
-
| action | string | yes | create, revise, set_lifecycle. Operation to perform. |
|
|
107
|
-
| input | object | no | New contact payload. Required when action=create. |
|
|
108
|
-
| contact | object | no | Target contact. Required when action=revise or set_lifecycle. Provide contactId or identity. |
|
|
109
|
-
| patch | object | no | Allowed contact patch. Required when action=revise. |
|
|
110
|
-
| lifecycleState | string | no | active, dormant, merged, lost. Target lifecycle state. Required when action=set_lifecycle. |
|
|
111
|
-
| options | object | no | Optional lifecycle metadata. |
|
|
112
|
-
|
|
113
|
-
## merge_contacts
|
|
114
|
-
|
|
115
|
-
Merge one loser contact into one winner contact using explicit contact locators.
|
|
116
|
-
|
|
117
|
-
Use when: Use this only when two contacts are confirmed duplicates and the system should consolidate them.
|
|
118
|
-
|
|
119
|
-
Not for: Do not use this for routine contact edits or identity cleanup.
|
|
120
|
-
|
|
121
|
-
Writes: writes_state.
|
|
122
|
-
|
|
123
|
-
| Parameter | Type | Required | Values / description |
|
|
124
|
-
| --- | --- | --- | --- |
|
|
125
|
-
| winner | object | yes | Winner contact. Provide contactId or identity. |
|
|
126
|
-
| loser | object | yes | Loser contact. Provide contactId or identity. |
|
|
127
|
-
| reasonSummary | string | no | Optional merge reason. |
|
|
128
|
-
| now | integer | no | Optional merge timestamp. |
|
|
129
|
-
|
|
130
|
-
## manage_duplicate_dismissal
|
|
131
|
-
|
|
132
|
-
Dismiss or un-dismiss a duplicate candidate pair so it does not resurface in listDuplicateCandidates.
|
|
133
|
-
|
|
134
|
-
Use when: Use dismiss after confirming two contacts are different people (not duplicates). Use undismiss to re-surface a pair for re-evaluation.
|
|
135
|
-
|
|
136
|
-
Not for: Do not use this to merge contacts — use merge_contacts for confirmed duplicates.
|
|
137
|
-
|
|
138
|
-
Writes: writes_state.
|
|
139
|
-
|
|
140
|
-
| Parameter | Type | Required | Values / description |
|
|
141
|
-
| --- | --- | --- | --- |
|
|
142
|
-
| action | string | yes | dismiss, undismiss. Action to perform. |
|
|
143
|
-
| left | object | yes | Left contact. Provide contactId or identity. |
|
|
144
|
-
| right | object | yes | Right contact. Provide contactId or identity. |
|
|
145
|
-
| reason | any | no | Optional reason for the dismissal. |
|
|
146
|
-
|
|
147
|
-
## manage_identity
|
|
148
|
-
|
|
149
|
-
Add, revise, verify, or remove one routing identity on a contact. Use this for emails, phone numbers, social handles, and URLs — anything that could locate a person. Do not use manage_attribute for these.
|
|
150
|
-
|
|
151
|
-
Use when: Use this for contact identity management such as email, handle, or phone routing keys.
|
|
152
|
-
|
|
153
|
-
Not for: Do not use this for contact core fields, links, or attributes.
|
|
154
|
-
|
|
155
|
-
Writes: writes_state.
|
|
156
|
-
|
|
157
|
-
| Parameter | Type | Required | Values / description |
|
|
158
|
-
| --- | --- | --- | --- |
|
|
159
|
-
| action | string | yes | add, revise, verify, remove. Operation to perform. |
|
|
160
|
-
| contact | object | no | Target contact. Required when action=add. Provide contactId or identity. |
|
|
161
|
-
| input | object | no | New identity payload. Required when action=add. |
|
|
162
|
-
| identityId | integer | no | Identity id. Required when action=revise, verify, or remove. |
|
|
163
|
-
| patch | object | no | Identity patch. Required when action=revise. |
|
|
164
|
-
| verifiedAt | integer | no | Verification timestamp. Optional for action=verify. |
|
|
165
|
-
| removedAt | integer | no | Removal timestamp. Optional for action=remove. |
|
|
166
|
-
|
|
167
|
-
## manage_relationship
|
|
168
|
-
|
|
169
|
-
Seed social links, revise bond and state, and manage structural ties. Seed a link as soon as a relationship is mentioned — do not wait for repeated evidence.
|
|
170
|
-
|
|
171
|
-
Use when: Use this for direct relationship modeling and link-state changes.
|
|
172
|
-
|
|
173
|
-
Not for: Do not use this for recording social evidence or resolving commitments.
|
|
174
|
-
|
|
175
|
-
Writes: writes_state.
|
|
176
|
-
|
|
177
|
-
| Parameter | Type | Required | Values / description |
|
|
178
|
-
| --- | --- | --- | --- |
|
|
179
|
-
| action | string | yes | seed_social_link, revise_bond, override_state, set_structural_tie, remove_structural_tie. Operation to perform. |
|
|
180
|
-
| from | object | no | Source contact. Required when action=seed_social_link or set_structural_tie. Provide contactId or identity. |
|
|
181
|
-
| to | object | no | Target contact. Required when action=seed_social_link or set_structural_tie. Provide contactId or identity. |
|
|
182
|
-
| kind | string | no | Link kind. Required for seed_social_link and set_structural_tie. Can be passed here or inside input. For seed_social_link: personal, family, professional, romantic, care, service, observed, other_relational. For set_structural_tie: works_at, manages, member_of, married_to, partner_of, parent_of, child_of, sibling_of, friend_of, client_of, vendor_of, reports_to, belongs_to, other_structural. |
|
|
183
|
-
| role | string | no | Optional role for seed_social_link or set_structural_tie. Can be passed here or inside input. |
|
|
184
|
-
| input | object | no | Full payload for seed_social_link or set_structural_tie. Alternative to top-level kind/role. |
|
|
185
|
-
| link | object | no | Target link. Required when action=revise_bond, override_state, or remove_structural_tie. Provide linkId or endpoints. |
|
|
186
|
-
| bond | any | no | Bond text. Required when action=revise_bond. Null to clear. |
|
|
187
|
-
| state | string | no | active, dormant, strained, broken, archived. Link state. Required when action=override_state. |
|
|
188
|
-
| options | object | no | Optional metadata. |
|
|
189
|
-
| removedAt | integer | no | Removal timestamp. Optional for action=remove_structural_tie. |
|
|
190
|
-
|
|
191
|
-
## record_event
|
|
192
|
-
|
|
193
|
-
Record one social event such as an interaction, observation, milestone, or transaction. For interactions, milestones, and transactions the owner contact is auto-injected into participants if missing. Observations may omit the owner when recording third-party evidence.
|
|
194
|
-
|
|
195
|
-
Use when: Use this when you are capturing something that happened in the relationship graph.
|
|
196
|
-
|
|
197
|
-
Not for: Do not use this for commitments, date anchors, or direct relationship state overrides.
|
|
198
|
-
|
|
199
|
-
Writes: writes_state.
|
|
200
|
-
|
|
201
|
-
| Parameter | Type | Required | Values / description |
|
|
202
|
-
| --- | --- | --- | --- |
|
|
203
|
-
| kind | string | yes | interaction, observation, milestone, transaction. Event kind. |
|
|
204
|
-
| input | object | yes | Event payload. Always required. Interaction events also require `type`. |
|
|
205
|
-
|
|
206
|
-
## manage_commitment
|
|
207
|
-
|
|
208
|
-
Record or resolve one commitment such as a promise or agreement. The owner contact is auto-injected into participants if missing.
|
|
209
|
-
|
|
210
|
-
Use when: Use this when the work is specifically about a commitment lifecycle rather than a general event.
|
|
211
|
-
|
|
212
|
-
Not for: Do not use this for ordinary interactions or direct relationship state changes.
|
|
213
|
-
|
|
214
|
-
Writes: writes_state.
|
|
215
|
-
|
|
216
|
-
| Parameter | Type | Required | Values / description |
|
|
217
|
-
| --- | --- | --- | --- |
|
|
218
|
-
| action | string | yes | record, resolve. Operation to perform. |
|
|
219
|
-
| input | object | no | Commitment payload. Required when action=record. |
|
|
220
|
-
| commitmentEventId | integer | no | Commitment event id. Required when action=resolve. |
|
|
221
|
-
| resolution | string | no | kept, cancelled, broken. How the commitment was resolved. Required when action=resolve. |
|
|
222
|
-
| options | object | no | Optional metadata. |
|
|
223
|
-
|
|
224
|
-
## manage_date_anchor
|
|
225
|
-
|
|
226
|
-
Add, revise, or remove recurring date anchors on contacts or links. Use this for birthdays, anniversaries, and yearly events — not manage_attribute.
|
|
227
|
-
|
|
228
|
-
Use when: Use this for birthdays, anniversaries, renewals, memorials, and other recurring anchors.
|
|
229
|
-
|
|
230
|
-
Not for: Do not use this for one-off events or relationship state changes.
|
|
231
|
-
|
|
232
|
-
Writes: writes_state.
|
|
233
|
-
|
|
234
|
-
| Parameter | Type | Required | Values / description |
|
|
235
|
-
| --- | --- | --- | --- |
|
|
236
|
-
| action | string | yes | add, revise, remove. Operation to perform. |
|
|
237
|
-
| input | object | no | Date anchor payload. Required when action=add. |
|
|
238
|
-
| anchorEventId | integer | no | Anchor event id. Required when action=revise or remove. |
|
|
239
|
-
| patch | object | no | Anchor patch. Required when action=revise. |
|
|
240
|
-
| options | object | no | Optional metadata. |
|
|
241
|
-
| removedAt | integer | no | Removal timestamp. Optional for action=remove. |
|
|
242
|
-
|
|
243
|
-
## manage_attribute
|
|
244
|
-
|
|
245
|
-
Set, unset, or replace custom metadata attributes on contacts and links. For emails, phones, handles, and URLs use manage_identity instead — those are routing keys, not attributes.
|
|
246
|
-
|
|
247
|
-
Use when: Use this for metadata such as tags, notes, or small labeled facts attached to a contact or link.
|
|
248
|
-
|
|
249
|
-
Not for: Do not use this for core contact fields, identities, or direct relationship mechanics.
|
|
250
|
-
|
|
251
|
-
Writes: writes_state.
|
|
252
|
-
|
|
253
|
-
| Parameter | Type | Required | Values / description |
|
|
254
|
-
| --- | --- | --- | --- |
|
|
255
|
-
| action | string | yes | set, unset, replace. Operation to perform. |
|
|
256
|
-
| target | object | no | Attribute target. Always required. |
|
|
257
|
-
| name | string | no | Attribute name. Required when action=set or unset. |
|
|
258
|
-
| value | any | no | Attribute value. Required when action=set. Null for presence/tag semantics. |
|
|
259
|
-
| entries | array | no | Key-value map to replace all attributes. Required when action=replace. |
|
|
260
|
-
| removedAt | integer | no | Removal timestamp. Optional for action=unset. |
|
|
261
|
-
|
|
262
|
-
## Workflow guides
|
|
263
|
-
|
|
264
|
-
- [bootstrap-and-cold-start](skills/affinity/references/bootstrap-and-cold-start.md): Establish a clean Affinity baseline with one owner, one verified identity, and the minimum structure needed for later evidence and review work.
|
|
265
|
-
- [identify-and-locate-contacts](skills/affinity/references/identify-and-locate-contacts.md): Find the right contact reliably, prefer stable natural keys when possible, and avoid creating duplicates through weak lookup discipline.
|
|
266
|
-
- [import-history-without-faking-evidence](skills/affinity/references/import-history-without-faking-evidence.md): Import pre-existing relationship state honestly, using seeded links for known history instead of inventing fake journal evidence.
|
|
267
|
-
- [model-structure-orgs-and-households](skills/affinity/references/model-structure-orgs-and-households.md): Model factual structure such as employment, membership, hierarchy, and household ties without confusing it with live relational mechanics.
|
|
268
|
-
- [record-direct-evidence-well](skills/affinity/references/record-direct-evidence-well.md): Record direct owner-facing social evidence in a way that produces truthful mechanics, good moments, and useful future review surfaces.
|
|
269
|
-
- [record-observations-and-referrals](skills/affinity/references/record-observations-and-referrals.md): Capture third-party and referral truth without overclaiming intimacy, directness, or trust that the operator did not actually earn.
|
|
270
|
-
- [capture-transactions-and-commercial-events](skills/affinity/references/capture-transactions-and-commercial-events.md): Capture commercially meaningful interactions as transactions so operational and service relationships accumulate the right evidence shape.
|
|
271
|
-
- [manage-promises-and-agreements](skills/affinity/references/manage-promises-and-agreements.md): Track obligations explicitly from creation to resolution so open commitments remain actionable and trust consequences stay honest.
|
|
272
|
-
- [manage-recurring-dates-and-reminders](skills/affinity/references/manage-recurring-dates-and-reminders.md): Use date anchors for recurring salience so important birthdays, anniversaries, renewals, and memorials feed review surfaces cleanly.
|
|
273
|
-
- [review-radar-progression-and-graph](skills/affinity/references/review-radar-progression-and-graph.md): Use the review surfaces to prioritize maintenance, understand progression readiness, and read the shape of the relationship graph without guessing from raw rows.
|
|
274
|
-
- [reconcile-duplicates-and-merge-safely](skills/affinity/references/reconcile-duplicates-and-merge-safely.md): Review duplicate candidates carefully and merge only after the identity, history, and structural consequences are understood.
|
|
275
|
-
|
|
276
|
-
## Principles
|
|
78
|
+
### Tool index
|
|
79
|
+
|
|
80
|
+
- **search_affinity**: Search contacts by name, identity, attributes, link roles, bonds and event text.
|
|
81
|
+
- **review_affinity**: Review one affinity surface such as contacts, journals, link queues, commitments, dates, graph state, or merge history..
|
|
82
|
+
- **inspect_affinity_item**: Inspect one exact affinity item such as the owner profile, a contact profile, or one link detail..
|
|
83
|
+
- **manage_contact**: Create, revise, export or permanently delete a contact (confirm: true required; owner cannot be deleted).
|
|
84
|
+
- **merge_contacts**: Merge one loser contact into one winner contact using explicit contact locators..
|
|
85
|
+
- **manage_duplicate_dismissal**: Dismiss or un-dismiss a duplicate candidate pair so it does not resurface in review_affinity contacts.duplicates..
|
|
86
|
+
- **manage_identity**: Add, revise, verify, or remove one routing identity on a contact.
|
|
87
|
+
- **manage_relationship**: Seed social links, revise bond and state, and manage structural ties.
|
|
88
|
+
- **record_event**: Record one social event such as an interaction, observation, milestone, or transaction.
|
|
89
|
+
- **manage_commitment**: Record or resolve one commitment such as a promise or agreement.
|
|
90
|
+
- **manage_date_anchor**: Add, revise, or remove recurring date anchors on contacts or links.
|
|
91
|
+
- **manage_attribute**: Set, unset, or replace custom metadata attributes on contacts, links and events.
|
|
92
|
+
- **manage_event**: Revise or delete one event by eventId or external reference.
|
|
93
|
+
|
|
94
|
+
Parameter details and examples: `ghostpaw-affinity skill tools` or `ghostpaw-affinity describe <tool>`.
|
|
95
|
+
|
|
96
|
+
### Workflow guides
|
|
97
|
+
|
|
98
|
+
- `ghostpaw-affinity skill bootstrap-and-cold-start`: Establish a clean Affinity baseline with one owner, one verified identity, and the minimum structure needed for later evidence and review work.
|
|
99
|
+
- `ghostpaw-affinity skill identify-and-locate-contacts`: Find the right contact reliably, prefer stable natural keys when possible, and avoid creating duplicates through weak lookup discipline.
|
|
100
|
+
- `ghostpaw-affinity skill import-history-without-faking-evidence`: Import pre-existing relationship state honestly, using seeded links for known history instead of inventing fake journal evidence.
|
|
101
|
+
- `ghostpaw-affinity skill model-structure-orgs-and-households`: Model factual structure such as employment, membership, hierarchy, and household ties without confusing it with live relational mechanics.
|
|
102
|
+
- `ghostpaw-affinity skill record-direct-evidence-well`: Record direct owner-facing social evidence in a way that produces truthful mechanics, good moments, and useful future review surfaces.
|
|
103
|
+
- `ghostpaw-affinity skill record-observations-and-referrals`: Capture third-party and referral truth without overclaiming intimacy, directness, or trust that the operator did not actually earn.
|
|
104
|
+
- `ghostpaw-affinity skill capture-transactions-and-commercial-events`: Capture commercially meaningful interactions as transactions so operational and service relationships accumulate the right evidence shape.
|
|
105
|
+
- `ghostpaw-affinity skill manage-promises-and-agreements`: Track obligations explicitly from creation to resolution so open commitments remain actionable and trust consequences stay honest.
|
|
106
|
+
- `ghostpaw-affinity skill manage-recurring-dates-and-reminders`: Use date anchors for recurring salience so important birthdays, anniversaries, renewals, and memorials feed review surfaces cleanly.
|
|
107
|
+
- `ghostpaw-affinity skill review-radar-progression-and-graph`: Use the review surfaces to prioritize maintenance, understand progression readiness, and read the shape of the relationship graph without guessing from raw rows.
|
|
108
|
+
- `ghostpaw-affinity skill reconcile-duplicates-and-merge-safely`: Review duplicate candidates carefully and merge only after the identity, history, and structural consequences are understood.
|
|
109
|
+
- `ghostpaw-affinity skill tools`: Tool parameters, nested fields, and examples.
|
|
110
|
+
|
|
111
|
+
### Principles
|
|
277
112
|
|
|
278
113
|
- Honor evidence before narrative.
|
|
279
114
|
- Clarify before you act.
|
|
@@ -281,3 +116,9 @@ Writes: writes_state.
|
|
|
281
116
|
- Read derived signals with judgment.
|
|
282
117
|
- Protect relationship integrity over time.
|
|
283
118
|
- Follow the operational protocol.
|
|
119
|
+
|
|
120
|
+
From the binary: `ghostpaw-affinity skill <guide>`.
|
|
121
|
+
|
|
122
|
+
## Without the binary
|
|
123
|
+
|
|
124
|
+
Use `npx -y @ghostpaw/affinity ...` (Node.js 24 or newer), or import `@ghostpaw/affinity` as a library.
|