@olegkoval/agent-skills 1.38.1 → 1.38.3

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
@@ -341,6 +341,8 @@ When adding or changing a skill:
341
341
 
342
342
  ### Shared context store
343
343
 
344
+ ![How the agent context store works: the five resolution steps, the three skills that use the store, and the four states every run ends in](docs/assets/context-store-card.png)
345
+
344
346
  `retro-analysis` and `shared-knowledge-artifact` share one private GitHub repository,
345
347
  resolved through the `context-repo` skill the first time either one runs. It finds a
346
348
  store before it creates one: private repositories are probed for a root `ledger.json`
@@ -23,7 +23,8 @@ description: >
23
23
  form.
24
24
  license: MIT
25
25
  allowed-tools: Bash, Read, Write, Edit, Agent, Workflow, AskUserQuestion, Artifact
26
- compatibility: Claude Code only. Requires the Workflow tool (multi-agent orchestration)
26
+ compatibility: >
27
+ Claude Code only. Requires the Workflow tool (multi-agent orchestration)
27
28
  and the Artifact tool (living review page): other Agent Skills-compatible tools
28
29
  without an equivalent to Workflow cannot run the review/verify/critic pipeline this
29
30
  skill depends on. Requires git and gh (GitHub CLI) authenticated.
@@ -25,6 +25,98 @@ time an agent has no access to the Artifact page that came before it. A durable,
25
25
  cross-machine store is what makes "compare this retro to the last one" or "what have
26
26
  other agents already learned" answerable at all.
27
27
 
28
+ ## How it works
29
+
30
+ The resolver searches for an existing private store before offering creation. The
31
+ diagram includes the silent reuse paths, the explicit consent boundary, and every
32
+ terminal status the caller can receive.
33
+
34
+ ```mermaid
35
+ flowchart TD
36
+ start["Caller asks for the store"] --> pointer{"Normal pointer?"}
37
+ pointer -->|"Yes"| clone{"Local clone exists?"}
38
+ clone -->|"Yes"| visibility{"Fresh remote read is private?"}
39
+ visibility -->|"Yes"| ready1["READY: reuse, no prompt"]
40
+ visibility -->|"Public"| discover["Exhaustive private-store discovery"]
41
+ visibility -->|"Not found or access denied"| discover
42
+ visibility -->|"Network, API, or rate limit after retry"| blocked1["BLOCKED: visibility unknown"]
43
+ clone -->|"No"| remote2{"Remote read succeeds?"}
44
+ remote2 -->|"Private"| reclone["Clone to the fixed path"]
45
+ reclone --> verifyclone{"Fresh visibility read is private?"}
46
+ verifyclone -->|"Yes"| ready2["READY: adopted and re-cloned"]
47
+ verifyclone -->|"No"| blocked2["BLOCKED: verification failed"]
48
+ remote2 -->|"Network or API failure"| blocked3["BLOCKED: cannot verify or clone"]
49
+ remote2 -->|"Not found, access denied, or public"| discover
50
+
51
+ pointer -->|"No, or stale"| refusal{"Refusal pointer?"}
52
+ refusal -->|"Yes, no explicit resume"| local1["LOCAL_ONLY: prior refusal"]
53
+ refusal -->|"No, or explicit resume"| discover
54
+ discover --> probe{"All private repositories probed?"}
55
+ probe -->|"No: retry still failed"| blocked4["BLOCKED: discovery incomplete"]
56
+ probe -->|"Exactly one private match"| adopt["Adopt matching store"]
57
+ probe -->|"Several matches"| choose["User chooses; no clone or pointer write yet"]
58
+ choose --> adopt
59
+ probe -->|"No matches"| preconditions["Check gh and repo authentication"]
60
+ adopt --> adoptread["Fresh private read, then clone and read again"]
61
+ adoptread --> ready3["READY: existing store adopted"]
62
+ preconditions -->|"Missing or unauthenticated"| blocked5["BLOCKED: gh auth login -s repo"]
63
+ preconditions -->|"Pass"| prompt["Ask once: owner, name, private, exact paths"]
64
+ prompt -->|"n"| local2["LOCAL_ONLY: this run only"]
65
+ prompt -->|"never"| local3["LOCAL_ONLY: refusal pointer recorded"]
66
+ prompt -->|"y"| create["Create private repo, clone, seed, commit, push"]
67
+ create --> verify{"Fresh remote and local reads agree?"}
68
+ verify -->|"Yes"| writepointer["Write normal pointer"]
69
+ writepointer --> created["CREATED: verified receipt"]
70
+ verify -->|"No"| blocked6["BLOCKED: no pointer written"]
71
+ ```
72
+
73
+ On a normal first run, the caller waits while `context-repo` completes discovery,
74
+ checks prerequisites, asks once, creates the private store, and verifies it from
75
+ fresh reads before returning a receipt.
76
+
77
+ ```mermaid
78
+ sequenceDiagram
79
+ participant Caller as Calling skill
80
+ participant Context as context-repo
81
+ participant User as User
82
+ participant CLI as gh and git
83
+ participant Remote as GitHub
84
+
85
+ Caller->>Context: Resolve durable store
86
+ Context->>CLI: List private owner repositories
87
+ CLI->>Remote: Probe each repository tree
88
+ Remote-->>CLI: No matching ledger + retro layout
89
+ CLI-->>Context: Exhaustive discovery complete
90
+ Context->>CLI: gh --version and gh auth status
91
+ CLI-->>Context: Preconditions pass
92
+ Context->>CLI: gh api user -q .login
93
+ CLI-->>Context: Authenticated owner
94
+ Context->>User: Ask once before creation
95
+ Note over Context,User: Private store, exact pointer and clone paths,<br/>README.md, AGENTS.md, .gitignore, ledger.json, retro/
96
+ User-->>Context: y
97
+ Context->>CLI: gh repo create owner/name --private
98
+ CLI->>Remote: Create repository
99
+ Remote-->>CLI: Created
100
+ Context->>CLI: git clone and seed the store
101
+ CLI-->>Context: Local initialized tree
102
+ Context->>CLI: git add, commit, and push
103
+ CLI->>Remote: Push initialization commit
104
+ Note over Context,Remote: A successful-looking push is not proof
105
+ Context->>CLI: gh repo view owner/name --json nameWithOwner,visibility
106
+ CLI->>Remote: Fresh visibility read
107
+ Remote-->>CLI: PRIVATE
108
+ Context->>CLI: git -C clone rev-parse HEAD
109
+ CLI-->>Context: Fresh local SHA
110
+ Context->>Context: Confirm both reads and write the pointer
111
+ Context-->>Caller: CREATED with repo, clone, and init SHA
112
+ ```
113
+
114
+ The callers then own distinct content in the same clone: `retro-analysis` writes
115
+ one uniquely named Markdown snapshot under `retro/`, while
116
+ `shared-knowledge-artifact` appends notes to the root `ledger.json` and treats its
117
+ Artifact page as the user-facing view. Both follow the store's lease, pull-before-
118
+ push, validation, append-only, and no-force-push rules.
119
+
28
120
  ## Repository layout
