toga-ai 1.0.42 → 1.0.43

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,5 +1,6 @@
1
1
  ---
2
2
  title: Compass Canada
3
+ name: "Compass Canada"
3
4
  framework: "2.0"
4
5
  project: _Underscore
5
6
  client: compass-canada
@@ -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,6 @@
1
1
  ---
2
2
  title: Compass USA
3
+ name: "Compass USA"
3
4
  framework: "2.0"
4
5
  project: _Underscore
5
6
  client: compass-usa
@@ -1,4 +1,4 @@
1
- # Client: elite
1
+ # Client: Elite `elite`
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  title: Elite Client Profile
3
+ name: "Elite"
3
4
  framework: "2.0"
4
5
  project: Worker
5
6
  client: elite
@@ -1,4 +1,4 @@
1
- # Client: nycdoe
1
+ # Client: New York City Department of Education `nycdoe`
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  title: NYC DOE (New York City Department of Education)
3
+ name: "New York City Department of Education"
3
4
  framework: "1.0"
4
5
  project: Worker
5
6
  client: nycdoe
@@ -1,4 +1,4 @@
1
- # Client: prudential
1
+ # Client: Prudential Financial `prudential`
2
2
 
3
3
  | Doc | Framework | Summary | Files |
4
4
  |-----|-----------|---------|-------|
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  title: Prudential
3
+ name: "Prudential Financial"
3
4
  framework: "2.0"
4
5
  project: _Underscore
5
6
  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.name) || 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).');
@@ -340,6 +344,7 @@ function cmdValidate() {
340
344
  const isClientDoc = d.rel.startsWith('clients/');
341
345
  if (isClientDoc) {
342
346
  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; }
343
348
  } else {
344
349
  // framework/apps doc: framework + repo must match the path
345
350
  const parts = d.rel.split('/'); // <fw>/apps/<repo>/... OR <fw>/standards/...
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.42",
3
+ "version": "1.0.43",
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`, set the dedicated `name:` field to the client's **formal name**
150
+ (distinct from `title`, the doc title) — `validate` requires it; 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,38 @@ 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` with the formal name in the dedicated `name:` field
370
+ (distinct from `title`). `validate` **requires** `name:` on every client profile — a
371
+ profile missing it fails the build.
372
+
373
+ ```markdown
374
+ ---
375
+ title: <Client> Profile
376
+ name: "<Formal Client Name>" # formal name; the slug is only the folder
377
+ framework: "<1.0|2.0>"
378
+ project: <Project>
379
+ client: <slug>
380
+ type: profile
381
+ status: active
382
+ updated: <YYYY-MM-DD>
383
+ owners: ["<AUTHOR_USERNAME>"]
384
+ files: []
385
+ related: []
386
+ ---
387
+
388
+ ## Summary
389
+ Who the client is and what their integration does.
390
+ ```
391
+
358
392
  ---
359
393
 
360
394
  ### 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 `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
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 `name:`), not the slug ...
148
151
  S. shared / internal
149
152
  X. a new client
150
153
  ```