crewly 1.5.10 → 1.5.11
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/orchestrator/update-team-member/SKILL.md +36 -0
- package/config/skills/orchestrator/update-team-member/execute.sh +25 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +66 -46
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/frontend/dist/assets/{index-76782e9e.js → index-9af2ea40.js} +2 -2
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# update-team-member
|
|
2
|
+
|
|
3
|
+
Update a team member's properties including name, role, runtimeType, systemPrompt, and other attributes.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bash config/skills/orchestrator/update-team-member/execute.sh '{"teamId":"<team-uuid>","memberId":"<member-uuid>","runtimeType":"crewly-agent"}'
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
| Parameter | Required | Description |
|
|
14
|
+
|-----------|----------|-------------|
|
|
15
|
+
| teamId | Yes | Team UUID or "orchestrator" |
|
|
16
|
+
| memberId | Yes | Member UUID |
|
|
17
|
+
| name | No | New display name |
|
|
18
|
+
| role | No | New role (e.g., "developer", "pm") |
|
|
19
|
+
| runtimeType | No | Runtime type: "claude-code", "gemini-cli", "codex-cli", "crewly-agent" |
|
|
20
|
+
| systemPrompt | No | New system prompt text |
|
|
21
|
+
|
|
22
|
+
## Examples
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Change runtime type
|
|
26
|
+
bash config/skills/orchestrator/update-team-member/execute.sh '{"teamId":"817a1aeb","memberId":"member-001","runtimeType":"gemini-cli"}'
|
|
27
|
+
|
|
28
|
+
# Update name and role
|
|
29
|
+
bash config/skills/orchestrator/update-team-member/execute.sh '{"teamId":"817a1aeb","memberId":"member-001","name":"New Name","role":"developer"}'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
|
|
34
|
+
- When only `runtimeType` is provided, the dedicated `/runtime` endpoint is used for stricter validation
|
|
35
|
+
- For other fields, the general member update endpoint is used
|
|
36
|
+
- The member must exist in the specified team
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Update a team member's properties (name, role, runtimeType, systemPrompt, etc.)
|
|
3
|
+
# If only runtimeType is being updated, uses the dedicated runtime endpoint for validation.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
7
|
+
|
|
8
|
+
INPUT=$(read_json_input "${1:-}")
|
|
9
|
+
[ -z "$INPUT" ] && error_exit 'Usage: execute.sh '"'"'{"teamId":"uuid","memberId":"uuid","runtimeType":"claude-code"}'"'"''
|
|
10
|
+
|
|
11
|
+
TEAM_ID=$(printf '%s' "$INPUT" | jq -r '.teamId // empty')
|
|
12
|
+
MEMBER_ID=$(printf '%s' "$INPUT" | jq -r '.memberId // empty')
|
|
13
|
+
require_param "teamId" "$TEAM_ID"
|
|
14
|
+
require_param "memberId" "$MEMBER_ID"
|
|
15
|
+
|
|
16
|
+
# Remove teamId and memberId from the body (they go in the URL)
|
|
17
|
+
BODY=$(printf '%s' "$INPUT" | jq 'del(.teamId, .memberId)')
|
|
18
|
+
|
|
19
|
+
# Check if this is a runtime-only update (use the dedicated endpoint for validation)
|
|
20
|
+
KEYS=$(printf '%s' "$BODY" | jq -r 'keys[]')
|
|
21
|
+
if [ "$KEYS" = "runtimeType" ]; then
|
|
22
|
+
api_call PUT "/teams/$TEAM_ID/members/$MEMBER_ID/runtime" "$BODY"
|
|
23
|
+
else
|
|
24
|
+
api_call PUT "/teams/$TEAM_ID/members/$MEMBER_ID" "$BODY"
|
|
25
|
+
fi
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAYrF;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAE/E;
|
|
1
|
+
{"version":3,"file":"team.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,21 @@ async function getDefaultRuntime() {
|
|
|
42
42
|
return RUNTIME_TYPES.CLAUDE_CODE;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if the auditor is enabled in settings.
|
|
47
|
+
* Used to conditionally include the auditor member in the orchestrator team.
|
|
48
|
+
*
|
|
49
|
+
* @returns True if the auditor is enabled
|
|
50
|
+
*/
|
|
51
|
+
async function isAuditorEnabled() {
|
|
52
|
+
try {
|
|
53
|
+
const settings = await getSettingsService().getSettings();
|
|
54
|
+
return settings.general.enableAuditor ?? false;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
45
60
|
/**
|
|
46
61
|
* Computes the lastActivity timestamp for a team.
|
|
47
62
|
*
|
|
@@ -84,60 +99,63 @@ function withLastActivity(team) {
|
|
|
84
99
|
* @param overrides - Optional field overrides (e.g. projectIds for updates)
|
|
85
100
|
* @returns A Team object representing the orchestrator
|
|
86
101
|
*/
|
|
87
|
-
function buildOrchestratorTeam(actualAgentStatus, orchestratorStatus, overrides, inProcessRuntimeStatus) {
|
|
102
|
+
function buildOrchestratorTeam(actualAgentStatus, orchestratorStatus, overrides, inProcessRuntimeStatus, options) {
|
|
88
103
|
const now = new Date().toISOString();
|
|
89
104
|
// Resolve Assistant status: check in-process runtime active state
|
|
90
105
|
const assistantInProcessActive = inProcessRuntimeStatus?.['crewly-orc-assistant'] ?? false;
|
|
91
106
|
const assistantStatus = assistantInProcessActive
|
|
92
107
|
? CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE
|
|
93
108
|
: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
109
|
+
const members = [
|
|
110
|
+
{
|
|
111
|
+
id: 'orchestrator-member',
|
|
112
|
+
name: 'Agentmux Orchestrator',
|
|
113
|
+
sessionName: CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME,
|
|
114
|
+
role: 'orchestrator',
|
|
115
|
+
systemPrompt: 'You are the Crewly Orchestrator responsible for coordinating teams and managing project workflows.',
|
|
116
|
+
agentStatus: actualAgentStatus,
|
|
117
|
+
workingStatus: (orchestratorStatus?.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE),
|
|
118
|
+
runtimeType: (orchestratorStatus?.runtimeType || 'claude-code'),
|
|
119
|
+
createdAt: orchestratorStatus?.createdAt || now,
|
|
120
|
+
updatedAt: orchestratorStatus?.updatedAt || now
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: 'crewly-orc-assistant-member-001',
|
|
124
|
+
name: 'Assistant',
|
|
125
|
+
sessionName: 'crewly-orc-assistant',
|
|
126
|
+
role: 'orchestrator',
|
|
127
|
+
systemPrompt: 'Shadow orchestrator running in-process via Crewly Agent runtime (AI SDK)',
|
|
128
|
+
agentStatus: assistantStatus,
|
|
129
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
130
|
+
runtimeType: 'crewly-agent',
|
|
131
|
+
createdAt: '2026-03-11T02:00:00.000Z',
|
|
132
|
+
updatedAt: now
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
// Only include auditor member when auditor is enabled (default: include for backward compat)
|
|
136
|
+
if (options?.auditorEnabled !== false) {
|
|
137
|
+
const auditorInProcessActive = inProcessRuntimeStatus?.['crewly-auditor'] ?? false;
|
|
138
|
+
const auditorStatus = auditorInProcessActive
|
|
139
|
+
? CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE
|
|
140
|
+
: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE;
|
|
141
|
+
members.push({
|
|
142
|
+
id: 'e5f6a7b8-9012-3cde-f456-auditor00001',
|
|
143
|
+
name: 'Auditor',
|
|
144
|
+
sessionName: 'crewly-auditor',
|
|
145
|
+
role: 'auditor',
|
|
146
|
+
systemPrompt: 'Autonomous quality observer — monitors all agents, detects problems, writes audit reports',
|
|
147
|
+
agentStatus: auditorStatus,
|
|
148
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
149
|
+
runtimeType: 'claude-code',
|
|
150
|
+
createdAt: '2026-03-11T02:10:00.000Z',
|
|
151
|
+
updatedAt: now
|
|
152
|
+
});
|
|
153
|
+
}
|
|
99
154
|
return {
|
|
100
155
|
id: 'orchestrator',
|
|
101
156
|
name: 'Orchestrator Team',
|
|
102
157
|
description: 'System orchestrator for project management',
|
|
103
|
-
members
|
|
104
|
-
{
|
|
105
|
-
id: 'orchestrator-member',
|
|
106
|
-
name: 'Agentmux Orchestrator',
|
|
107
|
-
sessionName: CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME,
|
|
108
|
-
role: 'orchestrator',
|
|
109
|
-
systemPrompt: 'You are the Crewly Orchestrator responsible for coordinating teams and managing project workflows.',
|
|
110
|
-
agentStatus: actualAgentStatus,
|
|
111
|
-
workingStatus: (orchestratorStatus?.workingStatus || CREWLY_CONSTANTS.WORKING_STATUSES.IDLE),
|
|
112
|
-
runtimeType: (orchestratorStatus?.runtimeType || 'claude-code'),
|
|
113
|
-
createdAt: orchestratorStatus?.createdAt || now,
|
|
114
|
-
updatedAt: orchestratorStatus?.updatedAt || now
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
id: 'crewly-orc-assistant-member-001',
|
|
118
|
-
name: 'Assistant',
|
|
119
|
-
sessionName: 'crewly-orc-assistant',
|
|
120
|
-
role: 'orchestrator',
|
|
121
|
-
systemPrompt: 'Shadow orchestrator running in-process via Crewly Agent runtime (AI SDK)',
|
|
122
|
-
agentStatus: assistantStatus,
|
|
123
|
-
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
124
|
-
runtimeType: 'crewly-agent',
|
|
125
|
-
createdAt: '2026-03-11T02:00:00.000Z',
|
|
126
|
-
updatedAt: now
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: 'e5f6a7b8-9012-3cde-f456-auditor00001',
|
|
130
|
-
name: 'Auditor',
|
|
131
|
-
sessionName: 'crewly-auditor',
|
|
132
|
-
role: 'auditor',
|
|
133
|
-
systemPrompt: 'Autonomous quality observer — monitors all agents, detects problems, writes audit reports',
|
|
134
|
-
agentStatus: auditorStatus,
|
|
135
|
-
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
136
|
-
runtimeType: 'claude-code',
|
|
137
|
-
createdAt: '2026-03-11T02:10:00.000Z',
|
|
138
|
-
updatedAt: now
|
|
139
|
-
}
|
|
140
|
-
],
|
|
158
|
+
members,
|
|
141
159
|
projectIds: [],
|
|
142
160
|
createdAt: orchestratorStatus?.createdAt || now,
|
|
143
161
|
updatedAt: orchestratorStatus?.updatedAt || now,
|
|
@@ -678,7 +696,8 @@ export async function getTeams(req, res) {
|
|
|
678
696
|
const actualOrchestratorStatus = resolveAgentStatus(orchestratorStatus?.agentStatus, orchestratorSessionExists);
|
|
679
697
|
// Check in-process runtime status for virtual team members (Assistant, Auditor)
|
|
680
698
|
const inProcessRuntimeStatus = getInProcessRuntimeStatusMap(this.agentRegistrationService);
|
|
681
|
-
const
|
|
699
|
+
const auditorEnabled = await isAuditorEnabled();
|
|
700
|
+
const orchestratorTeam = buildOrchestratorTeam(actualOrchestratorStatus, orchestratorStatus, undefined, inProcessRuntimeStatus, { auditorEnabled });
|
|
682
701
|
// Load working status data from ActivityMonitorService
|
|
683
702
|
let workingStatusData;
|
|
684
703
|
try {
|
|
@@ -732,7 +751,8 @@ export async function getTeam(req, res) {
|
|
|
732
751
|
const orchestratorSessionExists = backend?.sessionExists(CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME) || false;
|
|
733
752
|
const actualOrchestratorStatus = resolveAgentStatus(orchestratorStatus?.agentStatus, orchestratorSessionExists);
|
|
734
753
|
const inProcessStatus = getInProcessRuntimeStatusMap(this.agentRegistrationService);
|
|
735
|
-
const
|
|
754
|
+
const auditorEnabled = await isAuditorEnabled();
|
|
755
|
+
const orchestratorTeam = buildOrchestratorTeam(actualOrchestratorStatus, orchestratorStatus, undefined, inProcessStatus, { auditorEnabled });
|
|
736
756
|
res.json({ success: true, data: withLastActivity(orchestratorTeam) });
|
|
737
757
|
return;
|
|
738
758
|
}
|