toga-ai 1.0.42 → 1.0.44

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.
@@ -17,9 +17,9 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
17
17
 
18
18
  ## Clients
19
19
 
20
- - **compass-canada** → [clients/compass-canada/INDEX.md](clients/compass-canada/INDEX.md)
21
- - **compass-usa** → [clients/compass-usa/INDEX.md](clients/compass-usa/INDEX.md)
22
- - **elite** → [clients/elite/INDEX.md](clients/elite/INDEX.md)
23
- - **nycdoe** → [clients/nycdoe/INDEX.md](clients/nycdoe/INDEX.md)
24
- - **prudential** → [clients/prudential/INDEX.md](clients/prudential/INDEX.md)
20
+ - **Compass Canada** (`compass-canada`) → [clients/compass-canada/INDEX.md](clients/compass-canada/INDEX.md)
21
+ - **Compass USA** (`compass-usa`) → [clients/compass-usa/INDEX.md](clients/compass-usa/INDEX.md)
22
+ - **Elite** (`elite`) → [clients/elite/INDEX.md](clients/elite/INDEX.md)
23
+ - **New York City Department of Education** (`nycdoe`) → [clients/nycdoe/INDEX.md](clients/nycdoe/INDEX.md)
24
+ - **Prudential Financial** (`prudential`) → [clients/prudential/INDEX.md](clients/prudential/INDEX.md)
25
25
 
