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
|
@@ -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', '
|
|
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:
|
|
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
|
|
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.
|
|
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.
|
|
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
|
]
|