@ericrisco/rsc 0.1.14 → 0.1.16

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
@@ -71,7 +71,7 @@ Run it inside any project and describe what you want. Working on the catalog
71
71
  itself? Clone and link:
72
72
 
73
73
  ```bash
74
- git clone https://github.com/ericrisco/skills.git ~/rsc-skills
74
+ git clone https://github.com/ericrisco/rsc-harness.git ~/rsc-skills
75
75
  cd ~/rsc-skills && npm install && npm link
76
76
  ```
77
77
 
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.14",
2
+ "version": "0.1.16",
3
3
  "counts": {
4
4
  "skills": 231
5
5
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ericrisco/rsc",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "Eric Risco's agent-skills catalog as a granular, self-recommending CLI installer.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -47,13 +47,13 @@
47
47
  ],
48
48
  "license": "MIT",
49
49
  "author": "Eric Risco",
50
- "homepage": "https://github.com/ericrisco/skills#readme",
50
+ "homepage": "https://github.com/ericrisco/rsc-harness#readme",
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "git+https://github.com/ericrisco/skills.git"
53
+ "url": "git+https://github.com/ericrisco/rsc-harness.git"
54
54
  },
55
55
  "bugs": {
56
- "url": "https://github.com/ericrisco/skills/issues"
56
+ "url": "https://github.com/ericrisco/rsc-harness/issues"
57
57
  },