29
121
 
30
122
  ```text
@@ -0,0 +1,377 @@
1
+ <title>Agent Context Store</title>
2
+ <link href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700&amp;family=JetBrains+Mono:wght@500;600;700&amp;display=swap" rel="stylesheet">
3
+ <style>
4
+ :root {
5
+ --page-ground: #0A0A0A;
6
+ --surface: #141414;
7
+ --border: #262626;
8
+ --accent: #FFC53D;
9
+ --heading: #F5F5F5;
10
+ --body: #A3A3A3;
11
+ --metadata: #6B6B6B;
12
+ --rose: #B56576;
13
+ --green: #5C8A63;
14
+ --ink-dark: #141414;
15
+ --transparent: transparent;
16
+ --warm-glow: rgb(255 197 61 / 5%);
17
+ --mono: "JetBrains Mono", "SFMono-Regular", Consolas, "Liberation Mono", monospace;
18
+ --sans: "Figtree", "Avenir Next", Avenir, "Segoe UI", sans-serif;
19
+ }
20
+
21
+ * {
22
+ box-sizing: border-box;
23
+ margin: 0;
24
+ }
25
+
26
+ body {
27
+ min-height: 100vh;
28
+ display: grid;
29
+ place-items: center;
30
+ padding: 28px;
31
+ overflow-x: hidden;
32
+ background: radial-gradient(circle at 4% 4%, var(--warm-glow), var(--transparent) 34%), var(--page-ground);
33
+ color: var(--body);
34
+ font-family: var(--sans);
35
+ }
36
+
37
+ .frame {
38
+ width: min(1500px, calc(100vw - 56px));
39
+ max-width: 1500px;
40
+ /* A 16:9 floor, not a clamp. A hard aspect-ratio plus overflow:hidden made the
41
+ cards paint over the state strip whenever the copy needed one more line. */
42
+ min-height: calc(min(1500px, 100vw - 56px) * 9 / 16);
43
+ display: grid;
44
+ grid-template-rows: auto auto auto auto auto;
45
+ gap: 13px;
46
+ padding: 24px 30px 20px;
47
+ background: var(--surface);
48
+ border: 1px solid var(--border);
49
+ border-radius: 10px;
50
+ }
51
+
52
+ .title-band,
53
+ .skill-card,
54
+ .state-strip,
55
+ .closing-band,
56
+ .state-copy,
57
+ .state-item {
58
+ display: flex;
59
+ flex-direction: column;
60
+ }
61
+
62
+ .title-band {
63
+ gap: 5px;
64
+ }
65
+
66
+ h1 {
67
+ color: var(--accent);
68
+ font-family: var(--mono);
69
+ font-size: 1.95rem;
70
+ font-weight: 700;
71
+ letter-spacing: 0.11em;
72
+ line-height: 1.08;
73
+ }
74
+
75
+ .subtitle {
76
+ color: var(--body);
77
+ font-size: 0.95rem;
78
+ line-height: 1.35;
79
+ }
80
+
81
+ .pipeline {
82
+ display: grid;
83
+ grid-template-columns: repeat(4, minmax(0, 1fr) 28px) minmax(0, 1fr);
84
+ align-items: center;
85
+ gap: 8px;
86
+ }
87
+
88
+ .pipeline-step {
89
+ display: grid;
90
+ place-items: center;
91
+ min-height: 38px;
92
+ padding: 7px 10px;
93
+ border: 1px solid var(--border);
94
+ border-radius: 7px;
95
+ color: var(--body);
96
+ font-family: var(--mono);
97
+ font-size: 0.76rem;
98
+ font-weight: 600;
99
+ line-height: 1.15;
100
+ text-align: center;
101
+ }
102
+
103
+ .pipeline-step.highlight {
104
+ border-color: var(--accent);
105
+ color: var(--accent);
106
+ }
107
+
108
+ .arrow {
109
+ color: var(--metadata);
110
+ font-family: var(--mono);
111
+ font-size: 1rem;
112
+ text-align: center;
113
+ }
114
+
115
+ .cards {
116
+ display: grid;
117
+ align-content: start;
118
+ grid-template-columns: repeat(3, minmax(0, 1fr));
119
+ gap: 16px;
120
+ min-height: 0;
121
+ }
122
+
123
+ .skill-card {
124
+ gap: 9px;
125
+ min-width: 0;
126
+ padding: 16px 17px 15px;
127
+ border: 1px solid var(--border);
128
+ border-radius: 9px;
129
+ }
130
+
131
+ .eyebrow,
132
+ .strip-label {
133
+ color: var(--accent);
134
+ font-family: var(--mono);
135
+ font-size: 0.72rem;
136
+ font-weight: 700;
137
+ font-variant-numeric: tabular-nums;
138
+ letter-spacing: 0.14em;
139
+ line-height: 1.2;
140
+ text-transform: uppercase;
141
+ }
142
+
143
+ .skill-card h2 {
144
+ color: var(--heading);
145
+ font-size: 1.16rem;
146
+ font-weight: 600;
147
+ line-height: 1.2;
148
+ }
149
+
150
+ .divider {
151
+ height: 1px;
152
+ background: var(--border);
153
+ }
154
+
155
+ .card-copy {
156
+ display: flex;
157
+ flex-direction: column;
158
+ gap: 7px;
159
+ color: var(--body);
160
+ font-size: 0.87rem;
161
+ line-height: 1.32;
162
+ }
163
+
164
+ .state-strip {
165
+ gap: 9px;
166
+ padding: 13px 17px 12px;
167
+ border: 1px solid var(--border);
168
+ border-radius: 9px;
169
+ }
170
+
171
+ .state-row {
172
+ display: grid;
173
+ grid-template-columns: repeat(4, minmax(128px, 1fr)) minmax(250px, 1.45fr);
174
+ align-items: stretch;
175
+ gap: 10px;
176
+ }
177
+
178
+ .state-item {
179
+ justify-content: center;
180
+ gap: 4px;
181
+ min-height: 54px;
182
+ padding: 8px 11px;
183
+ border: 1px solid var(--border);
184
+ border-radius: 7px;
185
+ }
186
+
187
+ .state-name {
188
+ color: var(--heading);
189
+ font-family: var(--mono);
190
+ font-size: 0.76rem;
191
+ font-weight: 700;
192
+ letter-spacing: 0.06em;
193
+ }
194
+
195
+ .state-detail {
196
+ color: var(--body);
197
+ font-size: 0.72rem;
198
+ line-height: 1.24;
199
+ }
200
+
201
+ .state-ready {
202
+ border-color: var(--green);
203
+ }
204
+
205
+ .state-ready .state-name {
206
+ color: var(--green);
207
+ }
208
+
209
+ .state-created {
210
+ background: var(--accent);
211
+ border-color: var(--accent);
212
+ }
213
+
214
+ .state-created .state-name,
215
+ .state-created .state-detail {
216
+ color: var(--ink-dark);
217
+ }
218
+
219
+ .state-blocked {
220
+ border-color: var(--rose);
221
+ }
222
+
223
+ .state-blocked .state-name {
224
+ color: var(--rose);
225
+ }
226
+
227
+ .state-copy {
228
+ justify-content: center;
229
+ color: var(--body);
230
+ font-size: 0.88rem;
231
+ line-height: 1.35;
232
+ }
233
+
234
+ .proof-line {
235
+ color: var(--heading);
236
+ font-size: 0.96rem;
237
+ line-height: 1.35;
238
+ }
239
+
240
+ .closing-band {
241
+ gap: 7px;
242
+ }
243
+
244
+ .closing-line {
245
+ color: var(--heading);
246
+ font-size: 1.2rem;
247
+ font-weight: 700;
248
+ line-height: 1.2;
249
+ }
250
+
251
+ .metadata-line {
252
+ display: flex;
253
+ justify-content: space-between;
254
+ gap: 24px;
255
+ color: var(--metadata);
256
+ font-family: var(--mono);
257
+ font-size: 0.63rem;
258
+ line-height: 1.3;
259
+ white-space: nowrap;
260
+ }
261
+
262
+ @media (max-width: 1100px) {
263
+ .frame {
264
+ gap: 12px;
265
+ padding: 22px;
266
+ }
267
+
268
+ h1 {
269
+ font-size: 1.75rem;
270
+ }
271
+
272
+ .skill-card {
273
+ gap: 8px;
274
+ padding: 14px;
275
+ }
276
+
277
+ .card-copy,
278
+ .state-copy {
279
+ font-size: 0.76rem;
280
+ }
281
+
282
+ .metadata-line {
283
+ font-size: 0.51rem;
284
+ }
285
+ }
286
+
287
+ @media (prefers-reduced-motion: reduce) {
288
+ *,
289
+ *::before,
290
+ *::after {
291
+ scroll-behavior: auto;
292
+ }
293
+ }
294
+ </style>
295
+
296
+ <main class="frame" aria-labelledby="card-title">
297
+ <header class="title-band">
298
+ <h1 id="card-title">AGENT CONTEXT STORE</h1>
299
+ <p class="subtitle">One private repository holds shared context: discover first, ask once, then verify before claiming success.</p>
300
+ </header>
301
+
302
+ <section class="pipeline" aria-label="Context repository resolution order">
303
+ <div class="pipeline-step">check pointer</div>
304
+ <div class="arrow" aria-hidden="true">→</div>
305
+ <div class="pipeline-step">discover stores</div>
306
+ <div class="arrow" aria-hidden="true">→</div>
307
+ <div class="pipeline-step highlight">ask if needed</div>
308
+ <div class="arrow" aria-hidden="true">→</div>
309
+ <div class="pipeline-step">create + seed</div>
310
+ <div class="arrow" aria-hidden="true">→</div>
311
+ <div class="pipeline-step">verify + record</div>
312
+ </section>
313
+
314
+ <section class="cards" aria-label="Three skills that use the context store">
315
+ <article class="skill-card">
316
+ <p class="eyebrow">SKILL 01</p>
317
+ <h2><code>context-repo</code></h2>
318
+ <div class="divider" aria-hidden="true"></div>
319
+ <div class="card-copy">
320
+ <p>Discovers or resolves one private GitHub repository and its fixed local clone.</p>
321
+ <p>Never claims ready or created until fresh remote and local reads agree.</p>
322
+ </div>
323
+ </article>
324
+
325
+ <article class="skill-card">
326
+ <p class="eyebrow">SKILL 02</p>
327
+ <h2><code>retro-analysis</code></h2>
328
+ <div class="divider" aria-hidden="true"></div>
329
+ <div class="card-copy">
330
+ <p>Writes one uniquely named snapshot under <code>retro/</code>, after reading the store.</p>
331
+ <p>Shared history powers <code>compare</code> and <code>global</code> across machines.</p>
332
+ </div>
333
+ </article>
334
+
335
+ <article class="skill-card">
336
+ <p class="eyebrow">SKILL 03</p>
337
+ <h2><code>shared-knowledge-artifact</code></h2>
338
+ <div class="divider" aria-hidden="true"></div>
339
+ <div class="card-copy">
340
+ <p>Appends notes to the root <code>ledger.json</code>; the Artifact page is the user-facing view.</p>
341
+ <p>Git is canonical; viewer-only notes reach it on the next agent publish.</p>
342
+ </div>
343
+ </article>
344
+ </section>
345
+
346
+ <section class="state-strip" aria-labelledby="state-title">
347
+ <p class="strip-label" id="state-title">EVERY RUN ENDS IN ONE STATE</p>
348
+ <div class="state-row">
349
+ <div class="state-item state-ready">
350
+ <p class="state-name">READY</p>
351
+ <p class="state-detail">existing or adopted, nothing created</p>
352
+ </div>
353
+ <div class="state-item state-created">
354
+ <p class="state-name">CREATED</p>
355
+ <p class="state-detail">new store, read back and verified</p>
356
+ </div>
357
+ <div class="state-item">
358
+ <p class="state-name">LOCAL_ONLY</p>
359
+ <p class="state-detail">declined, or store not resolved</p>
360
+ </div>
361
+ <div class="state-item state-blocked">
362
+ <p class="state-name">BLOCKED</p>
363
+ <p class="state-detail"><code>gh</code>, discovery, or verification failed</p>
364
+ </div>
365
+ <p class="state-copy">The caller always gets a definite answer, never a silent partial success.</p>
366
+ </div>
367
+ <p class="proof-line">A push that appears to succeed is <strong>not proof</strong>. <strong>CREATED</strong> is claimed only after a <strong>fresh read-back agrees</strong>.</p>
368
+ </section>
369
+
370
+ <footer class="closing-band">
371
+ <p class="closing-line">One consented store gives every skill durable context with explicit verification.</p>
372
+ <div class="metadata-line">
373
+ <span>${XDG_CONFIG_HOME:-$HOME/.config}/agent-context/config.json · ${XDG_DATA_HOME:-$HOME/.local/share}/agent-context/repo</span>
374
+ <span>oleg-koval/agent-skills</span>
375
+ </div>
376
+ </footer>
377
+ </main>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.38.1",
3
+ "version": "1.38.3",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-apple-kit",
3
3
  "description": "Build and ship Apple platform apps: macOS menubar apps, App Store submissions.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-creative",
3
3
  "description": "Creative and personal projects: photo galleries, music players, listings, wiki editing.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-garmin-kit",
3
3
  "description": "Build, test and publish Garmin Connect IQ watch faces.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-git-tools",
3
3
  "description": "Everyday git and GitHub CLI operations: conventional commits, branch hygiene.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-github-pr",
3
3
  "description": "Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descriptions, dependency triage.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -23,7 +23,8 @@ description: >
23
23
  form.
24
24
  license: MIT
25
25
  allowed-tools: Bash, Read, Write, Edit, Agent, Workflow, AskUserQuestion, Artifact
26
- compatibility: Claude Code only. Requires the Workflow tool (multi-agent orchestration)
26
+ compatibility: >
27
+ Claude Code only. Requires the Workflow tool (multi-agent orchestration)
27
28
  and the Artifact tool (living review page): other Agent Skills-compatible tools
28
29
  without an equivalent to Workflow cannot run the review/verify/critic pipeline this
29
30
  skill depends on. Requires git and gh (GitHub CLI) authenticated.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-obsidian",
3
3
  "description": "Keep an Obsidian vault in sync with work: PR sync, task rollover, morning routine.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-product",
3
3
  "description": "Take a product idea to a shippable build: MVP passes, full-stack scaffolds, launch plans.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-reflection",
3
3
  "description": "Look back and improve: self-critique, retrospectives, performance review, rapid learning.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-release",
3
3
  "description": "Ship a release: semantic-release setup, changelogs, store listing copy, release-day routine.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-skill-meta",
3
3
  "description": "Author and maintain agent skills and the AI toolchain itself.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-web-ops",
3
3
  "description": "Operate a website: WAF rules, search console audits, analytics bootstrap, docs indexes.",
4
- "version": "1.38.1",
4
+ "version": "1.38.3",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },