crewly 1.5.12 → 1.5.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/config/skills/_common/lib.sh +31 -0
- package/config/skills/_common/lib.test.sh +164 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts +13 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +67 -23
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +50 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,6 +7,37 @@
|
|
|
7
7
|
# Base URL for the Crewly backend API
|
|
8
8
|
CREWLY_API_URL="${CREWLY_API_URL:-http://localhost:8787}"
|
|
9
9
|
|
|
10
|
+
# -----------------------------------------------------------------------------
|
|
11
|
+
# Universal --file flag preprocessor (#EOF-fix)
|
|
12
|
+
#
|
|
13
|
+
# Fixes Gemini CLI's "unexpected EOF while looking for matching `'" errors.
|
|
14
|
+
#
|
|
15
|
+
# Root cause: When an LLM CLI passes JSON as a shell argument, special chars
|
|
16
|
+
# inside the JSON (single quotes, backticks, parentheses, $variables) get
|
|
17
|
+
# interpreted by the shell BEFORE the script runs, causing parse errors.
|
|
18
|
+
#
|
|
19
|
+
# Solution: The LLM writes JSON to a temp file, then passes --file <path>.
|
|
20
|
+
# This preprocessor detects --file as the first argument, reads the file,
|
|
21
|
+
# and replaces the script's positional parameters with the file contents.
|
|
22
|
+
# All downstream parsing (read_json_input, custom arg loops) works unchanged.
|
|
23
|
+
#
|
|
24
|
+
# Usage (by LLM CLI):
|
|
25
|
+
# printf '%s' '{"summary":"text with 'quotes'"}' > /tmp/crewly_input.json
|
|
26
|
+
# bash execute.sh --file /tmp/crewly_input.json
|
|
27
|
+
#
|
|
28
|
+
# This runs at source-time, so every script that sources lib.sh gets it for free.
|
|
29
|
+
# -----------------------------------------------------------------------------
|
|
30
|
+
if [ "${1:-}" = "--file" ] && [ -n "${2:-}" ]; then
|
|
31
|
+
if [ -f "$2" ]; then
|
|
32
|
+
_CREWLY_FILE_CONTENT="$(cat "$2")"
|
|
33
|
+
set -- "$_CREWLY_FILE_CONTENT"
|
|
34
|
+
unset _CREWLY_FILE_CONTENT
|
|
35
|
+
else
|
|
36
|
+
echo '{"error":"File not found: '"$2"'"}' >&2
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
fi
|
|
40
|
+
|
|
10
41
|
# -----------------------------------------------------------------------------
|
|
11
42
|
# read_json_input [arg]
|
|
12
43
|
#
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Tests for lib.sh — shared skills library
|
|
4
|
+
# Covers: --file preprocessor, read_json_input, require_param, error_exit
|
|
5
|
+
# =============================================================================
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
PASS=0
|
|
10
|
+
FAIL=0
|
|
11
|
+
TOTAL=0
|
|
12
|
+
|
|
13
|
+
# Color output
|
|
14
|
+
RED='\033[0;31m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
NC='\033[0m' # No Color
|
|
17
|
+
|
|
18
|
+
assert_eq() {
|
|
19
|
+
local test_name="$1" expected="$2" actual="$3"
|
|
20
|
+
TOTAL=$((TOTAL + 1))
|
|
21
|
+
if [ "$expected" = "$actual" ]; then
|
|
22
|
+
echo -e "${GREEN}PASS${NC}: $test_name"
|
|
23
|
+
PASS=$((PASS + 1))
|
|
24
|
+
else
|
|
25
|
+
echo -e "${RED}FAIL${NC}: $test_name"
|
|
26
|
+
echo " Expected: $expected"
|
|
27
|
+
echo " Actual: $actual"
|
|
28
|
+
FAIL=$((FAIL + 1))
|
|
29
|
+
fi
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
assert_contains() {
|
|
33
|
+
local test_name="$1" expected_substr="$2" actual="$3"
|
|
34
|
+
TOTAL=$((TOTAL + 1))
|
|
35
|
+
if echo "$actual" | grep -q "$expected_substr"; then
|
|
36
|
+
echo -e "${GREEN}PASS${NC}: $test_name"
|
|
37
|
+
PASS=$((PASS + 1))
|
|
38
|
+
else
|
|
39
|
+
echo -e "${RED}FAIL${NC}: $test_name"
|
|
40
|
+
echo " Expected to contain: $expected_substr"
|
|
41
|
+
echo " Actual: $actual"
|
|
42
|
+
FAIL=$((FAIL + 1))
|
|
43
|
+
fi
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
assert_exit_code() {
|
|
47
|
+
local test_name="$1" expected_code="$2"
|
|
48
|
+
shift 2
|
|
49
|
+
local actual_code=0
|
|
50
|
+
"$@" >/dev/null 2>&1 || actual_code=$?
|
|
51
|
+
TOTAL=$((TOTAL + 1))
|
|
52
|
+
if [ "$expected_code" = "$actual_code" ]; then
|
|
53
|
+
echo -e "${GREEN}PASS${NC}: $test_name"
|
|
54
|
+
PASS=$((PASS + 1))
|
|
55
|
+
else
|
|
56
|
+
echo -e "${RED}FAIL${NC}: $test_name"
|
|
57
|
+
echo " Expected exit code: $expected_code"
|
|
58
|
+
echo " Actual exit code: $actual_code"
|
|
59
|
+
FAIL=$((FAIL + 1))
|
|
60
|
+
fi
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# Create a minimal test skill script that sources lib.sh and echoes $1
|
|
64
|
+
TEMP_DIR=$(mktemp -d)
|
|
65
|
+
trap "rm -rf $TEMP_DIR" EXIT
|
|
66
|
+
|
|
67
|
+
cat > "$TEMP_DIR/test_skill.sh" << 'SKILL_EOF'
|
|
68
|
+
#!/bin/bash
|
|
69
|
+
set -euo pipefail
|
|
70
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
71
|
+
# Source lib.sh via the real path
|
|
72
|
+
source "$LIB_PATH"
|
|
73
|
+
# Output the first positional parameter (after preprocessor runs)
|
|
74
|
+
echo "$1"
|
|
75
|
+
SKILL_EOF
|
|
76
|
+
chmod +x "$TEMP_DIR/test_skill.sh"
|
|
77
|
+
|
|
78
|
+
# Also create a test skill that uses read_json_input
|
|
79
|
+
cat > "$TEMP_DIR/test_read_json.sh" << 'SKILL_EOF'
|
|
80
|
+
#!/bin/bash
|
|
81
|
+
set -euo pipefail
|
|
82
|
+
source "$LIB_PATH"
|
|
83
|
+
INPUT=$(read_json_input "${1:-}")
|
|
84
|
+
echo "$INPUT"
|
|
85
|
+
SKILL_EOF
|
|
86
|
+
chmod +x "$TEMP_DIR/test_read_json.sh"
|
|
87
|
+
|
|
88
|
+
export LIB_PATH="$SCRIPT_DIR/lib.sh"
|
|
89
|
+
|
|
90
|
+
echo "=== lib.sh Test Suite ==="
|
|
91
|
+
echo ""
|
|
92
|
+
|
|
93
|
+
# ---- Test 1: --file flag reads JSON from file ----
|
|
94
|
+
echo '{"key":"value","text":"hello world"}' > "$TEMP_DIR/input.json"
|
|
95
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "$TEMP_DIR/input.json")
|
|
96
|
+
assert_eq "--file reads JSON from file" '{"key":"value","text":"hello world"}' "$RESULT"
|
|
97
|
+
|
|
98
|
+
# ---- Test 2: --file with special characters (the whole point!) ----
|
|
99
|
+
printf '%s' '{"summary":"text with '\''quotes'\'' and (parens) and `backticks`"}' > "$TEMP_DIR/special.json"
|
|
100
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "$TEMP_DIR/special.json")
|
|
101
|
+
assert_contains "--file handles single quotes" "quotes" "$RESULT"
|
|
102
|
+
assert_contains "--file handles parentheses" "(parens)" "$RESULT"
|
|
103
|
+
assert_contains "--file handles backticks" "backticks" "$RESULT"
|
|
104
|
+
|
|
105
|
+
# ---- Test 3: --file with multiline JSON ----
|
|
106
|
+
cat > "$TEMP_DIR/multiline.json" << 'MULTI_EOF'
|
|
107
|
+
{"summary":"line 1\nline 2\nline 3","status":"done"}
|
|
108
|
+
MULTI_EOF
|
|
109
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "$TEMP_DIR/multiline.json")
|
|
110
|
+
assert_contains "--file handles multiline content" "line 1" "$RESULT"
|
|
111
|
+
|
|
112
|
+
# ---- Test 4: --file with nonexistent file fails ----
|
|
113
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "/tmp/nonexistent_crewly_test_file.json" 2>&1 || true)
|
|
114
|
+
assert_contains "--file with missing file reports error" "File not found" "$RESULT"
|
|
115
|
+
|
|
116
|
+
# ---- Test 5: Direct JSON argument still works (backward compat) ----
|
|
117
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" '{"key":"direct"}')
|
|
118
|
+
assert_eq "Direct JSON argument works" '{"key":"direct"}' "$RESULT"
|
|
119
|
+
|
|
120
|
+
# ---- Test 6: read_json_input with --file ----
|
|
121
|
+
echo '{"agentId":"dev-1","content":"test memory"}' > "$TEMP_DIR/read_input.json"
|
|
122
|
+
RESULT=$(bash "$TEMP_DIR/test_read_json.sh" --file "$TEMP_DIR/read_input.json")
|
|
123
|
+
assert_contains "read_json_input with --file" "dev-1" "$RESULT"
|
|
124
|
+
|
|
125
|
+
# ---- Test 7: read_json_input with @filepath ----
|
|
126
|
+
echo '{"agentId":"dev-2","content":"at-file test"}' > "$TEMP_DIR/at_input.json"
|
|
127
|
+
RESULT=$(bash "$TEMP_DIR/test_read_json.sh" "@$TEMP_DIR/at_input.json")
|
|
128
|
+
assert_contains "read_json_input with @filepath" "dev-2" "$RESULT"
|
|
129
|
+
|
|
130
|
+
# ---- Test 8: read_json_input with stdin pipe ----
|
|
131
|
+
RESULT=$(echo '{"agentId":"dev-3","content":"stdin test"}' | bash "$TEMP_DIR/test_read_json.sh")
|
|
132
|
+
assert_contains "read_json_input with stdin pipe" "dev-3" "$RESULT"
|
|
133
|
+
|
|
134
|
+
# ---- Test 9: read_json_input with direct JSON arg ----
|
|
135
|
+
RESULT=$(bash "$TEMP_DIR/test_read_json.sh" '{"agentId":"dev-4"}')
|
|
136
|
+
assert_contains "read_json_input with direct arg" "dev-4" "$RESULT"
|
|
137
|
+
|
|
138
|
+
# ---- Test 10: --file with Unicode content ----
|
|
139
|
+
printf '%s' '{"text":"Chinese: 你好世界, Japanese: こんにちは"}' > "$TEMP_DIR/unicode.json"
|
|
140
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "$TEMP_DIR/unicode.json")
|
|
141
|
+
assert_contains "--file handles Unicode" "你好世界" "$RESULT"
|
|
142
|
+
|
|
143
|
+
# ---- Test 11: --file with dollar signs and variables ----
|
|
144
|
+
printf '%s' '{"text":"Price is $100, env is ${HOME}"}' > "$TEMP_DIR/dollar.json"
|
|
145
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "$TEMP_DIR/dollar.json")
|
|
146
|
+
assert_contains "--file preserves dollar signs" '$100' "$RESULT"
|
|
147
|
+
assert_contains "--file preserves \\\${} syntax" '${HOME}' "$RESULT"
|
|
148
|
+
|
|
149
|
+
# ---- Test 12: --file with newlines in JSON values ----
|
|
150
|
+
printf '%s' '{"text":"line1\nline2\nline3"}' > "$TEMP_DIR/newlines.json"
|
|
151
|
+
RESULT=$(bash "$TEMP_DIR/test_skill.sh" --file "$TEMP_DIR/newlines.json")
|
|
152
|
+
assert_contains "--file preserves escaped newlines" 'line1\\nline2' "$RESULT"
|
|
153
|
+
|
|
154
|
+
# ---- Test 13: --file with empty JSON ----
|
|
155
|
+
echo '{}' > "$TEMP_DIR/empty.json"
|
|
156
|
+
RESULT=$(bash "$TEMP_DIR/test_read_json.sh" --file "$TEMP_DIR/empty.json")
|
|
157
|
+
assert_eq "--file with empty JSON" '{}' "$RESULT"
|
|
158
|
+
|
|
159
|
+
echo ""
|
|
160
|
+
echo "=== Results: $PASS/$TOTAL passed, $FAIL failed ==="
|
|
161
|
+
|
|
162
|
+
if [ "$FAIL" -gt 0 ]; then
|
|
163
|
+
exit 1
|
|
164
|
+
fi
|
|
@@ -29,6 +29,19 @@ export declare class CommunicationModule implements PromptModule {
|
|
|
29
29
|
* @returns Formatted markdown communication section
|
|
30
30
|
*/
|
|
31
31
|
build(config: ModuleConfig): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Build a skill call example snippet. For gemini-cli runtime, uses --file
|
|
34
|
+
* pattern to avoid shell escaping EOF errors. For other runtimes, uses
|
|
35
|
+
* inline JSON argument.
|
|
36
|
+
*
|
|
37
|
+
* @param config - Module configuration with runtime type
|
|
38
|
+
* @param skillPath - Relative path to the skill (e.g., 'core/report-status')
|
|
39
|
+
* @param jsonExample - Example JSON string for inline mode
|
|
40
|
+
* @param basePath - Optional base path override (defaults to config.agentSkillsPath).
|
|
41
|
+
* Use config.tlSkillsPath for team-leader skills like delegate-task.
|
|
42
|
+
* @returns Formatted bash code block
|
|
43
|
+
*/
|
|
44
|
+
private buildSkillExample;
|
|
32
45
|
/**
|
|
33
46
|
* Full orchestrator communication spec — Slack, Chat UI, NOTIFY markers,
|
|
34
47
|
* thread management, message formatting, and notification protocol.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/communication.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAoB,MAAM,8BAA8B,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACvD,IAAI,SAAmB;IACvB,QAAQ,SAAK;IACb,SAAS,SAAQ;IACjB,WAAW,UAAQ;IAEnB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;;OAOG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBlD;;;OAGG;IACH,OAAO,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"communication.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/communication.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAoB,MAAM,8BAA8B,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACvD,IAAI,SAAmB;IACvB,QAAQ,SAAK;IACb,SAAS,SAAQ;IACjB,WAAW,UAAQ;IAEnB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;;OAOG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBlD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAyE9B;;OAEG;IACH,OAAO,CAAC,YAAY;IA8BpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAqBxB"}
|
|
@@ -46,11 +46,39 @@ export class CommunicationModule {
|
|
|
46
46
|
}
|
|
47
47
|
return this.buildWorkerComms(config);
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Build a skill call example snippet. For gemini-cli runtime, uses --file
|
|
51
|
+
* pattern to avoid shell escaping EOF errors. For other runtimes, uses
|
|
52
|
+
* inline JSON argument.
|
|
53
|
+
*
|
|
54
|
+
* @param config - Module configuration with runtime type
|
|
55
|
+
* @param skillPath - Relative path to the skill (e.g., 'core/report-status')
|
|
56
|
+
* @param jsonExample - Example JSON string for inline mode
|
|
57
|
+
* @param basePath - Optional base path override (defaults to config.agentSkillsPath).
|
|
58
|
+
* Use config.tlSkillsPath for team-leader skills like delegate-task.
|
|
59
|
+
* @returns Formatted bash code block
|
|
60
|
+
*/
|
|
61
|
+
buildSkillExample(config, skillPath, jsonExample, basePath) {
|
|
62
|
+
const resolvedBase = basePath || config.agentSkillsPath;
|
|
63
|
+
if (config.runtimeType === 'gemini-cli') {
|
|
64
|
+
return `\`\`\`bash
|
|
65
|
+
printf '%s' '${jsonExample}' > /tmp/crewly_skill_input.json
|
|
66
|
+
bash ${resolvedBase}/${skillPath}/execute.sh --file /tmp/crewly_skill_input.json
|
|
67
|
+
\`\`\``;
|
|
68
|
+
}
|
|
69
|
+
return `\`\`\`bash
|
|
70
|
+
bash ${resolvedBase}/${skillPath}/execute.sh '${jsonExample}'
|
|
71
|
+
\`\`\``;
|
|
72
|
+
}
|
|
49
73
|
/**
|
|
50
74
|
* Full orchestrator communication spec — Slack, Chat UI, NOTIFY markers,
|
|
51
75
|
* thread management, message formatting, and notification protocol.
|
|
52
76
|
*/
|
|
53
77
|
buildOrchestratorComms(config) {
|
|
78
|
+
const reportStatusJson = `{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
79
|
+
const sendMessageJson = '{"to":"<session>","message":"<msg>"}';
|
|
80
|
+
const reportExample = this.buildSkillExample(config, 'core/report-status', reportStatusJson);
|
|
81
|
+
const sendExample = this.buildSkillExample(config, 'core/send-message', sendMessageJson);
|
|
54
82
|
return `## Communication Protocol
|
|
55
83
|
|
|
56
84
|
### Message Channels
|
|
@@ -60,14 +88,19 @@ You have access to multiple communication channels:
|
|
|
60
88
|
- **Google Chat** — Alternative messaging platform
|
|
61
89
|
- **NOTIFY markers** — Internal agent-to-orchestrator signaling
|
|
62
90
|
|
|
63
|
-
### Message Routing Rules
|
|
64
|
-
1.
|
|
65
|
-
2.
|
|
66
|
-
3.
|
|
67
|
-
4.
|
|
91
|
+
### Message Routing Rules — Reply on the SAME Channel
|
|
92
|
+
1. **\`[CHAT:...]\` prefix** → Message from Chat UI → Use \`reply-chat\` skill
|
|
93
|
+
2. **\`[GCHAT:...]\` prefix** → Message from Google Chat → Use \`reply-gchat\` skill
|
|
94
|
+
3. **\`[SLACK:...]\` marker** → Message from Slack → Use \`reply-slack\` skill
|
|
95
|
+
4. **\`[REMOTE:...]\` marker** → Message from remote device → Use \`reply-remote\` skill
|
|
96
|
+
5. **Agent status updates** → Process internally, do not forward to user unless requested
|
|
97
|
+
6. **Task completions / Error notifications** → Notify user on their active channel
|
|
98
|
+
|
|
99
|
+
**CRITICAL:** Match the reply skill to the message source prefix. Never use \`reply-slack\` for a \`[GCHAT:...]\` message or vice versa.
|
|
68
100
|
|
|
69
101
|
### Slack Communication
|
|
70
102
|
- Use \`reply-slack\` skill to send messages to Slack threads
|
|
103
|
+
- Triggered when you see a \`[SLACK:channelId:threadTs]\` marker on the message
|
|
71
104
|
- Always reply in the **same thread** the user messaged from
|
|
72
105
|
- Format messages using Slack mrkdwn (not standard Markdown):
|
|
73
106
|
- Bold: \`*text*\` (not \`**text**\`)
|
|
@@ -76,8 +109,17 @@ You have access to multiple communication channels:
|
|
|
76
109
|
- Links: \`<url|text>\` (not \`[text](url)\`)
|
|
77
110
|
- Keep messages concise — avoid walls of text in Slack
|
|
78
111
|
|
|
112
|
+
### Google Chat Communication
|
|
113
|
+
- Use \`reply-gchat\` skill to send messages to Google Chat threads
|
|
114
|
+
- Triggered when you see a \`[GCHAT:conversationId thread=spaceName]\` prefix on the message
|
|
115
|
+
- Extract the \`thread=\` value from the prefix and pass it as \`--thread\` to reply-gchat
|
|
116
|
+
- Extract the space from the conversationId and pass it as \`--space\` to reply-gchat
|
|
117
|
+
- Standard Markdown formatting is supported in Google Chat
|
|
118
|
+
- Keep messages concise and actionable
|
|
119
|
+
|
|
79
120
|
### Chat UI Communication
|
|
80
121
|
- Use \`reply-chat\` skill for Chat UI responses
|
|
122
|
+
- Triggered when you see a \`[CHAT:...]\` prefix without \`GCHAT\` or \`SLACK\` markers
|
|
81
123
|
- Standard Markdown formatting is supported
|
|
82
124
|
- Include structured data (tables, code blocks) when helpful
|
|
83
125
|
|
|
@@ -100,30 +142,32 @@ When you receive a message from the user (via Slack, Chat UI, or Google Chat):
|
|
|
100
142
|
This prevents the user from wondering if their message was received or if the agent is stuck.
|
|
101
143
|
|
|
102
144
|
### Communication Skills
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
\`\`\`
|
|
106
|
-
\`\`\`bash
|
|
107
|
-
bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<session>","message":"<msg>"}'
|
|
108
|
-
\`\`\``;
|
|
145
|
+
${reportExample}
|
|
146
|
+
${sendExample}`;
|
|
109
147
|
}
|
|
110
148
|
/**
|
|
111
149
|
* TL communication — delegation-focused messaging plus basic user comms.
|
|
112
150
|
*/
|
|
113
151
|
buildTLComms(config) {
|
|
152
|
+
const reportStatusJson = `{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
153
|
+
const sendMessageJson = '{"to":"<worker-session>","message":"<task or feedback>"}';
|
|
154
|
+
const delegateTaskJson = `{"to":"<worker-session>","task":"<task description>","priority":"high","teamId":"${config.teamId || ''}","tlMemberId":"${config.memberId}","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
155
|
+
const reportExample = this.buildSkillExample(config, 'core/report-status', reportStatusJson);
|
|
156
|
+
const sendExample = this.buildSkillExample(config, 'core/send-message', sendMessageJson);
|
|
157
|
+
const delegateExample = this.buildSkillExample(config, 'delegate-task', delegateTaskJson, config.tlSkillsPath);
|
|
114
158
|
return `## Communication Protocol
|
|
115
159
|
|
|
116
160
|
### Reporting to Orchestrator
|
|
117
161
|
Use \`report-status\` to keep the orchestrator informed of progress:
|
|
118
|
-
|
|
119
|
-
bash ${config.agentSkillsPath}/core/report-status/execute.sh '{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}'
|
|
120
|
-
\`\`\`
|
|
162
|
+
${reportExample}
|
|
121
163
|
|
|
122
164
|
### Messaging Workers
|
|
123
165
|
Use \`send-message\` to communicate with your subordinates:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
166
|
+
${sendExample}
|
|
167
|
+
|
|
168
|
+
### Delegating Tasks
|
|
169
|
+
Use \`delegate-task\` to assign tasks to your subordinates:
|
|
170
|
+
${delegateExample}
|
|
127
171
|
|
|
128
172
|
### Communication Rules
|
|
129
173
|
1. **Report up** — Keep orchestrator informed of progress and blockers
|
|
@@ -136,19 +180,19 @@ bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<worker-sess
|
|
|
136
180
|
* Worker communication — compact report-status and send-message only.
|
|
137
181
|
*/
|
|
138
182
|
buildWorkerComms(config) {
|
|
183
|
+
const reportStatusJson = `{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
184
|
+
const sendMessageJson = '{"to":"<session>","message":"<msg>"}';
|
|
185
|
+
const reportExample = this.buildSkillExample(config, 'core/report-status', reportStatusJson);
|
|
186
|
+
const sendExample = this.buildSkillExample(config, 'core/send-message', sendMessageJson);
|
|
139
187
|
return `## Communication
|
|
140
188
|
|
|
141
189
|
### Reporting Progress
|
|
142
190
|
Use \`report-status\` to update your team leader on task progress:
|
|
143
|
-
|
|
144
|
-
bash ${config.agentSkillsPath}/core/report-status/execute.sh '{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}'
|
|
145
|
-
\`\`\`
|
|
191
|
+
${reportExample}
|
|
146
192
|
|
|
147
193
|
### Messaging
|
|
148
194
|
Use \`send-message\` to communicate with other agents:
|
|
149
|
-
|
|
150
|
-
bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<session>","message":"<msg>"}'
|
|
151
|
-
\`\`\`
|
|
195
|
+
${sendExample}
|
|
152
196
|
|
|
153
197
|
### Rules
|
|
154
198
|
- Report progress periodically so your team leader stays informed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/communication.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,mBAAmB;IAC/B,IAAI,GAAG,eAAe,CAAC;IACvB,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,OAAqB;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC/B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC;QAEzC,4EAA4E;QAC5E,IAAI,cAAc,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YACpF,IAAI,QAAQ,EAAE,CAAC;gBACd,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAAC,MAAoB;QAClD,
|
|
1
|
+
{"version":3,"file":"communication.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/communication.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,20 @@ export declare class SkillsReferenceModule implements PromptModule {
|
|
|
34
34
|
* Workers get narrow read+execute scope; orchestrators get broader coordination scope.
|
|
35
35
|
*/
|
|
36
36
|
private buildCapabilities;
|
|
37
|
+
/**
|
|
38
|
+
* Build safe skill calling guide for runtimes with shell escaping issues.
|
|
39
|
+
*
|
|
40
|
+
* Gemini CLI's run_shell_command mangles JSON arguments containing quotes,
|
|
41
|
+
* backticks, and parentheses, causing "unexpected EOF" shell errors.
|
|
42
|
+
* This guide instructs the agent to write JSON to a temp file first,
|
|
43
|
+
* then pass --file <path> to avoid shell interpretation entirely.
|
|
44
|
+
*
|
|
45
|
+
* Only included for gemini-cli runtime type.
|
|
46
|
+
*
|
|
47
|
+
* @param config - Module configuration with runtime type
|
|
48
|
+
* @returns Safe calling guide markdown, or null if not needed
|
|
49
|
+
*/
|
|
50
|
+
private buildSafeCallGuide;
|
|
37
51
|
/**
|
|
38
52
|
* Build communication and memory tool instructions.
|
|
39
53
|
*/
|
package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,IAAI,SAAuB;IAC3B,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,UAAS;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,IAAI,SAAuB;IAC3B,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,UAAS;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAalD;;OAEG;IACH,OAAO,CAAC,eAAe;IAoDvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAkB1B"}
|
|
@@ -29,7 +29,12 @@ export class SkillsReferenceModule {
|
|
|
29
29
|
const coreSkills = this.buildCoreSkills(config);
|
|
30
30
|
const capabilities = this.buildCapabilities(config);
|
|
31
31
|
const communication = this.buildCommunication(config);
|
|
32
|
-
|
|
32
|
+
const safeCallGuide = this.buildSafeCallGuide(config);
|
|
33
|
+
const parts = [coreSkills, capabilities, communication];
|
|
34
|
+
if (safeCallGuide) {
|
|
35
|
+
parts.push(safeCallGuide);
|
|
36
|
+
}
|
|
37
|
+
return parts.join('\n\n');
|
|
33
38
|
}
|
|
34
39
|
/**
|
|
35
40
|
* Build the core skills list — available to all roles.
|
|
@@ -74,6 +79,50 @@ export class SkillsReferenceModule {
|
|
|
74
79
|
}
|
|
75
80
|
return lines.join('\n');
|
|
76
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Build safe skill calling guide for runtimes with shell escaping issues.
|
|
84
|
+
*
|
|
85
|
+
* Gemini CLI's run_shell_command mangles JSON arguments containing quotes,
|
|
86
|
+
* backticks, and parentheses, causing "unexpected EOF" shell errors.
|
|
87
|
+
* This guide instructs the agent to write JSON to a temp file first,
|
|
88
|
+
* then pass --file <path> to avoid shell interpretation entirely.
|
|
89
|
+
*
|
|
90
|
+
* Only included for gemini-cli runtime type.
|
|
91
|
+
*
|
|
92
|
+
* @param config - Module configuration with runtime type
|
|
93
|
+
* @returns Safe calling guide markdown, or null if not needed
|
|
94
|
+
*/
|
|
95
|
+
buildSafeCallGuide(config) {
|
|
96
|
+
if (config.runtimeType !== 'gemini-cli') {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return `## Safe Skill Calling (MANDATORY)
|
|
100
|
+
|
|
101
|
+
**CRITICAL:** When calling any bash skill, you MUST use the \`--file\` pattern to avoid shell escaping errors.
|
|
102
|
+
Passing JSON directly as a shell argument will cause "unexpected EOF" errors when the content contains quotes, backticks, or parentheses.
|
|
103
|
+
|
|
104
|
+
### Required Pattern
|
|
105
|
+
\`\`\`bash
|
|
106
|
+
# Step 1: Write JSON to a temp file (printf preserves all special characters)
|
|
107
|
+
printf '%s' '{"sessionName":"my-agent","status":"done","summary":"Fixed the bug"}' > /tmp/crewly_skill_input.json
|
|
108
|
+
|
|
109
|
+
# Step 2: Call the skill with --file flag
|
|
110
|
+
bash ${config.agentSkillsPath}/core/report-status/execute.sh --file /tmp/crewly_skill_input.json
|
|
111
|
+
\`\`\`${config.canDelegate ? `
|
|
112
|
+
|
|
113
|
+
### Team Leader Skills (delegate-task, verify-output, schedule-check)
|
|
114
|
+
\`\`\`bash
|
|
115
|
+
printf '%s' '{"to":"worker-session","task":"implement feature"}' > /tmp/crewly_skill_input.json
|
|
116
|
+
bash ${config.tlSkillsPath}/delegate-task/execute.sh --file /tmp/crewly_skill_input.json
|
|
117
|
+
\`\`\`` : ''}
|
|
118
|
+
|
|
119
|
+
### Rules
|
|
120
|
+
1. **ALWAYS** use \`printf '%s' '<json>' > /tmp/crewly_skill_input.json\` then \`--file\`
|
|
121
|
+
2. **NEVER** pass JSON directly as a shell argument: \`bash execute.sh '{"key":"value with 'quotes'"}'\`
|
|
122
|
+
3. Use \`/tmp/crewly_skill_input.json\` as the temp file (overwritten each call)
|
|
123
|
+
4. This applies to ALL skills: report-status, send-message, remember, recall, delegate-task, reply-slack, reply-gchat, etc.
|
|
124
|
+
5. For skills that support named flags (reply-slack, reply-gchat), you may also use \`--text-file\` for the message body`;
|
|
125
|
+
}
|
|
77
126
|
/**
|
|
78
127
|
* Build communication and memory tool instructions.
|
|
79
128
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAqB;IACjC,IAAI,GAAG,mBAAmB,CAAC;IAC3B,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,GAAG,CAAC;IAChB,WAAW,GAAG,KAAK,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAqB;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEtD,
|
|
1
|
+
{"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crewly",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
|
|
6
6
|
"main": "dist/cli/cli/src/index.js",
|