@phi-code-admin/phi-code 0.71.1 โ†’ 0.73.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.
@@ -471,6 +471,10 @@ export default function orchestratorExtension(pi: ExtensionAPI) {
471
471
  let activeAgentTools: string[] | null = null;
472
472
  let savedTools: string[] | null = null;
473
473
  let phasePending = false; // true while waiting for a phase to complete
474
+ let phaseTimeoutId: ReturnType<typeof setTimeout> | null = null;
475
+ const MAX_PHASE_DURATION_MS = 10 * 60 * 1000; // 10 minutes per phase
476
+ const MAX_TOOL_CALLS_PER_PHASE = 60; // Safety limit
477
+ let phaseStartTime: number | null = null;
474
478
 
475
479
  /**
476
480
  * Parse agent .md file with YAML frontmatter
@@ -527,6 +531,8 @@ export default function orchestratorExtension(pi: ExtensionAPI) {
527
531
  const review = getModel("review");
528
532
 
529
533
  const ts = timestamp();
534
+ // Inject runtime info so agents can adapt to the host OS
535
+ const runtimeInfo = `\n\nRuntime: ${process.platform} (${process.arch})`;
530
536
 
531
537
  return [
532
538
  {
@@ -534,21 +540,29 @@ export default function orchestratorExtension(pi: ExtensionAPI) {
534
540
  agent: loadAgentDef("explore"),
535
541
  instruction: `You are the EXPLORE agent. Analyze the project requirements and existing codebase.
536
542
 
543
+ **FIRST ACTION (MANDATORY):** Call \`memory_search\` with project-relevant keywords to check for prior context.
544
+
537
545
  **Project Request:** ${description}
538
546
 
539
547
  **Your tasks:**
540
- 1. List all existing files and read key ones
541
- 2. Identify tech stack, patterns, and constraints
542
- 3. Create a STRUCTURED PROJECT BRIEF in \`.phi/plans/brief-${ts}.md\`:
548
+
549
+ **Parallelization:** When making multiple tool calls that don't depend on each other (e.g., memory_search + ontology_query, or reading 2+ files), call them IN PARALLEL in the same response. This is faster.
550
+
551
+ 1. Call \`memory_search\` with project-relevant keywords (MANDATORY)
552
+ 2. List all existing files and read key ones
553
+ 3. Identify tech stack, patterns, and constraints
554
+ 4. Create a STRUCTURED PROJECT BRIEF in \`.phi/plans/brief-${ts}.md\`:
543
555
  - Context: what exists now
544
556
  - Objective: what needs to be built
545
557
  - Requirements: specific features needed
546
558
  - Tech decisions: frameworks, patterns to use
547
559
  - Constraints: what to NOT break
560
+ 5. Write your findings to \`.phi/plans/explore-${ts}.md\`
548
561
 
549
- **Step 4:** Write your findings to \`.phi/plans/explore-${ts}.md\`
562
+ **LAST ACTION (MANDATORY):** Call \`memory_write\` to save your exploration findings for downstream agents.
550
563
 
551
564
  **Knowledge Graph:**
565
+ // TODO: ontology_batch_add for reducing API calls (currently single-item only)
552
566
  After your analysis, use \`ontology_add\` to save key project entities AND their relations:
553
567
  - Add entities for: the project, each major library, each module/directory
554
568
  - Add relations between them: "uses", "contains", "depends_on", "implements"
@@ -576,7 +590,7 @@ After your analysis, use \`ontology_add\` to save key project entities AND their
576
590
  - Every function fully implemented
577
591
  - Follow existing patterns if codebase exists
578
592
  - [Any other specific constraints]
579
- \`\`\``,
593
+ \`\`\`` + runtimeInfo,
580
594
  },
581
595
  {
582
596
  key: "plan", label: "๐Ÿ“ Phase 2 โ€” PLAN", model: plan.preferred, fallback: plan.fallback,
@@ -616,7 +630,7 @@ After your analysis, use \`ontology_add\` to save key project entities AND their
616
630
  - Dependencies: Task 1
617
631
  \`\`\`
618
632
 
619
- Before finishing, use \`memory_write\` to save your plan summary with relevant tags for future reference.`,
633
+ Before finishing, use \`memory_write\` to save your plan summary with relevant tags for future reference.` + runtimeInfo,
620
634
  },
621
635
  {
622
636
  key: "code", label: "๐Ÿ’ป Phase 3 โ€” CODE", model: code.preferred, fallback: code.fallback,
@@ -663,7 +677,7 @@ After implementation, use \`memory_write\` to save a summary of what was built,
663
677
  **CRITICAL RULES:**
664
678
  - Write ONE file per tool call โ€” NEVER combine multiple files in a single response
665
679
  - Keep each file under 500 lines. If longer, split into modules
666
- - After writing each file, verify it exists with \`ls\` before proceeding`,
680
+ - After writing ALL files, verify they exist with a single \`find . -name '*.ts' -o -name '*.js' -o -name '*.html' | sort\`` + runtimeInfo,
667
681
  },
668
682
  {
669
683
  key: "test", label: "๐Ÿงช Phase 4 โ€” TEST", model: test.preferred, fallback: test.fallback,
@@ -710,20 +724,25 @@ After implementation, use \`memory_write\` to save a summary of what was built,
710
724
  - NEVER put tool calls inside thinking blocks. Always use the proper JSON tool call format
711
725
  - NEVER modify source code permanently for testing. Use environment variables: \`PORT=3001 node server.js\` instead of editing files
712
726
  - NEVER create .env files with fake credentials. Use inline env vars: \`API_KEY=test node server.js\`
713
- - For port conflicts on Windows, use: \`netstat -ano | findstr :PORT\` and \`taskkill /PID <pid> /F\`
714
- - For port conflicts on Linux/Mac, use: \`lsof -ti:PORT | xargs kill -9\`
727
+ - For port conflicts, prefer: \`npx kill-port PORT\` (cross-platform)
728
+ - On Windows fallback: \`netstat -ano | findstr :PORT\` and \`taskkill /PID <pid> /F\`
729
+ - On Linux/Mac fallback: \`lsof -ti:PORT | xargs kill -9\`
715
730
  - Always clean up after tests: kill background processes, remove temp files
716
731
 
717
- After testing, use \`memory_write\` to save test results, bugs found, and lessons learned.`,
732
+ **Anti-loop rule:** If the SAME test fails 3 times in a row with the same error after your fixes, STOP trying to fix it. Write the failure in your test report as "UNRESOLVED" and move on. Do not waste more than 3 iterations on the same issue.
733
+
734
+ After testing, use \`memory_write\` to save test results, bugs found, and lessons learned.` + runtimeInfo,
718
735
  },
719
736
  {
720
737
  key: "review", label: "๐Ÿ” Phase 5 โ€” REVIEW", model: review.preferred, fallback: review.fallback,
721
738
  agent: loadAgentDef("review"),
722
739
  instruction: `You are the REVIEW agent. Final quality review.
723
740
 
741
+ **FIRST ACTIONS (MANDATORY โ€” do these before anything else):**
742
+ 1. Call \`memory_search\` to find all notes from previous phases (explore, plan, code, test)
743
+ 2. Call \`ontology_query\` to understand the full project architecture and entity relationships
744
+
724
745
  **Context Retrieval:**
725
- 1. Use \`memory_search\` to find all notes from previous phases (explore, plan, code, test)
726
- 2. Use \`ontology_query\` to understand the full project architecture
727
746
  3. Review all \`.phi/plans/*.md\` files for complete context
728
747
 
729
748
  **Project Request:** ${description}
@@ -765,11 +784,18 @@ After testing, use \`memory_write\` to save test results, bugs found, and lesson
765
784
  โœ… Project ready for production / โŒ Issues need resolution
766
785
  \`\`\`
767
786
 
768
- After your review, use \`memory_write\` to save:
787
+ After your review, use \`memory_write\` ONCE to save:
769
788
  - Key lessons learned about this project type
770
789
  - Patterns that worked well
771
790
  - Common mistakes to avoid in future projects
772
- Tag the note with relevant keywords for vector search.`,
791
+ Tag the note with relevant keywords for vector search.
792
+
793
+ **Important:** Write lessons-learned ONCE. Do not call memory_write twice with the same filename or duplicate content.
794
+
795
+ **Ontology enrichment:** After your review, use \`ontology_add\` to save your key findings:
796
+ - Add a "review-report" entity with type "Document"
797
+ - Add relations to the project: "reviews" โ†’ project, quality score as entity property
798
+ - Save any new architectural decisions or patterns discovered` + runtimeInfo,
773
799
  },
774
800
  ];
775
801
  }
@@ -837,10 +863,26 @@ Tag the note with relevant keywords for vector search.`,
837
863
 
838
864
  function sendNextPhase(ctx: any) {
839
865
  if (phaseQueue.length === 0) {
866
+ // All phases done โ€” clean up and notify
840
867
  setOrchestrationActive(false);
841
868
  phasePending = false;
842
869
  deactivateAgent();
843
- ctx.ui.notify(`\nโœ… **All 5 phases complete!**`, "info");
870
+ if (phaseTimeoutId) { clearTimeout(phaseTimeoutId); phaseTimeoutId = null; }
871
+ // Generate global final summary
872
+ const totalPhases = 5; // always 5
873
+ const elapsed = phaseStartTime ? Math.round((Date.now() - phaseStartTime) / 1000) : 0;
874
+ const minutes = Math.floor(elapsed / 60);
875
+ const seconds = elapsed % 60;
876
+ ctx.ui.notify(`\n๐Ÿ“Š **Orchestration Summary**\n` +
877
+ ` Phases: ${totalPhases}/5 completed\n` +
878
+ ` Duration: ${minutes}m ${seconds}s\n` +
879
+ ` Check \`.phi/plans/\` for all reports`, "info");
880
+ try {
881
+ ctx.ui.notify(`\nโœ… **All 5 phases complete!**`, "info");
882
+ } catch {
883
+ // Fallback: inject completion message into conversation stream
884
+ try { pi.sendUserMessage(`โœ… All 5 phases complete! The project is ready for review.`); } catch { /* best effort */ }
885
+ }
844
886
  return;
