@ericrisco/rsc 3.0.12 → 3.0.13
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 +4 -4
- package/manifest.json +33 -3
- package/package.json +1 -1
- package/scripts/lib/default-skill-floor.js +5 -1
- package/scripts/lib/domains.js +1 -1
- package/skills/connect-tool/SKILL.md +173 -0
- package/skills/connect-tool/evals/cases.yaml +58 -0
- package/skills/harness/SKILL.md +4 -4
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@ericrisco/rsc)
|
|
8
8
|
[](https://www.npmjs.com/package/@ericrisco/rsc)
|
|
9
|
-
[](#the-catalog)
|
|
10
10
|
[](LICENSE)
|
|
11
11
|
[](https://github.com/ericrisco/rsc-harness/stargazers)
|
|
12
12
|
|
|
@@ -376,7 +376,7 @@ $ rsc onboard
|
|
|
376
376
|
██████╗ ███████╗ ██████╗ ← animated gradient wordmark
|
|
377
377
|
██╔══██╗██╔════╝██╔════╝
|
|
378
378
|
██████╔╝███████╗██║
|
|
379
|
-
|
|
379
|
+
271 skills · one CLI · zero bloat
|
|
380
380
|
|
|
381
381
|
How should I talk to you?
|
|
382
382
|
What are you building or running?
|
|
@@ -698,7 +698,7 @@ just asks in plain language.
|
|
|
698
698
|
|
|
699
699
|
## The catalog
|
|
700
700
|
|
|
701
|
-
|
|
701
|
+
271 skills, grouped by what you're trying to do. Click any skill to read its
|
|
702
702
|
`SKILL.md`. It fires on its own when a task matches.
|
|
703
703
|
|
|
704
704
|
### 🧭 Core & control plane
|
|
@@ -770,7 +770,7 @@ Each with a `02-DOCS` feedback loop that learns from your own results. `remotion
|
|
|
770
770
|
|
|
771
771
|
### 🔌 Connect & automate
|
|
772
772
|
|
|
773
|
-
[stripe](skills/stripe/) · [email-connector](skills/email-connector/) · [google-workspace](skills/google-workspace/) · [notion-connector](skills/notion-connector/) · [whatsapp-telegram](skills/whatsapp-telegram/) · [automation-flows](skills/automation-flows/) · [api-connector-builder](skills/api-connector-builder/) · [webhooks](skills/webhooks/) · [data-scraper](skills/data-scraper/) · [spreadsheet-ops](skills/spreadsheet-ops/) · [calendar-scheduling](skills/calendar-scheduling/) · [document-processing](skills/document-processing/) · [e-signature](skills/e-signature/)
|
|
773
|
+
[connect-tool](skills/connect-tool/) · [stripe](skills/stripe/) · [email-connector](skills/email-connector/) · [google-workspace](skills/google-workspace/) · [notion-connector](skills/notion-connector/) · [whatsapp-telegram](skills/whatsapp-telegram/) · [automation-flows](skills/automation-flows/) · [api-connector-builder](skills/api-connector-builder/) · [webhooks](skills/webhooks/) · [data-scraper](skills/data-scraper/) · [spreadsheet-ops](skills/spreadsheet-ops/) · [calendar-scheduling](skills/calendar-scheduling/) · [document-processing](skills/document-processing/) · [e-signature](skills/e-signature/)
|
|
774
774
|
|
|
775
775
|
### ⚙️ Automation
|
|
776
776
|
|
package/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.0.
|
|
2
|
+
"version": "3.0.13",
|
|
3
3
|
"counts": {
|
|
4
|
-
"skills":
|
|
4
|
+
"skills": 271,
|
|
5
5
|
"agents": 34,
|
|
6
6
|
"commands": 53,
|
|
7
7
|
"fixedCommands": 20
|
|
@@ -810,6 +810,35 @@
|
|
|
810
810
|
],
|
|
811
811
|
"profiles": []
|
|
812
812
|
},
|
|
813
|
+
{
|
|
814
|
+
"id": "connect-tool",
|
|
815
|
+
"description": "Use when the user names a specific tool to connect to the agent (an ERP, accounting or desktop program, CRM, WhatsApp, a spreadsheet, a database): research its real docs, choose the safest route, build `01-TOOLS/<TOOL>/` with a test that proves it, and guide the user. NOT a full typed API client (that is `api-connector-builder`), NOT a whole-workspace tooling scan (that is `harness`).",
|
|
816
|
+
"tags": [
|
|
817
|
+
"connect",
|
|
818
|
+
"integration",
|
|
819
|
+
"erp",
|
|
820
|
+
"legacy",
|
|
821
|
+
"desktop",
|
|
822
|
+
"database",
|
|
823
|
+
"read-only",
|
|
824
|
+
"mcp",
|
|
825
|
+
"api",
|
|
826
|
+
"export",
|
|
827
|
+
"least-privilege",
|
|
828
|
+
"onboarding"
|
|
829
|
+
],
|
|
830
|
+
"recommends": [
|
|
831
|
+
"harness",
|
|
832
|
+
"api-connector-builder",
|
|
833
|
+
"automation-strategy",
|
|
834
|
+
"automation-flows"
|
|
835
|
+
],
|
|
836
|
+
"profiles": [
|
|
837
|
+
"minimal",
|
|
838
|
+
"core",
|
|
839
|
+
"full"
|
|
840
|
+
]
|
|
841
|
+
},
|
|
813
842
|
{
|
|
814
843
|
"id": "constitution",
|
|
815
844
|
"description": "Use when setting or amending a project's non-negotiables — stack canon, quality bars, conventions, security/a11y floors — as numbered, testable rules later phases obey. First rsc-sdd phase; writes 02-DOCS/wiki/sdd/constitution.md. NOT a feature spec (that is `specify`), NOT the technical plan (that is `plan`), NOT the wiki itself (that is `harness`).",
|
|
@@ -2293,7 +2322,8 @@
|
|
|
2293
2322
|
"knowledge"
|
|
2294
2323
|
],
|
|
2295
2324
|
"recommends": [
|
|
2296
|
-
"init"
|
|
2325
|
+
"init",
|
|
2326
|
+
"connect-tool"
|
|
2297
2327
|
],
|
|
2298
2328
|
"profiles": [
|
|
2299
2329
|
"minimal",
|
package/package.json
CHANGED
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
// routes ordinary work to `../ftd/SKILL.md`, so a harness without it has a default
|
|
11
11
|
// lane that points at nothing. Membership of every profile was not enough — a
|
|
12
12
|
// declaration written before the skill existed never gains it (see `syncInstalled`).
|
|
13
|
-
|
|
13
|
+
//
|
|
14
|
+
// `connect-tool` joined in 3.0.13 (issue #303): rsc ships no ready-made connections, so "connect my
|
|
15
|
+
// Holded" is answered by a method, not a list, and that method has to be there the first time the
|
|
16
|
+
// user asks, in any kind of project. Like `unslop`, only its description is paid for on other turns.
|
|
17
|
+
export const DEFAULT_SKILL_FLOOR = Object.freeze(['orient', 'suggest', 'unslop', 'ftd', 'connect-tool']);
|
|
14
18
|
|
|
15
19
|
export function withDefaultSkillFloor(skillIds = []) {
|
|
16
20
|
return [...new Set([...DEFAULT_SKILL_FLOOR, ...skillIds])];
|
package/scripts/lib/domains.js
CHANGED
|
@@ -11,7 +11,7 @@ export const DOMAINS = [
|
|
|
11
11
|
{ title: 'Legal, privacy & compliance', ids: ['gdpr-privacy', 'terms-conditions', 'compliance', 'data-policy', 'ip-trademark'] },
|
|
12
12
|
{ title: 'Market & brand', ids: ['marketing', 'seo-geo', 'content-engine', 'social-publisher', 'brand-voice', 'brand-identity', 'newsletter', 'landing-copy', 'ads', 'article-writing', 'case-studies', 'video-shorts', 'podcast', 'market-research', 'competitor-watch', 'press-kit', 'community', 'webinar', 'review-management'] },
|
|
13
13
|
{ title: 'Grow a channel (YouTube / TikTok / Reels / LinkedIn / Medium)', ids: ['youtube-api', 'youtube-strategy', 'youtube-ideation', 'youtube-thumbnails', 'youtube-packaging', 'remotion-video', 'tiktok-api', 'instagram-api', 'shortform-strategy', 'shortform-ideation', 'shortform-packaging', 'shortform-editing', 'viral-score', 'linkedin-api', 'linkedin-strategy', 'linkedin-content', 'linkedin-carousels', 'linkedin-outreach', 'medium-writing', 'medium-publishing', 'medium-strategy'] },
|
|
14
|
-
{ title: 'Connect & automate', ids: ['stripe', 'email-connector', 'google-workspace', 'notion-connector', 'whatsapp-telegram', 'automation-flows', 'api-connector-builder', 'webhooks', 'data-scraper', 'spreadsheet-ops', 'calendar-scheduling', 'document-processing', 'e-signature'] },
|
|
14
|
+
{ title: 'Connect & automate', ids: ['connect-tool', 'stripe', 'email-connector', 'google-workspace', 'notion-connector', 'whatsapp-telegram', 'automation-flows', 'api-connector-builder', 'webhooks', 'data-scraper', 'spreadsheet-ops', 'calendar-scheduling', 'document-processing', 'e-signature'] },
|
|
15
15
|
{ title: 'Automation platforms', ids: ['automation-strategy', 'n8n', 'make', 'zapier', 'power-automate'] },
|
|
16
16
|
{ title: 'Data & analytics', ids: ['analytics', 'dashboard', 'kpi-framework', 'reporting', 'ab-testing', 'forecasting', 'data-cleaning', 'business-intelligence'] },
|
|
17
17
|
{ title: 'AI — build it in', ids: ['building-agents', 'rag', 'embeddings-search', 'prompt-engineering', 'llm-pipeline', 'agent-eval', 'chatbot', 'ai-media', 'replicate-images', 'structured-extraction', 'agent-safety', 'cost-tracking'] },
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: connect-tool
|
|
3
|
+
description: "Use when the user names a specific tool to connect to the agent (an ERP, accounting or desktop program, CRM, WhatsApp, a spreadsheet, a database): research its real docs, choose the safest route, build `01-TOOLS/<TOOL>/` with a test that proves it, and guide the user. NOT a full typed API client (that is `api-connector-builder`), NOT a whole-workspace tooling scan (that is `harness`)."
|
|
4
|
+
tags: [connect, integration, erp, legacy, desktop, database, read-only, mcp, api, export, least-privilege, onboarding]
|
|
5
|
+
recommends: [harness, api-connector-builder, automation-strategy, automation-flows]
|
|
6
|
+
profiles: [minimal, core, full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Connect a tool: research it, pick the safe route, prove it works
|
|
11
|
+
|
|
12
|
+
The user said *"connect my Holded"*, *"can the agent read our Sage?"*, *"hook up WhatsApp"*. This
|
|
13
|
+
skill turns that sentence into a working, documented connection in `01-TOOLS/<TOOL>/`, for **any**
|
|
14
|
+
tool: the ones with a modern API, and the program installed on an office PC fifteen years ago.
|
|
15
|
+
|
|
16
|
+
rsc ships no ready-made connections. Every project builds only the ones its user asks for, so the
|
|
17
|
+
method matters more than any list of vendors: **find the truth, take the least dangerous route,
|
|
18
|
+
prove it, leave it written down.**
|
|
19
|
+
|
|
20
|
+
## Before anything: what does the user want to do?
|
|
21
|
+
|
|
22
|
+
Ask only what the docs cannot answer, in plain words (`technical_level` in
|
|
23
|
+
`02-DOCS/wiki/harness/user-profile.md` sets the register):
|
|
24
|
+
|
|
25
|
+
- **Which product, exactly?** Name, edition, version. "Sage" is five different products.
|
|
26
|
+
- **Where does it run?** In the cloud (a website they log into) or installed on a computer or
|
|
27
|
+
server in the office.
|
|
28
|
+
- **Read or write?** Reports and questions need reading. Entering invoices needs writing, and
|
|
29
|
+
writing is a separate, explicit decision (below).
|
|
30
|
+
- **Who administers it?** Themselves, an IT person, an accounting firm, the vendor's distributor.
|
|
31
|
+
That person often holds the keys, and step 5 writes the message for them.
|
|
32
|
+
|
|
33
|
+
## 1. Research: the docs decide, never memory
|
|
34
|
+
|
|
35
|
+
Look it up every time, even for a tool you "know": plans, endpoints and MCP servers change monthly.
|
|
36
|
+
In this order, stopping when the route is clear:
|
|
37
|
+
|
|
38
|
+
1. **The vendor's own developer docs**: search `<product> API`, `<product> developers`,
|
|
39
|
+
`<product> MCP`. Prefer the vendor domain over blog posts.
|
|
40
|
+
2. **The official MCP registry** (`registry.modelcontextprotocol.io`) and the vendor's docs for an
|
|
41
|
+
official MCP server. An official, read-only MCP is often the fastest safe route.
|
|
42
|
+
3. **Library docs** through Context7 when the route is an SDK.
|
|
43
|
+
4. **Export and import features** in the product's user manual: scheduled CSV/Excel exports, FTP
|
|
44
|
+
drops, official import file formats.
|
|
45
|
+
5. **Where the data lives** for installed software: the vendor's installation guide, the database
|
|
46
|
+
engine it installs (often SQL Server Express, sometimes Access, Firebird or MySQL).
|
|
47
|
+
|
|
48
|
+
Write every source into the tool's `README.md` with its URL and the date you read it. **If you find
|
|
49
|
+
nothing reliable, say so** and stop at a question for the vendor; an invented endpoint costs the
|
|
50
|
+
user a week.
|
|
51
|
+
|
|
52
|
+
## 2. Choose the route: the least dangerous one that does the job
|
|
53
|
+
|
|
54
|
+
| Route | Use when | Watch for |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| Official MCP server | The vendor publishes one | Start it read-only if it offers the mode |
|
|
57
|
+
| Official API | Documented REST/GraphQL with scoped tokens | Request read scopes only; full client work goes to `api-connector-builder` |
|
|
58
|
+
| Built-in integration (OAuth app, Zapier/Make/n8n connector) | No API for you, but a supported integration exists | The integration's permissions, not yours, are the ceiling |
|
|
59
|
+
| Scheduled export | The program can export CSV/Excel or drop files to a folder | Freshness is the export schedule, say so |
|
|
60
|
+
| Read-only copy of the database | Installed software with no API and no export | See *Desktop programs* below; never the live database |
|
|
61
|
+
| Screen automation (RPA) | Nothing else exists | Last resort: fragile and breaks on every update |
|
|
62
|
+
|
|
63
|
+
**Connect, or migrate?** If every route above is poor and the program is near end-of-life, or new
|
|
64
|
+
legal requirements (Spanish e-invoicing, Veri\*factu) will force a change anyway, say so plainly
|
|
65
|
+
and hand the decision to `automation-strategy`. Check the current dates at the tax authority's
|
|
66
|
+
site: they have moved before.
|
|
67
|
+
|
|
68
|
+
## 3. Least privilege, always
|
|
69
|
+
|
|
70
|
+
- **Read first.** Every connection starts read-only, even when the goal is writing.
|
|
71
|
+
- **Writing is explicit.** Only when the user asks for it, only through the vendor's API or its
|
|
72
|
+
official import format, and only for the objects named.
|
|
73
|
+
- **Never write directly into a desktop program's database.** It bypasses the program's own
|
|
74
|
+
rules, voids support contracts, and can corrupt accounting. Generate the program's official
|
|
75
|
+
import file instead, and a person imports it.
|
|
76
|
+
- **Secrets stay in `.env`** (gitignored, `chmod 600`). Never in the repo, never in `02-DOCS`.
|
|
77
|
+
|
|
78
|
+
## 4. Build it in `01-TOOLS/<TOOL>/`
|
|
79
|
+
|
|
80
|
+
Copy `01-TOOLS/_TEMPLATE/` to `01-TOOLS/<TOOL>/` (uppercase id, e.g. `HOLDED`, `SAGE_50`) and fill
|
|
81
|
+
every file: `.env.example` with the real variable names, `CREDENTIALS.md` with where each one is
|
|
82
|
+
generated and how to rotate it, `README.md` with the route, the sources and their dates, and the
|
|
83
|
+
permissions granted. Add a row to `01-TOOLS/README.md`.
|
|
84
|
+
|
|
85
|
+
**`test_connection` is the proof, not a formality.** It makes one cheap read and prints
|
|
86
|
+
`OK — …`. When the connection is meant to be read-only, it must also **prove that writing fails**,
|
|
87
|
+
because a read-only promise nobody tested is not one:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# PostgreSQL: a write must fail with a PERMISSION error. Any other error (wrong host, bad password)
|
|
91
|
+
# proves nothing, so it fails the test too instead of passing as "refused".
|
|
92
|
+
out=$(psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -c "BEGIN; CREATE TABLE rsc_write_probe(i int); ROLLBACK;" 2>&1) \
|
|
93
|
+
&& { echo "FAIL — this user can write" >&2; exit 1; }
|
|
94
|
+
grep -qiE "permission denied|read-only transaction" <<<"$out" \
|
|
95
|
+
&& echo "OK — writes refused" || { echo "FAIL — unexpected error: $out" >&2; exit 1; }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# SQL Server: insert into one of the views you exposed; only error 229 (permission denied) passes.
|
|
100
|
+
out=$(sqlcmd -S "$MSSQL_HOST" -U "$MSSQL_USER" -P "$MSSQL_PASSWORD" -d "$MSSQL_DB" -b \
|
|
101
|
+
-Q "BEGIN TRAN; INSERT INTO rsc_views.customers DEFAULT VALUES; ROLLBACK;" 2>&1) \
|
|
102
|
+
&& { echo "FAIL — this user can write" >&2; exit 1; }
|
|
103
|
+
grep -q "Msg 229" <<<"$out" && echo "OK — writes refused" || { echo "FAIL — unexpected error: $out" >&2; exit 1; }
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
For an API, prove it through the token itself: list its scopes from the vendor's token endpoint
|
|
107
|
+
or dashboard and fail when a write scope is present. Never fire a real write to "see what happens".
|
|
108
|
+
|
|
109
|
+
## Desktop programs and old ERPs
|
|
110
|
+
|
|
111
|
+
Most small-business software was never meant to be connected. The safe pattern:
|
|
112
|
+
|
|
113
|
+
1. **Find the data.** The vendor's install guide, the Windows ODBC data sources, or the SQL Server
|
|
114
|
+
instance the program installed (often `.\SQLEXPRESS`). Access files are `.mdb`/`.accdb`.
|
|
115
|
+
2. **Work on a copy, never the live database.** A nightly copy, off business hours. SQL Server
|
|
116
|
+
Express has no Agent: schedule `sqlcmd` with a `BACKUP DATABASE` from the Windows Task
|
|
117
|
+
Scheduler and restore it where the agent reads. Access: copy the file, then convert or read it
|
|
118
|
+
with `mdbtools` (`mdb-tables`, `mdb-export`).
|
|
119
|
+
3. **A dedicated reader.** A login that can only `SELECT`, ideally only on a schema of views that
|
|
120
|
+
expose what is needed:
|
|
121
|
+
|
|
122
|
+
```sql
|
|
123
|
+
CREATE LOGIN ia_reader WITH PASSWORD = '<from .env>';
|
|
124
|
+
CREATE USER ia_reader FOR LOGIN ia_reader;
|
|
125
|
+
GRANT SELECT ON SCHEMA::rsc_views TO ia_reader;
|
|
126
|
+
ALTER ROLE db_denydatawriter ADD MEMBER ia_reader;
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
4. **Reach it privately.** Same network, or a private mesh (the `TAILSCALE` tool). Never open the
|
|
130
|
+
database port to the internet.
|
|
131
|
+
5. **Ask first.** Many vendors and distributors restrict direct database access in their support
|
|
132
|
+
terms. The message in step 5 asks before anyone touches anything.
|
|
133
|
+
|
|
134
|
+
## 5. Guide the user, in their words
|
|
135
|
+
|
|
136
|
+
Say what you found, which route you chose and why, and what happens next, in short sentences. When
|
|
137
|
+
the next step belongs to someone else, write the message for them, ready to send:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
Hi <name>, we want our assistant to READ <data> from <program> for <purpose>.
|
|
141
|
+
Could you create a read-only user (SELECT only, no write permissions) on <database or a copy of
|
|
142
|
+
it>, and tell us the server name and port? We will not modify anything. If your support terms
|
|
143
|
+
prefer another method (an export, an official API), we are happy to use that instead.
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 6. Leave it written down
|
|
147
|
+
|
|
148
|
+
Record the connection in `02-DOCS` following the `harness` wiki protocol: what is connected, the
|
|
149
|
+
route, the permissions, who owns the credentials, and the date. The next session, or a colleague,
|
|
150
|
+
reads it instead of starting over.
|
|
151
|
+
|
|
152
|
+
## Anti-patterns
|
|
153
|
+
|
|
154
|
+
| If you are about to… | Do instead |
|
|
155
|
+
|---|---|
|
|
156
|
+
| Write the endpoint from memory | Read the vendor docs now and cite them with a date |
|
|
157
|
+
| Connect with an admin account "to get started" | Create the read-only user first; it costs ten minutes |
|
|
158
|
+
| Write into the program's database because it is quicker | Generate its official import file |
|
|
159
|
+
| Point the agent at the live database | Read a nightly copy |
|
|
160
|
+
| Call the connection done because it authenticates | Run the test; for read-only, watch the write fail |
|
|
161
|
+
| Promise the vendor has an API or MCP | Say what you found, with links, or that you found nothing |
|
|
162
|
+
| Build the whole typed client here | Hand it to `api-connector-builder` once the route is chosen |
|
|
163
|
+
|
|
164
|
+
## See also
|
|
165
|
+
|
|
166
|
+
- `../harness/SKILL.md`: owns `01-TOOLS/` and `02-DOCS/` as a whole.
|
|
167
|
+
- `../api-connector-builder/SKILL.md`: auth, pagination and retries once an API is the route.
|
|
168
|
+
- `../automation-strategy/SKILL.md`: whether to connect, migrate or automate at all.
|
|
169
|
+
- `../automation-flows/SKILL.md`: chaining the connected tool into a workflow.
|
|
170
|
+
|
|
171
|
+
## Orientación (siempre)
|
|
172
|
+
|
|
173
|
+
Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
skill: connect-tool
|
|
2
|
+
|
|
3
|
+
# Cases for connect-tool: the user names ONE tool to connect to the agent. The skill researches the
|
|
4
|
+
# vendor's real docs, picks the least dangerous route (MCP, API, integration, export, read-only copy
|
|
5
|
+
# of the database, RPA last), builds 01-TOOLS/<TOOL>/ with a test that proves it (and proves writes
|
|
6
|
+
# fail when read-only), guides the user and records it in 02-DOCS. It is NOT the typed API client
|
|
7
|
+
# (api-connector-builder), NOT the whole-workspace scan (harness), NOT whether to automate a process
|
|
8
|
+
# (automation-strategy), NOT chaining services (automation-flows).
|
|
9
|
+
|
|
10
|
+
should_trigger:
|
|
11
|
+
- prompt: "Quiero que el agente lea las facturas de Holded para hacerme un resumen de cobros cada lunes."
|
|
12
|
+
why: "A named cloud tool and a read goal. The route (official API with read scopes, or an MCP if the vendor has one) must come from Holded's current docs, then a 01-TOOLS/HOLDED/ folder with a read test."
|
|
13
|
+
|
|
14
|
+
- prompt: "Tenemos Sage 50 instalado en el ordenador de la oficina. ¿Puede el agente leer los clientes?"
|
|
15
|
+
why: "Desktop software with no public API: the legacy pattern, find where the data lives, read a nightly copy with a SELECT-only login, never the live database, and ask the distributor first."
|
|
16
|
+
|
|
17
|
+
- prompt: "Hook up our WhatsApp Business number so the agent can see incoming orders."
|
|
18
|
+
why: "A named tool where the route is not obvious (the Business app versus the Cloud API). Research decides, and reading orders is the first, read-only step."
|
|
19
|
+
|
|
20
|
+
- prompt: "Mi TPV no tiene API. ¿Qué le pido al informático para que el agente vea las ventas?"
|
|
21
|
+
why: "Non-obvious trigger: no connection yet, the deliverable is the route choice plus the ready-to-send message for the IT person asking for an export or a read-only user."
|
|
22
|
+
|
|
23
|
+
- prompt: "Connect the agent to our Access database, the one the old stock program uses."
|
|
24
|
+
why: "A legacy file database. Copy the .mdb/.accdb, read it with mdbtools or convert it, and never write into the program's file."
|
|
25
|
+
|
|
26
|
+
- prompt: "¿Se puede conectar InstalWin? No sé ni por dónde empezar."
|
|
27
|
+
why: "An obscure vertical program nobody has catalogued: the method (search vendor docs, export features, the database it installs) works for it, and if nothing reliable exists the skill says so."
|
|
28
|
+
|
|
29
|
+
should_not_trigger:
|
|
30
|
+
- prompt: "Write a TypeScript client for the Holded API with pagination, retries and token refresh."
|
|
31
|
+
route_to: "api-connector-builder"
|
|
32
|
+
why: "The route is already decided; what remains is building a robust typed client, which is that skill's job."
|
|
33
|
+
|
|
34
|
+
- prompt: "Set up 01-TOOLS and 02-DOCS for this whole repo and detect every provider we use."
|
|
35
|
+
route_to: "harness"
|
|
36
|
+
why: "A whole-workspace scan and layout, not one named tool."
|
|
37
|
+
|
|
38
|
+
- prompt: "¿Merece la pena automatizar la conciliación bancaria o la seguimos haciendo a mano?"
|
|
39
|
+
route_to: "automation-strategy"
|
|
40
|
+
why: "Whether to automate a process at all; no tool is being connected yet."
|
|
41
|
+
|
|
42
|
+
- prompt: "When a Stripe payment lands, create the invoice in Holded and post it to Slack."
|
|
43
|
+
route_to: "automation-flows"
|
|
44
|
+
why: "Chaining already-connected services into a workflow, not establishing one connection."
|
|
45
|
+
|
|
46
|
+
- prompt: "We need to receive Stripe webhooks and verify their signatures."
|
|
47
|
+
route_to: "webhooks"
|
|
48
|
+
why: "Inbound callbacks into our own service, not connecting the agent to an outside tool."
|
|
49
|
+
|
|
50
|
+
capability:
|
|
51
|
+
- scenario: "A non-technical user says: 'Usamos A3 en un servidor de la oficina, lo lleva una gestoría. Quiero que el agente me diga qué clientes deben dinero.' Show what the agent does from the first answer to the end."
|
|
52
|
+
must_include:
|
|
53
|
+
- "Asks only what the docs cannot answer (edition, where it runs, who administers it) and confirms the goal is reading, not writing"
|
|
54
|
+
- "Researches the vendor's current documentation and cites sources with dates, or says plainly that nothing reliable was found"
|
|
55
|
+
- "Chooses a read-only route and never proposes writing into the program's database; if writing comes up, it goes through the official import format"
|
|
56
|
+
- "Proposes reading a nightly copy with a SELECT-only user, reached privately, never the live database exposed to the internet"
|
|
57
|
+
- "Builds 01-TOOLS/<TOOL>/ from the template with a test_connection that proves reading works AND that a write is refused, telling a permission error apart from any other failure"
|
|
58
|
+
- "Writes the ready-to-send message for the accounting firm asking for a read-only user or an export, and records the connection in 02-DOCS"
|
package/skills/harness/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness
|
|
3
3
|
description: "Use when governing a workspace's control plane, code or not — the `01-TOOLS/` tooling layer, the `02-DOCS/` chaos→knowledge wiki, the root Knowledge map. Audits it, migrates legacy `XX-*` folders, scaffolds provider tooling, sweeps the inbox, writes root CLAUDE.md/AGENTS.md. NOT the bootstrap front door (that is `init`, which hands off here)."
|
|
4
4
|
tags: [harness, company, ops, docs, wiki, connect, tools, knowledge]
|
|
5
|
-
recommends: [init]
|
|
5
|
+
recommends: [init, connect-tool]
|
|
6
6
|
profiles: [minimal, core, full]
|
|
7
7
|
origin: risco
|
|
8
8
|
---
|
|
@@ -81,7 +81,7 @@ for harness-level choices, but defer concrete deploy mechanics to `deployment`,
|
|
|
81
81
|
|
|
82
82
|
The skill proposes, the user confirms, the skill executes. Every destructive operation (deleting a legacy folder, merging into an existing `CLAUDE.md`) requires explicit consent quoted back from the user, not inferred.
|
|
83
83
|
|
|
84
|
-
**Out of scope:** adding a single tool
|
|
84
|
+
**Out of scope:** adding a single tool the user names — that is `../connect-tool/SKILL.md`, which researches the tool and builds `01-TOOLS/<X>/` from the template; and refactoring runtime code — this skill is operational tooling only, never runtime.
|
|
85
85
|
|
|
86
86
|
## Protocol — five phases
|
|
87
87
|
|
|
@@ -152,7 +152,7 @@ Execute in this exact order. Each step writes to disk; abort and report on first
|
|
|
152
152
|
- Same logic for `AGENTS.md`, rendered from `references/agents-md-template.md`.
|
|
153
153
|
2. **Create `01-TOOLS/` skeleton.**
|
|
154
154
|
- Create `01-TOOLS/` directory.
|
|
155
|
-
- Copy `assets/_TEMPLATE/` to `01-TOOLS/_TEMPLATE/`. The asset ships its ignore rules as `gitignore` (no leading dot, because npm never packages a `.gitignore`) and it must land as `.gitignore`; the installer already does this on every apply, so normally you will find the directory built. This template is **generic boilerplate with placeholders (`<NOMBRE_TOOL>`, `<TOOL>_API_KEY`)**.
|
|
155
|
+
- Copy `assets/_TEMPLATE/` to `01-TOOLS/_TEMPLATE/`. The asset ships its ignore rules as `gitignore` (no leading dot, because npm never packages a `.gitignore`) and it must land as `.gitignore`; the installer already does this on every apply, so normally you will find the directory built. This template is **generic boilerplate with placeholders (`<NOMBRE_TOOL>`, `<TOOL>_API_KEY`)**. `../connect-tool/SKILL.md` copies it when the user asks for a tool NOT in the catalog. The skill itself does NOT use `_TEMPLATE/` to generate the detected tools — those come from `providers.yaml`.
|
|
156
156
|
3. **Per detected tool** (in catalog order):
|
|
157
157
|
- Create `01-TOOLS/<ID>/`.
|
|
158
158
|
- Write every file from the provider entry's `files:` map verbatim (replacing template variables: `{{TOOL_ID}}`, `{{DASHBOARD_URL}}`, etc.).
|
|
@@ -279,7 +279,7 @@ Opt out of the size nudge with `.rsc/.no-claudemd-check`.
|
|
|
279
279
|
The consent, merge and `.env` rules live with the phases that enforce them above. These four are
|
|
280
280
|
scope rules that no single phase owns, and breaking one destroys something the user cannot get back:
|
|
281
281
|
|
|
282
|
-
1. **No speculative tools.** A tool is created
|
|
282
|
+
1. **No speculative tools.** A tool is created only when there is evidence: the detector found it in the user's code, or the user asked for it by name (then `../connect-tool/SKILL.md` builds it). No "we should probably have a Sentry tool too".
|
|
283
283
|
2. **Idempotent.** Running the skill twice produces no extra side effects. Re-scanning a project already canonical detects "nothing to do".
|
|
284
284
|
3. **Out-of-scope dirs are invisible.** `node_modules/`, `.venv/`, `.next/`, `__pycache__/`, `.git/`, `dist/`, `build/`, `.dart_tool/` are never read for detection and never touched.
|
|
285
285
|
4. **Subproject internals are out of scope.** `.env.example`, `requirements.txt`, `package.json`, source files inside subprojects are READ for detection only. They are NEVER moved, renamed, modified, or deleted. The skill operates exclusively on workspace-root artifacts (`CLAUDE.md`, `AGENTS.md`, `01-TOOLS/`, `02-DOCS/`, and `XX-*` legacy folders at the root level).
|