@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.
- package/extensions/phi/orchestrator.ts +118 -20
- package/package.json +105 -105
|
@@ -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
|
-
|
|
541
|
-
|
|
542
|
-
|
|
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
|
-
**
|
|
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
|
|
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
|
|
714
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
}
|