toga-ai 1.0.43 → 1.0.45
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/knowledge/clients/compass-canada/profile.md +0 -1
- package/knowledge/clients/compass-usa/profile.md +0 -1
- package/knowledge/clients/elite/INDEX.md +1 -1
- package/knowledge/clients/elite/profile.md +1 -2
- package/knowledge/clients/nycdoe/INDEX.md +1 -1
- package/knowledge/clients/nycdoe/profile.md +1 -2
- package/knowledge/clients/prudential/INDEX.md +1 -1
- package/knowledge/clients/prudential/profile.md +1 -2
- package/knowledge.js +28 -3
- package/package.json +1 -1
- package/skills/capture/SKILL.md +18 -45
- package/skills/kickoff/SKILL.md +16 -42
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
|
|
3
3
|
| Doc | Framework | Summary | Files |
|
|
4
4
|
|-----|-----------|---------|-------|
|
|
5
|
-
| [Elite
|
|
5
|
+
| [Elite](profile.md) | 2.0 | Elite is a managed-services client that uses **Freshservice** as their helpdesk platform. | worker2/Worker/Elite.php, library/app/api/toga2.php |
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
| Doc | Framework | Summary | Files |
|
|
4
4
|
|-----|-----------|---------|-------|
|
|
5
5
|
| [NYCDOE ServiceNow / ASN Integration](features/servicenow-integration.md) | 1.0 | The NYCDOE/ServiceNow integration mirrors DOE's ServiceNow tickets (Incidents + RITMs) into local tables, turns vendor shipment notices into NetSuite Sales Orde | worker/crons/sync/nycdoe/import_asn.php, worker/crons/sync/nycdoe/import_inc.php, worker/crons/sync/nycdoe/legacy_import_asn.php, worker/crons/sync/nycdoe/legacy_process_asn_queue.php, worker/crons/sync/nycdoe/process_tickets.php, worker/crons/sync/nycdoe/1_send_asn_to_netsuite.php, worker/crons/sync/nycdoe/2_send_serials_to_netsuite.php, worker/crons/sync/nycdoe/3_create_installation_ticket.php, worker/crons/sync/nycdoe/send_ticket_updates.php, worker/crons/sync/nycdoe/send_request_item_updates.php, worker/crons/sync/nycdoe/send_nycdoe_proof_of_delivery.php, worker/crons/sync/nycdoe/sync_nycdoe_locations.php, worker/crons/sync/nycdoe/receive_edi_purchase_orders.php, worker/crons/sync/nycdoe/send_edi_open_invoices.php, worker/crons/notifications/nycdoe/, worker/schedules/cron.worker.sync.json, worker/schedules/cron.worker.notification.json, library/app/api/nycdoe.php, library/app/api/nycdoev2.php, library/app/asnprocessor/manufacturer.php, library/app/edi.php |
|
|
6
|
-
| [
|
|
6
|
+
| [New York City Department of Education](profile.md) | 1.0 | NYC DOE (New York City Department of Education) is a TOGA client whose entire integration runs in the **1.0 worker tier** (~30 cron scripts under `worker/crons/ | |
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
| Doc | Framework | Summary | Files |
|
|
4
4
|
|-----|-----------|---------|-------|
|
|
5
5
|
| [Prudential: Dell ASN units PRE/POST interceptor (legacy key + flat tracking)](features/dell-asn-units-interceptor.md) | 2.0 | After the tracking-number bridge migration, the ASN unit route was renamed (`advance-shipping-notice-units` → `advance-shipping-notice-item-units`), so the inhe | _underscore/Model/Prudential/AdvanceShippingNotice.php, dbchanges2/Client_Prudential/2026-06-10 - AsnUnitsInterceptor.sql |
|
|
6
|
-
| [Prudential](profile.md) | 2.0 | Prudential is a TOGA client whose device-fulfillment flow is driven by **Dell** via the Dell API (`Client_Prudential.Apis.id = 2`). | |
|
|
6
|
+
| [Prudential Financial](profile.md) | 2.0 | Prudential is a TOGA client whose device-fulfillment flow is driven by **Dell** via the Dell API (`Client_Prudential.Apis.id = 2`). | |
|
package/knowledge.js
CHANGED
|
@@ -145,6 +145,31 @@ function coreReposFor(registry, framework) {
|
|
|
145
145
|
return registry.filter(r => r.framework === framework && r.role === 'core').map(r => r.repo);
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
+
/* ------------------------------------------------------------------ */
|
|
149
|
+
/* command: manifest — compact pickable lists for kickoff (one call, */
|
|
150
|
+
/* no profile reads). Prints minified JSON {repos:[...],clients:[...]}. */
|
|
151
|
+
/* ------------------------------------------------------------------ */
|
|
152
|
+
|
|
153
|
+
function cmdManifest() {
|
|
154
|
+
const registry = loadRegistry();
|
|
155
|
+
const repos = registry.map(r => ({ repo: r.repo, project: r.project, framework: r.framework, role: r.role }));
|
|
156
|
+
const clients = [];
|
|
157
|
+
const clientsDir = path.join(ROOT, 'clients');
|
|
158
|
+
if (fs.existsSync(clientsDir)) {
|
|
159
|
+
for (const slug of fs.readdirSync(clientsDir, { withFileTypes: true }).filter(e => e.isDirectory()).map(e => e.name)) {
|
|
160
|
+
const profile = path.join(clientsDir, slug, 'profile.md');
|
|
161
|
+
let title = slug, framework = '';
|
|
162
|
+
if (fs.existsSync(profile)) {
|
|
163
|
+
const { data } = parseFrontmatter(fs.readFileSync(profile, 'utf8'));
|
|
164
|
+
title = data.title || slug;
|
|
165
|
+
framework = data.framework || '';
|
|
166
|
+
}
|
|
167
|
+
clients.push({ slug, title, framework });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
console.log(JSON.stringify({ repos, clients }));
|
|
171
|
+
}
|
|
172
|
+
|
|
148
173
|
/* ------------------------------------------------------------------ */
|
|
149
174
|
/* command: deps */
|
|
150
175
|
/* ------------------------------------------------------------------ */
|
|
@@ -258,7 +283,7 @@ function cmdIndex() {
|
|
|
258
283
|
const clientDir = path.join(clientsDir, client);
|
|
259
284
|
const clientDocs = docs.filter(d => d.file.startsWith(clientDir + path.sep));
|
|
260
285
|
const profileDoc = clientDocs.find(d => path.basename(d.file) === 'profile.md');
|
|
261
|
-
const formalName = (profileDoc && profileDoc.data.
|
|
286
|
+
const formalName = (profileDoc && profileDoc.data.title) || client;
|
|
262
287
|
clientFormalNames[client] = formalName;
|
|
263
288
|
const lines = [
|
|
264
289
|
`# Client: ${formalName} \`${client}\``,
|
|
@@ -344,7 +369,6 @@ function cmdValidate() {
|
|
|
344
369
|
const isClientDoc = d.rel.startsWith('clients/');
|
|
345
370
|
if (isClientDoc) {
|
|
346
371
|
if (!d.data.client || d.data.client === 'shared') { fail(`${d.rel}: client doc must set a real "client"`); ok = false; }
|
|
347
|
-
if (path.basename(d.rel) === 'profile.md' && !d.data.name) { fail(`${d.rel}: client profile must set a formal "name" (e.g. name: "Compass USA")`); ok = false; }
|
|
348
372
|
} else {
|
|
349
373
|
// framework/apps doc: framework + repo must match the path
|
|
350
374
|
const parts = d.rel.split('/'); // <fw>/apps/<repo>/... OR <fw>/standards/...
|
|
@@ -380,8 +404,9 @@ function main() {
|
|
|
380
404
|
case 'index': return cmdIndex();
|
|
381
405
|
case 'deps': return cmdDeps(args);
|
|
382
406
|
case 'validate': return cmdValidate();
|
|
407
|
+
case 'manifest': return cmdManifest();
|
|
383
408
|
default:
|
|
384
|
-
console.log('Usage: node knowledge.js <search|index|deps|validate> [--flags]');
|
|
409
|
+
console.log('Usage: node knowledge.js <search|index|deps|validate|manifest> [--flags]');
|
|
385
410
|
process.exitCode = 1;
|
|
386
411
|
}
|
|
387
412
|
}
|
package/package.json
CHANGED
package/skills/capture/SKILL.md
CHANGED
|
@@ -11,17 +11,10 @@ assume**. Nothing is written until the developer approves your proposal.
|
|
|
11
11
|
|
|
12
12
|
### Contribution model
|
|
13
13
|
|
|
14
|
-
Every `/capture`
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
before installing — so the two-way loop is:
|
|
19
|
-
1. `npx toga-harness` seeds knowledge from the npm bundle
|
|
20
|
-
2. `/capture` grows the knowledge base and pushes it back to git
|
|
21
|
-
3. Teammates run `npx toga-harness` → git pull delivers the new docs → they get it
|
|
22
|
-
- The push is **non-blocking**: if offline or credentials are missing, capture is still
|
|
23
|
-
successful and you report a reminder to push manually.
|
|
24
|
-
- Only `knowledge/` files are ever staged — source code is never touched.
|
|
14
|
+
Every `/capture` validates, indexes, then **pushes** `knowledge/` to the team git repo
|
|
15
|
+
(only `knowledge/` is ever staged — never source code). Teammates receive it on their next
|
|
16
|
+
`npx toga-ai` run (which git-pulls before installing). The push is **non-blocking**: if
|
|
17
|
+
offline or unauthenticated, the capture still succeeds — report a manual-push reminder.
|
|
25
18
|
|
|
26
19
|
## Core data model (same as `knowledge/CONVENTIONS.md` and the `kickoff` skill)
|
|
27
20
|
|
|
@@ -146,8 +139,8 @@ For every doc, set/refresh frontmatter: `framework`, `repo`, `project`, `client`
|
|
|
146
139
|
`type`, `status`, `updated` (today's date), `owners`, `files`, `related`.
|
|
147
140
|
Set `owners` to `["<AUTHOR_USERNAME>"]` from Step 1b — **never leave it empty**; when a doc
|
|
148
141
|
already has owners, add `AUTHOR_USERNAME` if missing rather than replacing.
|
|
149
|
-
For a client `profile.md`,
|
|
150
|
-
|
|
142
|
+
For a client `profile.md`, the `title:` **is** the client's formal name (e.g. "Compass USA") —
|
|
143
|
+
there is no separate name field; `validate` requires `title`. See New-client onboarding.
|
|
151
144
|
Add `related:` cross-links. Append new repos to `<TEAM_REPO>/knowledge/registry.json`.
|
|
152
145
|
|
|
153
146
|
## Step 6 — Validate, index, mirror back (mandatory)
|
|
@@ -366,14 +359,13 @@ any client docs:
|
|
|
366
359
|
is used only for the folder name.
|
|
367
360
|
2. **Formal name** — **ASK the developer for the client's formal name** (e.g. "Compass USA",
|
|
368
361
|
"New York City Department of Education"). **Never invent it from the slug.**
|
|
369
|
-
3. Create `clients/<slug>/profile.md`
|
|
370
|
-
|
|
371
|
-
profile missing it fails the build.
|
|
362
|
+
3. Create `clients/<slug>/profile.md` using the formal name as the `title:` (the slug is only
|
|
363
|
+
the folder key — the profile's `title` carries the human-readable client name). `validate`
|
|
364
|
+
**requires** `title` on every doc — a profile missing it fails the build.
|
|
372
365
|
|
|
373
366
|
```markdown
|
|
374
367
|
---
|
|
375
|
-
title: <Client>
|
|
376
|
-
name: "<Formal Client Name>" # formal name; the slug is only the folder
|
|
368
|
+
title: "<Formal Client Name>" # the client's formal name IS the title; slug is only the folder
|
|
377
369
|
framework: "<1.0|2.0>"
|
|
378
370
|
project: <Project>
|
|
379
371
|
client: <slug>
|
|
@@ -393,34 +385,15 @@ Who the client is and what their integration does.
|
|
|
393
385
|
|
|
394
386
|
### After Capture
|
|
395
387
|
|
|
396
|
-
|
|
397
|
-
|
|
388
|
+
After the push is confirmed, suggest the developer persist session state:
|
|
389
|
+
> "Captured. If you might not finish this thread in one sitting, run `/session-save` to
|
|
390
|
+
> record what worked, what failed, what's pending, and your next step — so you can resume
|
|
391
|
+
> later without losing context."
|
|
398
392
|
|
|
399
|
-
|
|
400
|
-
> thread in one sitting, run `/session-save` to persist your session state. This
|
|
401
|
-
> records exactly what worked, what failed, what's pending, and your exact next step —
|
|
402
|
-
> so you can resume without losing context, even days later."
|
|
403
|
-
|
|
404
|
-
Provide the suggested command with a name hint:
|
|
405
|
-
```
|
|
406
|
-
/session-save <suggested-slug-based-on-what-was-worked-on>
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
For example, if the session was about "ClickUp deploy worker actions", suggest:
|
|
410
|
-
```
|
|
411
|
-
/session-save clickup-deploy-worker
|
|
412
|
-
```
|
|
393
|
+
Suggest a slug from the work, e.g. `/session-save clickup-deploy-worker`.
|
|
413
394
|
|
|
414
395
|
### PostToolUse hook auto-validation
|
|
415
396
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
- As each doc is written during the capture step, validation runs immediately.
|
|
421
|
-
- You will see inline output with any `ERROR:` or `OK` messages.
|
|
422
|
-
- If validation fails after a write, address the error before writing the next doc —
|
|
423
|
-
do not proceed to Step 6's explicit `validate` run while errors are outstanding.
|
|
424
|
-
- Step 6's explicit `node knowledge.js validate` call is still required as the final
|
|
425
|
-
gate — the hook fires per-write, but the explicit call confirms global consistency
|
|
426
|
-
after all writes are complete.
|
|
397
|
+
`.claude/settings.json` runs `node knowledge.js validate` after every write to `knowledge/`,
|
|
398
|
+
so `ERROR:`/`OK` output appears inline as each doc is written — fix any error before writing
|
|
399
|
+
the next. Step 6's explicit `validate` is still required as the final global-consistency gate.
|
package/skills/kickoff/SKILL.md
CHANGED
|
@@ -14,7 +14,7 @@ shortcut the flow.
|
|
|
14
14
|
- **Step 0 (auto-update check) ALWAYS runs first**, with or without arguments.
|
|
15
15
|
- Use the argument text to **pre-fill answers** to the Step 2 interview (framework, layer,
|
|
16
16
|
repo, client, task). Only ask about whatever is still missing or ambiguous.
|
|
17
|
-
- Never treat the argument as an instruction to start coding before Steps 0–
|
|
17
|
+
- Never treat the argument as an instruction to start coding before Steps 0–6 complete.
|
|
18
18
|
|
|
19
19
|
## Step 0 — Auto-update check (runs before anything else, even with arguments)
|
|
20
20
|
|
|
@@ -107,52 +107,26 @@ When resolved, if there was no `team-repo-path` memory, **write one** (memory ty
|
|
|
107
107
|
|
|
108
108
|
## Step 2 — Interview the developer (ask the work questions FIRST)
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
Get the pickable lists in **one call**: `node "<TEAM_REPO>/knowledge.js" manifest` returns
|
|
111
|
+
minified JSON `{repos:[{repo,project,framework,role}], clients:[{slug,title,framework}]}`.
|
|
112
|
+
**Do not read `registry.json` or any `profile.md` to build these lists.** Ask all questions
|
|
113
|
+
in one message:
|
|
112
114
|
|
|
113
115
|
1. **Framework** — 1.0, 2.0, or **both**?
|
|
114
116
|
2. **Layer** — front-end, back-end, or hybrid?
|
|
115
|
-
3. **Repo(s) / project(s)** —
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
4. **Client** — which client is this for, or "shared / internal"? **List EVERY client by its
|
|
121
|
-
formal name** — read the `name:` field from each `knowledge/clients/<slug>/profile.md`
|
|
122
|
-
and show the **formal name, not the slug** (fall back to a title-cased slug only if
|
|
123
|
-
`name:` is missing). Include "shared / internal" and "a new client". Do not show only a
|
|
124
|
-
subset.
|
|
117
|
+
3. **Repo(s) / project(s)** — list EVERY manifest repo for the chosen framework(s).
|
|
118
|
+
**Multi-select (checkbox), not single choice** — a session often spans several repos. If
|
|
119
|
+
they name a repo not listed, run **New-repo onboarding** (below) for each before continuing.
|
|
120
|
+
4. **Client** — list EVERY manifest client by its **`title`** (the formal name, not the slug),
|
|
121
|
+
plus "shared / internal" and "a new client".
|
|
125
122
|
5. **What are you building or changing?** (a sentence — used to pick relevant feature docs.)
|
|
126
123
|
|
|
127
|
-
If any answer is unclear, ask again. Do not guess
|
|
124
|
+
If any answer is unclear, ask again. Do not guess framework, repo, project, or client.
|
|
128
125
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
clients the developer never sees the full set. Instead, **render the full list as a
|
|
134
|
-
numbered markdown list in a normal message** and ask the developer to reply with the
|
|
135
|
-
numbers they want (e.g. "1, 3, 5"). This shows every repo and every client with no cap
|
|
136
|
-
and naturally supports multi-select.
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
**Which repo(s)/project(s)?** (reply with the numbers, multiple OK)
|
|
140
|
-
1. _underscore (_Underscore — 2.0 core)
|
|
141
|
-
2. worker2 (Worker — 2.0 app)
|
|
142
|
-
3. api2 (API — 2.0 app)
|
|
143
|
-
... every registered repo for the chosen framework(s) ...
|
|
144
|
-
N. a new repo not listed
|
|
145
|
-
|
|
146
|
-
**Which client?** (one, or "shared / internal")
|
|
147
|
-
1. Compass Canada
|
|
148
|
-
2. Compass USA
|
|
149
|
-
3. Elite
|
|
150
|
-
... every client's FORMAL name (from clients/<slug>/profile.md `name:`), not the slug ...
|
|
151
|
-
S. shared / internal
|
|
152
|
-
X. a new client
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Framework (q1) and layer (q2) have ≤4 options, so the chip control is fine for those.
|
|
126
|
+
**Presenting q3 and q4:** do NOT use the option-chip / radio control — it caps at ~4 options
|
|
127
|
+
and silently truncates a 7-repo / 5-client list. Render the full list as a numbered markdown
|
|
128
|
+
list and have the developer reply with numbers (e.g. "1, 3, 5") — no cap, supports
|
|
129
|
+
multi-select. Framework (q1) and layer (q2) have ≤4 options, so chips are fine there.
|
|
156
130
|
|
|
157
131
|
## Step 3 — Resolve the repos this work needs (local paths, lazily)
|
|
158
132
|
|
|
@@ -251,7 +225,7 @@ If they have already run `/session-resume` and are now running `/kickoff`, proce
|
|
|
251
225
|
normally — the session context they loaded will complement the framework knowledge
|
|
252
226
|
loaded here.
|
|
253
227
|
|
|
254
|
-
## Step
|
|
228
|
+
## Step 6 — Propose a multi-agent workflow plan
|
|
255
229
|
|
|
256
230
|
After loading context, analyze what the developer said they're building and **propose a
|
|
257
231
|
concrete agent plan before writing a single line of code**. This gives them visibility
|