@@ -1,4 +1,4 @@
1
- # Client: compass-canada
1
+ # Client: Compass Canada `compass-canada`
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
@@ -1,4 +1,4 @@
1
- # Client: compass-usa
1
+ # Client: Compass USA `compass-usa`
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
@@ -1,5 +1,5 @@
1
- # Client: elite
1
+ # Client: Elite `elite`
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
5
- | [Elite Client Profile](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 |
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 |
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Elite Client Profile
2
+ title: Elite
3
3
  framework: "2.0"
4
4
  project: Worker
5
5
  client: elite
@@ -1,6 +1,6 @@
1
- # Client: nycdoe
1
+ # Client: New York City Department of Education `nycdoe`
2
2
 
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
- | [NYC DOE (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/ | |
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/ | |
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: NYC DOE (New York City Department of Education)
2
+ title: New York City Department of Education
3
3
  framework: "1.0"
4
4
  project: Worker
5
5
  client: nycdoe
@@ -1,6 +1,6 @@
1
- # Client: prudential
1
+ # Client: Prudential Financial `prudential`
2
2
 
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`). | |
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Prudential
2
+ title: Prudential Financial
3
3
  framework: "2.0"
4
4
  project: _Underscore
5
5
  client: prudential
package/knowledge.js CHANGED
@@ -252,12 +252,16 @@ function cmdIndex() {
252
252
 
253
253
  // per-client INDEX.md
254
254
  const clientsDir = path.join(ROOT, 'clients');
255
+ const clientFormalNames = {}; // slug -> formal name (from profile.md `name:`)
255
256
  if (fs.existsSync(clientsDir)) {
256
257
  for (const client of fs.readdirSync(clientsDir, { withFileTypes: true }).filter(e => e.isDirectory()).map(e => e.name)) {
257
258
  const clientDir = path.join(clientsDir, client);
258
259
  const clientDocs = docs.filter(d => d.file.startsWith(clientDir + path.sep));
260
+ const profileDoc = clientDocs.find(d => path.basename(d.file) === 'profile.md');
261
+ const formalName = (profileDoc && profileDoc.data.title) || client;
262
+ clientFormalNames[client] = formalName;
259
263
  const lines = [
260
- `# Client: ${client}`,
264
+ `# Client: ${formalName} \`${client}\``,
261
265
  '',
262
266
  '| Doc | Framework | Summary | Files |',
263
267
  '|-----|-----------|---------|-------|',
@@ -284,7 +288,7 @@ function cmdIndex() {
284
288
  ? fs.readdirSync(clientsDir, { withFileTypes: true }).filter(e => e.isDirectory()).map(e => e.name) : [];
285
289
  master.push('## Clients', '');
286
290
  if (clientNames.length === 0) master.push('_No client knowledge captured yet._', '');
287
- else { for (const c of clientNames) master.push(`- **${c}** → [clients/${c}/INDEX.md](clients/${c}/INDEX.md)`); master.push(''); }
291
+ else { for (const c of clientNames) master.push(`- **${clientFormalNames[c] || c}** (\`${c}\`) → [clients/${c}/INDEX.md](clients/${c}/INDEX.md)`); master.push(''); }
288
292
  writeIndex(path.join(ROOT, 'INDEX.md'), master);
289
293
 
290
294
  console.log('index rebuilt: ' + docs.length + ' doc(s) across ' + registry.length + ' registered repo(s).');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.42",
3
+ "version": "1.0.44",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",
@@ -146,6 +146,8 @@ For every doc, set/refresh frontmatter: `framework`, `repo`, `project`, `client`
146
146
  `type`, `status`, `updated` (today's date), `owners`, `files`, `related`.
147
147
  Set `owners` to `["<AUTHOR_USERNAME>"]` from Step 1b — **never leave it empty**; when a doc
148
148
  already has owners, add `AUTHOR_USERNAME` if missing rather than replacing.
149
+ For a client `profile.md`, the `title:` **is** the client's formal name (e.g. "Compass USA") —
150
+ there is no separate name field; `validate` requires `title`. See New-client onboarding.
149
151
  Add `related:` cross-links. Append new repos to `<TEAM_REPO>/knowledge/registry.json`.
150
152
 
151
153
  ## Step 6 — Validate, index, mirror back (mandatory)
@@ -355,6 +357,37 @@ Ask **all** — assume nothing (a heuristic may seed a default to confirm):
355
357
 
356
358
  Append the entry to `registry.json`, then continue. `validate` will confirm consistency.
357
359
 
360
+ ## New-client onboarding (client has no `knowledge/clients/<slug>/` folder yet)
361
+
362
+ When this session's work is for a client with no `clients/<slug>/` folder, before writing
363
+ any client docs:
364
+
365
+ 1. **Slug** — confirm the folder slug (lowercase, hyphenated, e.g. `compass-usa`). The slug
366
+ is used only for the folder name.
367
+ 2. **Formal name** — **ASK the developer for the client's formal name** (e.g. "Compass USA",
368
+ "New York City Department of Education"). **Never invent it from the slug.**
369
+ 3. Create `clients/<slug>/profile.md` using the formal name as the `title:` (the slug is only
370
+ the folder key — the profile's `title` carries the human-readable client name). `validate`
371
+ **requires** `title` on every doc — a profile missing it fails the build.
372
+
373
+ ```markdown
374
+ ---
375
+ title: "<Formal Client Name>" # the client's formal name IS the title; slug is only the folder
376
+ framework: "<1.0|2.0>"
377
+ project: <Project>
378
+ client: <slug>
379
+ type: profile
380
+ status: active
381
+ updated: <YYYY-MM-DD>
382
+ owners: ["<AUTHOR_USERNAME>"]
383
+ files: []
384
+ related: []
385
+ ---
386
+
387
+ ## Summary
388
+ Who the client is and what their integration does.
389
+ ```
390
+
358
391
  ---
359
392
 
360
393
  ### After Capture
@@ -117,8 +117,10 @@ Ask these in one message. **Present the repos/projects you already know** (read
117
117
  choice;** a session often spans more than one repo/project, so always let the developer
118
118
  pick several. If they pick a repo not listed, run **New-repo onboarding** (below) for
119
119
  each new repo before continuing.
120
- 4. **Client** — which client is this for, or "shared / internal"? **List EVERY folder under
121
- `knowledge/clients/`** plus "shared / internal" and "a new client" — do not show only a
120
+ 4. **Client** — which client is this for, or "shared / internal"? **List EVERY client by its
121
+ formal name** read the `title:` 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 the
123
+ profile is missing). Include "shared / internal" and "a new client". Do not show only a
122
124
  subset.
123
125
  5. **What are you building or changing?** (a sentence — used to pick relevant feature docs.)
124
126
 
@@ -142,9 +144,10 @@ and naturally supports multi-select.
142
144
  N. a new repo not listed
143
145
 
144
146
  **Which client?** (one, or "shared / internal")
145
- 1. compass-canada
146
- 2. compass-usa
147
- ... every folder under knowledge/clients/ ...
147
+ 1. Compass Canada
148
+ 2. Compass USA
149
+ 3. Elite
150
+ ... every client's FORMAL name (from clients/<slug>/profile.md `title:`), not the slug ...
148
151
  S. shared / internal
149
152
  X. a new client
150
153
  ```