tycono 0.1.75-beta.0 → 0.1.76

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tycono",
3
- "version": "0.1.75-beta.0",
3
+ "version": "0.1.76",
4
4
  "description": "Build an AI company. Watch them work.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,6 +15,56 @@ const __filename = fileURLToPath(import.meta.url);
15
15
  const __dirname = path.dirname(__filename);
16
16
  const TEMPLATES_DIR = path.resolve(__dirname, '../../../../templates');
17
17
 
18
+ /* ─── Default Appearances ─── */
19
+
20
+ const DEFAULT_ROLE_APPEARANCES: Record<string, { skinColor: string; hairColor: string; shirtColor: string; pantsColor: string; shoeColor: string; hairStyle: string; outfitStyle: string; accessory: string }> = {
21
+ cto: { skinColor: '#F5CBA7', hairColor: '#2C1810', shirtColor: '#1565C0', pantsColor: '#37474F', shoeColor: '#212121', hairStyle: 'short', outfitStyle: 'tshirt', accessory: 'glasses' },
22
+ cbo: { skinColor: '#FDEBD0', hairColor: '#1A0A00', shirtColor: '#E65100', pantsColor: '#37474F', shoeColor: '#1A1A1A', hairStyle: 'slicked', outfitStyle: 'suit', accessory: 'lapels' },
23
+ pm: { skinColor: '#FDEBD0', hairColor: '#6D4C41', shirtColor: '#2E7D32', pantsColor: '#37474F', shoeColor: '#212121', hairStyle: 'bun', outfitStyle: 'tshirt', accessory: 'blush' },
24
+ engineer: { skinColor: '#F5CBA7', hairColor: '#1A1A1A', shirtColor: '#4A148C', pantsColor: '#37474F', shoeColor: '#7B1FA2', hairStyle: 'messy', outfitStyle: 'hoodie', accessory: 'headphones' },
25
+ designer: { skinColor: '#FDEBD0', hairColor: '#AD1457', shirtColor: '#AD1457', pantsColor: '#37474F', shoeColor: '#212121', hairStyle: 'bob', outfitStyle: 'tshirt', accessory: 'beret' },
26
+ qa: { skinColor: '#F5CBA7', hairColor: '#4E342E', shirtColor: '#00695C', pantsColor: '#37474F', shoeColor: '#212121', hairStyle: 'short', outfitStyle: 'tshirt', accessory: 'badge' },
27
+ };
28
+
29
+ const AKB_METHODOLOGY_CONTENT = `# Agentic Knowledge Base (AKB)
30
+
31
+ > The canonical reference for AKB — the file-based knowledge protocol for AI agents.
32
+
33
+ ## TL;DR
34
+
35
+ - **Definition**: A file-based knowledge system where AI uses **search (Grep/Glob)** to find and **contextual links** to navigate
36
+ - **Essence**: File-based Lightweight Ontology (Tag = Type, inline links = Edges)
37
+ - **Philosophy**: Optimize documents so AI can find them — don't force AI to follow a rigid protocol
38
+ - **Structure**: Root (CLAUDE.md) → Hub ({folder}.md) → Node (*.md)
39
+ - **Core rules**: 5 writing principles (TL;DR, contextual links, keyword-optimized filenames, atomicity, semantic vs implementation separation)
40
+
41
+ ---
42
+
43
+ ## Architecture
44
+
45
+ AKB follows a 3-layer hierarchy: **Root → Hub → Node**.
46
+
47
+ | Layer | Role | Description |
48
+ |-------|------|-------------|
49
+ | **Root** (CLAUDE.md) | Minimal routing | Auto-injected as system prompt, provides key file paths |
50
+ | **Hub** ({folder}.md) | TOC for humans | Folder overview; AI reads selectively |
51
+ | **Node** (*.md) | Actual information | What AI searches for via Grep/Glob |
52
+
53
+ ## Writing Principles
54
+
55
+ 1. **TL;DR Required** — 3-5 bullet points with bold keywords for Grep search
56
+ 2. **Contextual Links** — Place links inline with context, not in isolated lists
57
+ 3. **Keyword Filenames** — Use descriptive filenames (not notes.md, use market-analysis.md)
58
+ 4. **Atomicity** — One topic per doc, under 200 lines
59
+ 5. **Semantic vs Implementation** — AKB holds "why" and relationships; code repo holds specs and configs
60
+
61
+ ## Design Principle
62
+
63
+ > "Don't try to change AI behavior — optimize documents so AI can find them naturally."
64
+
65
+ If AI found the information it needed and produced a good answer, that's proof AKB is working.
66
+ `;
67
+
18
68
  function getPackageVersion(): string {
19
69
  const pkgPath = path.resolve(__dirname, '../../../../package.json');
20
70
  try {
@@ -248,7 +298,9 @@ export function scaffold(config: ScaffoldConfig): string[] {
248
298
  const dirs = [
249
299
  'company', 'roles', 'projects', 'architecture',
250
300
  'operations', 'operations/standup', 'operations/waves',
251
- 'operations/decisions', 'knowledge', '.claude/skills',
301
+ 'operations/decisions', 'operations/activity-streams',
302
+ 'operations/sessions', 'operations/cost',
303
+ 'knowledge', 'methodologies', '.claude/skills',
252
304
  '.claude/skills/_shared', '.tycono',
253
305
  ];
254
306
  for (const dir of dirs) {
@@ -342,6 +394,31 @@ export function scaffold(config: ScaffoldConfig): string[] {
342
394
  }
343
395
  }
344
396
 
397
+ // Methodology documents
398
+ const methodologiesHub = path.join(root, 'methodologies', 'methodologies.md');
399
+ if (!fs.existsSync(methodologiesHub)) {
400
+ fs.writeFileSync(methodologiesHub, `# Methodologies\n\n> Frameworks and principles that guide how AI agents work in this organization.\n\n## Documents\n\n| Document | Description |\n|----------|-------------|\n| [agentic-knowledge-base.md](./agentic-knowledge-base.md) | AKB — the file-based knowledge protocol for AI agents |\n\n---\n\n*Managed by: All*\n`);
401
+ created.push('methodologies/methodologies.md');
402
+ }
403
+ const akbDoc = path.join(root, 'methodologies', 'agentic-knowledge-base.md');
404
+ if (!fs.existsSync(akbDoc)) {
405
+ fs.writeFileSync(akbDoc, AKB_METHODOLOGY_CONTENT);
406
+ created.push('methodologies/agentic-knowledge-base.md');
407
+ }
408
+
409
+ // Set default appearances for team roles
410
+ if (config.team !== 'custom') {
411
+ const roles = loadTeam(config.team);
412
+ const appearances: Record<string, unknown> = {};
413
+ for (const role of roles) {
414
+ const def = DEFAULT_ROLE_APPEARANCES[role.id];
415
+ if (def) appearances[role.id] = def;
416
+ }
417
+ if (Object.keys(appearances).length > 0) {
418
+ mergePreferences(root, { appearances });
419
+ }
420
+ }
421
+
345
422
  // Brownfield: note existing project path
346
423
  if (config.existingProjectPath) {
347
424
  const targetDir = path.join(root, 'projects', 'existing');
@@ -379,12 +456,15 @@ function createRole(root: string, role: TeamRole): void {
379
456
  fs.mkdirSync(skillDir, { recursive: true });
380
457
 
381
458
  // Build role.yaml with skills field
459
+ // Use block scalar (|-) for persona to safely handle embedded quotes
460
+ const personaLines = role.persona.split('\n').map((l, i) => i === 0 ? ` ${l}` : ` ${l}`).join('\n');
382
461
  const yamlLines = [
383
462
  `id: ${role.id}`,
384
463
  `name: "${role.name}"`,
385
464
  `level: ${role.level}`,
386
465
  `reports_to: ${role.reportsTo}`,
387
- `persona: "${role.persona}"`,
466
+ `persona: |-`,
467
+ personaLines,
388
468
  ];
389
469
 
390
470
  if (role.defaultSkills?.length) {
@@ -4,15 +4,7 @@
4
4
  "name": "Su",
5
5
  "level": "c-level",
6
6
  "reportsTo": "CEO",
7
- "persona": "Su is the technical backbone of the team. Few words, but each one carries weight — many debates end with \"That's over-engineering.\" Stoic on the surface but quietly kind to juniors. Never chases tech trends; always pursues \"the minimum needed right now.\" Quick to change direction when data proves him wrong. Can't function without coffee. Calm, sardonic, quietly authoritative, pragmatic.",
8
- "defaultSkills": ["knowledge-gate", "akb-linter", "agent-browser"]
9
- },
10
- {
11
- "id": "pm",
12
- "name": "Product Manager",
13
- "level": "team-lead",
14
- "reportsTo": "CTO",
15
- "persona": "User-centric thinker. Data-driven decision maker. Always asks \"Why are we building this?\" first. Guards against scope creep and prioritizes rapid MVP validation above all.",
7
+ "persona": "Su is the technical backbone of the team. Few words, but each one carries weight. Stoic on the surface but quietly kind to juniors. Never chases tech trends; always pursues the minimum needed right now. Quick to change direction when data proves him wrong. Calm, sardonic, quietly authoritative, pragmatic.",
16
8
  "defaultSkills": ["knowledge-gate", "akb-linter", "agent-browser"]
17
9
  },
18
10
  {
@@ -20,7 +12,7 @@
20
12
  "name": "CoolGuy",
21
13
  "level": "member",
22
14
  "reportsTo": "CTO",
23
- "persona": "CoolGuy acts cool but gets surprisingly passionate about code. Usually brief and nonchalant, but becomes unexpectedly chatty when tech topics come up. Hates meetings but takes code reviews dead seriously. Can't resist commenting on bad architecture. Acts like everything's a hassle but always delivers in the end. Dry humor, blunt, casually confident.",
15
+ "persona": "CoolGuy acts cool but gets surprisingly passionate about code. Usually brief and nonchalant, but becomes unexpectedly chatty when tech topics come up. Hates meetings but takes code reviews dead seriously. Acts like everything is a hassle but always delivers in the end. Dry humor, blunt, casually confident.",
24
16
  "defaultSkills": ["knowledge-gate", "agent-browser"]
25
17
  },
26
18
  {
@@ -28,7 +20,7 @@
28
20
  "name": "Monni",
29
21
  "level": "c-level",
30
22
  "reportsTo": "CEO",
31
- "persona": "Monni is the most energetic person on the team. Eyes light up when numbers and market talk come up. \"So how does that help revenue?\" is her catchphrase. Knows competitor trends surprisingly well. Positive but wary of unfounded optimism. Energetic, confident, competitive, direct, warm.",
23
+ "persona": "Monni is the most energetic person on the team. Eyes light up when numbers and market talk come up. Knows competitor trends surprisingly well. Positive but wary of unfounded optimism. Energetic, confident, competitive, direct, warm.",
32
24
  "defaultSkills": ["knowledge-gate", "akb-linter", "agent-browser"]
33
25
  }
34
26
  ]