@teammates/cli 0.3.1 → 0.3.2
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/dist/adapter.js +50 -50
- package/dist/banner.d.ts +74 -0
- package/dist/banner.js +284 -0
- package/dist/cli-args.d.ts +19 -0
- package/dist/cli-args.js +125 -0
- package/dist/cli.js +286 -439
- package/dist/index.d.ts +6 -1
- package/dist/index.js +3 -0
- package/dist/onboard.js +165 -165
- package/dist/registry.test.js +23 -23
- package/dist/theme.d.ts +13 -0
- package/dist/theme.js +18 -0
- package/dist/types.d.ts +30 -0
- package/package.json +48 -48
- package/template/CROSS-TEAM.md +31 -31
- package/template/PROTOCOL.md +156 -156
- package/template/README.md +48 -48
- package/template/example/SOUL.md +82 -82
- package/template/example/WISDOM.md +9 -9
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,11 @@ export type { AgentAdapter, InstalledService, RecallContext, RosterEntry, } from
|
|
|
2
2
|
export { buildTeammatePrompt, formatHandoffContext, queryRecallContext, syncRecallIndex, } from "./adapter.js";
|
|
3
3
|
export { type AgentPreset, CliProxyAdapter, type CliProxyOptions, PRESETS, } from "./adapters/cli-proxy.js";
|
|
4
4
|
export { EchoAdapter } from "./adapters/echo.js";
|
|
5
|
+
export type { BannerInfo, ServiceInfo, ServiceStatus } from "./banner.js";
|
|
6
|
+
export { AnimatedBanner } from "./banner.js";
|
|
7
|
+
export type { CliArgs } from "./cli-args.js";
|
|
8
|
+
export { findTeammatesDir, PKG_VERSION, parseCliArgs } from "./cli-args.js";
|
|
5
9
|
export { Orchestrator, type OrchestratorConfig, type TeammateStatus, } from "./orchestrator.js";
|
|
6
10
|
export { Registry } from "./registry.js";
|
|
7
|
-
export
|
|
11
|
+
export { tp } from "./theme.js";
|
|
12
|
+
export type { DailyLog, HandoffEnvelope, OrchestratorEvent, OwnershipRules, QueueEntry, SandboxLevel, SlashCommand, TaskAssignment, TaskResult, TeammateConfig, } from "./types.js";
|
package/dist/index.js
CHANGED
|
@@ -2,5 +2,8 @@
|
|
|
2
2
|
export { buildTeammatePrompt, formatHandoffContext, queryRecallContext, syncRecallIndex, } from "./adapter.js";
|
|
3
3
|
export { CliProxyAdapter, PRESETS, } from "./adapters/cli-proxy.js";
|
|
4
4
|
export { EchoAdapter } from "./adapters/echo.js";
|
|
5
|
+
export { AnimatedBanner } from "./banner.js";
|
|
6
|
+
export { findTeammatesDir, PKG_VERSION, parseCliArgs } from "./cli-args.js";
|
|
5
7
|
export { Orchestrator, } from "./orchestrator.js";
|
|
6
8
|
export { Registry } from "./registry.js";
|
|
9
|
+
export { tp } from "./theme.js";
|
package/dist/onboard.js
CHANGED
|
@@ -225,82 +225,82 @@ export async function buildImportAdaptationPrompt(teammatesDir, teammateNames, s
|
|
|
225
225
|
teammateSections.push(`### @${name}\n${soulBlock}${wisdomBlock}`);
|
|
226
226
|
}
|
|
227
227
|
const projectDir = dirname(teammatesDir);
|
|
228
|
-
return `You are adapting an imported team to a new project. This is a non-interactive session — complete ALL work without pausing. Do not ask for confirmation or wait for user input.
|
|
229
|
-
|
|
230
|
-
**Source project:** \`${sourceProjectPath}\`
|
|
231
|
-
**Target project:** \`${projectDir}\`
|
|
232
|
-
**Target .teammates/ directory:** \`${teammatesDir}\`
|
|
233
|
-
**Imported teammates:** ${teammateNames.map((n) => `@${n}`).join(", ")}
|
|
234
|
-
|
|
235
|
-
> **IMPORTANT:** The \`example/\` directory inside \`.teammates/\` is a **template reference**, NOT a teammate. Do not adapt it, rename it, or treat it as a teammate. When creating new teammates, never use "example" as a folder name.
|
|
236
|
-
|
|
237
|
-
## Imported Teammates (from source project)
|
|
238
|
-
|
|
239
|
-
${teammateSections.join("\n\n---\n\n")}
|
|
240
|
-
|
|
241
|
-
## Instructions
|
|
242
|
-
|
|
243
|
-
Complete these steps in order. Do NOT pause, ask questions, or wait for approval. Make all changes directly.
|
|
244
|
-
|
|
245
|
-
### Step 1: Scan This Project
|
|
246
|
-
|
|
247
|
-
Read the project root to understand its structure:
|
|
248
|
-
- Package manifest, README, config files
|
|
249
|
-
- Major subsystems, languages, frameworks, file patterns
|
|
250
|
-
- Dependency flow and architecture
|
|
251
|
-
|
|
252
|
-
### Step 2: Adapt EVERY Imported Teammate
|
|
253
|
-
|
|
254
|
-
This is the most important step. For EACH imported teammate listed above, you MUST edit their SOUL.md and WISDOM.md to reflect THIS project, not the source project.
|
|
255
|
-
|
|
256
|
-
For each teammate's **SOUL.md**:
|
|
257
|
-
|
|
258
|
-
1. **Add a "Previous Projects" section** (place it after Ethics). Compress what the teammate did in the source project:
|
|
259
|
-
\`\`\`markdown
|
|
260
|
-
## Previous Projects
|
|
261
|
-
|
|
262
|
-
### <source-project-name>
|
|
263
|
-
- **Role**: <one-line summary of what they did>
|
|
264
|
-
- **Stack**: <key technologies they worked with>
|
|
265
|
-
- **Domains**: <what they owned — file patterns or subsystem names>
|
|
266
|
-
- **Key learnings**: <1-3 bullets of notable patterns, decisions, or lessons>
|
|
267
|
-
\`\`\`
|
|
268
|
-
|
|
269
|
-
2. **Rewrite project-specific sections** for THIS project:
|
|
270
|
-
- **Preserve**: Identity (name, personality), Core Principles, Ethics
|
|
271
|
-
- **Rewrite completely**: Ownership (primary/secondary file globs for THIS project's actual files), Boundaries, Capabilities (commands, file patterns, technologies for THIS project), Routing keywords, Quality Bar
|
|
272
|
-
- **Update**: All codebase-specific references — paths, package names, tools, teammate names must reference THIS project
|
|
273
|
-
|
|
274
|
-
For each teammate's **WISDOM.md**:
|
|
275
|
-
- Add a "Previous Projects" note at the top
|
|
276
|
-
- Keep universal wisdom entries (general principles, patterns)
|
|
277
|
-
- Remove entries that reference source project paths, architecture, or tools not used here
|
|
278
|
-
- Adapt entries with transferable knowledge but old-project-specific details
|
|
279
|
-
|
|
280
|
-
### Step 3: Evaluate Gaps and Create New Teammates
|
|
281
|
-
|
|
282
|
-
After adapting all existing teammates, check if THIS project has major subsystems that no teammate covers. If so, create new teammates:
|
|
283
|
-
- Create \`${teammatesDir}/<name>/\` with SOUL.md, WISDOM.md, and \`memory/\`
|
|
284
|
-
- Use the template at \`${teammatesDir}/TEMPLATE.md\` for structure
|
|
285
|
-
- WISDOM.md starts with one creation entry
|
|
286
|
-
|
|
287
|
-
If a teammate's domain doesn't exist at all in this project and their skills aren't transferable, delete their directory under \`${teammatesDir}\`.
|
|
288
|
-
|
|
289
|
-
### Step 4: Update Framework Files
|
|
290
|
-
|
|
291
|
-
- Update \`${teammatesDir}/README.md\` with the final roster
|
|
292
|
-
- Update \`${teammatesDir}/CROSS-TEAM.md\` ownership table
|
|
293
|
-
|
|
294
|
-
### Step 5: Verify
|
|
295
|
-
|
|
296
|
-
- Every teammate has SOUL.md and WISDOM.md adapted to THIS project
|
|
297
|
-
- Ownership globs reference actual files in THIS project
|
|
298
|
-
- Boundaries reference correct teammate names
|
|
299
|
-
- Previous Projects sections are present for all imported teammates
|
|
300
|
-
- CROSS-TEAM.md has one row per teammate
|
|
301
|
-
|
|
302
|
-
## Critical Reminder
|
|
303
|
-
|
|
228
|
+
return `You are adapting an imported team to a new project. This is a non-interactive session — complete ALL work without pausing. Do not ask for confirmation or wait for user input.
|
|
229
|
+
|
|
230
|
+
**Source project:** \`${sourceProjectPath}\`
|
|
231
|
+
**Target project:** \`${projectDir}\`
|
|
232
|
+
**Target .teammates/ directory:** \`${teammatesDir}\`
|
|
233
|
+
**Imported teammates:** ${teammateNames.map((n) => `@${n}`).join(", ")}
|
|
234
|
+
|
|
235
|
+
> **IMPORTANT:** The \`example/\` directory inside \`.teammates/\` is a **template reference**, NOT a teammate. Do not adapt it, rename it, or treat it as a teammate. When creating new teammates, never use "example" as a folder name.
|
|
236
|
+
|
|
237
|
+
## Imported Teammates (from source project)
|
|
238
|
+
|
|
239
|
+
${teammateSections.join("\n\n---\n\n")}
|
|
240
|
+
|
|
241
|
+
## Instructions
|
|
242
|
+
|
|
243
|
+
Complete these steps in order. Do NOT pause, ask questions, or wait for approval. Make all changes directly.
|
|
244
|
+
|
|
245
|
+
### Step 1: Scan This Project
|
|
246
|
+
|
|
247
|
+
Read the project root to understand its structure:
|
|
248
|
+
- Package manifest, README, config files
|
|
249
|
+
- Major subsystems, languages, frameworks, file patterns
|
|
250
|
+
- Dependency flow and architecture
|
|
251
|
+
|
|
252
|
+
### Step 2: Adapt EVERY Imported Teammate
|
|
253
|
+
|
|
254
|
+
This is the most important step. For EACH imported teammate listed above, you MUST edit their SOUL.md and WISDOM.md to reflect THIS project, not the source project.
|
|
255
|
+
|
|
256
|
+
For each teammate's **SOUL.md**:
|
|
257
|
+
|
|
258
|
+
1. **Add a "Previous Projects" section** (place it after Ethics). Compress what the teammate did in the source project:
|
|
259
|
+
\`\`\`markdown
|
|
260
|
+
## Previous Projects
|
|
261
|
+
|
|
262
|
+
### <source-project-name>
|
|
263
|
+
- **Role**: <one-line summary of what they did>
|
|
264
|
+
- **Stack**: <key technologies they worked with>
|
|
265
|
+
- **Domains**: <what they owned — file patterns or subsystem names>
|
|
266
|
+
- **Key learnings**: <1-3 bullets of notable patterns, decisions, or lessons>
|
|
267
|
+
\`\`\`
|
|
268
|
+
|
|
269
|
+
2. **Rewrite project-specific sections** for THIS project:
|
|
270
|
+
- **Preserve**: Identity (name, personality), Core Principles, Ethics
|
|
271
|
+
- **Rewrite completely**: Ownership (primary/secondary file globs for THIS project's actual files), Boundaries, Capabilities (commands, file patterns, technologies for THIS project), Routing keywords, Quality Bar
|
|
272
|
+
- **Update**: All codebase-specific references — paths, package names, tools, teammate names must reference THIS project
|
|
273
|
+
|
|
274
|
+
For each teammate's **WISDOM.md**:
|
|
275
|
+
- Add a "Previous Projects" note at the top
|
|
276
|
+
- Keep universal wisdom entries (general principles, patterns)
|
|
277
|
+
- Remove entries that reference source project paths, architecture, or tools not used here
|
|
278
|
+
- Adapt entries with transferable knowledge but old-project-specific details
|
|
279
|
+
|
|
280
|
+
### Step 3: Evaluate Gaps and Create New Teammates
|
|
281
|
+
|
|
282
|
+
After adapting all existing teammates, check if THIS project has major subsystems that no teammate covers. If so, create new teammates:
|
|
283
|
+
- Create \`${teammatesDir}/<name>/\` with SOUL.md, WISDOM.md, and \`memory/\`
|
|
284
|
+
- Use the template at \`${teammatesDir}/TEMPLATE.md\` for structure
|
|
285
|
+
- WISDOM.md starts with one creation entry
|
|
286
|
+
|
|
287
|
+
If a teammate's domain doesn't exist at all in this project and their skills aren't transferable, delete their directory under \`${teammatesDir}\`.
|
|
288
|
+
|
|
289
|
+
### Step 4: Update Framework Files
|
|
290
|
+
|
|
291
|
+
- Update \`${teammatesDir}/README.md\` with the final roster
|
|
292
|
+
- Update \`${teammatesDir}/CROSS-TEAM.md\` ownership table
|
|
293
|
+
|
|
294
|
+
### Step 5: Verify
|
|
295
|
+
|
|
296
|
+
- Every teammate has SOUL.md and WISDOM.md adapted to THIS project
|
|
297
|
+
- Ownership globs reference actual files in THIS project
|
|
298
|
+
- Boundaries reference correct teammate names
|
|
299
|
+
- Previous Projects sections are present for all imported teammates
|
|
300
|
+
- CROSS-TEAM.md has one row per teammate
|
|
301
|
+
|
|
302
|
+
## Critical Reminder
|
|
303
|
+
|
|
304
304
|
The PRIMARY goal is adapting the imported teammates. Every SOUL.md must be rewritten so the teammate understands THIS project's codebase, not the source project's. If you only have time for one thing, adapt the existing teammates — that is more important than creating new ones.`;
|
|
305
305
|
}
|
|
306
306
|
/**
|
|
@@ -326,95 +326,95 @@ export async function getOnboardingPrompt(projectDir) {
|
|
|
326
326
|
return wrapPrompt(BUILTIN_ONBOARDING, projectDir);
|
|
327
327
|
}
|
|
328
328
|
function wrapPrompt(onboardingContent, projectDir) {
|
|
329
|
-
return `You are setting up the teammates framework for a project.
|
|
330
|
-
|
|
331
|
-
**Target project directory:** ${projectDir}
|
|
332
|
-
|
|
333
|
-
**Framework files have already been copied** into \`${projectDir}/.teammates/\` from the template. The following files are already in place:
|
|
334
|
-
- CROSS-TEAM.md — fill in the Ownership Scopes table as you create teammates
|
|
335
|
-
- PROTOCOL.md — team protocol (ready to use)
|
|
336
|
-
- TEMPLATE.md — reference for creating teammate SOUL.md and WISDOM.md files
|
|
337
|
-
- USER.md — user profile (gitignored, user fills in later)
|
|
338
|
-
- README.md — update with project-specific roster and info
|
|
339
|
-
- .gitignore — configured for USER.md and .index/
|
|
340
|
-
- example/ — example SOUL.md and WISDOM.md for reference
|
|
341
|
-
|
|
342
|
-
**Your job is to:**
|
|
343
|
-
1. Analyze the codebase (Step 1)
|
|
344
|
-
2. Design the team roster (Step 2)
|
|
345
|
-
3. Create teammate folders with SOUL.md and WISDOM.md (Step 3) — use TEMPLATE.md for the structure
|
|
346
|
-
4. Update README.md and CROSS-TEAM.md with the roster info (Step 3)
|
|
347
|
-
5. Verify everything is in place (Step 4)
|
|
348
|
-
|
|
349
|
-
You do NOT need to create the framework files listed above — they're already there.
|
|
350
|
-
|
|
351
|
-
> **IMPORTANT:** The \`example/\` directory is a **template reference**, NOT a teammate. Do not modify it or treat it as a teammate. Never name a new teammate "example".
|
|
352
|
-
|
|
353
|
-
Follow the onboarding instructions below. This is a non-interactive session — complete ALL work without pausing. Do not ask for confirmation or wait for user input. Work through each step and make all changes directly.
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
329
|
+
return `You are setting up the teammates framework for a project.
|
|
330
|
+
|
|
331
|
+
**Target project directory:** ${projectDir}
|
|
332
|
+
|
|
333
|
+
**Framework files have already been copied** into \`${projectDir}/.teammates/\` from the template. The following files are already in place:
|
|
334
|
+
- CROSS-TEAM.md — fill in the Ownership Scopes table as you create teammates
|
|
335
|
+
- PROTOCOL.md — team protocol (ready to use)
|
|
336
|
+
- TEMPLATE.md — reference for creating teammate SOUL.md and WISDOM.md files
|
|
337
|
+
- USER.md — user profile (gitignored, user fills in later)
|
|
338
|
+
- README.md — update with project-specific roster and info
|
|
339
|
+
- .gitignore — configured for USER.md and .index/
|
|
340
|
+
- example/ — example SOUL.md and WISDOM.md for reference
|
|
341
|
+
|
|
342
|
+
**Your job is to:**
|
|
343
|
+
1. Analyze the codebase (Step 1)
|
|
344
|
+
2. Design the team roster (Step 2)
|
|
345
|
+
3. Create teammate folders with SOUL.md and WISDOM.md (Step 3) — use TEMPLATE.md for the structure
|
|
346
|
+
4. Update README.md and CROSS-TEAM.md with the roster info (Step 3)
|
|
347
|
+
5. Verify everything is in place (Step 4)
|
|
348
|
+
|
|
349
|
+
You do NOT need to create the framework files listed above — they're already there.
|
|
350
|
+
|
|
351
|
+
> **IMPORTANT:** The \`example/\` directory is a **template reference**, NOT a teammate. Do not modify it or treat it as a teammate. Never name a new teammate "example".
|
|
352
|
+
|
|
353
|
+
Follow the onboarding instructions below. This is a non-interactive session — complete ALL work without pausing. Do not ask for confirmation or wait for user input. Work through each step and make all changes directly.
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
357
|
${onboardingContent}`;
|
|
358
358
|
}
|
|
359
|
-
const BUILTIN_ONBOARDING = `# Teammates Onboarding
|
|
360
|
-
|
|
361
|
-
You are going to analyze a codebase and create a set of AI teammates — persistent personas that each own a slice of the project. Follow these steps in order.
|
|
362
|
-
|
|
363
|
-
## Step 1: Analyze the Codebase
|
|
364
|
-
|
|
365
|
-
Read the project's entry points to understand its structure:
|
|
366
|
-
- README, CONTRIBUTING, or similar docs
|
|
367
|
-
- Package manifest (package.json, Cargo.toml, pyproject.toml, go.mod, etc.)
|
|
368
|
-
- Top-level directory structure
|
|
369
|
-
- Key configuration files
|
|
370
|
-
|
|
371
|
-
Identify:
|
|
372
|
-
1. **Major domains/subsystems** — distinct areas of the codebase
|
|
373
|
-
2. **Dependency flow** — which layers depend on which
|
|
374
|
-
3. **Key technologies** — languages, frameworks, tools per area
|
|
375
|
-
4. **File patterns** — glob patterns for each domain
|
|
376
|
-
|
|
377
|
-
## Step 2: Design the Team
|
|
378
|
-
|
|
379
|
-
Based on your analysis, design a roster of teammates:
|
|
380
|
-
- **Aim for 3–7 teammates.** Fewer for small projects, more for monorepos.
|
|
381
|
-
- **Each teammate owns a distinct domain** with minimal overlap.
|
|
382
|
-
- **Pick short, memorable names** — one word, evocative of the domain.
|
|
383
|
-
|
|
384
|
-
For each teammate, define:
|
|
385
|
-
- Name and one-line persona
|
|
386
|
-
- Primary ownership (file patterns)
|
|
387
|
-
- Key technologies
|
|
388
|
-
- Boundaries (what they do NOT own)
|
|
389
|
-
|
|
390
|
-
## Step 3: Create the Directory Structure
|
|
391
|
-
|
|
392
|
-
Create teammate folders under \`.teammates/\`:
|
|
393
|
-
|
|
394
|
-
### Teammate folders
|
|
395
|
-
For each teammate, create \`.teammates/<name>/\` with:
|
|
396
|
-
|
|
397
|
-
**SOUL.md** — Use the template from \`.teammates/TEMPLATE.md\`. Fill in identity, core principles, boundaries, capabilities, ownership, ethics.
|
|
398
|
-
|
|
399
|
-
**WISDOM.md** — Start with one entry recording creation and key decisions.
|
|
400
|
-
|
|
401
|
-
**memory/** — Empty directory for daily logs.
|
|
402
|
-
|
|
403
|
-
### Update framework files
|
|
404
|
-
- Update \`.teammates/README.md\` with the roster table, dependency flow, and routing guide
|
|
405
|
-
- Update \`.teammates/CROSS-TEAM.md\` Ownership Scopes table with one row per teammate
|
|
406
|
-
|
|
407
|
-
## Step 4: Verify
|
|
408
|
-
|
|
409
|
-
Check:
|
|
410
|
-
- Every roster teammate has a folder with SOUL.md and WISDOM.md
|
|
411
|
-
- Ownership globs cover the codebase without major gaps
|
|
412
|
-
- Boundaries reference the correct owning teammate
|
|
413
|
-
- CROSS-TEAM.md Ownership Scopes table has one row per teammate with correct paths
|
|
414
|
-
- .gitignore is in place (USER.md not committed)
|
|
415
|
-
|
|
416
|
-
## Tips
|
|
417
|
-
- Small projects are fine with 2–3 teammates
|
|
418
|
-
- WISDOM.md starts light — just one creation entry
|
|
419
|
-
- Prompt the user to fill in USER.md after setup
|
|
359
|
+
const BUILTIN_ONBOARDING = `# Teammates Onboarding
|
|
360
|
+
|
|
361
|
+
You are going to analyze a codebase and create a set of AI teammates — persistent personas that each own a slice of the project. Follow these steps in order.
|
|
362
|
+
|
|
363
|
+
## Step 1: Analyze the Codebase
|
|
364
|
+
|
|
365
|
+
Read the project's entry points to understand its structure:
|
|
366
|
+
- README, CONTRIBUTING, or similar docs
|
|
367
|
+
- Package manifest (package.json, Cargo.toml, pyproject.toml, go.mod, etc.)
|
|
368
|
+
- Top-level directory structure
|
|
369
|
+
- Key configuration files
|
|
370
|
+
|
|
371
|
+
Identify:
|
|
372
|
+
1. **Major domains/subsystems** — distinct areas of the codebase
|
|
373
|
+
2. **Dependency flow** — which layers depend on which
|
|
374
|
+
3. **Key technologies** — languages, frameworks, tools per area
|
|
375
|
+
4. **File patterns** — glob patterns for each domain
|
|
376
|
+
|
|
377
|
+
## Step 2: Design the Team
|
|
378
|
+
|
|
379
|
+
Based on your analysis, design a roster of teammates:
|
|
380
|
+
- **Aim for 3–7 teammates.** Fewer for small projects, more for monorepos.
|
|
381
|
+
- **Each teammate owns a distinct domain** with minimal overlap.
|
|
382
|
+
- **Pick short, memorable names** — one word, evocative of the domain.
|
|
383
|
+
|
|
384
|
+
For each teammate, define:
|
|
385
|
+
- Name and one-line persona
|
|
386
|
+
- Primary ownership (file patterns)
|
|
387
|
+
- Key technologies
|
|
388
|
+
- Boundaries (what they do NOT own)
|
|
389
|
+
|
|
390
|
+
## Step 3: Create the Directory Structure
|
|
391
|
+
|
|
392
|
+
Create teammate folders under \`.teammates/\`:
|
|
393
|
+
|
|
394
|
+
### Teammate folders
|
|
395
|
+
For each teammate, create \`.teammates/<name>/\` with:
|
|
396
|
+
|
|
397
|
+
**SOUL.md** — Use the template from \`.teammates/TEMPLATE.md\`. Fill in identity, core principles, boundaries, capabilities, ownership, ethics.
|
|
398
|
+
|
|
399
|
+
**WISDOM.md** — Start with one entry recording creation and key decisions.
|
|
400
|
+
|
|
401
|
+
**memory/** — Empty directory for daily logs.
|
|
402
|
+
|
|
403
|
+
### Update framework files
|
|
404
|
+
- Update \`.teammates/README.md\` with the roster table, dependency flow, and routing guide
|
|
405
|
+
- Update \`.teammates/CROSS-TEAM.md\` Ownership Scopes table with one row per teammate
|
|
406
|
+
|
|
407
|
+
## Step 4: Verify
|
|
408
|
+
|
|
409
|
+
Check:
|
|
410
|
+
- Every roster teammate has a folder with SOUL.md and WISDOM.md
|
|
411
|
+
- Ownership globs cover the codebase without major gaps
|
|
412
|
+
- Boundaries reference the correct owning teammate
|
|
413
|
+
- CROSS-TEAM.md Ownership Scopes table has one row per teammate with correct paths
|
|
414
|
+
- .gitignore is in place (USER.md not committed)
|
|
415
|
+
|
|
416
|
+
## Tips
|
|
417
|
+
- Small projects are fine with 2–3 teammates
|
|
418
|
+
- WISDOM.md starts light — just one creation entry
|
|
419
|
+
- Prompt the user to fill in USER.md after setup
|
|
420
420
|
`;
|
package/dist/registry.test.js
CHANGED
|
@@ -142,18 +142,18 @@ describe("Registry role parsing", () => {
|
|
|
142
142
|
});
|
|
143
143
|
describe("Registry ownership parsing", () => {
|
|
144
144
|
it("parses primary ownership patterns", async () => {
|
|
145
|
-
const soul = `# Beacon
|
|
146
|
-
|
|
147
|
-
## Ownership
|
|
148
|
-
|
|
149
|
-
### Primary
|
|
150
|
-
|
|
151
|
-
- \`recall/src/**\` — All source files
|
|
152
|
-
- \`recall/package.json\` — Package manifest
|
|
153
|
-
|
|
154
|
-
### Secondary
|
|
155
|
-
|
|
156
|
-
- \`.teammates/.index/**\` — Vector indexes
|
|
145
|
+
const soul = `# Beacon
|
|
146
|
+
|
|
147
|
+
## Ownership
|
|
148
|
+
|
|
149
|
+
### Primary
|
|
150
|
+
|
|
151
|
+
- \`recall/src/**\` — All source files
|
|
152
|
+
- \`recall/package.json\` — Package manifest
|
|
153
|
+
|
|
154
|
+
### Secondary
|
|
155
|
+
|
|
156
|
+
- \`.teammates/.index/**\` — Vector indexes
|
|
157
157
|
`;
|
|
158
158
|
await createTeammate("beacon", soul);
|
|
159
159
|
const registry = new Registry(tempDir);
|
|
@@ -174,17 +174,17 @@ describe("Registry ownership parsing", () => {
|
|
|
174
174
|
});
|
|
175
175
|
describe("Registry routing keyword parsing", () => {
|
|
176
176
|
it("parses routing keywords from ### Routing section", async () => {
|
|
177
|
-
const soul = `# Beacon
|
|
178
|
-
|
|
179
|
-
## Ownership
|
|
180
|
-
|
|
181
|
-
### Primary
|
|
182
|
-
|
|
183
|
-
- \`recall/src/**\` — All source files
|
|
184
|
-
|
|
185
|
-
### Routing
|
|
186
|
-
|
|
187
|
-
- \`search\`, \`embeddings\`, \`vector\`, \`semantic\`
|
|
177
|
+
const soul = `# Beacon
|
|
178
|
+
|
|
179
|
+
## Ownership
|
|
180
|
+
|
|
181
|
+
### Primary
|
|
182
|
+
|
|
183
|
+
- \`recall/src/**\` — All source files
|
|
184
|
+
|
|
185
|
+
### Routing
|
|
186
|
+
|
|
187
|
+
- \`search\`, \`embeddings\`, \`vector\`, \`semantic\`
|
|
188
188
|
`;
|
|
189
189
|
await createTeammate("beacon", soul);
|
|
190
190
|
const registry = new Registry(tempDir);
|
package/dist/theme.d.ts
CHANGED
|
@@ -54,3 +54,16 @@ export declare function theme(): Theme;
|
|
|
54
54
|
export declare function setTheme(t: Theme): void;
|
|
55
55
|
/** Format a Color as a hex string for display. */
|
|
56
56
|
export declare function colorToHex(c: Color): string;
|
|
57
|
+
export declare const tp: {
|
|
58
|
+
accent: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
59
|
+
accentBright: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
60
|
+
accentDim: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
61
|
+
text: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
62
|
+
muted: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
63
|
+
dim: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
64
|
+
success: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
65
|
+
warning: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
66
|
+
error: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
67
|
+
info: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
68
|
+
bold: (s: string) => import("@teammates/consolonia").StyledSpan;
|
|
69
|
+
};
|
package/dist/theme.js
CHANGED
|
@@ -52,3 +52,21 @@ export function colorToHex(c) {
|
|
|
52
52
|
const b = c.b.toString(16).padStart(2, "0");
|
|
53
53
|
return `#${r}${g}${b}`.toUpperCase();
|
|
54
54
|
}
|
|
55
|
+
// ── Themed pen shortcuts ────────────────────────────────────────────
|
|
56
|
+
//
|
|
57
|
+
// Thin wrappers that read from the active theme() at call time, so
|
|
58
|
+
// every styled span picks up the current palette automatically.
|
|
59
|
+
import { pen } from "@teammates/consolonia";
|
|
60
|
+
export const tp = {
|
|
61
|
+
accent: (s) => pen.fg(theme().accent)(s),
|
|
62
|
+
accentBright: (s) => pen.fg(theme().accentBright)(s),
|
|
63
|
+
accentDim: (s) => pen.fg(theme().accentDim)(s),
|
|
64
|
+
text: (s) => pen.fg(theme().text)(s),
|
|
65
|
+
muted: (s) => pen.fg(theme().textMuted)(s),
|
|
66
|
+
dim: (s) => pen.fg(theme().textDim)(s),
|
|
67
|
+
success: (s) => pen.fg(theme().success)(s),
|
|
68
|
+
warning: (s) => pen.fg(theme().warning)(s),
|
|
69
|
+
error: (s) => pen.fg(theme().error)(s),
|
|
70
|
+
info: (s) => pen.fg(theme().info)(s),
|
|
71
|
+
bold: (s) => pen.bold.fg(theme().text)(s),
|
|
72
|
+
};
|
package/dist/types.d.ts
CHANGED
|
@@ -103,3 +103,33 @@ export type OrchestratorEvent = {
|
|
|
103
103
|
teammate: string;
|
|
104
104
|
error: string;
|
|
105
105
|
};
|
|
106
|
+
/** A task queue entry — either an agent task or an internal operation. */
|
|
107
|
+
export type QueueEntry = {
|
|
108
|
+
type: "agent";
|
|
109
|
+
teammate: string;
|
|
110
|
+
task: string;
|
|
111
|
+
} | {
|
|
112
|
+
type: "compact";
|
|
113
|
+
teammate: string;
|
|
114
|
+
task: string;
|
|
115
|
+
} | {
|
|
116
|
+
type: "retro";
|
|
117
|
+
teammate: string;
|
|
118
|
+
task: string;
|
|
119
|
+
} | {
|
|
120
|
+
type: "btw";
|
|
121
|
+
teammate: string;
|
|
122
|
+
task: string;
|
|
123
|
+
} | {
|
|
124
|
+
type: "debug";
|
|
125
|
+
teammate: string;
|
|
126
|
+
task: string;
|
|
127
|
+
};
|
|
128
|
+
/** A registered slash command. */
|
|
129
|
+
export interface SlashCommand {
|
|
130
|
+
name: string;
|
|
131
|
+
aliases: string[];
|
|
132
|
+
usage: string;
|
|
133
|
+
description: string;
|
|
134
|
+
run: (args: string) => Promise<void>;
|
|
135
|
+
}
|
package/package.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@teammates/cli",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Agent-agnostic CLI for teammates. Routes tasks, manages handoffs, and plugs into any coding agent backend.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"files": [
|
|
9
|
-
"dist",
|
|
10
|
-
"template"
|
|
11
|
-
],
|
|
12
|
-
"bin": {
|
|
13
|
-
"teammates": "dist/cli.js"
|
|
14
|
-
},
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsc",
|
|
17
|
-
"dev": "tsc --watch",
|
|
18
|
-
"test": "vitest run",
|
|
19
|
-
"test:coverage": "vitest run --coverage",
|
|
20
|
-
"test:watch": "vitest",
|
|
21
|
-
"typecheck": "tsc --noEmit"
|
|
22
|
-
},
|
|
23
|
-
"keywords": [
|
|
24
|
-
"teammates",
|
|
25
|
-
"ai",
|
|
26
|
-
"orchestrator",
|
|
27
|
-
"agent",
|
|
28
|
-
"handoff",
|
|
29
|
-
"cli"
|
|
30
|
-
],
|
|
31
|
-
"license": "MIT",
|
|
32
|
-
"dependencies": {
|
|
33
|
-
"@github/copilot-sdk": "^0.1.32",
|
|
34
|
-
"@teammates/consolonia": "0.3.
|
|
35
|
-
"@teammates/recall": "0.3.
|
|
36
|
-
"chalk": "^5.6.2",
|
|
37
|
-
"ora": "^9.3.0"
|
|
38
|
-
},
|
|
39
|
-
"devDependencies": {
|
|
40
|
-
"@types/node": "^25.5.0",
|
|
41
|
-
"@vitest/coverage-v8": "^4.1.0",
|
|
42
|
-
"typescript": "^5.5.0",
|
|
43
|
-
"vitest": "^4.1.0"
|
|
44
|
-
},
|
|
45
|
-
"engines": {
|
|
46
|
-
"node": ">=20.0.0"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@teammates/cli",
|
|
3
|
+
"version": "0.3.2",
|
|
4
|
+
"description": "Agent-agnostic CLI for teammates. Routes tasks, manages handoffs, and plugs into any coding agent backend.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"template"
|
|
11
|
+
],
|
|
12
|
+
"bin": {
|
|
13
|
+
"teammates": "dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:coverage": "vitest run --coverage",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"typecheck": "tsc --noEmit"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"teammates",
|
|
25
|
+
"ai",
|
|
26
|
+
"orchestrator",
|
|
27
|
+
"agent",
|
|
28
|
+
"handoff",
|
|
29
|
+
"cli"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@github/copilot-sdk": "^0.1.32",
|
|
34
|
+
"@teammates/consolonia": "0.3.2",
|
|
35
|
+
"@teammates/recall": "0.3.2",
|
|
36
|
+
"chalk": "^5.6.2",
|
|
37
|
+
"ora": "^9.3.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "^25.5.0",
|
|
41
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
42
|
+
"typescript": "^5.5.0",
|
|
43
|
+
"vitest": "^4.1.0"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=20.0.0"
|
|
47
|
+
}
|
|
48
|
+
}
|