@hham21/circe 0.4.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 (83) hide show
  1. package/README.md +185 -0
  2. package/dist/agent.d.ts +73 -0
  3. package/dist/agent.js +334 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cli/agents-cmd.d.ts +2 -0
  6. package/dist/cli/agents-cmd.js +77 -0
  7. package/dist/cli/agents-cmd.js.map +1 -0
  8. package/dist/cli/index.d.ts +4 -0
  9. package/dist/cli/index.js +29 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/output.d.ts +20 -0
  12. package/dist/cli/output.js +136 -0
  13. package/dist/cli/output.js.map +1 -0
  14. package/dist/cli/run.d.ts +10 -0
  15. package/dist/cli/run.js +90 -0
  16. package/dist/cli/run.js.map +1 -0
  17. package/dist/cli/skills-cmd.d.ts +2 -0
  18. package/dist/cli/skills-cmd.js +95 -0
  19. package/dist/cli/skills-cmd.js.map +1 -0
  20. package/dist/cli/workflows-cmd.d.ts +2 -0
  21. package/dist/cli/workflows-cmd.js +61 -0
  22. package/dist/cli/workflows-cmd.js.map +1 -0
  23. package/dist/context.d.ts +8 -0
  24. package/dist/context.js +23 -0
  25. package/dist/context.js.map +1 -0
  26. package/dist/events.d.ts +134 -0
  27. package/dist/events.js +127 -0
  28. package/dist/events.js.map +1 -0
  29. package/dist/handoff.d.ts +153 -0
  30. package/dist/handoff.js +42 -0
  31. package/dist/handoff.js.map +1 -0
  32. package/dist/index.d.ts +9 -0
  33. package/dist/index.js +10 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/orchestration/contract.d.ts +27 -0
  36. package/dist/orchestration/contract.js +104 -0
  37. package/dist/orchestration/contract.js.map +1 -0
  38. package/dist/orchestration/index.d.ts +10 -0
  39. package/dist/orchestration/index.js +6 -0
  40. package/dist/orchestration/index.js.map +1 -0
  41. package/dist/orchestration/loop.d.ts +25 -0
  42. package/dist/orchestration/loop.js +81 -0
  43. package/dist/orchestration/loop.js.map +1 -0
  44. package/dist/orchestration/parallel.d.ts +27 -0
  45. package/dist/orchestration/parallel.js +78 -0
  46. package/dist/orchestration/parallel.js.map +1 -0
  47. package/dist/orchestration/pipeline.d.ts +23 -0
  48. package/dist/orchestration/pipeline.js +100 -0
  49. package/dist/orchestration/pipeline.js.map +1 -0
  50. package/dist/orchestration/sprint.d.ts +21 -0
  51. package/dist/orchestration/sprint.js +56 -0
  52. package/dist/orchestration/sprint.js.map +1 -0
  53. package/dist/presets/frontend.d.ts +8 -0
  54. package/dist/presets/frontend.js +113 -0
  55. package/dist/presets/frontend.js.map +1 -0
  56. package/dist/presets/fullstack.d.ts +9 -0
  57. package/dist/presets/fullstack.js +118 -0
  58. package/dist/presets/fullstack.js.map +1 -0
  59. package/dist/presets/index.d.ts +2 -0
  60. package/dist/presets/index.js +3 -0
  61. package/dist/presets/index.js.map +1 -0
  62. package/dist/session/index.d.ts +1 -0
  63. package/dist/session/index.js +2 -0
  64. package/dist/session/index.js.map +1 -0
  65. package/dist/session/manager.d.ts +17 -0
  66. package/dist/session/manager.js +50 -0
  67. package/dist/session/manager.js.map +1 -0
  68. package/dist/tools/custom.d.ts +5 -0
  69. package/dist/tools/custom.js +7 -0
  70. package/dist/tools/custom.js.map +1 -0
  71. package/dist/tools/index.d.ts +1 -0
  72. package/dist/tools/index.js +2 -0
  73. package/dist/tools/index.js.map +1 -0
  74. package/dist/tools/skills.d.ts +18 -0
  75. package/dist/tools/skills.js +99 -0
  76. package/dist/tools/skills.js.map +1 -0
  77. package/dist/types.d.ts +36 -0
  78. package/dist/types.js +12 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/utils.d.ts +24 -0
  81. package/dist/utils.js +85 -0
  82. package/dist/utils.js.map +1 -0
  83. package/package.json +49 -0
