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.
Files changed (62) hide show
  1. package/CONTRIBUTING.md +91 -0
  2. package/LICENSE +5 -0
  3. package/README.md +254 -0
  4. package/bin/citadel.js +2 -0
  5. package/dist/agents/registry.d.ts +16 -0
  6. package/dist/agents/registry.js +1108 -0
  7. package/dist/agents/registry.js.map +1 -0
  8. package/dist/cli/ide-rules.d.ts +5 -0
  9. package/dist/cli/ide-rules.js +176 -0
  10. package/dist/cli/ide-rules.js.map +1 -0
  11. package/dist/cli/index.d.ts +1 -0
  12. package/dist/cli/index.js +59 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli/init.d.ts +1 -0
  15. package/dist/cli/init.js +110 -0
  16. package/dist/cli/init.js.map +1 -0
  17. package/dist/cli/run.d.ts +1 -0
  18. package/dist/cli/run.js +64 -0
  19. package/dist/cli/run.js.map +1 -0
  20. package/dist/core/chinese-wall.d.ts +34 -0
  21. package/dist/core/chinese-wall.js +62 -0
  22. package/dist/core/chinese-wall.js.map +1 -0
  23. package/dist/core/gates.d.ts +19 -0
  24. package/dist/core/gates.js +38 -0
  25. package/dist/core/gates.js.map +1 -0
  26. package/dist/core/loops.d.ts +20 -0
  27. package/dist/core/loops.js +83 -0
  28. package/dist/core/loops.js.map +1 -0
  29. package/dist/core/memory.d.ts +23 -0
  30. package/dist/core/memory.js +116 -0
  31. package/dist/core/memory.js.map +1 -0
  32. package/dist/core/orchestrator.d.ts +22 -0
  33. package/dist/core/orchestrator.js +234 -0
  34. package/dist/core/orchestrator.js.map +1 -0
  35. package/dist/core/types.d.ts +139 -0
  36. package/dist/core/types.js +2 -0
  37. package/dist/core/types.js.map +1 -0
  38. package/dist/index.d.ts +9 -0
  39. package/dist/index.js +9 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/llm/provider.d.ts +8 -0
  42. package/dist/llm/provider.js +84 -0
  43. package/dist/llm/provider.js.map +1 -0
  44. package/dist/ui/terminal.d.ts +16 -0
  45. package/dist/ui/terminal.js +71 -0
  46. package/dist/ui/terminal.js.map +1 -0
  47. package/package.json +40 -0
  48. package/templates/.citadel/citadel.config.json +1 -0
  49. package/templates/.citadel/gates/gate-0-inception.json +1 -0
  50. package/templates/.citadel/gates/gate-1-predesign.json +1 -0
  51. package/templates/.citadel/gates/gate-2-prebuild.json +1 -0
  52. package/templates/.citadel/gates/gate-3-preship.json +1 -0
  53. package/templates/.citadel/gates/gate-4-postdeploy.json +1 -0
  54. package/templates/.citadel/memory/decisions.json +1 -0
  55. package/templates/.citadel/memory/errors.json +1 -0
  56. package/templates/.citadel/memory/project.json +1 -0
  57. package/templates/.citadel/memory/session.json +1 -0
  58. package/templates/.citadel/specs/adr.md +1 -0
  59. package/templates/.citadel/specs/data-model.md +1 -0
  60. package/templates/.citadel/specs/growth.md +1 -0
  61. package/templates/.citadel/specs/prd.md +1 -0
  62. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -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":"AAAA,kEAAkE;AAClE,wBAAwB;AACxB,kEAAkE;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,OAAO,GAAG,UAAU,CAAC;AAC3B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,KAAK,GAAG,UAAU,CAAC;AAEzB,MAAM,UAAU,MAAM;IACpB,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,OAAO;EACP,IAAI,GAAG,IAAI;;;;;;;EAOX,KAAK;IACH,GAAG,yDAAyD,KAAK;IACjE,GAAG,uBAAuB,KAAK;;IAE/B,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,OAAO,WAAW,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC,MAAM,WAAW,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,MAAM,UAAU,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,YAAY,KAAK;IAClP,GAAG,0CAA0C,KAAK;IAClD,GAAG,+BAA+B,KAAK;CAC1C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IACnE,OAAO,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAc,EAAE,KAAa,EAAE,MAAc;IACpF,MAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,OAAO,GAAG,KAAK,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,IAAY,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACnF,MAAM,UAAU,KAAK,CAAC,GAAW,IAAY,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AAC/E,MAAM,UAAU,OAAO,CAAC,GAAW,IAAY,OAAO,GAAG,MAAM,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACtF,MAAM,UAAU,IAAI,CAAC,GAAW,IAAY,OAAO,GAAG,IAAI,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,kEAAkE;AACpE,CAAC;AAED,qCAAqC;AACrC,MAAM,OAAO,OAAO;IACV,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,QAAQ,GAA0C,IAAI,CAAC;IACvD,CAAC,GAAG,CAAC,CAAC;IAEd,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;YAC5F,IAAI,CAAC,CAAC,EAAE,CAAC;QACX,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,IAAI,CAAC,GAAY;QACf,IAAI,IAAI,CAAC,QAAQ;YAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
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
+ # adr
@@ -0,0 +1 @@
1
+ # data-model
@@ -0,0 +1 @@
1
+ # growth
@@ -0,0 +1 @@
1
+ # prd
@@ -0,0 +1 @@
1
+ # security