zigrix 0.1.0-alpha.9 → 0.1.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.
Files changed (82) hide show
  1. package/README.md +85 -182
  2. package/dist/agents/registry.js +14 -0
  3. package/dist/config/defaults.d.ts +87 -6
  4. package/dist/config/defaults.js +82 -51
  5. package/dist/config/load.d.ts +5 -3
  6. package/dist/config/load.js +69 -30
  7. package/dist/config/schema.d.ts +21 -1
  8. package/dist/config/schema.js +15 -1
  9. package/dist/configure.d.ts +1 -0
  10. package/dist/configure.js +24 -14
  11. package/dist/dashboard/.next/BUILD_ID +1 -1
  12. package/dist/dashboard/.next/app-build-manifest.json +21 -21
  13. package/dist/dashboard/.next/app-path-routes-manifest.json +7 -7
  14. package/dist/dashboard/.next/build-manifest.json +2 -2
  15. package/dist/dashboard/.next/prerender-manifest.json +10 -10
  16. package/dist/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/dist/dashboard/.next/server/app/_not-found.html +1 -1
  18. package/dist/dashboard/.next/server/app/_not-found.rsc +1 -1
  19. package/dist/dashboard/.next/server/app/api/auth/login/route.js +1 -1
  20. package/dist/dashboard/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  21. package/dist/dashboard/.next/server/app/api/auth/logout/route.js +1 -1
  22. package/dist/dashboard/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  23. package/dist/dashboard/.next/server/app/api/auth/session/route.js +1 -1
  24. package/dist/dashboard/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  25. package/dist/dashboard/.next/server/app/api/auth/setup/route.js +1 -1
  26. package/dist/dashboard/.next/server/app/api/auth/setup/route_client-reference-manifest.js +1 -1
  27. package/dist/dashboard/.next/server/app/api/overview/route_client-reference-manifest.js +1 -1
  28. package/dist/dashboard/.next/server/app/api/stream/route_client-reference-manifest.js +1 -1
  29. package/dist/dashboard/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  30. package/dist/dashboard/.next/server/app/api/tasks/[taskId]/conversation/route_client-reference-manifest.js +1 -1
  31. package/dist/dashboard/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  32. package/dist/dashboard/.next/server/app/login/page_client-reference-manifest.js +1 -1
  33. package/dist/dashboard/.next/server/app/login.html +1 -1
  34. package/dist/dashboard/.next/server/app/login.rsc +1 -1
  35. package/dist/dashboard/.next/server/app/page.js +2 -2
  36. package/dist/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  37. package/dist/dashboard/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  38. package/dist/dashboard/.next/server/app/setup.html +1 -1
  39. package/dist/dashboard/.next/server/app/setup.rsc +1 -1
  40. package/dist/dashboard/.next/server/app-paths-manifest.json +7 -7
  41. package/dist/dashboard/.next/server/chunks/972.js +1 -1
  42. package/dist/dashboard/.next/server/functions-config-manifest.json +4 -4
  43. package/dist/dashboard/.next/server/middleware.js +1 -1
  44. package/dist/dashboard/.next/server/pages/404.html +1 -1
  45. package/dist/dashboard/.next/server/pages/500.html +1 -1
  46. package/dist/dashboard/.next/static/chunks/app/page-0314989c31e18b4b.js +1 -0
  47. package/dist/dashboard/.next/static/css/{94d75aff24d0c077.css → c3a7306cb2ba3f6c.css} +1 -1
  48. package/dist/dashboard.js +47 -0
  49. package/dist/doctor.js +28 -5
  50. package/dist/index.js +170 -170
  51. package/dist/onboard.d.ts +60 -0
  52. package/dist/onboard.js +403 -18
  53. package/dist/orchestration/dispatch.d.ts +1 -0
  54. package/dist/orchestration/dispatch.js +17 -5
  55. package/dist/orchestration/evidence.js +18 -5
  56. package/dist/orchestration/finalize.d.ts +1 -0
  57. package/dist/orchestration/finalize.js +5 -3
  58. package/dist/orchestration/report.js +4 -1
  59. package/dist/orchestration/worker.d.ts +1 -1
  60. package/dist/orchestration/worker.js +53 -18
  61. package/dist/state/tasks.d.ts +5 -0
  62. package/dist/state/tasks.js +7 -0
  63. package/package.json +23 -2
  64. package/rules/defaults/README.md +9 -9
  65. package/rules/defaults/{back-zig.md → backend-agent.md} +4 -4
  66. package/rules/defaults/{front-zig.md → frontend-agent.md} +4 -4
  67. package/rules/defaults/orchestrator-agent.md +261 -0
  68. package/rules/defaults/{qa-zig.md → qa-agent.md} +11 -11
  69. package/rules/defaults/{sec-zig.md → security-agent.md} +4 -4
  70. package/rules/defaults/{sys-zig.md → system-agent.md} +8 -9
  71. package/rules/defaults/worker-common.md +25 -19
  72. package/skills/zigrix-doctor/SKILL.md +4 -2
  73. package/skills/zigrix-evidence/SKILL.md +7 -3
  74. package/skills/zigrix-main-agent-guide/SKILL.md +38 -28
  75. package/skills/zigrix-shared/SKILL.md +27 -3
  76. package/skills/zigrix-task-create/SKILL.md +8 -2
  77. package/skills/zigrix-task-status/SKILL.md +5 -2
  78. package/skills/zigrix-worker/SKILL.md +12 -4
  79. package/dist/dashboard/.next/static/chunks/app/page-25f54e54e74fb3af.js +0 -1
  80. package/rules/defaults/pro-zig.md +0 -238
  81. /package/dist/dashboard/.next/static/{TlUj0t8APzTccK13DVZZW → PT4hYxzrqxj-Zq4ZjtKNg}/_buildManifest.js +0 -0
  82. /package/dist/dashboard/.next/static/{TlUj0t8APzTccK13DVZZW → PT4hYxzrqxj-Zq4ZjtKNg}/_ssgManifest.js +0 -0
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { ROLE_HINTS } from '../agents/roles.js';
4
+ import { resolveAbsolutePath } from '../config/defaults.js';
4
5
  import { appendEvent } from '../state/events.js';