845
887
  }
846
888
 
@@ -853,6 +895,15 @@ Tag the note with relevant keywords for vector search.`,
853
895
  ctx.ui.notify(`\n${phase.label} โ†’ \`${modelId}\` (agent: ${agentName})`, "info");
854
896
  // Small delay to let the model switch settle, then send instruction
855
897
  setTimeout(() => pi.sendUserMessage(phase.instruction), 500);
898
+ // Set phase timeout โ€” abort if phase takes too long
899
+ if (phaseTimeoutId) clearTimeout(phaseTimeoutId);
900
+ phaseTimeoutId = setTimeout(() => {
901
+ if (orchestrationActive && phasePending) {
902
+ ctx.ui.notify(`\nโฐ **Phase timed out** (${MAX_PHASE_DURATION_MS / 60000} min limit). Skipping to next phase.`, "warning");
903
+ phasePending = false;
904
+ sendNextPhase(ctx);
905
+ }
906
+ }, MAX_PHASE_DURATION_MS);
856
907
  });
857
908
  }
858
909
 
@@ -875,7 +926,18 @@ Tag the note with relevant keywords for vector search.`,
875
926
  // That's why phases 2-5 never executed.
876
927
 
877
928
  pi.on("agent_end", async (event, ctx) => {
878
- if (!orchestrationActive || !phasePending) return;
929
+ if (!orchestrationActive) return;
930
+ // Allow completion even if phasePending was cleared by a duplicate event
931
+ if (!phasePending) {
932
+ // If queue is empty and orchestration is active, force completion
933
+ if (phaseQueue.length === 0) {
934
+ sendNextPhase(ctx);
935
+ }
936
+ return;
937
+ }
938
+
939
+ // Clear phase timeout on normal completion
940
+ if (phaseTimeoutId) { clearTimeout(phaseTimeoutId); phaseTimeoutId = null; }
879
941
 
880
942
  // Build a structured summary of what happened in this phase
881
943
  // Instead of raw LLM text, extract concrete actions: files created/modified,
@@ -888,12 +950,13 @@ Tag the note with relevant keywords for vector search.`,
888
950
  let toolCallCount = 0;
