@nomad-e/bluma-cli 0.0.13 → 0.0.14
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/dist/config/bluma-mcp.json +1 -1
- package/dist/main.js +155 -238
- package/package.json +4 -1
package/dist/main.js
CHANGED
|
@@ -21,28 +21,27 @@ var BRAND_COLORS = {
|
|
|
21
21
|
};
|
|
22
22
|
var Header = () => {
|
|
23
23
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
24
|
-
/* @__PURE__ */ jsx(
|
|
25
|
-
|
|
24
|
+
/* @__PURE__ */ jsx(Box, { flexDirection: "column", height: 8, marginBottom: 1, children: /* @__PURE__ */ jsx(
|
|
25
|
+
BigText,
|
|
26
26
|
{
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
children: /* @__PURE__ */ jsx(
|
|
31
|
-
BigText,
|
|
32
|
-
{
|
|
33
|
-
text: "BluMa CLI",
|
|
34
|
-
font: "block",
|
|
35
|
-
colors: [BRAND_COLORS.main, BRAND_COLORS.accent, BRAND_COLORS.shadow]
|
|
36
|
-
}
|
|
37
|
-
)
|
|
27
|
+
text: "BluMa CLI",
|
|
28
|
+
font: "block",
|
|
29
|
+
colors: [BRAND_COLORS.main, BRAND_COLORS.accent, BRAND_COLORS.shadow]
|
|
38
30
|
}
|
|
39
|
-
),
|
|
31
|
+
) }),
|
|
40
32
|
/* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, children: [
|
|
41
33
|
/* @__PURE__ */ jsx(Text, { children: "How to get started with BluMa:" }),
|
|
42
34
|
/* @__PURE__ */ jsx(Text, { children: "1. You can ask questions, modify files, or execute commands directly." }),
|
|
43
35
|
/* @__PURE__ */ jsx(Text, { children: "2. Be as clear and specific as possible to get accurate responses." }),
|
|
44
36
|
/* @__PURE__ */ jsxs(Text, { children: [
|
|
45
|
-
"3.
|
|
37
|
+
"3. Run ",
|
|
38
|
+
/* @__PURE__ */ jsx(Text, { color: "cyan", children: "/init" }),
|
|
39
|
+
" to create a ",
|
|
40
|
+
/* @__PURE__ */ jsx(Text, { color: "cyan", children: "BluMa.md" }),
|
|
41
|
+
", file with instructions for BluMa."
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ jsxs(Text, { children: [
|
|
44
|
+
"4. Type ",
|
|
46
45
|
/* @__PURE__ */ jsx(Text, { color: "cyan", children: "/help" }),
|
|
47
46
|
" to explore available commands and features."
|
|
48
47
|
] })
|
|
@@ -63,6 +62,7 @@ var SessionInfo = ({
|
|
|
63
62
|
{
|
|
64
63
|
borderStyle: "round",
|
|
65
64
|
borderColor: "gray",
|
|
65
|
+
padding: 1,
|
|
66
66
|
flexDirection: "column",
|
|
67
67
|
marginBottom: 1,
|
|
68
68
|
children: [
|
|
@@ -194,12 +194,45 @@ var getSlashCommands = () => [
|
|
|
194
194
|
{ name: "/help", description: "list commands" },
|
|
195
195
|
{ name: "/mcp", description: "list tools connected via MCP" },
|
|
196
196
|
{ name: "/tools", description: "list native tools" },
|
|
197
|
+
{ name: "/init", description: "create a new BluMa.md file with codebase documentation" },
|
|
197
198
|
{ name: "/clear", description: "clear history" }
|
|
198
199
|
];
|
|
199
200
|
var filterSlashCommands = (query) => {
|
|
200
201
|
const list = getSlashCommands();
|
|
201
|
-
const q = query.toLowerCase();
|
|
202
|
-
|
|
202
|
+
const q = (query || "").toLowerCase();
|
|
203
|
+
if (!q) return list;
|
|
204
|
+
const scored = list.map((c) => {
|
|
205
|
+
const name = c.name.toLowerCase();
|
|
206
|
+
const desc = c.description.toLowerCase();
|
|
207
|
+
const isPrefix = name.startsWith(q);
|
|
208
|
+
const nameIdx = name.indexOf(q);
|
|
209
|
+
const descIdx = desc.indexOf(q);
|
|
210
|
+
let tier = 3;
|
|
211
|
+
let scorePrimary = 0;
|
|
212
|
+
let scoreSecondary = Number.MAX_SAFE_INTEGER;
|
|
213
|
+
let scoreTertiary = name.length;
|
|
214
|
+
if (isPrefix) {
|
|
215
|
+
tier = 0;
|
|
216
|
+
scorePrimary = q.length * -1;
|
|
217
|
+
scoreSecondary = 0;
|
|
218
|
+
} else if (nameIdx >= 0) {
|
|
219
|
+
tier = 1;
|
|
220
|
+
scorePrimary = 0;
|
|
221
|
+
scoreSecondary = nameIdx;
|
|
222
|
+
} else if (descIdx >= 0) {
|
|
223
|
+
tier = 2;
|
|
224
|
+
scorePrimary = 0;
|
|
225
|
+
scoreSecondary = descIdx;
|
|
226
|
+
}
|
|
227
|
+
return { cmd: c, tier, scorePrimary, scoreSecondary, scoreTertiary };
|
|
228
|
+
}).filter((s) => s.tier !== 3).sort((a, b) => {
|
|
229
|
+
if (a.tier !== b.tier) return a.tier - b.tier;
|
|
230
|
+
if (a.scorePrimary !== b.scorePrimary) return a.scorePrimary - b.scorePrimary;
|
|
231
|
+
if (a.scoreSecondary !== b.scoreSecondary) return a.scoreSecondary - b.scoreSecondary;
|
|
232
|
+
if (a.scoreTertiary !== b.scoreTertiary) return a.scoreTertiary - b.scoreTertiary;
|
|
233
|
+
return a.cmd.name.localeCompare(b.cmd.name);
|
|
234
|
+
});
|
|
235
|
+
return scored.map((s) => s.cmd);
|
|
203
236
|
};
|
|
204
237
|
|
|
205
238
|
// src/app/ui/components/InputPrompt.tsx
|
|
@@ -283,7 +316,7 @@ var InputPrompt = ({ onSubmit, isReadOnly, onInterrupt }) => {
|
|
|
283
316
|
}
|
|
284
317
|
}, { isActive: slashOpen });
|
|
285
318
|
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
|
|
286
|
-
/* @__PURE__ */ jsx2(Box2, { borderStyle: "round", borderColor, borderDimColor: !isReadOnly,
|
|
319
|
+
/* @__PURE__ */ jsx2(Box2, { borderStyle: "round", borderColor, borderDimColor: !isReadOnly, children: /* @__PURE__ */ jsxs2(Box2, { flexDirection: "row", paddingX: 1, flexWrap: "nowrap", children: [
|
|
287
320
|
/* @__PURE__ */ jsxs2(Text2, { color: "white", dimColor: true, children: [
|
|
288
321
|
">",
|
|
289
322
|
" "
|
|
@@ -716,45 +749,34 @@ async function saveSessionHistory(sessionFile, history) {
|
|
|
716
749
|
import os2 from "os";
|
|
717
750
|
var SYSTEM_PROMPT = `
|
|
718
751
|
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
- **
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
- **
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
- **
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
- **PROACTIVE EXTENSION**: Take patterns further than the original example when appropriate
|
|
748
|
-
|
|
749
|
-
# BEHAVIORAL RULES (Compact)
|
|
750
|
-
- Identity: You are BluMa (NomadEngenuity). Be professional and technical.
|
|
751
|
-
- Communication: ALL messages must use message_notify_dev. No direct text replies.
|
|
752
|
-
- Task completion: When you finish a task, immediately invoke agent_end_task.
|
|
753
|
-
- Tool rules: Never make parallel tool calls. Always use only the defined tools with exact names.
|
|
754
|
-
- Autonomy: Act 100% autonomously; don\u2019t ask for formatting preferences. Use the notebook for internal thinking.
|
|
755
|
-
- Notion: When writing to Notion, strictly use proper headings (heading_1, heading_2, ...), per rules.
|
|
756
|
-
|
|
757
|
-
CRITICAL COMMUNICATION PROTOCOL (Compact)
|
|
752
|
+
### YOU ARE BluMa CLI \u2014 AUTONOMOUS SENIOR SOFTWARE ENGINEER @ NOMADENGENUITY
|
|
753
|
+
You use a proprietary Large Language Model (LLM) fine-tuned by the NomadEngenuity team.
|
|
754
|
+
|
|
755
|
+
---
|
|
756
|
+
|
|
757
|
+
## BEHAVIORAL RULES
|
|
758
|
+
|
|
759
|
+
- **Identity:**
|
|
760
|
+
You are BluMa (NomadEngenuity). Maintain professionalism and technical language.
|
|
761
|
+
|
|
762
|
+
- **Communication:**
|
|
763
|
+
ALL messages must be sent via 'message_notify_dev'.
|
|
764
|
+
**No direct text replies to the developer.**
|
|
765
|
+
|
|
766
|
+
- **Task Completion:**
|
|
767
|
+
When a task is completed, immediately invoke 'agent_end_task' without dev permissions.
|
|
768
|
+
|
|
769
|
+
- **Tool Rules:**
|
|
770
|
+
Never make parallel tool calls.
|
|
771
|
+
Always use only the defined tools with their exact names.
|
|
772
|
+
|
|
773
|
+
- **Autonomy:**
|
|
774
|
+
Act 100% autonomously.
|
|
775
|
+
Do not ask for formatting preferences.
|
|
776
|
+
Use the notebook for internal reasoning.
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
### CRITICAL COMMUNICATION PROTOCOL
|
|
758
780
|
- Only tool_calls are allowed for assistant replies. Never include a "content" field.
|
|
759
781
|
- Always use tools to respond, retrieve data, compute or transform. Await a valid tool response before any final message.
|
|
760
782
|
- Zero tolerance for protocol violations.
|
|
@@ -770,113 +792,6 @@ CRITICAL COMMUNICATION PROTOCOL (Compact)
|
|
|
770
792
|
- Locale: {locale}
|
|
771
793
|
</current_system_environment>
|
|
772
794
|
|
|
773
|
-
<resilience_and_alternatives>
|
|
774
|
-
# RESILIENCE & NEVER GIVE UP ATTITUDE - CRITICAL!
|
|
775
|
-
## SENIOR ENGINEER MINDSET: ALWAYS FIND A WAY
|
|
776
|
-
|
|
777
|
-
### CORE PRINCIPLE: NO EXCUSES, ONLY SOLUTIONS
|
|
778
|
-
- **NEVER give up** when the first approach fails
|
|
779
|
-
- **ALWAYS try alternatives** when one method doesn't work
|
|
780
|
-
- **BE RESOURCEFUL** - explore multiple solutions
|
|
781
|
-
- **THINK CREATIVELY** - find workarounds and alternatives
|
|
782
|
-
- **STAY PERSISTENT** - keep trying until you succeed
|
|
783
|
-
|
|
784
|
-
### SPECIFIC RULES FOR COMMON SCENARIOS
|
|
785
|
-
|
|
786
|
-
#### PDF GENERATION - NEVER USE PANDOC!
|
|
787
|
-
- **FORBIDDEN**: Do NOT use Pandoc for PDF generation
|
|
788
|
-
- **REQUIRED**: Always use Python libraries for PDF creation
|
|
789
|
-
- **PRIMARY CHOICE**: Use **fpdf2** library for maximum customization
|
|
790
|
-
- **ALTERNATIVES**: **reportlab**, **weasyprint**, **matplotlib** for charts
|
|
791
|
-
|
|
792
|
-
#### OFFICIAL PDF TEMPLATE - MANDATORY USAGE!
|
|
793
|
-
When creating PDFs, you MUST follow this professional structure:
|
|
794
|
-
|
|
795
|
-
**STEP 1: Import and Unicode Function**
|
|
796
|
-
- Import: **from fpdf import FPDF** and **import os**
|
|
797
|
-
- Create remove_unicode function to handle special characters
|
|
798
|
-
- Replace problematic chars: '\u2014' to '-', '\u2714\uFE0F' to 'X', '\u2026' to '...'
|
|
799
|
-
|
|
800
|
-
**STEP 2: Custom PDF Class**
|
|
801
|
-
- Inherit from FPDF: **class PDF(FPDF)**
|
|
802
|
-
- Custom header method with professional title formatting
|
|
803
|
-
- Custom footer with "Generated by BluMa | NomadEngenuity" branding
|
|
804
|
-
- Use colors: Title (30,60,120), text (80,80,80)
|
|
805
|
-
- Add professional line separator in header
|
|
806
|
-
|
|
807
|
-
**STEP 3: PDF Creation Standards**
|
|
808
|
-
- Create PDF instance and add page
|
|
809
|
-
- Set auto page break with 18pt margin
|
|
810
|
-
- Use Helvetica font family throughout
|
|
811
|
-
- Standard text: 11pt, Headers: 14pt bold, Title: 22pt bold
|
|
812
|
-
- Professional color scheme: Blues and grays
|
|
813
|
-
|
|
814
|
-
**STEP 4: Content Formatting Rules**
|
|
815
|
-
- Use multi_cell for paragraphs with proper line spacing
|
|
816
|
-
- Create tables with alternating row colors (fill=True/False)
|
|
817
|
-
- Section headers in bold with proper spacing
|
|
818
|
-
- Consistent margins and indentation
|
|
819
|
-
- Save with descriptive filename using os.path.join
|
|
820
|
-
|
|
821
|
-
**STEP 5: Table Creation Pattern**
|
|
822
|
-
- Header row with light blue fill (220,230,250)
|
|
823
|
-
- Alternating row colors for readability
|
|
824
|
-
- Proper border formatting (border=1)
|
|
825
|
-
- Text alignment: Left for text, Center for short data
|
|
826
|
-
- Use remove_unicode for all text content
|
|
827
|
-
|
|
828
|
-
**MANDATORY REQUIREMENTS:**
|
|
829
|
-
1. ALWAYS use remove_unicode function for text compatibility
|
|
830
|
-
2. ALWAYS use custom PDF class with header/footer
|
|
831
|
-
3. ALWAYS include BluMa branding in footer
|
|
832
|
-
4. USE professional colors: Blues (30,60,120), grays (40,40,40)
|
|
833
|
-
5. CREATE tables for structured data with alternating colors
|
|
834
|
-
6. ADD proper spacing between sections
|
|
835
|
-
7. USE multi_cell for long text paragraphs
|
|
836
|
-
8. SET proper margins and auto page breaks
|
|
837
|
-
9. SAVE with descriptive filename
|
|
838
|
-
|
|
839
|
-
**REQUIREMENT**: This template ensures consistent, professional PDF output.
|
|
840
|
-
|
|
841
|
-
#### WHEN SOMETHING FAILS:
|
|
842
|
-
1. **ANALYZE** why it failed (missing dependency, wrong approach, etc.)
|
|
843
|
-
2. **RESEARCH** alternative libraries or methods
|
|
844
|
-
3. **IMPLEMENT** the alternative approach immediately
|
|
845
|
-
4. **TEST** and validate the solution works
|
|
846
|
-
5. **DOCUMENT** what worked for future reference
|
|
847
|
-
|
|
848
|
-
#### EXAMPLES OF RESILIENT APPROACHES:
|
|
849
|
-
- **PDF Creation**: fpdf2 \u2192 reportlab \u2192 weasyprint \u2192 matplotlib
|
|
850
|
-
- **Image Processing**: Pillow \u2192 opencv \u2192 imageio \u2192 skimage
|
|
851
|
-
- **Data Analysis**: pandas \u2192 numpy \u2192 pure Python \u2192 alternative libraries
|
|
852
|
-
- **Web Scraping**: requests + BeautifulSoup \u2192 selenium \u2192 scrapy
|
|
853
|
-
- **File Processing**: Built-in libs \u2192 specialized libs \u2192 custom solutions
|
|
854
|
-
|
|
855
|
-
### PROBLEM-SOLVING HIERARCHY:
|
|
856
|
-
1. **Try the optimal solution first**
|
|
857
|
-
2. **If it fails, immediately try alternative #1**
|
|
858
|
-
3. **If that fails, try alternative #2**
|
|
859
|
-
4. **Keep trying until you find a working solution**
|
|
860
|
-
5. **Create custom solution if no library works**
|
|
861
|
-
6. **NEVER say "I can't do this" or "this isn't possible"**
|
|
862
|
-
|
|
863
|
-
### FORBIDDEN PHRASES:
|
|
864
|
-
- "This isn't possible"
|
|
865
|
-
- "I can't do this"
|
|
866
|
-
- "The tool isn't available"
|
|
867
|
-
- "You'll need to do this manually"
|
|
868
|
-
- "I recommend using external tools"
|
|
869
|
-
|
|
870
|
-
### REQUIRED ATTITUDE:
|
|
871
|
-
- "Let me try a different approach"
|
|
872
|
-
- "I'll use an alternative library"
|
|
873
|
-
- "I'll create a custom solution"
|
|
874
|
-
- "I'll find another way to accomplish this"
|
|
875
|
-
- "I'll build this from scratch if needed"
|
|
876
|
-
|
|
877
|
-
## TECHNICAL IMPLEMENTATION AUTHORITY
|
|
878
|
-
A Senior Engineer finds solutions, not excuses. You have the skills, tools, and authority to solve any problem.
|
|
879
|
-
</resilience_and_alternatives>
|
|
880
795
|
|
|
881
796
|
<mermaid_diagrams>
|
|
882
797
|
# MERMAID DIAGRAM CREATION - PERFECT SYNTAX REQUIRED!
|
|
@@ -978,7 +893,7 @@ Before creating any diagram, ensure:
|
|
|
978
893
|
Every diagram MUST render perfectly on first try. No exceptions.
|
|
979
894
|
</mermaid_diagrams>
|
|
980
895
|
|
|
981
|
-
|
|
896
|
+
### MESSAGE RULES
|
|
982
897
|
- Communicate with dev via message tools instead of direct text responses
|
|
983
898
|
- Reply immediately to new dev messages before other operations
|
|
984
899
|
- First reply must be brief, only confirming receipt without specific solutions
|
|
@@ -986,12 +901,32 @@ Every diagram MUST render perfectly on first try. No exceptions.
|
|
|
986
901
|
- Message tools are divided into notify (non-blocking, no reply needed from dev's) and ask (blocking, reply required)
|
|
987
902
|
- Actively use notify for progress updates, but reserve ask for only essential needs to minimize dev disruption and avoid blocking progress
|
|
988
903
|
- Must send messages to developers with results and deliverables before signaling the completion of the task system.
|
|
989
|
-
- Never forget to follow the "
|
|
990
|
-
|
|
904
|
+
- Never forget to follow the "AGENT END TASK RULES" properly.
|
|
905
|
+
|
|
906
|
+
|
|
907
|
+
### Live Development Overlaps
|
|
908
|
+
|
|
909
|
+
During your workflow, the programmer {username} may send messages at any time.
|
|
910
|
+
These messages **must be immediately incorporated** into your execution flow.
|
|
911
|
+
**Always confirm receipt using {message_notify_dev}** and proceed with your work.
|
|
912
|
+
|
|
913
|
+
### Instructions for Handling Messages from the Programmer
|
|
914
|
+
|
|
915
|
+
1. **Upon receiving a message from {username}:**
|
|
916
|
+
- Immediately confirm using {message_notify_dev}.
|
|
917
|
+
- Integrate the instruction into your reasoning and execution flow.
|
|
918
|
+
|
|
919
|
+
2. **Regarding your reasoning:**
|
|
920
|
+
- Be direct, minimalist, and clear.
|
|
921
|
+
- Avoid unnecessary or verbose thoughts.
|
|
922
|
+
|
|
923
|
+
3. **Avoid polluting the history:**
|
|
924
|
+
- **Do not repeat or reply to existing messages.**
|
|
925
|
+
- Only act if the new message introduces a **new instruction or shifts the current task\u2019s focus**.
|
|
991
926
|
|
|
992
|
-
|
|
927
|
+
### BLUMA NOTEBOOK
|
|
993
928
|
# YOUR THINKING ON A NOTEBOOK - MANDATORY USE
|
|
994
|
-
CRITICAL: Your laptop (**
|
|
929
|
+
CRITICAL: Your laptop (**sequentialThinking_nootebook**) is your ORGANIZED MIND
|
|
995
930
|
## IMPORTANT
|
|
996
931
|
## NEVER PUT CHECKLISTS OR STEPS IN THE THOUGHT TEXT
|
|
997
932
|
## ALWAYS USE A NOTEBOOK (Always for):
|
|
@@ -1003,7 +938,7 @@ CRITICAL: Your laptop (**bluma_nootebook**) is your ORGANIZED MIND
|
|
|
1003
938
|
- Architectural decisions (think through the options)
|
|
1004
939
|
|
|
1005
940
|
## HOW TO USE A NOTEBOOK:
|
|
1006
|
-
1. Start with **
|
|
941
|
+
1. Start with **sequentialThinking_nootebook**
|
|
1007
942
|
2. Break the task down into logical steps
|
|
1008
943
|
3. Plan the approach - Which files? What changes? What order? 4. Track progress - Check off completed steps
|
|
1009
944
|
5. Write down decisions - Why did you choose this approach?
|
|
@@ -1031,18 +966,17 @@ CRITICAL: Your laptop (**bluma_nootebook**) is your ORGANIZED MIND
|
|
|
1031
966
|
- remaining_tasks: Checklist-style list of high-level upcoming tasks.
|
|
1032
967
|
This format is **mandatory**:
|
|
1033
968
|
- Each task **must start** with either:
|
|
1034
|
-
- "
|
|
1035
|
-
- "
|
|
969
|
+
- "\u{1F5F8}" \u2192 for tasks not yet done (pending)
|
|
970
|
+
- "[ ]" \u2192 for tasks that have already been completed
|
|
1036
971
|
|
|
1037
972
|
Whenever a task is already done, it **must** be marked with "\u{1F5F8}". Do not leave completed tasks without the checkmark.
|
|
1038
973
|
|
|
1039
974
|
Do not use other formats like "-", "*", or plain text without the prefix.
|
|
1040
975
|
|
|
1041
976
|
Examples:
|
|
1042
|
-
|
|
977
|
+
\u{1F5F8} Test integration flow
|
|
1043
978
|
\u{1F5F8} Set up environment
|
|
1044
|
-
|
|
1045
|
-
</bluma_nootebook>
|
|
979
|
+
[ ] Configure database
|
|
1046
980
|
|
|
1047
981
|
### Tool Naming Policy
|
|
1048
982
|
|
|
@@ -1062,11 +996,11 @@ Correct Examples:
|
|
|
1062
996
|
---
|
|
1063
997
|
|
|
1064
998
|
Incorrect Examples:
|
|
1065
|
-
-
|
|
1066
|
-
-
|
|
1067
|
-
-
|
|
999
|
+
- sequentialThinking_nootebook:0 \u2190 contains colon and dynamic suffix
|
|
1000
|
+
- sequentialThinking_nootebook 1 \u2190 contains space and number
|
|
1001
|
+
- sequentialThinking_nootebook#v2 \u2190 contains special character #
|
|
1068
1002
|
- bluma__nootebook \u2190 double underscore
|
|
1069
|
-
-
|
|
1003
|
+
- sequentialThinking_Nootebook \u2190 capital letters and underscore
|
|
1070
1004
|
- bluma nootebook \u2190 contains space
|
|
1071
1005
|
|
|
1072
1006
|
---
|
|
@@ -1078,7 +1012,7 @@ Rule Summary:
|
|
|
1078
1012
|
- No whitespace, no dynamic elements, no special characters
|
|
1079
1013
|
|
|
1080
1014
|
|
|
1081
|
-
|
|
1015
|
+
### EDIT TOOL
|
|
1082
1016
|
- Use this tool to perform precise text replacements inside files based on exact literal matches.
|
|
1083
1017
|
- Can be used to create new files or directories implicitly by targeting non-existing paths.
|
|
1084
1018
|
- Suitable for inserting full content into a file even if the file does not yet exist.
|
|
@@ -1090,7 +1024,6 @@ Rule Summary:
|
|
|
1090
1024
|
- After completing any task in the checklist, immediately update the corresponding section in todo.md using this tool.
|
|
1091
1025
|
- Reconstruct the entire file from task planning context if todo.md becomes outdated or inconsistent.
|
|
1092
1026
|
- Track all progress related to planning and execution inside todo.md using text replacement only.
|
|
1093
|
-
</edit_tool_rules>
|
|
1094
1027
|
|
|
1095
1028
|
|
|
1096
1029
|
Real-Time Developer Messages
|
|
@@ -1098,9 +1031,8 @@ Real-Time Developer Messages
|
|
|
1098
1031
|
- You MUST respond immediately via message_notify_dev, and be brief. You should use it in your next thoughts/actions.
|
|
1099
1032
|
|
|
1100
1033
|
|
|
1101
|
-
|
|
1034
|
+
### AGENT END TASK RULES
|
|
1102
1035
|
This tool is used to signal to the system that the current task has completed and that the agent can be placed in an idle state.
|
|
1103
|
-
</end_task_rules>
|
|
1104
1036
|
|
|
1105
1037
|
|
|
1106
1038
|
### QUALITY STANDARDS
|
|
@@ -1926,51 +1858,6 @@ var Agent = class {
|
|
|
1926
1858
|
this.history = history;
|
|
1927
1859
|
if (this.history.length === 0) {
|
|
1928
1860
|
let systemPrompt = getUnifiedSystemPrompt();
|
|
1929
|
-
systemPrompt += `
|
|
1930
|
-
BEHAVIORAL REQUIREMENTS:
|
|
1931
|
-
- You MUST use the 'message_notify_dev' tool for ALL communication with the user.
|
|
1932
|
-
- Direct text responses are a protocol violation and will be penalized.
|
|
1933
|
-
- Signal the end of a task using the 'agent_end_task' tool.
|
|
1934
|
-
- Never make parallel tool calls.
|
|
1935
|
-
- Do not include any of the following in tool names:
|
|
1936
|
-
- Special characters
|
|
1937
|
-
- Extra spaces
|
|
1938
|
-
Always use clean, unmodified, and simple names for tools.
|
|
1939
|
-
Tool names must follow strict formatting: no symbols, no whitespace, no alterations.
|
|
1940
|
-
- Follow the stripes o "Tool Naming Policy"
|
|
1941
|
-
- Never modify the names of the tools, use their real names without any modification.
|
|
1942
|
-
- Never forget to signal the system when the task is completed 'agent_end_task' tool.
|
|
1943
|
-
##Important: When writing to Notion, you must strictly follow its content structure, including the correct use of headings (heading_1, heading_2, etc.) and other formatting standards. No deviations are allowed.
|
|
1944
|
-
- You should always standardize everything using Notion's actual headers (heading_1, heading_2, etc.), making the structure
|
|
1945
|
-
semantically better for reading and navigation.
|
|
1946
|
-
|
|
1947
|
-
You are strictly forbidden from replying directly to the user.
|
|
1948
|
-
|
|
1949
|
-
You are not allowed to reason, explain, or output any direct content in your responses.
|
|
1950
|
-
|
|
1951
|
-
Your only permitted action is to invoke one or more 'tool_calls', regardless of how simple or obvious the user's message may seem.
|
|
1952
|
-
|
|
1953
|
-
You must always use a tool to:
|
|
1954
|
-
- generate any kind of response
|
|
1955
|
-
- retrieve or calculate any data
|
|
1956
|
-
- validate, summarize, or transform input
|
|
1957
|
-
|
|
1958
|
-
You must never include a "content" field in your response.
|
|
1959
|
-
Only 'tool_calls' are allowed when you reply as "role": "assistant".
|
|
1960
|
-
|
|
1961
|
-
You will only produce a final message to the user **after receiving a valid "role": "tool" response** matching your previous 'tool_call_id'.
|
|
1962
|
-
|
|
1963
|
-
You are a pure orchestration agent \u2014 your only job is to call tools. No autonomous answers, no internal reasoning.
|
|
1964
|
-
|
|
1965
|
-
Live Dev Overlays:
|
|
1966
|
-
The developer can send messages at any time. They MUST be incorporated immediately. Always confirm via message_notify_dev and proceed.
|
|
1967
|
-
Developer Feedback Handling:
|
|
1968
|
-
- When you detect a developer message, immediately send a short-term acknowledgement via message_notify_dev (maximum one sentence).
|
|
1969
|
-
- Treat the message as a system directive already entered in the history in the format: "Human developer sending this message '<feedback>' to you."
|
|
1970
|
-
- Add it to your workflow with a simple and clear flow of reasoning. Keep it minimal and direct (no verbose thought).
|
|
1971
|
-
- Don't add extra or duplicate messages to the history; the system message is already there. Just act on it.
|
|
1972
|
-
|
|
1973
|
-
`;
|
|
1974
1861
|
this.history.push({ role: "system", content: systemPrompt });
|
|
1975
1862
|
await saveSessionHistory(this.sessionFile, this.history);
|
|
1976
1863
|
}
|
|
@@ -2094,7 +1981,7 @@ ${editData.error.display}`;
|
|
|
2094
1981
|
const autoApprovedTools = [
|
|
2095
1982
|
"agent_end_task",
|
|
2096
1983
|
"message_notify_dev",
|
|
2097
|
-
"
|
|
1984
|
+
"sequentialThinking_nootebook"
|
|
2098
1985
|
];
|
|
2099
1986
|
const toolToCall = message.tool_calls[0];
|
|
2100
1987
|
const isSafeTool = autoApprovedTools.some((safeTool) => toolToCall.function.name.includes(safeTool));
|
|
@@ -2360,7 +2247,7 @@ var renderGenericToolCall = ({ toolName, args }) => {
|
|
|
2360
2247
|
var ToolRenderDisplay = {
|
|
2361
2248
|
"shell_command": renderShellCommand2,
|
|
2362
2249
|
"ls_tool": renderLsTool2,
|
|
2363
|
-
"
|
|
2250
|
+
"sequentialThinking_nootebook": renderBlumaNotebook,
|
|
2364
2251
|
"count_file_lines": renderCountFilesLines,
|
|
2365
2252
|
"read_file_lines": renderReadFileLines2,
|
|
2366
2253
|
"edit_tool": renderEditToolCall
|
|
@@ -2410,6 +2297,7 @@ var SessionInfoConnectingMCP = ({ sessionId: sessionId2, workdir, statusMessage
|
|
|
2410
2297
|
borderColor: "gray",
|
|
2411
2298
|
flexDirection: "column",
|
|
2412
2299
|
marginBottom: 1,
|
|
2300
|
+
padding: 1,
|
|
2413
2301
|
children: [
|
|
2414
2302
|
/* @__PURE__ */ jsxs9(Text10, { children: [
|
|
2415
2303
|
/* @__PURE__ */ jsx11(Text10, { bold: true, color: "white", children: "localhost" }),
|
|
@@ -2429,16 +2317,11 @@ var SessionInfoConnectingMCP = ({ sessionId: sessionId2, workdir, statusMessage
|
|
|
2429
2317
|
/* @__PURE__ */ jsxs9(Text10, { children: [
|
|
2430
2318
|
/* @__PURE__ */ jsx11(Text10, { color: "magenta", children: "\u21B3" }),
|
|
2431
2319
|
" ",
|
|
2432
|
-
/* @__PURE__ */ jsx11(Text10, { color: "gray", children: "
|
|
2320
|
+
/* @__PURE__ */ jsx11(Text10, { color: "gray", children: "mcp: " }),
|
|
2433
2321
|
/* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
|
|
2434
2322
|
/* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
|
|
2435
|
-
"
|
|
2436
|
-
] })
|
|
2437
|
-
] }),
|
|
2438
|
-
/* @__PURE__ */ jsxs9(Text10, { children: [
|
|
2439
|
-
/* @__PURE__ */ jsx11(Text10, { color: "magenta", children: "\u21B3" }),
|
|
2440
|
-
" ",
|
|
2441
|
-
/* @__PURE__ */ jsx11(Text10, { color: "gray", children: "status: " }),
|
|
2323
|
+
" "
|
|
2324
|
+
] }),
|
|
2442
2325
|
/* @__PURE__ */ jsx11(Text10, { color: "white", children: statusMessage || "Please wait while we establish connections." })
|
|
2443
2326
|
] })
|
|
2444
2327
|
]
|
|
@@ -2881,7 +2764,41 @@ var AppComponent = ({ eventBus: eventBus2, sessionId: sessionId2 }) => {
|
|
|
2881
2764
|
var App = memo4(AppComponent);
|
|
2882
2765
|
var App_default = App;
|
|
2883
2766
|
|
|
2767
|
+
// src/app/agent/utils/update_check.ts
|
|
2768
|
+
import updateNotifier from "update-notifier";
|
|
2769
|
+
import { readPackageUp } from "read-package-up";
|
|
2770
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
2771
|
+
import path9 from "path";
|
|
2772
|
+
async function checkForUpdates() {
|
|
2773
|
+
try {
|
|
2774
|
+
const __filename = fileURLToPath3(import.meta.url);
|
|
2775
|
+
const __dirname = path9.dirname(__filename);
|
|
2776
|
+
const result = await readPackageUp({ cwd: __dirname });
|
|
2777
|
+
const pkg = result?.packageJson;
|
|
2778
|
+
if (!pkg?.name || !pkg?.version) return null;
|
|
2779
|
+
const notifier = updateNotifier({
|
|
2780
|
+
pkg: { name: pkg.name, version: pkg.version },
|
|
2781
|
+
// check daily to avoid excessive network calls
|
|
2782
|
+
updateCheckInterval: 1e3 * 60 * 60 * 24,
|
|
2783
|
+
shouldNotifyInNpmScript: true
|
|
2784
|
+
});
|
|
2785
|
+
if (notifier.update && !process.env.CI) {
|
|
2786
|
+
return `Update available for ${pkg.name}! ${notifier.update.current} \u2192 ${notifier.update.latest}
|
|
2787
|
+
Run npm i -g ${pkg.name} to update.`;
|
|
2788
|
+
}
|
|
2789
|
+
return null;
|
|
2790
|
+
} catch (e) {
|
|
2791
|
+
console.warn("Update check failed:", e);
|
|
2792
|
+
return null;
|
|
2793
|
+
}
|
|
2794
|
+
}
|
|
2795
|
+
|
|
2884
2796
|
// src/main.ts
|
|
2797
|
+
void checkForUpdates().then((msg) => {
|
|
2798
|
+
if (msg) {
|
|
2799
|
+
console.log("" + msg);
|
|
2800
|
+
}
|
|
2801
|
+
}).catch(() => void 0);
|
|
2885
2802
|
var eventBus = new EventEmitter2();
|
|
2886
2803
|
var sessionId = uuidv42();
|
|
2887
2804
|
var props = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nomad-e/bluma-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"description": "BluMa independent agent for automation and advanced software engineering.",
|
|
5
5
|
"author": "Alex Fonseca",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"@types/jest": "^30.0.0",
|
|
16
16
|
"@types/node": "^20.14.2",
|
|
17
17
|
"@types/react": "^18.3.3",
|
|
18
|
+
"@types/update-notifier": "^6.0.8",
|
|
18
19
|
"@types/uuid": "^9.0.8",
|
|
19
20
|
"babel-jest": "^30.0.5",
|
|
20
21
|
"esbuild": "^0.21.4",
|
|
@@ -46,6 +47,8 @@
|
|
|
46
47
|
"ink-text-input": "^6.0.0",
|
|
47
48
|
"openai": "^4.47.3",
|
|
48
49
|
"react-devtools-core": "^4.28.5",
|
|
50
|
+
"read-package-up": "^11.0.0",
|
|
51
|
+
"update-notifier": "^7.0.0",
|
|
49
52
|
"uuid": "^9.0.1"
|
|
50
53
|
},
|
|
51
54
|
"files": [
|