58
58
  "publishConfig": {
59
59
  "access": "public"
@@ -11,7 +11,7 @@ profiles: [minimal, core, full]
11
11
  The **harness** is the control plane of a workspace. A workspace need not be code: it can be a company, an ops desk, a legal archive, a personal knowledge vault. Whatever it is, the harness is the durable apparatus that keeps it operable and legible, made of three parts:
12
12
 
13
13
  - **`01-TOOLS/<PROVIDER>/`** — the operational tooling layer. One folder per external provider, co-locating credentials (`.env`) with the scripts that consume them. Each tool ships a working `test_connection` against the real API.
14
- - **`02-DOCS/`** — the **Karpathy chaos→knowledge engine**: a domain-agnostic LLM wiki (`inbox/` + `raw/` + `raw/worklog/` + `wiki/` + `wiki/index.md` + `wiki/log.md` + `wiki/gaps.md` + `wiki/scores.json` + the `.base` views), fully embedded in this skill. It feeds from **two on-ramps**: (1) the user drops **any raw file in any format** (PDF, image, CSV, JSON, txt, html…) into `inbox/`, and an **Inbox Sweep** ("the agent goes for a walk") extracts, classifies, cross-links, and compiles it; (2) a **Worklog Sweep** captures **what we do** — every meaningful session of work is itself a `raw` source (`raw/worklog/`) compiled into the wiki, fired by a `PreCompact`/`SessionEnd` hook, by an explicit milestone (a commit), or by the daily curation automation (`references/daily-curation-automation.md`). The wiki is **Obsidian-native**: wikilinks, YAML frontmatter (Properties), readable filenames, and `.base` views give a real graph + live tables — structure, **not vector DB / embeddings / RAG**. The agent writes it; the human reads it in Obsidian. See `references/wiki-protocol.md` for the protocol, `references/ingest-formats.md` for the multiformat Fetch, `references/wiki-worklog-template.md` for the work capture, and `references/obsidian-scaffolding.md` for the vault scaffolding. Topics are inferred from content (`finanzas/`, `legal/`, `crm/`…), never hardcoded. The wiki **self-improves continuously**: every Ingest, Sweep and Query triggers a Maintenance Pass (deterministic lint, score recomputation, gap detection, Related/See-Also sweep), and every N interactions a Micro-Improve runs. Deep Improve runs on explicit request or via the scheduled daily curation. No external skill needed.
14
+ - **`02-DOCS/`** — the **Karpathy chaos→knowledge engine**: a domain-agnostic LLM wiki (`inbox/` + `raw/` + `raw/worklog/` + `wiki/` + `wiki/index.md` + `wiki/log.md` + `wiki/gaps.md` + `wiki/scores.json` + the `.base` views), fully embedded in this skill. It feeds from **two on-ramps**: (1) the user drops **any raw file in any format** (PDF, image, CSV, JSON, txt, html…) into `inbox/`, and an **Auto-Ingest Sweep** ("the agent goes for a walk") extracts, classifies, cross-links, and compiles it — and goes further, **discovering un-ingested documents anywhere in the workspace** (a stray `/transcripts`, `/facturas`…), bounded by `.rscignore` and de-duplicated by the `wiki/.ingested.json` ledger, fired automatically at SessionStart (when the inbox has material) and by the daily cron. Ingest is non-destructive (originals are copied, never moved); removing an emptied folder needs explicit consent; (2) a **Worklog Sweep** captures **what we do** — every meaningful session of work is itself a `raw` source (`raw/worklog/`) compiled into the wiki, fired by a `PreCompact`/`SessionEnd` hook, by an explicit milestone (a commit), or by the daily curation automation (`references/daily-curation-automation.md`). The wiki is **Obsidian-native**: wikilinks, YAML frontmatter (Properties), readable filenames, and `.base` views give a real graph + live tables — structure, **not vector DB / embeddings / RAG**. The agent writes it; the human reads it in Obsidian. See `references/wiki-protocol.md` for the protocol, `references/ingest-formats.md` for the multiformat Fetch, `references/wiki-worklog-template.md` for the work capture, and `references/obsidian-scaffolding.md` for the vault scaffolding. Topics are inferred from content (`finanzas/`, `legal/`, `crm/`…), never hardcoded. The wiki **self-improves continuously**: every Ingest, Sweep and Query triggers a Maintenance Pass (deterministic lint, score recomputation, gap detection, Related/See-Also sweep), and every N interactions a Micro-Improve runs. Deep Improve runs on explicit request or via the scheduled daily curation. No external skill needed.
15
15
  - **The Knowledge map** — the `## Knowledge map` section of the root `CLAUDE.md` that indexes the wiki (including the `harness/` topic) and is read by every other skill before it works in its area.
16
16
 
17
17
  `harness` is the **protagonist concept**. `init` is the bootstrap front door — it gauges the user, drafts the profile, and hands off the first scaffold. THIS skill (`harness`) is the **ongoing control**: it audits, migrates, scaffolds, sweeps the inbox, and keeps the wiki, the tooling and the Knowledge map honest over the life of the workspace. It also generates root `CLAUDE.md` and `AGENTS.md`, and migrates legacy `XX-*` numbered folders into the canonical layout.
@@ -14,7 +14,10 @@ cron via the `schedule` skill pointed at this prompt.
14
14
 
15
15
  Run once per day, at a quiet hour, to keep the second brain alive:
16
16
 
17
- - process pending `raw/worklog/` and `inbox/` material into `wiki/`
17
+ - run the **Auto-Ingest Sweep**: process `inbox/`, then scan the workspace (minus
18
+ `.rscignore`) for un-ingested documents, ingest the clearly-documentary folders,
19
+ record them in `wiki/.ingested.json`, and propose the ambiguous ones
20
+ - process pending `raw/worklog/` material into `wiki/`
18
21
  - strengthen weak / low-score pages; fill one open gap
19
22
  - repair links and the graph (resolve broken wikilinks, add `## Related` where proper nouns recur)
20
23
  - mark `stale` pages whose sources moved on
@@ -26,17 +29,21 @@ Daily, at a quiet hour when the user is unlikely to be editing the vault.
26
29
 
27
30
  ## Scope (paths)
28
31
 
29
- `raw/worklog/`, `inbox/`, `raw/`, `wiki/`, `wiki/harness/`.
32
+ The **workspace root** (for Auto-Ingest discovery, bounded by `.rscignore`),
33
+ `raw/worklog/`, `inbox/`, `raw/`, `wiki/`, `wiki/.ingested.json`, `wiki/harness/`.
30
34
 
31
35
  ## Prompt
32
36
 
33
37
  ```text
34
38
  Run the daily curation pass for this 02-DOCS second brain.
35
39
 
36
- Use the harness wiki-protocol.md as the contract. Compile pending raw/worklog/
37
- and inbox/ material into wiki/ pages (update existing before creating new),
38
- keep frontmatter + wikilinks consistent, append significant decisions to
39
- wiki/harness/decisions.md, refresh the .base-backed navigation, recompute
40
+ Use the harness wiki-protocol.md as the contract. First run the Auto-Ingest Sweep:
41
+ process inbox/, then scan the workspace (minus .rscignore) for un-ingested documents,
42
+ ingest the clearly-documentary folders (copy originals, never move), record them in
43
+ wiki/.ingested.json, and list ambiguous folders as proposals (do not grab them).
44
+ Then compile pending raw/worklog/ material into wiki/ pages (update existing before
45
+ creating new), keep frontmatter + wikilinks consistent, append significant decisions
46
+ to wiki/harness/decisions.md, refresh the .base-backed navigation, recompute
40
47
  scores.json + the score: property, and append a dated entry to wiki/log.md.
41
48
 
42
49
  Be conservative. If the topic map no longer fits, record a recommendation in
@@ -0,0 +1,48 @@
1
+ # Ignore defaults — what the Auto-Ingest Sweep must never scan
2
+
3
+ The Auto-Ingest Sweep discovers un-ingested documents across the whole workspace.
4
+ `02-DOCS/.rscignore` scopes that scan so it never grabs code, build output, tooling,
5
+ the wiki's own internals, or non-document files. This is the single guardrail that
6
+ keeps "automatic, workspace-wide" from turning into "tragar lo que no toca".
7
+
8
+ `02-DOCS/.rscignore` is **tracked** (not gitignored): the team shares the same scan
9
+ boundary. Users append their own patterns freely.
10
+
11
+ ## Default `02-DOCS/.rscignore`
12
+
13
+ ```gitignore
14
+ # 02-DOCS/.rscignore — paths the Auto-Ingest Sweep must NEVER scan as a knowledge source.
15
+ # Tracked (the team shares it). Append your own patterns below.
16
+ node_modules/
17
+ .git/
18
+ .next/
19
+ dist/
20
+ build/
21
+ .venv/
22
+ __pycache__/
23
+ .dart_tool/
24
+ .pytest_cache/
25
+ .ruff_cache/
26
+ 01-TOOLS/
27
+ 02-DOCS/inbox/_processed/
28
+ 02-DOCS/raw/
29
+ 02-DOCS/wiki/
30
+ .DS_Store
31
+ # Only document-like files are candidates anyway — pdf, docx, doc, md, txt, csv,
32
+ # tsv, json, html, rtf, and doc-like images (png/jpg of scans). Everything else
33
+ # (code, archives, binaries, lockfiles) is ignored even outside these paths.
34
+ ```
35
+
36
+ ## App source dirs are ignored at scan time
37
+
38
+ Beyond the file above, the sweep adds every detected **app source directory** to the
39
+ effective ignore set: any directory carrying a manifest (`package.json`,
40
+ `pyproject.toml`, `pubspec.yaml`, `go.mod`, `Cargo.toml`) and its tree. Source code is
41
+ never a knowledge source — `02-DOCS/wiki/` is where understanding about the code lives,
42
+ written deliberately, not scraped from the repo.
43
+
44
+ ## Why `02-DOCS/raw/` and `02-DOCS/wiki/` are ignored
45
+
46
+ They are *outputs* of ingestion, not inputs. Scanning them would re-ingest the wiki
47
+ into itself. `inbox/` is the only `02-DOCS/` subtree the sweep reads as a source
48
+ (plus discovered external folders).
@@ -17,6 +17,7 @@ skill required. When the parent skill (`SKILL.md`) reaches Phase 4 step 8
17
17
  - [Ingest](#ingest) · [Fetch](#fetch-raw) · [Compile](#compile-wiki) · [Cascade Updates](#cascade-updates) · [Post-Ingest](#post-ingest)
18
18
  - [Inbox Sweep — "el agente sale a pasear"](#inbox-sweep--el-agente-sale-a-pasear)
19
19
  - [Worklog Sweep — work-driven capture](#worklog-sweep--work-driven-capture)
20
+ - [Auto-Ingest Sweep — automatic, workspace-wide](#auto-ingest-sweep--automatic-workspace-wide)
20
21
  - [Query](#query)
21
22
  - [Lint](#lint) · [Deterministic Checks](#deterministic-checks-auto-fix) · [Heuristic Checks](#heuristic-checks-report-only)
22
23
  - [Continuous Improvement](#continuous-improvement) — Maintenance Pass / Micro-Improve / Deep Improve
@@ -172,6 +173,9 @@ exist. Create only what is missing; never overwrite existing files:
172
173
  - `02-DOCS/wiki/log.md` — heading `# Wiki Log`, empty body
173
174
  - `02-DOCS/wiki/gaps.md` — heading `# Knowledge Gaps`, empty body
174
175
  - `02-DOCS/wiki/scores.json` — `{}` (populated by the first Maintenance Pass)
176
+ - `02-DOCS/wiki/.ingested.json` — `{}` (the Auto-Ingest Sweep's seen-ledger)
177
+ - `02-DOCS/.rscignore` — the scan boundary for the Auto-Ingest Sweep, from
178
+ `ingest-ignore-defaults.md` (tracked, not gitignored)
175
179
  - `02-DOCS/wiki/reports/` directory (with `.gitkeep`) — will hold Deep Improve reports
176
180
  - `02-DOCS/audits/` directory (with `.gitkeep`) — holds per-run audit reports
177
181
  from the parent skill (`audit-YYYY-MM-DD-HHMM.html`). May already exist if
@@ -426,6 +430,62 @@ Append to `02-DOCS/wiki/log.md`:
426
430
 
427
431
  ---
428
432
 
433
+ ## Auto-Ingest Sweep — automatic, workspace-wide
434
+
435
+ The Inbox Sweep processes what the user *dropped* in `inbox/`. The **Auto-Ingest
436
+ Sweep** extends it: it also **discovers** un-ingested documents anywhere in the
437
+ workspace and ingests them on its own — so the user never has to remember to file
438
+ sources. It runs automatically (SessionStart nudge + daily cron; see Triggers) and
439
+ on request.
440
+
441
+ The hard rule that keeps "automatic, workspace-wide" safe: **ingesting is
442
+ non-destructive** (read + create wiki pages + copy the original into
443
+ `raw/<topic>/_originals/`), so it is safe to do unattended. **Moving or deleting
444
+ anything is destructive** and always requires explicit, quoted consent.
445
+
446
+ ### Steps
447
+
448
+ 1. **inbox/** — run the Inbox Sweep on `inbox/` (unchanged).
449
+ 2. **Scan** — walk the workspace minus `.rscignore` (and minus detected app source
450
+ dirs). Consider only document-like files. A file is **un-ingested** when its
451
+ `path` is absent from `wiki/.ingested.json` OR its content hash differs.
452
+ 3. **Classify** each candidate folder:
453
+ - **Clearly documentary** (a folder of docs/transcripts/pdfs, no code) →
454
+ **auto-ingest**: Compile to `wiki/`, copy the original into
455
+ `raw/<topic>/_originals/` (**copy, never move** — the source stays put).
456
+ - **Ambiguous** (mixed, or possibly app data) → **list it and propose**; do not
457
+ touch it. Log it to `gaps.md` so the next pass remembers.
458
+ 4. **Record** every ingested source in `wiki/.ingested.json`.
459
+ 5. **Offer cleanup** — for a folder the sweep fully ingested, **offer** to remove it
460
+ once empty, with the consent quoted back from the user. **Never auto-delete**, and
461
+ never a folder the sweep did not itself empty.
462
+
463
+ ### Ledger — `wiki/.ingested.json`
464
+
465
+ The seen-ledger; the single source of truth for "what we've already ingested",
466
+ which makes the workspace scan idempotent (the Inbox Sweep alone tracks
467
+ processed-ness only by moving files to `inbox/_processed/`).
468
+
469
+ ```json
470
+ {
471
+ "<relpath-from-workspace-root>": { "hash": "sha256:…", "ingested": "YYYY-MM-DD", "topic": "…" }
472
+ }
473
+ ```
474
+
475
+ Un-ingested = path absent OR hash changed. `inbox/` files still move to
476
+ `inbox/_processed/` **and** get a ledger entry. Initialized as `{}`.
477
+
478
+ ### Auto-Ingest safety rails
479
+
480
+ - **Ledger-idempotent.** Never reprocess a source whose path+hash is recorded.
481
+ - **Scoped by `.rscignore`.** Never scan code, build output, `01-TOOLS/`, the
482
+ wiki's own `raw/`+`wiki/`, or non-document files (see `ingest-ignore-defaults.md`).
483
+ - **Copy, don't move.** Discovered originals are copied; the source is left in place.
484
+ - **Consent for destruction.** Removing an emptied folder is quoted-consent only.
485
+ - **Ambiguity is proposed, not grabbed.**
486
+
487
+ ---
488
+
429
489
  ## Query
430
490
 
431
491
  Search the wiki and answer questions. Examples of triggers:
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env bash
2
2
  # rsc SessionStart payload (claude). Wired by targets/claude.js.
3
3
  # $1 = absolute path to suggest's SKILL.md $2 = absolute project root
4
- # Always emits suggest's always-on body; appends an onboarding banner only when
5
- # the workspace has no harness profile yet and the user has not opted out.
4
+ # Always emits suggest's always-on body; appends an onboarding banner when the
5
+ # workspace has no harness profile yet, and an auto-ingest nudge when there is
6
+ # un-ingested material waiting in the inbox.
6
7
  set -u
7
8
 
8
9
  cat "$1" 2>/dev/null
@@ -20,3 +21,23 @@ If the user does not want a harness here: create .rsc/.no-harness
20
21
  ==========================
21
22
  BANNER
22
23
  fi
24
+
25
+ # Auto-Ingest nudge: when a harness wiki exists and the inbox holds a real file
26
+ # (anything other than README.md / dotfiles / the _processed archive), tell the
27
+ # agent to run the Auto-Ingest Sweep. The hook only reminds; the agent does the
28
+ # scan + ingest. Cheap signal here; the thorough workspace scan lives in the sweep.
29
+ inbox="$2/02-DOCS/inbox"
30
+ if [ -d "$2/02-DOCS/wiki" ] && [ -d "$inbox" ]; then
31
+ pending=$(find "$inbox" -maxdepth 1 -type f ! -name 'README.md' ! -name '.*' 2>/dev/null | head -1)
32
+ if [ -n "$pending" ]; then
33
+ cat <<'BANNER'
34
+
35
+ ===== rsc auto-ingest =====
36
+ Un-ingested material is waiting in 02-DOCS/inbox/.
37
+ ACTION: run the Auto-Ingest Sweep now — ingest inbox/, then scan the workspace
38
+ (minus .rscignore) for un-ingested documents, recording them in wiki/.ingested.json.
39
+ Originals are copied, never moved; deleting an emptied folder needs explicit consent.
40
+ ===========================
41
+ BANNER
42
+ fi
43
+ fi