@@ -0,0 +1,118 @@
1
+ import { Agent } from "../agent.js";
2
+ import { QAReportSchema, hasQAPassed } from "../handoff.js";
3
+ import { Pipeline } from "../orchestration/pipeline.js";
4
+ import { Loop } from "../orchestration/loop.js";
5
+ import { Contract } from "../orchestration/contract.js";
6
+ import { PLAYWRIGHT_MCP_SERVER } from "../utils.js";
7
+ const DEFAULT_MAX_BUILD_ROUNDS = 3;
8
+ const DEFAULT_PASS_THRESHOLD = 7;
9
+ const DEFAULT_CONTRACT_ROUNDS = 2;
10
+ const DEFAULT_EVALUATION_CRITERIA = {
11
+ design_quality: 0.3,
12
+ functionality: 0.4,
13
+ code_quality: 0.2,
14
+ originality: 0.1,
15
+ };
16
+ function formatCriteriaDescription(criteria) {
17
+ return Object.entries(criteria)
18
+ .map(([criterion, weight]) => `${criterion} (weight ${weight})`)
19
+ .join(", ");
20
+ }
21
+ function createPlannerAgent() {
22
+ return new Agent({
23
+ name: "planner",
24
+ prompt: `You are a senior product designer. Given a user's app idea, expand it into a detailed product specification.
25
+
26
+ Output a JSON object with this structure:
27
+ {
28
+ "appName": "kebab-case-name",
29
+ "features": [{"name": "...", "description": "..."}],
30
+ "techStack": {"frontend": "React + Vite", "backend": "FastAPI", "database": "SQLite"},
31
+ "designDirection": "..."
32
+ }
33
+
34
+ Be ambitious — include 10-15 features. Think about AI integration opportunities.
35
+ The tech stack is always: React + Vite (port 5173) frontend, FastAPI (port 8000) backend, SQLite database.`,
36
+ });
37
+ }
38
+ function createContractProposerAgent() {
39
+ return new Agent({
40
+ name: "contract-proposer",
41
+ prompt: `You are a senior full-stack engineer. Given a product spec, propose a detailed build contract.
42
+ Include: feature implementation order, testable acceptance criteria for each feature, architecture decisions.
43
+ Output as a structured proposal that a reviewer can evaluate.`,
44
+ });
45
+ }
46
+ function createContractReviewerAgent() {
47
+ return new Agent({
48
+ name: "contract-reviewer",
49
+ prompt: `You are a senior QA engineer reviewing a build contract.
50
+ Check that every feature has testable acceptance criteria.
51
+ Check that the architecture is sound.
52
+ Output JSON: {"accepted": true/false, "feedback": "..."}`,
53
+ });
54
+ }
55
+ function createGeneratorAgent() {
56
+ return new Agent({
57
+ name: "generator",
58
+ prompt: `You are a senior full-stack engineer. Build the application according to the spec.
59
+
60
+ Tech stack: React + Vite (port 5173), FastAPI (port 8000), SQLite.
61
+
62
+ If this is the first round, you receive a ProductSpec — build from scratch.
63
+ If this is a subsequent round, you receive a QAReport with feedback — fix the issues.
64
+
65
+ Always:
66
+ - Create all files in the current working directory
67
+ - Start dev servers (Vite on 5173, FastAPI on 8000)
68
+ - Write progress to _status.md
69
+ - Use relative paths only`,
70
+ continueSession: true,
71
+ });
72
+ }
73
+ function createEvaluatorAgent(criteriaDescription, passThreshold) {
74
+ return new Agent({
75
+ name: "evaluator",
76
+ prompt: `You are a strict QA engineer. Test the running application thoroughly.
77
+
78
+ The app should be running at http://localhost:5173 (frontend) and http://localhost:8000 (backend).
79
+
80
+ Test by:
81
+ 1. Making API calls with curl/fetch
82
+ 2. Using Playwright MCP to navigate and interact with the UI
83
+ 3. Checking for errors in console and network
84
+
85
+ Score each criterion (1-10): ${criteriaDescription}
86
+ Fail if ANY criterion is below ${passThreshold}/10.
87
+
88
+ Output JSON:
89
+ {
90
+ "passed": true/false,
91
+ "scores": {"criterion": score, ...},
92
+ "feedback": ["specific issue 1", "specific issue 2"]
93
+ }`,
94
+ tools: ["Read", "Bash", "Glob", "Grep"],
95
+ mcpServers: {
96
+ playwright: PLAYWRIGHT_MCP_SERVER,
97
+ },
98
+ outputSchema: QAReportSchema,
99
+ });
100
+ }
101
+ export function fullstackApp(options) {
102
+ const maxRounds = options?.maxRounds ?? DEFAULT_MAX_BUILD_ROUNDS;
103
+ const passThreshold = options?.passThreshold ?? DEFAULT_PASS_THRESHOLD;
104
+ const criteria = options?.evaluatorCriteria ?? DEFAULT_EVALUATION_CRITERIA;
105
+ const criteriaDescription = formatCriteriaDescription(criteria);
106
+ const contractProposer = createContractProposerAgent();
107
+ const contractReviewer = createContractReviewerAgent();
108
+ const evaluator = createEvaluatorAgent(criteriaDescription, passThreshold);
109
+ const contract = new Contract(contractProposer, contractReviewer, {
110
+ maxRounds: DEFAULT_CONTRACT_ROUNDS,
111
+ });
112
+ const buildLoop = new Loop(createGeneratorAgent(), evaluator, {
113
+ maxRounds,
114
+ stopWhen: hasQAPassed,
115
+ });
116
+ return new Pipeline(createPlannerAgent(), contract, buildLoop);
117
+ }
118
+ //# sourceMappingURL=fullstack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullstack.js","sourceRoot":"","sources":["../../src/presets/fullstack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { fullstackApp } from "./fullstack.js";
2
+ export { frontendDesign } from "./frontend.js";
@@ -0,0 +1,3 @@
1
+ export { fullstackApp } from "./fullstack.js";
2
+ export { frontendDesign } from "./frontend.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ export { SessionManager, type Session } from "./manager.js";
@@ -0,0 +1,2 @@
1
+ export { SessionManager } from "./manager.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface Session {
2
+ id: string;
3
+ workflow: string;
4
+ input: string;
5
+ status: string;
6
+ createdAt: string;
7
+ updatedAt: string;
8
+ }
9
+ export declare class SessionManager {
10
+ private dir;
11
+ constructor(baseDir: string);
12
+ create(workflow: string, input: string): Session;
13
+ list(): Session[];
14
+ get(sessionId: string): Session;
15
+ updateStatus(sessionId: string, status: string): void;
16
+ private save;
17
+ }
@@ -0,0 +1,50 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ export class SessionManager {
5
+ dir;
6
+ constructor(baseDir) {
7
+ this.dir = join(baseDir, "sessions");
8
+ if (!existsSync(this.dir)) {
9
+ mkdirSync(this.dir, { recursive: true });
10
+ }
11
+ }
12
+ create(workflow, input) {
13
+ const now = new Date().toISOString();
14
+ const session = {
15
+ id: randomUUID().slice(0, 8),
16
+ workflow,
17
+ input,
18
+ status: "running",
19
+ createdAt: now,
20
+ updatedAt: now,
21
+ };
22
+ this.save(session);
23
+ return session;
24
+ }
25
+ list() {
26
+ if (!existsSync(this.dir))
27
+ return [];
28
+ const files = readdirSync(this.dir).filter((f) => f.endsWith(".json"));
29
+ return files
30
+ .map((f) => JSON.parse(readFileSync(join(this.dir, f), "utf-8")))
31
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt));
32
+ }
33
+ get(sessionId) {
34
+ const path = join(this.dir, `${sessionId}.json`);
35
+ if (!existsSync(path)) {
36
+ throw new Error(`Session not found: ${sessionId}`);
37
+ }
38
+ return JSON.parse(readFileSync(path, "utf-8"));
39
+ }
40
+ updateStatus(sessionId, status) {
41
+ const session = this.get(sessionId);
42
+ session.status = status;
43
+ session.updatedAt = new Date().toISOString();
44
+ this.save(session);
45
+ }
46
+ save(session) {
47
+ writeFileSync(join(this.dir, `${session.id}.json`), JSON.stringify(session, null, 2));
48
+ }
49
+ }
50
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,MAAM,OAAO,cAAc;IACjB,GAAG,CAAS;IAEpB,YAAY,OAAe;QACzB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,KAAa;QACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,QAAQ;YACR,KAAK;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAY,CAAC;aAC3E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,MAAc;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAEO,IAAI,CAAC,OAAgB;QAC3B,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,EACpC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACjC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export interface CirceToolFn extends Function {
2
+ _circeTool: boolean;
3
+ _circeToolName: string;
4
+ }
5
+ export declare function tool<T extends (...args: any[]) => any>(fn: T): T & CirceToolFn;
@@ -0,0 +1,7 @@
1
+ export function tool(fn) {
2
+ const wrapper = ((...args) => fn(...args));
3
+ wrapper._circeTool = true;
4
+ wrapper._circeToolName = fn.name;
5
+ return wrapper;
6
+ }
7
+ //# sourceMappingURL=custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/tools/custom.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,IAAI,CAAoC,EAAK;IAC3D,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAoB,CAAC;IACrE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,cAAc,GAAG,EAAE,CAAC,IAAI,CAAC;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1 @@
1
+ export { SkillRegistry, type SkillInfo } from "./skills.js";
@@ -0,0 +1,2 @@
1
+ export { SkillRegistry } from "./skills.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface SkillInfo {
2
+ name: string;
3
+ description: string;
4
+ source: string;
5
+ }
6
+ export declare class SkillRegistry {
7
+ private dirs;
8
+ constructor(dirs: string[]);
9
+ listSkills(): SkillInfo[];
10
+ getSkillInfo(name: string): SkillInfo | null;
11
+ getSkill(name: string): string | null;
12
+ validateSkills(names: string[]): void;
13
+ promptSummary(names: string[]): string;
14
+ private collectSkillsFromDir;
15
+ private buildSkillFilePath;
16
+ private readSkillInfoFromDir;
17
+ private parseFrontmatter;
18
+ }
@@ -0,0 +1,99 @@
1
+ import { readdirSync, readFileSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const SKILL_FILENAME = "SKILL.md";
4
+ export class SkillRegistry {
5
+ dirs;
6
+ constructor(dirs) {
7
+ this.dirs = dirs;
8
+ }
9
+ listSkills() {
10
+ const visitedNames = new Set();
11
+ const skills = [];
12
+ for (const dir of this.dirs) {
13
+ this.collectSkillsFromDir(dir, visitedNames, skills);
14
+ }
15
+ return skills;
16
+ }
17
+ getSkillInfo(name) {
18
+ for (const dir of this.dirs) {
19
+ const skill = this.readSkillInfoFromDir(dir, name);
20
+ if (skill)
21
+ return skill;
22
+ }
23
+ return null;
24
+ }
25
+ getSkill(name) {
26
+ for (const dir of this.dirs) {
27
+ const skillFilePath = this.buildSkillFilePath(dir, name);
28
+ if (!existsSync(skillFilePath))
29
+ continue;
30
+ return readFileSync(skillFilePath, "utf-8");
31
+ }
32
+ return null;
33
+ }
34
+ validateSkills(names) {
35
+ const missingSkills = names.filter((name) => this.getSkillInfo(name) === null);
36
+ if (missingSkills.length > 0) {
37
+ throw new Error(`Required skill(s) not found: ${missingSkills.join(", ")}`);
38
+ }
39
+ }
40
+ promptSummary(names) {
41
+ const summaryLines = names
42
+ .map((name) => this.getSkillInfo(name))
43
+ .filter((info) => info !== null)
44
+ .map((info) => `- ${info.name}: ${info.description}`);
45
+ if (summaryLines.length === 0)
46
+ return "";
47
+ return `Available skills (call mcp__circe-skills__use_skill to load full methodology):\n${summaryLines.join("\n")}`;
48
+ }
49
+ collectSkillsFromDir(dir, visitedNames, skills) {
50
+ if (!existsSync(dir))
51
+ return;
52
+ const entries = readdirSync(dir, { withFileTypes: true });
53
+ for (const entry of entries) {
54
+ if (!entry.isDirectory())
55
+ continue;
56
+ if (visitedNames.has(entry.name))
57
+ continue;
58
+ const skill = this.readSkillInfoFromDir(dir, entry.name);
59
+ if (skill) {
60
+ visitedNames.add(entry.name);
61
+ skills.push(skill);
62
+ }
63
+ }
64
+ }
65
+ buildSkillFilePath(dir, skillName) {
66
+ return join(dir, skillName, SKILL_FILENAME);
67
+ }
68
+ readSkillInfoFromDir(dir, skillName) {
69
+ const skillFilePath = this.buildSkillFilePath(dir, skillName);
70
+ if (!existsSync(skillFilePath))
71
+ return null;
72
+ const content = readFileSync(skillFilePath, "utf-8");
73
+ const frontmatter = this.parseFrontmatter(content);
74
+ if (!frontmatter.name)
75
+ return null;
76
+ return {
77
+ name: frontmatter.name,
78
+ description: frontmatter.description ?? "",
79
+ source: dir,
80
+ };
81
+ }
82
+ parseFrontmatter(text) {
83
+ const match = text.match(/^---\s*\n([\s\S]*?)\n---/);
84
+ if (!match)
85
+ return {};
86
+ const frontmatterBody = match[1];
87
+ const result = {};
88
+ for (const line of frontmatterBody.split("\n")) {
89
+ const colonIndex = line.indexOf(":");
90
+ if (colonIndex === -1)
91
+ continue;
92
+ const key = line.slice(0, colonIndex).trim();
93
+ const value = line.slice(colonIndex + 1).trim();
94
+ result[key] = value;
95
+ }
96
+ return result;
97
+ }
98
+ }
99
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ export type MetricsSnapshot = {
3
+ cost: number;
4
+ inputTokens: number;
5
+ outputTokens: number;
6
+ };
7
+ export interface Runnable<TIn = unknown, TOut = unknown> {
8
+ name?: string;
9
+ lastMetrics?: MetricsSnapshot | null;
10
+ run(input: TIn): Promise<TOut>;
11
+ }
12
+ export declare const RunContextSchema: z.ZodObject<{
13
+ workDir: z.ZodString;
14
+ sessionId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
15
+ model: z.ZodDefault<z.ZodString>;
16
+ verbose: z.ZodDefault<z.ZodBoolean>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ workDir: string;
19
+ sessionId: string | null;
20
+ model: string;
21
+ verbose: boolean;
22
+ }, {
23
+ workDir: string;
24
+ sessionId?: string | null | undefined;
25
+ model?: string | undefined;
26
+ verbose?: boolean | undefined;
27
+ }>;
28
+ export type RunContext = z.infer<typeof RunContextSchema>;
29
+ export declare const RunContext: {
30
+ parse: (data: unknown) => {
31
+ workDir: string;
32
+ sessionId: string | null;
33
+ model: string;
34
+ verbose: boolean;
35
+ };
36
+ };
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ const DEFAULT_MODEL = "claude-opus-4-6";
3
+ export const RunContextSchema = z.object({
4
+ workDir: z.string(),
5
+ sessionId: z.string().nullable().default(null),
6
+ model: z.string().default(DEFAULT_MODEL),
7
+ verbose: z.boolean().default(false),
8
+ });
9
+ export const RunContext = {
10
+ parse: (data) => RunContextSchema.parse(data),
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACpC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;CACvD,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Runnable } from "./types.js";
2
+ export declare function circeHome(): string;
3
+ export declare const PLAYWRIGHT_MCP_SERVER: {
4
+ readonly command: "npx";
5
+ readonly args: readonly ["@playwright/mcp@latest"];
6
+ };
7
+ /**
8
+ * Extract the first JSON string from text.
9
+ * Checks for fenced code blocks first, then bare JSON objects.
10
+ * Returns the raw JSON string (not parsed).
11
+ */
12
+ export declare function findJsonString(text: string): string | null;
13
+ /**
14
+ * Parse a variadic constructor signature where the last arg may be an options object.
15
+ * Used by Pipeline, Parallel, and Loop.
16
+ */
17
+ export declare function parseTrailingOptions<T>(args: any[]): {
18
+ agents: Runnable[];
19
+ options: T;
20
+ };
21
+ import type { MetricsSnapshot } from "./types.js";
22
+ export type MetricsAccumulator = MetricsSnapshot;
23
+ export declare function createMetrics(): MetricsAccumulator;
24
+ export declare function accumulateMetrics(acc: MetricsAccumulator, metrics: MetricsSnapshot | null | undefined): void;
package/dist/utils.js ADDED
@@ -0,0 +1,85 @@
1
+ import { join } from "node:path";
2
+ export function circeHome() {
3
+ return process.env.CIRCE_HOME ?? join(process.env.HOME, ".circe");
4
+ }
5
+ export const PLAYWRIGHT_MCP_SERVER = { command: "npx", args: ["@playwright/mcp@latest"] };
6
+ const FENCED_CODE_BLOCK_PATTERN = /```(?:json)?\s*\n([\s\S]*?)\n```/;
7
+ /**
8
+ * Extract the first JSON string from text.
9
+ * Checks for fenced code blocks first, then bare JSON objects.
10
+ * Returns the raw JSON string (not parsed).
11
+ */
12
+ export function findJsonString(text) {
13
+ const codeBlockMatch = text.match(FENCED_CODE_BLOCK_PATTERN);
14
+ if (codeBlockMatch) {
15
+ return codeBlockMatch[1].trim();
16
+ }
17
+ const start = text.indexOf("{");
18
+ if (start !== -1) {
19
+ const extracted = extractBalancedBraces(text, start);
20
+ if (extracted)
21
+ return extracted;
22
+ }
23
+ return null;
24
+ }
25
+ function extractBalancedBraces(text, start) {
26
+ let depth = 0;
27
+ let inString = false;
28
+ let escape = false;
29
+ for (let i = start; i < text.length; i++) {
30
+ const char = text[i];
31
+ if (escape) {
32
+ escape = false;
33
+ continue;
34
+ }
35
+ if (char === "\\") {
36
+ escape = true;
37
+ continue;
38
+ }
39
+ if (char === '"') {
40
+ inString = !inString;
41
+ continue;
42
+ }
43
+ if (inString)
44
+ continue;
45
+ if (char === "{")
46
+ depth++;
47
+ if (char === "}") {
48
+ depth--;
49
+ if (depth === 0)
50
+ return text.slice(start, i + 1);
51
+ }
52
+ }
53
+ return null;
54
+ }
55
+ /**
56
+ * Parse a variadic constructor signature where the last arg may be an options object.
57
+ * Used by Pipeline, Parallel, and Loop.
58
+ */
59
+ export function parseTrailingOptions(args) {
60
+ if (args.length === 0) {
61
+ return { agents: [], options: {} };
62
+ }
63
+ const last = args[args.length - 1];
64
+ if (last && !isRunnable(last)) {
65
+ return {
66
+ agents: args.slice(0, -1),
67
+ options: last,
68
+ };
69
+ }
70
+ return { agents: args, options: {} };
71
+ }
72
+ function isRunnable(value) {
73
+ return value != null && typeof value === "object" && "run" in value;
74
+ }
75
+ export function createMetrics() {
76
+ return { cost: 0, inputTokens: 0, outputTokens: 0 };
77
+ }
78
+ export function accumulateMetrics(acc, metrics) {
79
+ if (!metrics)
80
+ return;
81
+ acc.cost += metrics.cost;
82
+ acc.inputTokens += metrics.inputTokens;
83
+ acc.outputTokens += metrics.outputTokens;
84
+ }
85
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@hham21/circe",
3
+ "version": "0.4.0",
4
+ "description": "GAN-style multi-agent framework for application generation using Claude Agent SDK",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "circe": "dist/cli/index.js"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/hham21/circe.git"
14
+ },
15
+ "keywords": [
16
+ "claude",
17
+ "agent",
18
+ "multi-agent",
19
+ "gan",
20
+ "orchestration",
21
+ "ai",
22
+ "anthropic"
23
+ ],
24
+ "license": "MIT",
25
+ "homepage": "https://github.com/hham21/circe#readme",
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsc --watch",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest",
31
+ "lint": "tsc --noEmit",
32
+ "lint:examples": "tsc -p tsconfig.examples.json"
33
+ },
34
+ "dependencies": {
35
+ "@anthropic-ai/claude-agent-sdk": "^0.1.0",
36
+ "chalk": "^5.4.0",
37
+ "commander": "^13.0.0",
38
+ "zod": "^3.23.0",
39
+ "zod-to-json-schema": "^3.25.2"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.0.0",
43
+ "typescript": "^5.7.0",
44
+ "vitest": "^3.0.0"
45
+ },
46
+ "engines": {
47
+ "node": ">=22.0.0"
48
+ }
49
+ }