5
6
  import { createTask, rebuildIndex, saveTask } from '../state/tasks.js';
6
7
  import { ensureBaseState } from '../state/paths.js';
@@ -101,6 +102,17 @@ function resolveAgentSelection(config, scale) {
101
102
  qaAgentId,
102
103
  };
103
104
  }
105
+ export function resolveConfiguredProjectDir(config, explicitProjectDir) {
106
+ const explicit = explicitProjectDir?.trim();
107
+ if (explicit) {
108
+ return resolveAbsolutePath(explicit);
109
+ }
110
+ const configured = config.workspace.projectsBaseDir?.trim();
111
+ if (configured && configured.length > 0) {
112
+ return resolveAbsolutePath(configured);
113
+ }
114
+ return undefined;
115
+ }
104
116
  function defaultWorkPackages(scale) {
105
117
  return [
106
118
  { id: 'WP1', key: 'planning', title: 'planning', parallel: false },
@@ -169,12 +181,13 @@ zigrix task finalize ${task.taskId} --json
169
181
  export function dispatchTask(paths, config, params) {
170
182
  ensureBaseState(paths);
171
183
  const selection = resolveAgentSelection(config, params.scale);
184
+ const projectDir = resolveConfiguredProjectDir(config, params.projectDir);
172
185
  const task = createTask(paths, {
173
186
  title: params.title,
174
187
  description: params.description,
175
188
  scale: params.scale,
176
189
  requiredAgents: [...selection.requiredAgents],
177
- projectDir: params.projectDir,
190
+ projectDir,
178
191
  requestedBy: params.requestedBy,
179
192
  });
180
193
  task.selectedAgents = [...selection.requiredAgents];
@@ -203,7 +216,7 @@ export function dispatchTask(paths, config, params) {
203
216
  `- **Candidate Agents:** ${selection.candidateAgents.length > 0 ? selection.candidateAgents.join(', ') : '(none)'}`,
204
217
  `- **Required Roles:** ${selection.requiredRoles.join(', ')}`,
205
218
  `- **Optional Roles:** ${selection.optionalRoles.length > 0 ? selection.optionalRoles.join(', ') : '(none)'}`,
206
- params.projectDir ? `- **Project Dir:** ${params.projectDir}` : '',
219
+ projectDir ? `- **Project Dir:** ${projectDir}` : '',
207
220
  '',
208
221
  '### 요청 내용',
209
222
  params.description,
@@ -236,7 +249,7 @@ export function dispatchTask(paths, config, params) {
236
249
  requiredRoles: selection.requiredRoles,
237
250
  optionalRoles: selection.optionalRoles,
238
251
  roleAgentMap: selection.roleAgentMap,
239
- projectDir: params.projectDir ?? null,
252
+ projectDir: projectDir ?? null,
240
253
  },
241
254
  });
242
255
  rebuildIndex(paths);
@@ -256,7 +269,6 @@ export function dispatchTask(paths, config, params) {
256
269
  metaPath: path.join(paths.tasksDir, `${task.taskId}.meta.json`),
257
270
  promptPath,
258
271
  orchestratorPrompt,
259
- proZigPrompt: orchestratorPrompt,
260
- projectDir: params.projectDir ?? null,
272
+ projectDir: projectDir ?? null,
261
273
  };
262
274
  }
@@ -34,16 +34,28 @@ function extractEvidence(rows) {
34
34
  }
35
35
  function resolveQaAgentId(task) {
36
36
  if (typeof task.qaAgentId === 'string' && task.qaAgentId.trim().length > 0) {
37
- return task.qaAgentId;
37
+ return task.qaAgentId.trim();
38
38
  }
39
39
  const roleMap = task.roleAgentMap;
40
40
  if (roleMap && typeof roleMap === 'object') {
41
41
  const qaAgents = roleMap.qa;
42
42
  if (Array.isArray(qaAgents) && qaAgents.length > 0) {
43
- return String(qaAgents[0]);
43
+ const fromRoleMap = String(qaAgents[0]).trim();
44
+ if (fromRoleMap.length > 0)
45
+ return fromRoleMap;
44
46
  }
45
47
  }
46
- return 'qa-zig';
48
+ const required = Array.isArray(task.requiredAgents) ? task.requiredAgents : [];
49
+ if (required.length === 1) {
50
+ const only = String(required[0]).trim();
51
+ if (only.length > 0)
52
+ return only;
53
+ }
54
+ const orchestratorId = typeof task.orchestratorId === 'string' && task.orchestratorId.trim().length > 0
55
+ ? task.orchestratorId.trim()
56
+ : null;
57
+ const fallback = required.find((agentId) => String(agentId).trim().length > 0 && String(agentId).trim() !== orchestratorId);
58
+ return fallback ? String(fallback).trim() : null;
47
59
  }
48
60
  export function collectEvidence(paths, params) {
49
61
  ensureBaseState(paths);
@@ -97,8 +109,9 @@ export function mergeEvidence(paths, params) {
97
109
  const requiredAgents = [...(params.requiredAgents?.length ? params.requiredAgents : resolveRequiredAgents(task))];
98
110
  const missingAgents = requiredAgents.filter((agentId) => !presentAgents.includes(agentId));
99
111
  const qaAgentId = resolveQaAgentId(task);
100
- const qaPresent = presentAgents.includes(qaAgentId);
101
- const complete = missingAgents.length === 0 && (!(params.requireQa ?? false) || qaPresent);
112
+ const qaPresent = qaAgentId ? presentAgents.includes(qaAgentId) : false;
113
+ const qaRequiredSatisfied = !(params.requireQa ?? false) || (qaAgentId !== null && qaPresent);
114
+ const complete = missingAgents.length === 0 && qaRequiredSatisfied;
102
115
  const merged = { ts: nowIso(), taskId: params.taskId, requiredAgents, presentAgents, missingAgents, qaAgentId, qaPresent, complete, items };
103
116
  const outPath = path.join(taskDir, '_merged.json');
104
117
  fs.writeFileSync(outPath, `${JSON.stringify(merged, null, 2)}\n`, 'utf8');
@@ -1,6 +1,7 @@
1
1
  import { type ZigrixPaths } from '../state/paths.js';
2
2
  export declare function finalizeTask(paths: ZigrixPaths, params: {
3
3
  taskId: string;
4
+ /** Auto-transition to REPORTED when complete. Defaults to true. */
4
5
  autoReport?: boolean;
5
6
  secIssues?: boolean;
6
7
  qaIssues?: boolean;
@@ -15,8 +15,10 @@ function autoCloseCompletedUnits(task) {
15
15
  if (s.status === 'done')
16
16
  doneAgents.add(agentId);
17
17
  }
18
- // orchestrator is always "done" at finalize time
19
- doneAgents.add(task.orchestratorId ?? 'pro-zig');
18
+ // orchestrator is always "done" at finalize time when identifiable
19
+ if (typeof task.orchestratorId === 'string' && task.orchestratorId.trim().length > 0) {
20
+ doneAgents.add(task.orchestratorId.trim());
21
+ }
20
22
  let changed = false;
21
23
  for (const unit of units) {
22
24
  if (['OPEN', 'IN_PROGRESS'].includes(unit.status.toUpperCase()) && doneAgents.has(unit.owner)) {
@@ -130,7 +132,7 @@ export function finalizeTask(paths, params) {
130
132
  steps,
131
133
  };
132
134
  if (complete) {
133
- result.nextAction = 'sessions_send(sessionKey: "agent:main:main", message: "<taskId> 완료: <요약>")';
135
+ result.nextAction = 'send final task report to the requesting channel/thread';
134
136
  }
135
137
  return result;
136
138
  }
@@ -46,7 +46,10 @@ function qaLine(merged) {
46
46
  const present = new Set(Array.isArray(merged.presentAgents) ? merged.presentAgents.map(String) : []);
47
47
  const qaAgentId = typeof merged.qaAgentId === 'string' && merged.qaAgentId.trim().length > 0
48
48
  ? merged.qaAgentId
49
- : 'qa-zig';
49
+ : null;
50
+ if (!qaAgentId) {
51
+ return '- QA 역할 에이전트가 식별되지 않음 (config.agents.registry role=qa 확인 필요)';
52
+ }
50
53
  return present.has(qaAgentId)
51
54
  ? `- ${qaAgentId} evidence 존재, QA 수행됨`
52
55
  : `- ${qaAgentId} evidence 없음 또는 별도 QA 미실행`;
@@ -1,6 +1,6 @@
1
1
  import { type ZigrixPaths } from '../state/paths.js';
2
2
  import { type ZigrixTask } from '../state/tasks.js';
3
- export declare const DEFAULT_REQUIRED_AGENTS: readonly ["orchestrator", "qa"];
3
+ export declare const DEFAULT_REQUIRED_ROLES: readonly ["orchestrator", "qa"];
4
4
  export declare function resolveRequiredAgents(task: Partial<ZigrixTask> & Record<string, unknown>): string[];
5
5
  export declare function prepareWorker(paths: ZigrixPaths, params: {
6
6
  taskId: string;
@@ -2,22 +2,37 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { appendEvent } from '../state/events.js';
4
4
  import { ensureBaseState } from '../state/paths.js';
5
- import { loadTask, saveTask } from '../state/tasks.js';
6
- export const DEFAULT_REQUIRED_AGENTS = ['orchestrator', 'qa'];
7
- const DEFAULT_ORCHESTRATOR_ID = 'pro-zig';
8
- const DEFAULT_QA_AGENT_ID = 'qa-zig';
5
+ import { loadTask, resolveTaskPaths, saveTask } from '../state/tasks.js';
6
+ export const DEFAULT_REQUIRED_ROLES = ['orchestrator', 'qa'];
7
+ function firstNonEmpty(...values) {
8
+ for (const value of values) {
9
+ if (typeof value === 'string' && value.trim().length > 0) {
10
+ return value.trim();
11
+ }
12
+ }
13
+ return null;
14
+ }
15
+ function roleFallback(task, role) {
16
+ const roleMap = task.roleAgentMap;
17
+ if (roleMap && typeof roleMap === 'object') {
18
+ const mapped = roleMap[role];
19
+ if (Array.isArray(mapped) && mapped.length > 0) {
20
+ const first = firstNonEmpty(mapped[0]);
21
+ if (first)
22
+ return first;
23
+ }
24
+ }
25
+ return null;
26
+ }
9
27
  function resolveDefaultRequiredAgents(task) {
10
- const orchestratorId = typeof task.orchestratorId === 'string' && task.orchestratorId.trim().length > 0
11
- ? task.orchestratorId
12
- : DEFAULT_ORCHESTRATOR_ID;
13
- const qaAgentId = typeof task.qaAgentId === 'string' && task.qaAgentId.trim().length > 0
14
- ? task.qaAgentId
15
- : DEFAULT_QA_AGENT_ID;
16
28
  const resolvedByRole = {
17
- orchestrator: orchestratorId,
18
- qa: qaAgentId,
29
+ orchestrator: firstNonEmpty(task.orchestratorId) ?? roleFallback(task, 'orchestrator'),
30
+ qa: firstNonEmpty(task.qaAgentId) ?? roleFallback(task, 'qa'),
19
31
  };
20
- return [...new Set(DEFAULT_REQUIRED_AGENTS.map((role) => resolvedByRole[role]))];
32
+ const resolved = DEFAULT_REQUIRED_ROLES
33
+ .map((role) => resolvedByRole[role])
34
+ .filter((item) => Boolean(item && item.length > 0));
35
+ return [...new Set(resolved)];
21
36
  }
22
37
  export function resolveRequiredAgents(task) {
23
38
  for (const key of ['requiredAgents', 'selectedAgents', 'baselineRequiredAgents']) {
@@ -54,7 +69,7 @@ function renderPrompt(params) {
54
69
  if (params.unitId || params.workPackage) {
55
70
  sections.push('', '### Execution Context', `- unitId: ${params.unitId ?? 'N/A'}`, `- workPackage: ${params.workPackage ?? 'N/A'}`);
56
71
  }
57
- sections.push('', '### Completion', '작업 완료 후 결과와 근거를 명확히 보고하라.');
72
+ sections.push('', '### Completion', '작업 완료 후 다음 순서를 반드시 따르라:', '', '1. **증적(evidence) 수집** — 작업 결과 증적을 먼저 기록한다:', ' ```bash', ` zigrix evidence collect --task-id ${params.task.taskId} --agent-id ${params.agentId} --summary "<작업 결과 요약>"`, ' ```', '2. **결과 보고** — 증적 수집 완료 후 결과와 근거를 명확히 보고하라.', '', '⚠️ 증적 없이 완료하면 finalize에서 incomplete 판정된다.');
58
73
  return sections.join('\n');
59
74
  }
60
75
  export function prepareWorker(paths, params) {
@@ -88,18 +103,38 @@ export function prepareWorker(paths, params) {
88
103
  workPackage: params.workPackage,
89
104
  payload: { agentId: params.agentId, description: params.description, constraints: params.constraints ?? '', dod: params.dod ?? '', promptPath },
90
105
  });
91
- return { ok: true, taskId: params.taskId, agentId: params.agentId, promptPath, prompt, unitId: params.unitId, workPackage: params.workPackage };
106
+ return {
107
+ ok: true,
108
+ taskId: params.taskId,
109
+ agentId: params.agentId,
110
+ promptPath,
111
+ prompt,
112
+ unitId: params.unitId,
113
+ workPackage: params.workPackage,
114
+ projectDir: projectDir ?? null,
115
+ ...resolveTaskPaths(paths, params.taskId),
116
+ };
117
+ }
118
+ /**
119
+ * Extract sessionId from a sessionKey of the form `agent:<agentId>:subagent:<sessionId>`.
120
+ * Returns null if the sessionKey does not match the expected pattern.
121
+ */
122
+ function parseSessionIdFromKey(sessionKey) {
123
+ const matched = sessionKey.match(/^agent:[^:]+:subagent:([^:\s]+)$/);
124
+ return matched?.[1] ?? null;
92
125
  }
93
126
  export function registerWorker(paths, params) {
94
127
  const task = loadTask(paths, params.taskId);
95
128
  if (!task)
96
129
  return null;
130
+ // Resolve sessionId: use provided value, or fall back to parsing it from sessionKey
131
+ const resolvedSessionId = params.sessionId || parseSessionIdFromKey(params.sessionKey) || null;
97
132
  task.workerSessions[params.agentId] = {
98
133
  ...(task.workerSessions[params.agentId] ?? {}),
99
134
  status: 'dispatched',
100
135
  sessionKey: params.sessionKey,
101
136
  runId: params.runId ?? '',
102
- sessionId: params.sessionId ?? null,
137
+ sessionId: resolvedSessionId,
103
138
  unitId: params.unitId,
104
139
  workPackage: params.workPackage,
105
140
  reason: params.reason ?? '',
@@ -111,10 +146,10 @@ export function registerWorker(paths, params) {
111
146
  saveTask(paths, task);
112
147
  appendEvent(paths.eventsFile, {
113
148
  event: 'worker_dispatched', taskId: params.taskId, phase: 'execution', actor: 'zigrix', targetAgent: params.agentId, status: 'IN_PROGRESS',
114
- sessionKey: params.sessionKey, sessionId: params.sessionId ?? null, unitId: params.unitId, workPackage: params.workPackage,
149
+ sessionKey: params.sessionKey, sessionId: resolvedSessionId, unitId: params.unitId, workPackage: params.workPackage,
115
150
  payload: { agentId: params.agentId, runId: params.runId ?? '', reason: params.reason ?? '' },
116
151
  });
117
- return { ok: true, taskId: params.taskId, agentId: params.agentId, sessionKey: params.sessionKey, runId: params.runId ?? '', sessionId: params.sessionId ?? null, unitId: params.unitId, workPackage: params.workPackage, status: 'dispatched' };
152
+ return { ok: true, taskId: params.taskId, agentId: params.agentId, sessionKey: params.sessionKey, runId: params.runId ?? '', sessionId: resolvedSessionId, unitId: params.unitId, workPackage: params.workPackage, status: 'dispatched' };
118
153
  }
119
154
  export function completeWorker(paths, params) {
120
155
  const task = loadTask(paths, params.taskId);
@@ -41,6 +41,11 @@ export type ZigrixTask = {
41
41
  orchestratorSessionKey?: string;
42
42
  orchestratorSessionId?: string;
43
43
  };
44
+ export declare function resolveTaskPaths(paths: ZigrixPaths, taskId: string): {
45
+ specPath: string;
46
+ metaPath: string;
47
+ legacyPath: string;
48
+ };
44
49
  export declare function nextTaskId(paths: ZigrixPaths, prefix?: string): string;
45
50
  export declare function saveTask(paths: ZigrixPaths, task: ZigrixTask): ZigrixTask;
46
51
  export declare function loadTask(paths: ZigrixPaths, taskId: string): ZigrixTask | null;
@@ -14,6 +14,13 @@ function specPath(paths, taskId) {
14
14
  function legacyPath(paths, taskId) {
15
15
  return path.join(paths.tasksDir, `${taskId}.json`);
16
16
  }
17
+ export function resolveTaskPaths(paths, taskId) {
18
+ return {
19
+ specPath: specPath(paths, taskId),
20
+ metaPath: metaPath(paths, taskId),
21
+ legacyPath: legacyPath(paths, taskId),
22
+ };
23
+ }
17
24
  // ─── Read helpers ───────────────────────────────────────────────────────────
18
25
  function readJson(filePath) {
19
26
  try {
package/package.json CHANGED
@@ -1,9 +1,29 @@
1
1
  {
2
2
  "name": "zigrix",
3
- "version": "0.1.0-alpha.9",
3
+ "version": "0.1.0",
4
4
  "type": "module",
5
5
  "description": "Multi-project parallel task orchestration CLI for agent-assisted development",
6
6
  "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/owen-ever/zigrix.git"
10
+ },
11
+ "homepage": "https://github.com/owen-ever/zigrix",
12
+ "bugs": {
13
+ "url": "https://github.com/owen-ever/zigrix/issues"
14
+ },
15
+ "author": "Chanho Jeon",
16
+ "keywords": [
17
+ "zigrix",
18
+ "cli",
19
+ "openclaw",
20
+ "multi-agent",
21
+ "agent-orchestration",
22
+ "task-orchestration",
23
+ "agent-matrix",
24
+ "task-matrix",
25
+ "workflow"
26
+ ],
7
27
  "bin": {
8
28
  "zigrix": "./dist/index.js"
9
29
  },
@@ -23,7 +43,8 @@
23
43
  "prebuild": "npm run clean",
24
44
  "prepack": "npm run build && npm run build:dashboard",
25
45
  "publish:check": "npm run build && npm run build:dashboard && npm run test && npm run smoke && bash scripts/release-smoke.sh && npm pack --dry-run",
26
- "smoke": "node dist/index.js --version && node dist/index.js config validate --json",
46
+ "release": "tsx scripts/release.ts",
47
+ "smoke": "node dist/index.js --version",
27
48
  "pretest": "npm run build",
28
49
  "test": "vitest run",
29
50
  "typecheck": "tsc -p tsconfig.json --noEmit"
@@ -1,27 +1,27 @@
1
1
  # 6-Agent Orchestration Rule Templates
2
2
 
3
- 이 폴더는 `pro-zig` 오케스트레이션 운영을 위한 **규칙 템플릿** 모음이다.
3
+ 이 폴더는 `orchestrator-agent` 오케스트레이션 운영을 위한 **규칙 템플릿** 모음이다.
4
4
 
5
5
  ## 파일 구성
6
- - `pro-zig.md` — 오케스트레이터 규칙 템플릿
6
+ - `orchestrator-agent.md` — 오케스트레이터 규칙 템플릿
7
7
  - `worker-common.md` — 모든 워커 공통 규칙
8
- - `front-zig.md` — 프론트엔드 워커 규칙
9
- - `back-zig.md` — 백엔드 워커 규칙
10
- - `sys-zig.md` — 시스템 설계 워커 규칙
11
- - `sec-zig.md` — 보안 워커 규칙
12
- - `qa-zig.md` — QA 워커 규칙
8
+ - `frontend-agent.md` — 프론트엔드 워커 규칙
9
+ - `backend-agent.md` — 백엔드 워커 규칙
10
+ - `system-agent.md` — 시스템 설계 워커 규칙
11
+ - `security-agent.md` — 보안 워커 규칙
12
+ - `qa-agent.md` — QA 워커 규칙
13
13
 
14
14
  ## 공통 운영 고정값
15
15
  - Scale: `simple | normal | risky | large`
16
16
  - QA: **모든 Scale 필수 포함**
17
17
  - Session visibility: `all` (운영 규칙으로 통제)
18
18
  - Thread mapping: `taskId` 기준 유연 매핑 (`primaryThreadId`, `relatedThreadIds[]`)
19
- - 명세문서 경로: `orchestration/tasks/<taskId>.md`
19
+ - 명세문서 절대경로: `zigrix task status <taskId> --json`의 `specPath`
20
20
  - `normal|risky|large`: 명세문서 **미작성 시 진행 금지**
21
21
  - `simple`: 요약형 spec 허용(동일 경로 파일)
22
22
 
23
23
  ## 적용 순서
24
- 1. `pro-zig.md`를 기준으로 작업 분류 + 작업 분배 수행
24
+ 1. `orchestrator-agent.md`를 기준으로 작업 분류 + 작업 분배 수행
25
25
  2. 각 워커는 `worker-common.md` + 자기 역할 파일을 함께 준수
26
26
  3. 결과는 반드시 `taskId`/`sessionKey`/`runId` 증적을 포함
27
27
  4. QA 게이트 통과 전 완료 보고 금지
@@ -1,10 +1,10 @@
1
- # back-zig Rules
1
+ # backend-agent Rules
2
2
 
3
- > 공통 규칙: `orchestration/rules/worker-common.md` 참조
3
+ > 공통 규칙: `worker-common.md` 참조
4
4
 
5
5
  ## Role
6
6
  - API, 비즈니스 로직, 데이터 처리, 서버 측 성능/안정성
7
- - pro-zig 지시(taskId 기반)만 수행
7
+ - orchestrator-agent 지시(taskId 기반)만 수행
8
8
 
9
9
  ## In Scope
10
10
  - 엔드포인트/서비스 로직 구현
@@ -13,7 +13,7 @@
13
13
 
14
14
  ## Out of Scope
15
15
  - UI 결정
16
- - 보안 정책 최종 승인 (sec-zig 관할)
16
+ - 보안 정책 최종 승인 (security-agent 관할)
17
17
 
18
18
  ## Required Deliverables
19
19
  - API 변경점 (요청/응답/에러코드)
@@ -1,10 +1,10 @@
1
- # front-zig Rules
1
+ # frontend-agent Rules
2
2
 
3
- > 공통 규칙: `orchestration/rules/worker-common.md` 참조
3
+ > 공통 규칙: `worker-common.md` 참조
4
4
 
5
5
  ## Role
6
6
  - UI/UX, 프론트엔드 구현, 상태관리, API 연동(클라이언트 측)
7
- - pro-zig 지시(taskId 기반)만 수행
7
+ - orchestrator-agent 지시(taskId 기반)만 수행
8
8
 
9
9
  ## In Scope
10
10
  - 컴포넌트/페이지 구현
@@ -13,7 +13,7 @@
13
13
 
14
14
  ## Out of Scope
15
15
  - 서버 인프라/DB 스키마 변경 단독 확정
16
- - 보안 정책 최종 승인 (sec-zig 관할)
16
+ - 보안 정책 최종 승인 (security-agent 관할)
17
17
 
18
18
  ## Required Deliverables
19
19
  - 변경 파일 목록