tycono-server 0.1.0-beta.0
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/bin/cli.js +35 -0
- package/bin/server.ts +160 -0
- package/package.json +50 -0
- package/src/api/package.json +31 -0
- package/src/api/src/create-app.ts +90 -0
- package/src/api/src/create-server.ts +251 -0
- package/src/api/src/engine/agent-loop.ts +738 -0
- package/src/api/src/engine/authority-validator.ts +149 -0
- package/src/api/src/engine/context-assembler.ts +912 -0
- package/src/api/src/engine/index.ts +27 -0
- package/src/api/src/engine/knowledge-gate.ts +365 -0
- package/src/api/src/engine/llm-adapter.ts +304 -0
- package/src/api/src/engine/org-tree.ts +270 -0
- package/src/api/src/engine/role-lifecycle.ts +369 -0
- package/src/api/src/engine/runners/claude-cli.ts +796 -0
- package/src/api/src/engine/runners/direct-api.ts +66 -0
- package/src/api/src/engine/runners/index.ts +30 -0
- package/src/api/src/engine/runners/types.ts +95 -0
- package/src/api/src/engine/skill-template.ts +134 -0
- package/src/api/src/engine/tools/definitions.ts +201 -0
- package/src/api/src/engine/tools/executor.ts +611 -0
- package/src/api/src/routes/active-sessions.ts +134 -0
- package/src/api/src/routes/coins.ts +153 -0
- package/src/api/src/routes/company.ts +57 -0
- package/src/api/src/routes/cost.ts +141 -0
- package/src/api/src/routes/engine.ts +220 -0
- package/src/api/src/routes/execute.ts +1075 -0
- package/src/api/src/routes/git.ts +211 -0
- package/src/api/src/routes/knowledge.ts +378 -0
- package/src/api/src/routes/operations.ts +309 -0
- package/src/api/src/routes/preferences.ts +63 -0
- package/src/api/src/routes/presets.ts +123 -0
- package/src/api/src/routes/projects.ts +82 -0
- package/src/api/src/routes/quests.ts +41 -0
- package/src/api/src/routes/roles.ts +112 -0
- package/src/api/src/routes/save.ts +152 -0
- package/src/api/src/routes/sessions.ts +288 -0
- package/src/api/src/routes/setup.ts +437 -0
- package/src/api/src/routes/skills.ts +357 -0
- package/src/api/src/routes/speech.ts +959 -0
- package/src/api/src/routes/supervision.ts +136 -0
- package/src/api/src/routes/sync.ts +165 -0
- package/src/api/src/server.ts +59 -0
- package/src/api/src/services/activity-stream.ts +184 -0
- package/src/api/src/services/activity-tracker.ts +115 -0
- package/src/api/src/services/claude-md-manager.ts +94 -0
- package/src/api/src/services/company-config.ts +115 -0
- package/src/api/src/services/database.ts +77 -0
- package/src/api/src/services/digest-engine.ts +313 -0
- package/src/api/src/services/execution-manager.ts +1036 -0
- package/src/api/src/services/file-reader.ts +77 -0
- package/src/api/src/services/git-save.ts +614 -0
- package/src/api/src/services/job-manager.ts +16 -0
- package/src/api/src/services/knowledge-importer.ts +466 -0
- package/src/api/src/services/markdown-parser.ts +173 -0
- package/src/api/src/services/port-registry.ts +222 -0
- package/src/api/src/services/preferences.ts +150 -0
- package/src/api/src/services/preset-loader.ts +149 -0
- package/src/api/src/services/pricing.ts +34 -0
- package/src/api/src/services/scaffold.ts +546 -0
- package/src/api/src/services/session-store.ts +340 -0
- package/src/api/src/services/supervisor-heartbeat.ts +897 -0
- package/src/api/src/services/team-recommender.ts +382 -0
- package/src/api/src/services/token-ledger.ts +127 -0
- package/src/api/src/services/wave-messages.ts +194 -0
- package/src/api/src/services/wave-multiplexer.ts +356 -0
- package/src/api/src/services/wave-tracker.ts +359 -0
- package/src/api/src/utils/role-level.ts +31 -0
- package/src/core/scaffolder.ts +620 -0
- package/src/shared/types.ts +224 -0
- package/templates/CLAUDE.md.tmpl +239 -0
- package/templates/company.md.tmpl +17 -0
- package/templates/gitignore.tmpl +28 -0
- package/templates/roles.md.tmpl +8 -0
- package/templates/skills/_manifest.json +23 -0
- package/templates/skills/agent-browser/SKILL.md +159 -0
- package/templates/skills/agent-browser/meta.json +19 -0
- package/templates/skills/akb-linter/SKILL.md +125 -0
- package/templates/skills/akb-linter/meta.json +12 -0
- package/templates/skills/knowledge-gate/SKILL.md +120 -0
- package/templates/skills/knowledge-gate/meta.json +12 -0
- package/templates/teams/agency.json +58 -0
- package/templates/teams/research.json +58 -0
- package/templates/teams/startup.json +58 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Type Contract — Single Source of Truth (D-014 Session-Centric)
|
|
3
|
+
*
|
|
4
|
+
* 이 파일은 API와 Web이 공유하는 모든 상태/이벤트 타입을 정의합니다.
|
|
5
|
+
* 상태 관련 타입을 추가하거나 변경할 때는 반드시 이 파일을 수정하세요.
|
|
6
|
+
*
|
|
7
|
+
* 규칙:
|
|
8
|
+
* 1. 상태 타입은 여기서만 정의 — api/web에서 재정의 금지
|
|
9
|
+
* 2. UI-only 상태(waiting, connecting 등)는 별도 섹션에 명시적 분리
|
|
10
|
+
* 3. 상태 전이는 TRANSITIONS 맵으로 검증 가능
|
|
11
|
+
*
|
|
12
|
+
* D-014: Session이 모든 대화의 일급 단위. Job은 내부 런타임 핸들.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/* ═══════════════════════════════════════════════
|
|
16
|
+
* Message — 실행 단위의 핵심 상태 (D-014: 구 Job 대체)
|
|
17
|
+
* ═══════════════════════════════════════════════ */
|
|
18
|
+
|
|
19
|
+
/** Message의 실행 상태 — 시스템 전체에서 유일한 정의 */
|
|
20
|
+
export type MessageStatus = 'streaming' | 'done' | 'error' | 'awaiting_input' | 'interrupted';
|
|
21
|
+
|
|
22
|
+
/** /api/exec/status 등에서 Role 단위로 집계할 때 사용 */
|
|
23
|
+
export type RoleStatus = 'idle' | 'working' | 'awaiting_input' | 'done';
|
|
24
|
+
|
|
25
|
+
/** MessageStatus → RoleStatus 변환 (유일한 매핑 규칙) */
|
|
26
|
+
export function messageStatusToRoleStatus(status: MessageStatus): RoleStatus {
|
|
27
|
+
switch (status) {
|
|
28
|
+
case 'streaming': return 'working';
|
|
29
|
+
case 'awaiting_input': return 'awaiting_input';
|
|
30
|
+
case 'done': return 'done';
|
|
31
|
+
case 'error': return 'done';
|
|
32
|
+
case 'interrupted': return 'done';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Role이 "활성 상태"인지 판단 — exec/status, Org Chart 등에서 사용 */
|
|
37
|
+
export function isRoleActive(status: RoleStatus): boolean {
|
|
38
|
+
return status === 'working' || status === 'awaiting_input';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Message가 "활성 상태"인지 판단 */
|
|
42
|
+
export function isMessageActive(status: MessageStatus): boolean {
|
|
43
|
+
return status === 'streaming' || status === 'awaiting_input';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Message가 종료 상태인지 판단 */
|
|
47
|
+
export function isMessageTerminal(status: MessageStatus): boolean {
|
|
48
|
+
return status === 'done' || status === 'error' || status === 'interrupted';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 허용된 상태 전이 (from → to[]) */
|
|
52
|
+
export const MESSAGE_TRANSITIONS: Record<MessageStatus, MessageStatus[]> = {
|
|
53
|
+
streaming: ['done', 'error', 'awaiting_input', 'interrupted'],
|
|
54
|
+
awaiting_input: ['streaming', 'done', 'error', 'interrupted'],
|
|
55
|
+
interrupted: ['streaming', 'done'], // re-dispatch 또는 CEO dismiss
|
|
56
|
+
done: [],
|
|
57
|
+
error: [],
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/** 상태 전이 유효성 검증 */
|
|
61
|
+
export function canTransition(from: MessageStatus, to: MessageStatus): boolean {
|
|
62
|
+
return MESSAGE_TRANSITIONS[from].includes(to);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* ═══════════════════════════════════════════════
|
|
66
|
+
* Activity Events — 실행 이벤트 로그
|
|
67
|
+
* ═══════════════════════════════════════════════ */
|
|
68
|
+
|
|
69
|
+
/** 모든 이벤트 타입 — Message.events[]에 기록되는 유일한 어휘 */
|
|
70
|
+
export type ActivityEventType =
|
|
71
|
+
// Message lifecycle (D-014: 구 job:* → msg:*)
|
|
72
|
+
| 'msg:start' | 'msg:done' | 'msg:error'
|
|
73
|
+
| 'msg:awaiting_input' | 'msg:reply'
|
|
74
|
+
| 'msg:turn-complete'
|
|
75
|
+
// Execution
|
|
76
|
+
| 'text' | 'thinking'
|
|
77
|
+
| 'tool:start' | 'tool:result'
|
|
78
|
+
// Dispatch (child session)
|
|
79
|
+
| 'dispatch:start' | 'dispatch:done'
|
|
80
|
+
// Harness (turn limits)
|
|
81
|
+
| 'turn:warning' | 'turn:limit'
|
|
82
|
+
// Knowledge import
|
|
83
|
+
| 'import:scan' | 'import:process' | 'import:created'
|
|
84
|
+
// Trace (full prompt/response capture for AI debugging)
|
|
85
|
+
| 'prompt:assembled' | 'trace:response'
|
|
86
|
+
// Supervision (C-Level heartbeat)
|
|
87
|
+
| 'heartbeat:tick' | 'heartbeat:skip'
|
|
88
|
+
// Other
|
|
89
|
+
| 'stderr';
|
|
90
|
+
|
|
91
|
+
export interface ActivityEvent {
|
|
92
|
+
seq: number;
|
|
93
|
+
ts: string;
|
|
94
|
+
type: ActivityEventType;
|
|
95
|
+
roleId: string;
|
|
96
|
+
parentSessionId?: string;
|
|
97
|
+
/** Trace ID — top-level sessionId, inherited by child sessions */
|
|
98
|
+
traceId?: string;
|
|
99
|
+
data: Record<string, unknown>;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ═══════════════════════════════════════════════
|
|
103
|
+
* Session — D-014 통합 세션
|
|
104
|
+
* ═══════════════════════════════════════════════ */
|
|
105
|
+
|
|
106
|
+
export type SessionStatus = 'active' | 'closed';
|
|
107
|
+
export type SessionSource = 'chat' | 'wave' | 'dispatch' | 'consult';
|
|
108
|
+
|
|
109
|
+
/* ═══════════════════════════════════════════════
|
|
110
|
+
* Wave — 조직 전파 단위
|
|
111
|
+
* ═══════════════════════════════════════════════ */
|
|
112
|
+
|
|
113
|
+
/** Wave JSON에 저장되는 role별 상태 */
|
|
114
|
+
export type WaveRoleStatus = MessageStatus | 'unknown';
|
|
115
|
+
|
|
116
|
+
/* ═══════════════════════════════════════════════
|
|
117
|
+
* Frontend-Only 상태 (UI 전용, 백엔드에는 없음)
|
|
118
|
+
* 명시적으로 분리하여 혼동 방지
|
|
119
|
+
* ═══════════════════════════════════════════════ */
|
|
120
|
+
|
|
121
|
+
/** Wave 노드의 UI 상태 — MessageStatus + UI-only 상태 */
|
|
122
|
+
export type WaveNodeStatus =
|
|
123
|
+
| MessageStatus // 'streaming' | 'done' | 'error' | 'awaiting_input' | 'interrupted'
|
|
124
|
+
| 'waiting' // 아직 dispatch 안 됨 (UI 초기 상태)
|
|
125
|
+
| 'not-dispatched'; // wave 완료 후에도 dispatch 안 된 노드
|
|
126
|
+
|
|
127
|
+
/** WaveNode가 "활성 상태"인지 판단 — UI-only 상태 포함 */
|
|
128
|
+
export function isWaveNodeActive(status: WaveNodeStatus): boolean {
|
|
129
|
+
return status === 'streaming' || status === 'awaiting_input';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** SSE 연결 상태 — 네트워크 레벨, 실행 상태와 무관 */
|
|
133
|
+
export type StreamStatus = 'idle' | 'connecting' | 'streaming' | 'done' | 'error';
|
|
134
|
+
|
|
135
|
+
/** ActivityEventType → MessageStatus 변환 (wave replay 등에서 사용) */
|
|
136
|
+
export function eventTypeToMessageStatus(eventType: ActivityEventType): MessageStatus | 'unknown' {
|
|
137
|
+
switch (eventType) {
|
|
138
|
+
case 'msg:done': return 'done';
|
|
139
|
+
case 'msg:error': return 'error';
|
|
140
|
+
case 'msg:awaiting_input': return 'awaiting_input';
|
|
141
|
+
default: return 'unknown';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** TeamStatus — Role별 현재 상태 + 작업 내용 (context-assembler, runner에서 공유) */
|
|
146
|
+
export type TeamStatus = Record<string, { status: RoleStatus; task?: string }>;
|
|
147
|
+
|
|
148
|
+
/* ═══════════════════════════════════════════════
|
|
149
|
+
* Preset — Wave-scoped team configuration
|
|
150
|
+
* ═══════════════════════════════════════════════ */
|
|
151
|
+
|
|
152
|
+
/** preset.yaml 스키마 */
|
|
153
|
+
export interface PresetDefinition {
|
|
154
|
+
/** Spec version (e.g. "preset/v1") */
|
|
155
|
+
spec: string;
|
|
156
|
+
/** Unique identifier (directory name) */
|
|
157
|
+
id: string;
|
|
158
|
+
/** Display name */
|
|
159
|
+
name: string;
|
|
160
|
+
/** Short tagline */
|
|
161
|
+
tagline?: string;
|
|
162
|
+
/** Version string */
|
|
163
|
+
version: string;
|
|
164
|
+
/** Full description */
|
|
165
|
+
description?: string;
|
|
166
|
+
/** Author info */
|
|
167
|
+
author?: {
|
|
168
|
+
id: string;
|
|
169
|
+
name: string;
|
|
170
|
+
verified?: boolean;
|
|
171
|
+
};
|
|
172
|
+
/** Category / classification */
|
|
173
|
+
category?: string;
|
|
174
|
+
industry?: string;
|
|
175
|
+
stage?: string;
|
|
176
|
+
use_case?: string[];
|
|
177
|
+
/** Role IDs included in this preset */
|
|
178
|
+
roles: string[];
|
|
179
|
+
/** Counts */
|
|
180
|
+
knowledge_docs?: number;
|
|
181
|
+
skills_count?: number;
|
|
182
|
+
/** Pricing */
|
|
183
|
+
pricing?: {
|
|
184
|
+
type: 'one-time' | 'subscription';
|
|
185
|
+
price: number;
|
|
186
|
+
wave_scoped_tier?: string;
|
|
187
|
+
};
|
|
188
|
+
/** Tags for search */
|
|
189
|
+
tags?: string[];
|
|
190
|
+
languages?: string[];
|
|
191
|
+
/** Stats (marketplace) */
|
|
192
|
+
stats?: {
|
|
193
|
+
installs: number;
|
|
194
|
+
rating: number;
|
|
195
|
+
reviews: number;
|
|
196
|
+
waves_used: number;
|
|
197
|
+
};
|
|
198
|
+
/** Wave-scoped recommendations */
|
|
199
|
+
wave_scoped?: {
|
|
200
|
+
recommended_tasks?: string[];
|
|
201
|
+
task_keywords?: string[];
|
|
202
|
+
avg_wave_duration?: string;
|
|
203
|
+
complexity?: string;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Loaded preset with resolved path info */
|
|
208
|
+
export interface LoadedPreset {
|
|
209
|
+
definition: PresetDefinition;
|
|
210
|
+
/** Absolute path to preset directory (or null for _default) */
|
|
211
|
+
path: string | null;
|
|
212
|
+
/** Whether this is the _default preset */
|
|
213
|
+
isDefault: boolean;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Preset summary for TUI display */
|
|
217
|
+
export interface PresetSummary {
|
|
218
|
+
id: string;
|
|
219
|
+
name: string;
|
|
220
|
+
description?: string;
|
|
221
|
+
rolesCount: number;
|
|
222
|
+
roles: string[];
|
|
223
|
+
isDefault: boolean;
|
|
224
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Company Rules
|
|
2
|
+
|
|
3
|
+
> Powered by [Tycono](https://tycono.ai) — AI Company Operating Platform
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task Routing
|
|
8
|
+
|
|
9
|
+
| Task | Read First | Role |
|
|
10
|
+
|------|-----------|------|
|
|
11
|
+
| Product planning | `projects/` | PM |
|
|
12
|
+
| Technical design | `architecture/` | CTO |
|
|
13
|
+
| Implementation | `projects/*/tasks.md` | Engineer |
|
|
14
|
+
| UI/UX Design | `projects/*/design/` | Designer |
|
|
15
|
+
| Testing/QA | `projects/*/tasks.md` | QA |
|
|
16
|
+
| E2E Testing | `e2e-experiments/tui-e2e-testcases.md` | QA |
|
|
17
|
+
| Operations | `marketing/` | PM |
|
|
18
|
+
| Business/Revenue | `company.md` | CBO |
|
|
19
|
+
| Domain knowledge | `knowledge.md` | CBO |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## AKB Core Concepts
|
|
24
|
+
|
|
25
|
+
> **AKB** = A file-based knowledge system where AI uses **search (Grep/Glob)** to find and **contextual links** to navigate
|
|
26
|
+
>
|
|
27
|
+
> Full reference: `methodologies/agentic-knowledge-base.md`
|
|
28
|
+
|
|
29
|
+
| Layer | Role | AI Usage |
|
|
30
|
+
|-------|------|----------|
|
|
31
|
+
| **Root** (CLAUDE.md) | Minimal routing | Auto-injected as system prompt |
|
|
32
|
+
| **Hub** ({folder}.md) | TOC + tool/guide references | **Check before starting work** |
|
|
33
|
+
| **Node** (*.md) | Actual information | Search directly via Grep/Glob |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## AI Work Rules
|
|
38
|
+
|
|
39
|
+
### The Loop (Work Cycle)
|
|
40
|
+
|
|
41
|
+
Every task follows this cycle. Implementing without completing the cycle is only half the job.
|
|
42
|
+
|
|
43
|
+
| Step | Action | Why |
|
|
44
|
+
|------|--------|-----|
|
|
45
|
+
| ① Knowledge | Check/research related docs | Without context, direction goes wrong |
|
|
46
|
+
| ② Task | Define task from docs | Without requirements, you'll rework |
|
|
47
|
+
| ③ Implement | Execute the actual work | Value creation |
|
|
48
|
+
| ④ Knowledge Update | Update docs with new insights | Prevents knowledge decay |
|
|
49
|
+
| ⑤ Task Update | Update task status, check next work | Ensures continuity |
|
|
50
|
+
|
|
51
|
+
**C-Level**: Execute The Loop autonomously — decompose tasks, analyze dependencies, dispatch independent tasks in parallel, collect results.
|
|
52
|
+
**Member**: After implementation, always complete steps ④ and ⑤.
|
|
53
|
+
|
|
54
|
+
### Hub-First Principle
|
|
55
|
+
|
|
56
|
+
> ⛔ **Read the relevant Hub document before starting any work.**
|
|
57
|
+
|
|
58
|
+
Check the Task Routing table above to find the right "Read First" path.
|
|
59
|
+
Every folder has a Hub file (`{folder-name}.md`) as its entry point.
|
|
60
|
+
Read the Hub's existing tools/scripts/guides before starting work.
|
|
61
|
+
|
|
62
|
+
### Skill Check Principle
|
|
63
|
+
|
|
64
|
+
> ⛔ **If `.claude/skills/{role-id}/SKILL.md` exists, you MUST read it.**
|
|
65
|
+
|
|
66
|
+
Skill files define the tools, commands, and guides for each Role.
|
|
67
|
+
Working without reading skills means missing existing tools and starting from scratch.
|
|
68
|
+
|
|
69
|
+
### Custom Rules (CRITICAL)
|
|
70
|
+
|
|
71
|
+
> ⛔ **Before starting work, check if `custom-rules.md` exists and read it.**
|
|
72
|
+
> This file contains company-specific rules, constraints, and processes.
|
|
73
|
+
> If the file doesn't exist, ignore this section.
|
|
74
|
+
|
|
75
|
+
### Git Rules
|
|
76
|
+
|
|
77
|
+
- Source code changes: feature branch → PR → merge
|
|
78
|
+
- Direct push to main is prohibited
|
|
79
|
+
|
|
80
|
+
### Knowledge Gate
|
|
81
|
+
|
|
82
|
+
> **Before creating a new document, search existing docs first.**
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
1. Summarize the insight + 3-5 keywords
|
|
86
|
+
2. Search existing docs with those keywords (grep 3+ terms)
|
|
87
|
+
3. Decide:
|
|
88
|
+
- Overlap 70%+ -> Add to existing document
|
|
89
|
+
- Overlap 30-70% -> New doc + cross-link to existing
|
|
90
|
+
- Overlap <30% -> New document (register in Hub)
|
|
91
|
+
- Temporary info -> Journal only (no new doc)
|
|
92
|
+
4. Cross-link to related docs
|
|
93
|
+
5. Register in the relevant Hub
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Document Hygiene
|
|
97
|
+
|
|
98
|
+
| Rule | Description |
|
|
99
|
+
|------|-------------|
|
|
100
|
+
| No orphan docs | Every document must be reachable from a Hub |
|
|
101
|
+
| Hub pattern | Each folder's entry point is `{folder}.md` |
|
|
102
|
+
| Prefer existing | Adding 1 doc = maintenance cost. Strengthen existing > create new |
|
|
103
|
+
| Cross-link | New docs must reference at least 1 related doc |
|
|
104
|
+
| Source attribution | External research must cite source and date |
|
|
105
|
+
|
|
106
|
+
### Skills
|
|
107
|
+
|
|
108
|
+
Roles have equipped **Skills** -- modular capability guides in `.claude/skills/`.
|
|
109
|
+
|
|
110
|
+
- Role-specific skills: `.claude/skills/{role-id}/SKILL.md`
|
|
111
|
+
- Shared skills: `.claude/skills/_shared/{skill-id}/SKILL.md`
|
|
112
|
+
- Each Role's equipped skills are listed in `role.yaml` under `skills:`
|
|
113
|
+
- **Always read SKILL.md before starting work** for that Role
|
|
114
|
+
|
|
115
|
+
### Agent Dispatch Rules (CRITICAL)
|
|
116
|
+
|
|
117
|
+
> **Sub-agents (Agent/Task) do NOT automatically receive CLAUDE.md.**
|
|
118
|
+
> **You MUST instruct them to read CLAUDE.md in the first line of the prompt.**
|
|
119
|
+
|
|
120
|
+
Without the Root (CLAUDE.md), sub-agents skip Hubs and dive straight into code,
|
|
121
|
+
missing existing tools, guides, and constraints.
|
|
122
|
+
|
|
123
|
+
#### Required Prompt Pattern
|
|
124
|
+
|
|
125
|
+
Every sub-agent prompt **must include**:
|
|
126
|
+
|
|
127
|
+
1. Instruction to read CLAUDE.md
|
|
128
|
+
2. **Required skill file paths** for the Role
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
⛔ AKB Rule: Read CLAUDE.md before starting work.
|
|
132
|
+
Find the relevant Hub from the "Task Routing" table and read it first.
|
|
133
|
+
Check the Hub's existing tools/guides/constraints before exploring code.
|
|
134
|
+
⛔ Read the required skill files below and use the tools/commands defined in them.
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### Role Skill Mapping
|
|
138
|
+
|
|
139
|
+
| Role | Required Skills (path: `.claude/skills/{name}/SKILL.md`) |
|
|
140
|
+
|------|--------------------------------------------------------|
|
|
141
|
+
| Each Role | `{role-id}` + shared skills listed in `role.yaml` |
|
|
142
|
+
|
|
143
|
+
> Check each Role's `role.yaml` `skills:` field for the exact list.
|
|
144
|
+
|
|
145
|
+
### Self-Verification Before Escalation (CRITICAL)
|
|
146
|
+
|
|
147
|
+
> **Before saying "I can't" or "user action needed", check your own tools/skills first.**
|
|
148
|
+
|
|
149
|
+
#### Checklist (before reporting inability)
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
□ 1. Check CLAUDE.md routing table for relevant skills/tools
|
|
153
|
+
□ 2. Glob search .claude/skills/ for related skills
|
|
154
|
+
□ 3. Read the skill and determine if it can solve the problem
|
|
155
|
+
□ 4. Only if all above fail → Report: "Tried X but unable due to [specific reason]"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Exploration Depth
|
|
159
|
+
|
|
160
|
+
> **Don't stop at Hubs. Explore detailed documents for thorough understanding.**
|
|
161
|
+
|
|
162
|
+
| Question Type | Minimum | Additional |
|
|
163
|
+
|--------------|---------|------------|
|
|
164
|
+
| Implementation | Hub | Related Node |
|
|
165
|
+
| Debugging | Hub | Related issues/logs |
|
|
166
|
+
| **Strategy/Design** | Hub | **Design docs, past decisions, architecture details** |
|
|
167
|
+
| **New Feature** | Hub | **Existing implementation patterns, related architecture** |
|
|
168
|
+
|
|
169
|
+
### Skill Synchronization (CRITICAL)
|
|
170
|
+
|
|
171
|
+
> **When changing code/processes, update related `.claude/skills/` SKILL.md files too.**
|
|
172
|
+
|
|
173
|
+
| Change Type | Skill Update |
|
|
174
|
+
|-------------|-------------|
|
|
175
|
+
| API endpoint change | Update API reference |
|
|
176
|
+
| New tool/script added | Add to tool listing |
|
|
177
|
+
| Process change | Update procedure guide |
|
|
178
|
+
| Feature removed | Remove related section |
|
|
179
|
+
|
|
180
|
+
### AKB Management (CRITICAL)
|
|
181
|
+
|
|
182
|
+
> **Every Role manages knowledge as part of their work. Don't just code and stop.**
|
|
183
|
+
|
|
184
|
+
After completing any task, check:
|
|
185
|
+
|
|
186
|
+
| # | Item | Description |
|
|
187
|
+
|---|------|-------------|
|
|
188
|
+
| 1 | **New knowledge?** | Did this task produce new insights/decisions/analysis? |
|
|
189
|
+
| 2 | **Search existing docs** | Are there related docs already? (grep 3+ keywords) |
|
|
190
|
+
| 3 | **Decide location** | Add to existing doc vs create new (prefer existing) |
|
|
191
|
+
| 4 | **Hub connection** | Is the new/updated doc reachable from a Hub? |
|
|
192
|
+
| 5 | **Cross-link** | Are there mutual references between related docs? |
|
|
193
|
+
| 6 | **Task update** | Is the task status updated? Next work identified? |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Folder Structure
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
{project}/
|
|
201
|
+
├── knowledge/ ← Tycono world. AI agent's cwd. Git root.
|
|
202
|
+
│ ├── CLAUDE.md ← Only AI entry point
|
|
203
|
+
│ ├── .claude/skills/ ← Role skill guides
|
|
204
|
+
│ │ ├── _shared/
|
|
205
|
+
│ │ └── {role-id}/SKILL.md
|
|
206
|
+
│ ├── roles/
|
|
207
|
+
│ │ ├── roles.md ← Hub
|
|
208
|
+
│ │ └── {role-id}/
|
|
209
|
+
│ │ ├── role.yaml
|
|
210
|
+
│ │ ├── profile.md
|
|
211
|
+
│ │ └── journal/
|
|
212
|
+
│ ├── architecture/ ← Hub (technical architecture)
|
|
213
|
+
│ ├── projects/ ← Hub (project tracking)
|
|
214
|
+
│ ├── decisions/ ← CEO decisions
|
|
215
|
+
│ ├── methodologies/ ← Frameworks & principles
|
|
216
|
+
│ ├── presets/ ← Team presets
|
|
217
|
+
│ ├── marketing/ ← Hub (SNS, launch, SEO)
|
|
218
|
+
│ ├── e2e-experiments/ ← Hub (E2E test records)
|
|
219
|
+
│ ├── company.md ← Company info
|
|
220
|
+
│ ├── custom-rules.md ← Company custom rules (user owned)
|
|
221
|
+
│ └── knowledge.md ← Hub (domain knowledge index)
|
|
222
|
+
│
|
|
223
|
+
├── .tycono/ ← Operational data (outside git)
|
|
224
|
+
│ ├── config.json ← Engine settings, codeRoots
|
|
225
|
+
│ ├── tycono.db ← SQLite (conversation history)
|
|
226
|
+
│ ├── preferences.json ← UI settings
|
|
227
|
+
│ ├── waves/ ← Wave execution logs
|
|
228
|
+
│ ├── sessions/ ← Session state
|
|
229
|
+
│ ├── standup/ ← Daily standups
|
|
230
|
+
│ ├── cost/ ← Token cost tracking
|
|
231
|
+
│ └── activity-streams/ ← SSE event logs (runtime)
|
|
232
|
+
│
|
|
233
|
+
└── apps/ ← Code (default monorepo, outside git)
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
<!-- tycono:managed v{{VERSION}} — This file is managed by Tycono. Do not edit manually. -->
|
|
239
|
+
<!-- Company-specific rules go in custom-rules.md (knowledge/ root) -->
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
|
|
4
|
+
# Environment
|
|
5
|
+
.env
|
|
6
|
+
.env.local
|
|
7
|
+
.env.*.local
|
|
8
|
+
|
|
9
|
+
# Engine config (contains API keys)
|
|
10
|
+
.tycono/config.json
|
|
11
|
+
|
|
12
|
+
# OS
|
|
13
|
+
.DS_Store
|
|
14
|
+
Thumbs.db
|
|
15
|
+
|
|
16
|
+
# IDE
|
|
17
|
+
.vscode/
|
|
18
|
+
.idea/
|
|
19
|
+
*.swp
|
|
20
|
+
*.swo
|
|
21
|
+
|
|
22
|
+
# Logs
|
|
23
|
+
*.log
|
|
24
|
+
npm-debug.log*
|
|
25
|
+
|
|
26
|
+
# Runtime state
|
|
27
|
+
operations/activity/
|
|
28
|
+
operations/sessions/
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"skills": [
|
|
4
|
+
{
|
|
5
|
+
"id": "knowledge-gate",
|
|
6
|
+
"name": "Knowledge Gate",
|
|
7
|
+
"category": "core",
|
|
8
|
+
"description": "Knowledge documentation gatekeeper with dynamic domain expert analysis."
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "akb-linter",
|
|
12
|
+
"name": "AKB Document Linter",
|
|
13
|
+
"category": "core",
|
|
14
|
+
"description": "Document hygiene checker that finds AI-confusing documents."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "agent-browser",
|
|
18
|
+
"name": "Agent Browser",
|
|
19
|
+
"category": "core",
|
|
20
|
+
"description": "Token-efficient browser automation CLI for AI agents."
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|