889
951
 
890
952
  for (const msg of messages) {
891
- if (msg.role === 'tool' || msg.role === 'function') {
953
+ // Pi uses role: "toolResult" instead of "tool"
954
+ if (msg.role === 'tool' || msg.role === 'function' || msg.role === 'toolResult') {
892
955
  toolCallCount++;
893
956
  const content = Array.isArray(msg.content)
894
957
  ? msg.content.map((c: any) => c.text || '').join('')
895
958
  : String(msg.content || '');
896
- const name = (msg as any).name || '';
959
+ const name = (msg as any).name || (msg as any).toolName || '';
897
960
  // Track writes
898
961
  if (name === 'write' && content.includes('Successfully wrote')) {
899
962
  const match = content.match(/wrote \d+ bytes to (.+)/);
@@ -904,8 +967,12 @@ Tag the note with relevant keywords for vector search.`,
904
967
  const match = content.match(/edited (.+)/) || content.match(/in (.+)/);
905
968
  if (match) filesEdited.push(match[1]);
906
969
  }
907
- // Track errors
908
- if (content.includes('ERR:') || content.includes('Error:') || content.includes('FAIL')) {
970
+ // Track errors โ€” but filter out edit retries (old_text mismatch = normal retry, not error)
971
+ if ((content.includes('ERR:') || content.includes('Error:') || content.includes('FAIL'))
972
+ && !content.includes('old text must match')
973
+ && !content.includes('The old text')
974
+ && !content.includes('oldText not found')
975
+ && !content.includes('old_text not found')) {
909
976
  const preview = content.slice(0, 150).replace(/\n/g, ' ');
910
977
  errorsHit.push(`${name}: ${preview}`);
911
978
  }
@@ -917,13 +984,42 @@ Tag the note with relevant keywords for vector search.`,
917
984
  }
918
985
  }
919
986
 
987
+ // Detect API errors (401, auth failures) โ€” abort workflow if found
988
+ const hasAuthError = messages.some((msg: any) => {
989
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content || '');
990
+ return content.includes('401') && (content.includes('invalid access token') || content.includes('token expired') || content.includes('Unauthorized'));
991
+ });
992
+ if (hasAuthError || (toolCallCount === 0 && messages.length > 0)) {
993
+ const errorMsg = hasAuthError ? 'API authentication error (401)' : 'Phase produced 0 tool calls โ€” possible API or model error';
994
+ ctx.ui.notify(`\nโŒ **Orchestrator aborted:** ${errorMsg}\nCheck your API key and model configuration.`, "error");
995
+ setOrchestrationActive(false);
996
+ phasePending = false;
997
+ deactivateAgent();
998
+ if (phaseTimeoutId) { clearTimeout(phaseTimeoutId); phaseTimeoutId = null; }
999
+ return;
1000
+ }
1001
+
920
1002
  // Build the summary
921
1003
  const summaryParts: string[] = [];
922
1004
  summaryParts.push(`Tool calls: ${toolCallCount}`);
1005
+ // Anti-loop guard: warn if tool calls are excessive
1006
+ if (toolCallCount > MAX_TOOL_CALLS_PER_PHASE) {
1007
+ summaryParts.push(`โš ๏ธ WARNING: Phase used ${toolCallCount} tool calls (limit: ${MAX_TOOL_CALLS_PER_PHASE}). Possible loop detected.`);
1008
+ }
923
1009
  if (filesWritten.length > 0) summaryParts.push(`Files created/written: ${filesWritten.join(', ')}`);
924
1010
  if (filesEdited.length > 0) summaryParts.push(`Files edited: ${filesEdited.join(', ')}`);
925
1011
  if (testResults.length > 0) summaryParts.push(`Test results:\n${testResults.join('\n')}`);
926
1012
  if (errorsHit.length > 0) summaryParts.push(`Errors encountered: ${errorsHit.length}\n${errorsHit.slice(0, 5).join('\n')}`);
1013
+
1014
+ // Verify mandatory tool usage
1015
+ const toolNames = messages
1016
+ .filter((m: any) => m.role === 'tool' || m.role === 'function' || m.role === 'toolResult')
1017
+ .map((m: any) => (m as any).name || (m as any).toolName || '');
1018
+ const hasMemorySearch = toolNames.includes('memory_search');
1019
+ const hasMemoryWrite = toolNames.includes('memory_write');
1020
+ if (!hasMemorySearch) summaryParts.push(`โš ๏ธ Phase did NOT call memory_search (mandatory)`);
1021
+ if (!hasMemoryWrite) summaryParts.push(`โš ๏ธ Phase did NOT call memory_write (mandatory)`);
1022
+
927
1023
  const phaseSummary = summaryParts.join('\n');
928
1024
 
929
1025
  // Inject structured summary into next phase
@@ -979,6 +1075,8 @@ Tag the note with relevant keywords for vector search.`,
979
1075
  }
980
1076
  ctx.ui.notify("", "info");
981
1077
 
1078
+ // Record orchestration start time for final summary
1079
+ phaseStartTime = Date.now();
982
1080
  // Switch model and activate agent for first phase
983
1081
  const modelId = await switchModelForPhase(firstPhase, ctx);
984
1082
  activateAgent(firstPhase, ctx);
package/package.json CHANGED
@@ -1,107 +1,107 @@
1
1
  {
2
- "name": "@phi-code-admin/phi-code",
3
- "version": "0.71.1",
4
- "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
- "type": "module",
6
- "piConfig": {
7
- "name": "phi",
8
- "configDir": ".phi"
9
- },
10
- "bin": {
11
- "phi": "dist/cli.js"
12
- },
13
- "main": "./dist/index.js",
14
- "types": "./dist/index.d.ts",
15
- "exports": {
16
- ".": {
17
- "types": "./dist/index.d.ts",
18
- "import": "./dist/index.js"
19
- },
20
- "./hooks": {
21
- "types": "./dist/core/hooks/index.d.ts",
22
- "import": "./dist/core/hooks/index.js"
23
- }
24
- },
25
- "files": [
26
- "dist",
27
- "skills",
28
- "agents",
29
- "extensions",
30
- "README.md",
31
- "LICENSE",
32
- "CHANGELOG.md",
33
- "scripts"
34
- ],
35
- "scripts": {
36
- "clean": "shx rm -rf dist",
37
- "dev": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
38
- "build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && npm run copy-assets",
39
- "build:binary": "npm --prefix ../tui run build && npm --prefix ../ai run build && npm --prefix ../agent run build && npm run build && bun build --compile ./dist/cli.js --outfile dist/pi && npm run copy-binary-assets",
40
- "copy-assets": "./scripts/copy-assets.sh",
41
- "copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/",
42
- "test": "vitest --run",
43
- "prepublishOnly": "npm run clean && npm run build",
44
- "postinstall": "node scripts/postinstall.cjs"
45
- },
46
- "dependencies": {
47
- "@mariozechner/jiti": "^2.6.2",
48
- "@silvia-odwyer/photon-node": "^0.3.4",
49
- "chalk": "^5.5.0",
50
- "cli-highlight": "^2.1.11",
51
- "diff": "^8.0.2",
52
- "extract-zip": "^2.0.1",
53
- "file-type": "^21.1.1",
54
- "glob": "^13.0.1",
55
- "hosted-git-info": "^9.0.2",
56
- "ignore": "^7.0.5",
57
- "marked": "^15.0.12",
58
- "minimatch": "^10.2.3",
59
- "phi-code-agent": "^0.56.3",
60
- "phi-code-ai": "^0.56.3",
61
- "phi-code-tui": "^0.56.3",
62
- "proper-lockfile": "^4.1.2",
63
- "sigma-agents": "^0.1.6",
64
- "sigma-memory": "0.2.1",
65
- "sigma-skills": "^0.1.2",
66
- "strip-ansi": "^7.1.0",
67
- "undici": "^7.19.1",
68
- "yaml": "^2.8.2"
69
- },
70
- "overrides": {
71
- "rimraf": "6.1.2",
72
- "gaxios": {
73
- "rimraf": "6.1.2"
74
- }
75
- },
76
- "optionalDependencies": {
77
- "@mariozechner/clipboard": "^0.3.2"
78
- },
79
- "devDependencies": {
80
- "@types/diff": "^7.0.2",
81
- "@types/hosted-git-info": "^3.0.5",
82
- "@types/ms": "^2.1.0",
83
- "@types/node": "^24.3.0",
84
- "@types/proper-lockfile": "^4.1.4",
85
- "shx": "^0.4.0",
86
- "typescript": "^5.7.3",
87
- "vitest": "^3.2.4"
88
- },
89
- "keywords": [
90
- "ai",
91
- "coding-agent",
92
- "cli",
93
- "typescript",
94
- "sub-agents",
95
- "memory"
96
- ],
97
- "author": "Mario Zechner",
98
- "license": "MIT",
99
- "repository": {
100
- "type": "git",
101
- "url": "https://github.com/uglyswap/phi-code.git"
102
- },
103
- "homepage": "https://github.com/uglyswap/phi-code",
104
- "engines": {
105
- "node": ">=20.6.0"
106
- }
2
+ "name": "@phi-code-admin/phi-code",
3
+ "version": "0.73.0",
4
+ "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
+ "type": "module",
6
+ "piConfig": {
7
+ "name": "phi",
8
+ "configDir": ".phi"
9
+ },
10
+ "bin": {
11
+ "phi": "dist/cli.js"
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./hooks": {
21
+ "types": "./dist/core/hooks/index.d.ts",
22
+ "import": "./dist/core/hooks/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "skills",
28
+ "agents",
29
+ "extensions",
30
+ "README.md",
31
+ "LICENSE",
32
+ "CHANGELOG.md",
33
+ "scripts"
34
+ ],
35
+ "scripts": {
36
+ "clean": "shx rm -rf dist",
37
+ "dev": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
38
+ "build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && npm run copy-assets",
39
+ "build:binary": "npm --prefix ../tui run build && npm --prefix ../ai run build && npm --prefix ../agent run build && npm run build && bun build --compile ./dist/cli.js --outfile dist/pi && npm run copy-binary-assets",
40
+ "copy-assets": "./scripts/copy-assets.sh",
41
+ "copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/",
42
+ "test": "vitest --run",
43
+ "prepublishOnly": "npm run clean && npm run build",
44
+ "postinstall": "node scripts/postinstall.cjs"
45
+ },
46
+ "dependencies": {
47
+ "@mariozechner/jiti": "^2.6.2",
48
+ "@silvia-odwyer/photon-node": "^0.3.4",
49
+ "chalk": "^5.5.0",
50
+ "cli-highlight": "^2.1.11",
51
+ "diff": "^8.0.2",
52
+ "extract-zip": "^2.0.1",
53
+ "file-type": "^21.1.1",
54
+ "glob": "^13.0.1",
55
+ "hosted-git-info": "^9.0.2",
56
+ "ignore": "^7.0.5",
57
+ "marked": "^15.0.12",
58
+ "minimatch": "^10.2.3",
59
+ "phi-code-agent": "^0.56.3",
60
+ "phi-code-ai": "^0.56.3",
61
+ "phi-code-tui": "^0.56.3",
62
+ "proper-lockfile": "^4.1.2",
63
+ "sigma-agents": "^0.1.6",
64
+ "sigma-memory": "0.2.1",
65
+ "sigma-skills": "^0.1.2",
66
+ "strip-ansi": "^7.1.0",
67
+ "undici": "^7.19.1",
68
+ "yaml": "^2.8.2"
69
+ },
70
+ "overrides": {
71
+ "rimraf": "6.1.2",
72
+ "gaxios": {
73
+ "rimraf": "6.1.2"
74
+ }
75
+ },
76
+ "optionalDependencies": {
77
+ "@mariozechner/clipboard": "^0.3.2"
78
+ },
79
+ "devDependencies": {
80
+ "@types/diff": "^7.0.2",
81
+ "@types/hosted-git-info": "^3.0.5",
82
+ "@types/ms": "^2.1.0",
83
+ "@types/node": "^24.3.0",
84
+ "@types/proper-lockfile": "^4.1.4",
85
+ "shx": "^0.4.0",
86
+ "typescript": "^5.7.3",
87
+ "vitest": "^3.2.4"
88
+ },
89
+ "keywords": [
90
+ "ai",
91
+ "coding-agent",
92
+ "cli",
93
+ "typescript",
94
+ "sub-agents",
95
+ "memory"
96
+ ],
97
+ "author": "Mario Zechner",
98
+ "license": "MIT",
99
+ "repository": {
100
+ "type": "git",
101
+ "url": "https://github.com/uglyswap/phi-code.git"
102
+ },
103
+ "homepage": "https://github.com/uglyswap/phi-code",
104
+ "engines": {
105
+ "node": ">=20.6.0"
106
+ }
107
107
  }