citadel-ai 1.0.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/CONTRIBUTING.md +91 -0
- package/LICENSE +5 -0
- package/README.md +254 -0
- package/bin/citadel.js +2 -0
- package/dist/agents/registry.d.ts +16 -0
- package/dist/agents/registry.js +1108 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/cli/ide-rules.d.ts +5 -0
- package/dist/cli/ide-rules.js +176 -0
- package/dist/cli/ide-rules.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +59 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.js +110 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/run.d.ts +1 -0
- package/dist/cli/run.js +64 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/core/chinese-wall.d.ts +34 -0
- package/dist/core/chinese-wall.js +62 -0
- package/dist/core/chinese-wall.js.map +1 -0
- package/dist/core/gates.d.ts +19 -0
- package/dist/core/gates.js +38 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/loops.d.ts +20 -0
- package/dist/core/loops.js +83 -0
- package/dist/core/loops.js.map +1 -0
- package/dist/core/memory.d.ts +23 -0
- package/dist/core/memory.js +116 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/orchestrator.d.ts +22 -0
- package/dist/core/orchestrator.js +234 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/types.d.ts +139 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/provider.d.ts +8 -0
- package/dist/llm/provider.js +84 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/ui/terminal.d.ts +16 -0
- package/dist/ui/terminal.js +71 -0
- package/dist/ui/terminal.js.map +1 -0
- package/package.json +40 -0
- package/templates/.citadel/citadel.config.json +1 -0
- package/templates/.citadel/gates/gate-0-inception.json +1 -0
- package/templates/.citadel/gates/gate-1-predesign.json +1 -0
- package/templates/.citadel/gates/gate-2-prebuild.json +1 -0
- package/templates/.citadel/gates/gate-3-preship.json +1 -0
- package/templates/.citadel/gates/gate-4-postdeploy.json +1 -0
- package/templates/.citadel/memory/decisions.json +1 -0
- package/templates/.citadel/memory/errors.json +1 -0
- package/templates/.citadel/memory/project.json +1 -0
- package/templates/.citadel/memory/session.json +1 -0
- package/templates/.citadel/specs/adr.md +1 -0
- package/templates/.citadel/specs/data-model.md +1 -0
- package/templates/.citadel/specs/growth.md +1 -0
- package/templates/.citadel/specs/prd.md +1 -0
- package/templates/.citadel/specs/security.md +1 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
export type AgentLevel = 'command' | 'c-suite' | 'maker' | 'checker';
|
|
2
|
+
export type TeamId = 'cto' | 'cpo' | 'cgo' | 'ciso' | 'cdo';
|
|
3
|
+
export type GateId = 'gate-0' | 'gate-1' | 'gate-2' | 'gate-3' | 'gate-4';
|
|
4
|
+
export type GateStatus = 'pending' | 'in-progress' | 'passed' | 'failed' | 'blocked';
|
|
5
|
+
export type LoopId = 'design' | 'build' | 'security' | 'debug';
|
|
6
|
+
export type PhaseId = 'inception' | 'specification' | 'architecture' | 'build' | 'validation' | 'ship';
|
|
7
|
+
export type LLMProvider = 'anthropic' | 'openai';
|
|
8
|
+
export interface AgentDefinition {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
title: string;
|
|
12
|
+
subtitle: string;
|
|
13
|
+
level: AgentLevel;
|
|
14
|
+
parent: string | null;
|
|
15
|
+
team: TeamId | 'command';
|
|
16
|
+
icon: string;
|
|
17
|
+
color: string;
|
|
18
|
+
inspiration: string;
|
|
19
|
+
philosophy: string;
|
|
20
|
+
personality: string;
|
|
21
|
+
voice: string;
|
|
22
|
+
inputs: string[];
|
|
23
|
+
outputs: string[];
|
|
24
|
+
principles: string[];
|
|
25
|
+
rules: string[];
|
|
26
|
+
systemPrompt: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ProjectMemory {
|
|
29
|
+
projectName: string;
|
|
30
|
+
description: string;
|
|
31
|
+
techStack: Record<string, string>;
|
|
32
|
+
architecture: string[];
|
|
33
|
+
scope: string[];
|
|
34
|
+
createdAt: string;
|
|
35
|
+
updatedAt: string;
|
|
36
|
+
}
|
|
37
|
+
export interface Decision {
|
|
38
|
+
id: string;
|
|
39
|
+
timestamp: string;
|
|
40
|
+
agent: string;
|
|
41
|
+
gate: GateId | null;
|
|
42
|
+
phase: PhaseId;
|
|
43
|
+
title: string;
|
|
44
|
+
description: string;
|
|
45
|
+
alternatives: string[];
|
|
46
|
+
reasoning: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ErrorRecord {
|
|
49
|
+
id: string;
|
|
50
|
+
timestamp: string;
|
|
51
|
+
agent: string;
|
|
52
|
+
phase: PhaseId;
|
|
53
|
+
error: string;
|
|
54
|
+
rootCause: string;
|
|
55
|
+
fix: string;
|
|
56
|
+
filesAffected: string[];
|
|
57
|
+
preventionRule: string;
|
|
58
|
+
}
|
|
59
|
+
export interface SessionState {
|
|
60
|
+
currentPhase: PhaseId;
|
|
61
|
+
currentGate: GateId;
|
|
62
|
+
activeAgent: string;
|
|
63
|
+
conversationHistory: ConversationMessage[];
|
|
64
|
+
loopState: LoopState | null;
|
|
65
|
+
startedAt: string;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}
|
|
68
|
+
export interface LoopState {
|
|
69
|
+
loopId: LoopId;
|
|
70
|
+
iteration: number;
|
|
71
|
+
maxIterations: number;
|
|
72
|
+
agents: string[];
|
|
73
|
+
status: 'active' | 'escaped' | 'completed';
|
|
74
|
+
reason: string;
|
|
75
|
+
}
|
|
76
|
+
export interface GateCheck {
|
|
77
|
+
id: string;
|
|
78
|
+
description: string;
|
|
79
|
+
agent: string;
|
|
80
|
+
status: 'pending' | 'passed' | 'failed';
|
|
81
|
+
timestamp: string | null;
|
|
82
|
+
notes: string;
|
|
83
|
+
}
|
|
84
|
+
export interface GateState {
|
|
85
|
+
id: GateId;
|
|
86
|
+
name: string;
|
|
87
|
+
status: GateStatus;
|
|
88
|
+
checks: GateCheck[];
|
|
89
|
+
blocker: string;
|
|
90
|
+
signoffs: Record<string, boolean>;
|
|
91
|
+
}
|
|
92
|
+
export interface ConversationMessage {
|
|
93
|
+
id: string;
|
|
94
|
+
role: 'user' | 'agent' | 'system';
|
|
95
|
+
agent?: string;
|
|
96
|
+
content: string;
|
|
97
|
+
timestamp: string;
|
|
98
|
+
phase: PhaseId;
|
|
99
|
+
gate: GateId;
|
|
100
|
+
metadata?: Record<string, unknown>;
|
|
101
|
+
}
|
|
102
|
+
export interface WorkUnit {
|
|
103
|
+
id: string;
|
|
104
|
+
type: 'code' | 'spec' | 'schema' | 'design' | 'test';
|
|
105
|
+
createdBy: string;
|
|
106
|
+
reviewedBy: string | null;
|
|
107
|
+
status: 'pending' | 'approved' | 'rejected';
|
|
108
|
+
content: string;
|
|
109
|
+
feedback: string;
|
|
110
|
+
attempts: number;
|
|
111
|
+
}
|
|
112
|
+
export interface LLMConfig {
|
|
113
|
+
provider: LLMProvider;
|
|
114
|
+
model: string;
|
|
115
|
+
apiKey: string;
|
|
116
|
+
maxTokens: number;
|
|
117
|
+
temperature: number;
|
|
118
|
+
}
|
|
119
|
+
export interface LLMMessage {
|
|
120
|
+
role: 'system' | 'user' | 'assistant';
|
|
121
|
+
content: string;
|
|
122
|
+
}
|
|
123
|
+
export interface LLMResponse {
|
|
124
|
+
content: string;
|
|
125
|
+
tokensUsed: number;
|
|
126
|
+
model: string;
|
|
127
|
+
}
|
|
128
|
+
export interface CitadelConfig {
|
|
129
|
+
version: string;
|
|
130
|
+
llm: LLMConfig;
|
|
131
|
+
projectPath: string;
|
|
132
|
+
citadelPath: string;
|
|
133
|
+
features: {
|
|
134
|
+
webResearch: boolean;
|
|
135
|
+
autoGates: boolean;
|
|
136
|
+
persistentMemory: boolean;
|
|
137
|
+
chineseWalls: boolean;
|
|
138
|
+
};
|
|
139
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { Orchestrator } from './core/orchestrator.js';
|
|
2
|
+
export { Memory } from './core/memory.js';
|
|
3
|
+
export { GateSystem } from './core/gates.js';
|
|
4
|
+
export { LoopManager } from './core/loops.js';
|
|
5
|
+
export { ChineseWall } from './core/chinese-wall.js';
|
|
6
|
+
export { AGENT_REGISTRY, getAgent, getAgentsByTeam, getAgentsByLevel, getCSuiteAgents, getAllAgentIds, getAgentCount } from './agents/registry.js';
|
|
7
|
+
export { createLLMProvider } from './llm/provider.js';
|
|
8
|
+
export type { ILLMProvider } from './llm/provider.js';
|
|
9
|
+
export * from './core/types.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { Orchestrator } from './core/orchestrator.js';
|
|
2
|
+
export { Memory } from './core/memory.js';
|
|
3
|
+
export { GateSystem } from './core/gates.js';
|
|
4
|
+
export { LoopManager } from './core/loops.js';
|
|
5
|
+
export { ChineseWall } from './core/chinese-wall.js';
|
|
6
|
+
export { AGENT_REGISTRY, getAgent, getAgentsByTeam, getAgentsByLevel, getCSuiteAgents, getAllAgentIds, getAgentCount } from './agents/registry.js';
|
|
7
|
+
export { createLLMProvider } from './llm/provider.js';
|
|
8
|
+
export * from './core/types.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LLMConfig, LLMMessage, LLMResponse } from '../core/types.js';
|
|
2
|
+
export interface ILLMProvider {
|
|
3
|
+
chat(messages: LLMMessage[], options?: {
|
|
4
|
+
maxTokens?: number;
|
|
5
|
+
temperature?: number;
|
|
6
|
+
}): Promise<LLMResponse>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createLLMProvider(config: LLMConfig): ILLMProvider;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2
|
+
// CITADEL — LLM Provider Abstraction
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════
|
|
4
|
+
// ── Anthropic (Claude) ──
|
|
5
|
+
class AnthropicProvider {
|
|
6
|
+
apiKey;
|
|
7
|
+
model;
|
|
8
|
+
defaults;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.apiKey = config.apiKey;
|
|
11
|
+
this.model = config.model;
|
|
12
|
+
this.defaults = { maxTokens: config.maxTokens, temperature: config.temperature };
|
|
13
|
+
}
|
|
14
|
+
async chat(messages, options) {
|
|
15
|
+
const sys = messages.filter(m => m.role === 'system').map(m => m.content).join('\n\n');
|
|
16
|
+
const msgs = messages.filter(m => m.role !== 'system').map(m => ({ role: m.role, content: m.content }));
|
|
17
|
+
const res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
headers: {
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
'x-api-key': this.apiKey,
|
|
22
|
+
'anthropic-version': '2023-06-01',
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify({
|
|
25
|
+
model: this.model,
|
|
26
|
+
max_tokens: options?.maxTokens ?? this.defaults.maxTokens,
|
|
27
|
+
temperature: options?.temperature ?? this.defaults.temperature,
|
|
28
|
+
system: sys || undefined,
|
|
29
|
+
messages: msgs,
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
const err = await res.text();
|
|
34
|
+
throw new Error(`Anthropic API error (${res.status}): ${err}`);
|
|
35
|
+
}
|
|
36
|
+
const data = await res.json();
|
|
37
|
+
const content = data.content?.map((c) => c.text || '').join('') ?? '';
|
|
38
|
+
const tokensUsed = (data.usage?.input_tokens ?? 0) + (data.usage?.output_tokens ?? 0);
|
|
39
|
+
return { content, tokensUsed, model: data.model ?? this.model };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ── OpenAI ──
|
|
43
|
+
class OpenAIProvider {
|
|
44
|
+
apiKey;
|
|
45
|
+
model;
|
|
46
|
+
defaults;
|
|
47
|
+
constructor(config) {
|
|
48
|
+
this.apiKey = config.apiKey;
|
|
49
|
+
this.model = config.model;
|
|
50
|
+
this.defaults = { maxTokens: config.maxTokens, temperature: config.temperature };
|
|
51
|
+
}
|
|
52
|
+
async chat(messages, options) {
|
|
53
|
+
const res = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: {
|
|
56
|
+
'Content-Type': 'application/json',
|
|
57
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
58
|
+
},
|
|
59
|
+
body: JSON.stringify({
|
|
60
|
+
model: this.model,
|
|
61
|
+
max_tokens: options?.maxTokens ?? this.defaults.maxTokens,
|
|
62
|
+
temperature: options?.temperature ?? this.defaults.temperature,
|
|
63
|
+
messages: messages.map(m => ({ role: m.role, content: m.content })),
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
if (!res.ok) {
|
|
67
|
+
const err = await res.text();
|
|
68
|
+
throw new Error(`OpenAI API error (${res.status}): ${err}`);
|
|
69
|
+
}
|
|
70
|
+
const data = await res.json();
|
|
71
|
+
const content = data.choices?.[0]?.message?.content ?? '';
|
|
72
|
+
const tokensUsed = (data.usage?.prompt_tokens ?? 0) + (data.usage?.completion_tokens ?? 0);
|
|
73
|
+
return { content, tokensUsed, model: data.model ?? this.model };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ── Factory ──
|
|
77
|
+
export function createLLMProvider(config) {
|
|
78
|
+
switch (config.provider) {
|
|
79
|
+
case 'anthropic': return new AnthropicProvider(config);
|
|
80
|
+
case 'openai': return new OpenAIProvider(config);
|
|
81
|
+
default: throw new Error(`Unsupported LLM provider: ${config.provider}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function banner(): string;
|
|
2
|
+
export declare function divider(): string;
|
|
3
|
+
export declare function agentHeader(icon: string, name: string, title: string): string;
|
|
4
|
+
export declare function gateStatus(name: string, passed: number, total: number, status: string): string;
|
|
5
|
+
export declare function success(msg: string): string;
|
|
6
|
+
export declare function error(msg: string): string;
|
|
7
|
+
export declare function warning(msg: string): string;
|
|
8
|
+
export declare function info(msg: string): string;
|
|
9
|
+
export declare function loadUI(): Promise<void>;
|
|
10
|
+
export declare class Spinner {
|
|
11
|
+
private frames;
|
|
12
|
+
private interval;
|
|
13
|
+
private i;
|
|
14
|
+
start(msg: string): void;
|
|
15
|
+
stop(msg?: string): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════
|
|
2
|
+
// CITADEL — Terminal UI
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════
|
|
4
|
+
import { getAgentCount } from '../agents/registry.js';
|
|
5
|
+
const RESET = '\x1b[0m';
|
|
6
|
+
const BOLD = '\x1b[1m';
|
|
7
|
+
const DIM = '\x1b[2m';
|
|
8
|
+
const RED = '\x1b[31m';
|
|
9
|
+
const GREEN = '\x1b[32m';
|
|
10
|
+
const YELLOW = '\x1b[33m';
|
|
11
|
+
const BLUE = '\x1b[34m';
|
|
12
|
+
const MAGENTA = '\x1b[35m';
|
|
13
|
+
const CYAN = '\x1b[36m';
|
|
14
|
+
const WHITE = '\x1b[37m';
|
|
15
|
+
export function banner() {
|
|
16
|
+
const c = getAgentCount();
|
|
17
|
+
return `
|
|
18
|
+
${BOLD}${CYAN}
|
|
19
|
+
██████╗██╗████████╗ █████╗ ██████╗ ███████╗██╗
|
|
20
|
+
██╔════╝██║╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██║
|
|
21
|
+
██║ ██║ ██║ ███████║██║ ██║█████╗ ██║
|
|
22
|
+
██║ ██║ ██║ ██╔══██║██║ ██║██╔══╝ ██║
|
|
23
|
+
╚██████╗██║ ██║ ██║ ██║██████╔╝███████╗███████╗
|
|
24
|
+
╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝╚══════╝
|
|
25
|
+
${RESET}
|
|
26
|
+
${DIM}Command Intelligence Tower for Architected Development${RESET}
|
|
27
|
+
${DIM}with Enforced Layers${RESET}
|
|
28
|
+
|
|
29
|
+
${YELLOW}${c.total} agents${RESET} ${DIM}|${RESET} ${CYAN}${c.command} command${RESET} ${DIM}|${RESET} ${MAGENTA}${c.csuite} c-suite${RESET} ${DIM}|${RESET} ${GREEN}${c.makers} makers${RESET} ${DIM}|${RESET} ${BLUE}${c.checkers} checkers${RESET}
|
|
30
|
+
${DIM}Maker ≠ Checker (Chinese Wall enforced)${RESET}
|
|
31
|
+
${RED}CISO has absolute veto power${RESET}
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
export function divider() {
|
|
35
|
+
return `${DIM}${'═'.repeat(60)}${RESET}\n`;
|
|
36
|
+
}
|
|
37
|
+
export function agentHeader(icon, name, title) {
|
|
38
|
+
return `\n${BOLD}${icon} ${name}${RESET} ${DIM}(${title})${RESET}\n`;
|
|
39
|
+
}
|
|
40
|
+
export function gateStatus(name, passed, total, status) {
|
|
41
|
+
const color = status === 'passed' ? GREEN : status === 'failed' ? RED : YELLOW;
|
|
42
|
+
return `${color}🚧 ${name} — ${passed}/${total} (${status})${RESET}`;
|
|
43
|
+
}
|
|
44
|
+
export function success(msg) { return `${GREEN}✅ ${msg}${RESET}`; }
|
|
45
|
+
export function error(msg) { return `${RED}❌ ${msg}${RESET}`; }
|
|
46
|
+
export function warning(msg) { return `${YELLOW}⚠️ ${msg}${RESET}`; }
|
|
47
|
+
export function info(msg) { return `${CYAN}ℹ️ ${msg}${RESET}`; }
|
|
48
|
+
export async function loadUI() {
|
|
49
|
+
// Terminal ANSI codes are used directly — no external deps needed
|
|
50
|
+
}
|
|
51
|
+
// ── Spinner for async operations ──
|
|
52
|
+
export class Spinner {
|
|
53
|
+
frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
54
|
+
interval = null;
|
|
55
|
+
i = 0;
|
|
56
|
+
start(msg) {
|
|
57
|
+
this.i = 0;
|
|
58
|
+
this.interval = setInterval(() => {
|
|
59
|
+
process.stdout.write(`\r${CYAN}${this.frames[this.i % this.frames.length]}${RESET} ${msg}`);
|
|
60
|
+
this.i++;
|
|
61
|
+
}, 80);
|
|
62
|
+
}
|
|
63
|
+
stop(msg) {
|
|
64
|
+
if (this.interval)
|
|
65
|
+
clearInterval(this.interval);
|
|
66
|
+
process.stdout.write(`\r${' '.repeat(60)}\r`);
|
|
67
|
+
if (msg)
|
|
68
|
+
console.log(msg);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/ui/terminal.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "citadel-ai",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Enterprise AI dev framework. 42 agents. C-suite governance. Chinese walls. Persistent memory. You talk, they build.",
|
|
5
|
+
"keywords": ["ai", "agents", "vibe-coding", "framework", "multi-agent", "enterprise", "claude", "openai", "development", "agentic"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "CITADEL Contributors",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/YOUR_USERNAME/citadel-ai.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/YOUR_USERNAME/citadel-ai#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/YOUR_USERNAME/citadel-ai/issues"
|
|
15
|
+
},
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"bin": {
|
|
20
|
+
"citadel": "./bin/citadel.js",
|
|
21
|
+
"citadel-ai": "./bin/citadel.js"
|
|
22
|
+
},
|
|
23
|
+
"files": ["dist", "bin", "templates", "README.md", "LICENSE", "CONTRIBUTING.md"],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc",
|
|
26
|
+
"dev": "tsc --watch",
|
|
27
|
+
"start": "node dist/cli/index.js",
|
|
28
|
+
"prepublishOnly": "npm run build",
|
|
29
|
+
"agents": "node dist/cli/index.js agents",
|
|
30
|
+
"verify": "node -e \"import('./dist/agents/registry.js').then(m => { const c = m.getAgentCount(); console.log(c.total + ' agents verified'); if (c.total !== 42) process.exit(1); })\""
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.10.0",
|
|
35
|
+
"typescript": "^5.7.0"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.0.0"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":"1.0.0"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# adr
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# data-model
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# growth
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# prd
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# security
|