baxian 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +19 -1
- package/dist/agent/bootstrap-poller.d.ts +34 -0
- package/dist/agent/bootstrap-poller.d.ts.map +1 -0
- package/dist/agent/bootstrap-poller.js +93 -0
- package/dist/agent/bootstrap-poller.js.map +1 -0
- package/dist/agent/bootstrap.d.ts +39 -0
- package/dist/agent/bootstrap.d.ts.map +1 -0
- package/dist/agent/bootstrap.js +214 -0
- package/dist/agent/bootstrap.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/manager.d.ts +280 -0
- package/dist/agent/manager.d.ts.map +1 -0
- package/dist/agent/manager.js +3666 -0
- package/dist/agent/manager.js.map +1 -0
- package/dist/agent/marker-protocol.d.ts +12 -0
- package/dist/agent/marker-protocol.d.ts.map +1 -0
- package/dist/agent/marker-protocol.js +52 -0
- package/dist/agent/marker-protocol.js.map +1 -0
- package/dist/agent/pane-streamer-manager.d.ts +24 -0
- package/dist/agent/pane-streamer-manager.d.ts.map +1 -0
- package/dist/agent/pane-streamer-manager.js +107 -0
- package/dist/agent/pane-streamer-manager.js.map +1 -0
- package/dist/agent/pane-streamer.d.ts +97 -0
- package/dist/agent/pane-streamer.d.ts.map +1 -0
- package/dist/agent/pane-streamer.js +382 -0
- package/dist/agent/pane-streamer.js.map +1 -0
- package/dist/agent/post-approve-marker-watcher.d.ts +29 -0
- package/dist/agent/post-approve-marker-watcher.d.ts.map +1 -0
- package/dist/agent/post-approve-marker-watcher.js +160 -0
- package/dist/agent/post-approve-marker-watcher.js.map +1 -0
- package/dist/agent/preflight.d.ts +9 -0
- package/dist/agent/preflight.d.ts.map +1 -0
- package/dist/agent/preflight.js +164 -0
- package/dist/agent/preflight.js.map +1 -0
- package/dist/agent/prompt.d.ts +44 -0
- package/dist/agent/prompt.d.ts.map +1 -0
- package/dist/agent/prompt.js +252 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/repo-store.d.ts +27 -0
- package/dist/agent/repo-store.d.ts.map +1 -0
- package/dist/agent/repo-store.js +152 -0
- package/dist/agent/repo-store.js.map +1 -0
- package/dist/agent/runner.d.ts +46 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +241 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/spec-review-marker-watcher.d.ts +33 -0
- package/dist/agent/spec-review-marker-watcher.d.ts.map +1 -0
- package/dist/agent/spec-review-marker-watcher.js +180 -0
- package/dist/agent/spec-review-marker-watcher.js.map +1 -0
- package/dist/agent/tmux-probe-poller.d.ts +78 -0
- package/dist/agent/tmux-probe-poller.d.ts.map +1 -0
- package/dist/agent/tmux-probe-poller.js +418 -0
- package/dist/agent/tmux-probe-poller.js.map +1 -0
- package/dist/agent/tmux.d.ts +78 -0
- package/dist/agent/tmux.d.ts.map +1 -0
- package/dist/agent/tmux.js +395 -0
- package/dist/agent/tmux.js.map +1 -0
- package/dist/agent/worktree.d.ts +10 -0
- package/dist/agent/worktree.d.ts.map +1 -0
- package/dist/agent/worktree.js +41 -0
- package/dist/agent/worktree.js.map +1 -0
- package/dist/api/agents.d.ts +3 -0
- package/dist/api/agents.d.ts.map +1 -0
- package/dist/api/agents.js +29 -0
- package/dist/api/agents.js.map +1 -0
- package/dist/api/config.d.ts +5 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +114 -0
- package/dist/api/config.js.map +1 -0
- package/dist/api/events.d.ts +3 -0
- package/dist/api/events.d.ts.map +1 -0
- package/dist/api/events.js +11 -0
- package/dist/api/events.js.map +1 -0
- package/dist/api/pollers.d.ts +3 -0
- package/dist/api/pollers.d.ts.map +1 -0
- package/dist/api/pollers.js +4 -0
- package/dist/api/pollers.js.map +1 -0
- package/dist/api/probe.d.ts +9 -0
- package/dist/api/probe.d.ts.map +1 -0
- package/dist/api/probe.js +87 -0
- package/dist/api/probe.js.map +1 -0
- package/dist/api/projects.d.ts +3 -0
- package/dist/api/projects.d.ts.map +1 -0
- package/dist/api/projects.js +602 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/restart.d.ts +3 -0
- package/dist/api/restart.d.ts.map +1 -0
- package/dist/api/restart.js +20 -0
- package/dist/api/restart.js.map +1 -0
- package/dist/api/tasks.d.ts +3 -0
- package/dist/api/tasks.d.ts.map +1 -0
- package/dist/api/tasks.js +136 -0
- package/dist/api/tasks.js.map +1 -0
- package/dist/app.d.ts +51 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +169 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +319 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/backup.d.ts +3 -0
- package/dist/config/backup.d.ts.map +1 -0
- package/dist/config/backup.js +44 -0
- package/dist/config/backup.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +42 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +197 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/mutex.d.ts +2 -0
- package/dist/config/mutex.d.ts.map +1 -0
- package/dist/config/mutex.js +7 -0
- package/dist/config/mutex.js.map +1 -0
- package/dist/config/normalizer.d.ts +2 -0
- package/dist/config/normalizer.d.ts.map +1 -0
- package/dist/config/normalizer.js +42 -0
- package/dist/config/normalizer.js.map +1 -0
- package/dist/config/validator.d.ts +7 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +278 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/event/broker.d.ts +11 -0
- package/dist/event/broker.d.ts.map +1 -0
- package/dist/event/broker.js +47 -0
- package/dist/event/broker.js.map +1 -0
- package/dist/event/bus.d.ts +12 -0
- package/dist/event/bus.d.ts.map +1 -0
- package/dist/event/bus.js +35 -0
- package/dist/event/bus.js.map +1 -0
- package/dist/event/handlers.d.ts +6 -0
- package/dist/event/handlers.d.ts.map +1 -0
- package/dist/event/handlers.js +1121 -0
- package/dist/event/handlers.js.map +1 -0
- package/dist/event/index.d.ts +4 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +4 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/log.d.ts +9 -0
- package/dist/event/log.d.ts.map +1 -0
- package/dist/event/log.js +43 -0
- package/dist/event/log.js.map +1 -0
- package/dist/event/publish.d.ts +37 -0
- package/dist/event/publish.d.ts.map +1 -0
- package/dist/event/publish.js +197 -0
- package/dist/event/publish.js.map +1 -0
- package/dist/event/ws.d.ts +3 -0
- package/dist/event/ws.d.ts.map +1 -0
- package/dist/event/ws.js +169 -0
- package/dist/event/ws.js.map +1 -0
- package/dist/github/index.d.ts +4 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +3 -0
- package/dist/github/index.js.map +1 -0
- package/dist/github/mapper.d.ts +51 -0
- package/dist/github/mapper.d.ts.map +1 -0
- package/dist/github/mapper.js +191 -0
- package/dist/github/mapper.js.map +1 -0
- package/dist/github/poller.d.ts +64 -0
- package/dist/github/poller.d.ts.map +1 -0
- package/dist/github/poller.js +513 -0
- package/dist/github/poller.js.map +1 -0
- package/dist/github/resolver.d.ts +8 -0
- package/dist/github/resolver.d.ts.map +1 -0
- package/dist/github/resolver.js +24 -0
- package/dist/github/resolver.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +310 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/restart-sentinel.d.ts +18 -0
- package/dist/lifecycle/restart-sentinel.d.ts.map +1 -0
- package/dist/lifecycle/restart-sentinel.js +61 -0
- package/dist/lifecycle/restart-sentinel.js.map +1 -0
- package/dist/lifecycle/restart.d.ts +21 -0
- package/dist/lifecycle/restart.d.ts.map +1 -0
- package/dist/lifecycle/restart.js +57 -0
- package/dist/lifecycle/restart.js.map +1 -0
- package/dist/shared/constants.d.ts +18 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +60 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +3 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/types.d.ts +263 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/skill/index.d.ts +2 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +2 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/skill/registry.d.ts +30 -0
- package/dist/skill/registry.d.ts.map +1 -0
- package/dist/skill/registry.js +174 -0
- package/dist/skill/registry.js.map +1 -0
- package/dist/skills/UPSTREAM.md +38 -0
- package/dist/skills/baxian-rules/SKILL.md +68 -0
- package/dist/skills/merge-sync/SKILL.md +42 -0
- package/dist/skills/pr-feedback/SKILL.md +117 -0
- package/dist/skills/pr-recheck/SKILL.md +52 -0
- package/dist/skills/pr-review/SKILL.md +60 -0
- package/dist/skills/spells/SKILL.md +41 -0
- package/dist/skills/task-check/SKILL.md +26 -0
- package/dist/state/agent-store.d.ts +21 -0
- package/dist/state/agent-store.d.ts.map +1 -0
- package/dist/state/agent-store.js +145 -0
- package/dist/state/agent-store.js.map +1 -0
- package/dist/state/error-record-store.d.ts +40 -0
- package/dist/state/error-record-store.d.ts.map +1 -0
- package/dist/state/error-record-store.js +203 -0
- package/dist/state/error-record-store.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +5 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/init.d.ts +2 -0
- package/dist/state/init.d.ts.map +1 -0
- package/dist/state/init.js +13 -0
- package/dist/state/init.js.map +1 -0
- package/dist/state/lock.d.ts +9 -0
- package/dist/state/lock.d.ts.map +1 -0
- package/dist/state/lock.js +36 -0
- package/dist/state/lock.js.map +1 -0
- package/dist/state/post-approve-store.d.ts +23 -0
- package/dist/state/post-approve-store.d.ts.map +1 -0
- package/dist/state/post-approve-store.js +79 -0
- package/dist/state/post-approve-store.js.map +1 -0
- package/dist/state/process-lock.d.ts +24 -0
- package/dist/state/process-lock.d.ts.map +1 -0
- package/dist/state/process-lock.js +175 -0
- package/dist/state/process-lock.js.map +1 -0
- package/dist/state/snapshot.d.ts +38 -0
- package/dist/state/snapshot.d.ts.map +1 -0
- package/dist/state/snapshot.js +134 -0
- package/dist/state/snapshot.js.map +1 -0
- package/dist/state/task-store.d.ts +25 -0
- package/dist/state/task-store.d.ts.map +1 -0
- package/dist/state/task-store.js +167 -0
- package/dist/state/task-store.js.map +1 -0
- package/dist/terminal/attach.d.ts +7 -0
- package/dist/terminal/attach.d.ts.map +1 -0
- package/dist/terminal/attach.js +26 -0
- package/dist/terminal/attach.js.map +1 -0
- package/dist/terminal/index.d.ts +3 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +3 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/key-sanitizer.d.ts +2 -0
- package/dist/terminal/key-sanitizer.d.ts.map +1 -0
- package/dist/terminal/key-sanitizer.js +9 -0
- package/dist/terminal/key-sanitizer.js.map +1 -0
- package/dist/terminal/stream-ws.d.ts +3 -0
- package/dist/terminal/stream-ws.d.ts.map +1 -0
- package/dist/terminal/stream-ws.js +426 -0
- package/dist/terminal/stream-ws.js.map +1 -0
- package/dist/terminal/ws-auth.d.ts +5 -0
- package/dist/terminal/ws-auth.d.ts.map +1 -0
- package/dist/terminal/ws-auth.js +45 -0
- package/dist/terminal/ws-auth.js.map +1 -0
- package/dist/timing/debounced-task.d.ts +9 -0
- package/dist/timing/debounced-task.d.ts.map +1 -0
- package/dist/timing/debounced-task.js +23 -0
- package/dist/timing/debounced-task.js.map +1 -0
- package/dist/timing/periodic-task-runner.d.ts +21 -0
- package/dist/timing/periodic-task-runner.d.ts.map +1 -0
- package/dist/timing/periodic-task-runner.js +61 -0
- package/dist/timing/periodic-task-runner.js.map +1 -0
- package/dist/web/assets/index-53CBbz4w.js +4 -0
- package/dist/web/assets/index-B9D6BV08.css +1 -0
- package/dist/web/assets/react-BG4Iuztk.js +40 -0
- package/dist/web/assets/router-B_Nv0oRz.js +12 -0
- package/dist/web/assets/xterm-CFbL2ovg.css +32 -0
- package/dist/web/assets/xterm-D5X2JljJ.js +9 -0
- package/dist/web/index.html +17 -0
- package/package.json +44 -5
- package/index.js +0 -1
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
export type AgentRuntime = 'claude-code' | 'codex';
|
|
2
|
+
export type AgentRole = 'dev' | 'qa';
|
|
3
|
+
export type AgentMode = 'local' | 'remote';
|
|
4
|
+
export type MergeStrategy = 'auto' | null;
|
|
5
|
+
export interface HostConfig {
|
|
6
|
+
hostname: string;
|
|
7
|
+
user?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AgentConfig {
|
|
10
|
+
id: string;
|
|
11
|
+
runtime: AgentRuntime;
|
|
12
|
+
role: AgentRole;
|
|
13
|
+
mode: AgentMode;
|
|
14
|
+
host?: HostConfig;
|
|
15
|
+
workdir?: string;
|
|
16
|
+
yolo?: boolean;
|
|
17
|
+
model?: string;
|
|
18
|
+
addDirs?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ProjectConfig {
|
|
21
|
+
id: string;
|
|
22
|
+
repo: string;
|
|
23
|
+
merge: MergeStrategy;
|
|
24
|
+
agent: AgentConfig[][];
|
|
25
|
+
}
|
|
26
|
+
export interface ReviewConfig {
|
|
27
|
+
/**
|
|
28
|
+
* Maximum review iterations for this task. Applies to BOTH the code-review
|
|
29
|
+
* loop (dev↔qa code rounds) AND the spec-review loop (dev↔qa spec rounds);
|
|
30
|
+
* same numeric cap. If the two ever need to diverge, split this field then.
|
|
31
|
+
*/
|
|
32
|
+
rounds: number;
|
|
33
|
+
}
|
|
34
|
+
export interface HttpsConfig {
|
|
35
|
+
/** Absolute path to PEM-encoded private key, readable by the server user. */
|
|
36
|
+
keyFile: string;
|
|
37
|
+
/** Absolute path to PEM-encoded full-chain certificate. */
|
|
38
|
+
certFile: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ServerConfig {
|
|
41
|
+
port: number;
|
|
42
|
+
token?: string;
|
|
43
|
+
host?: string;
|
|
44
|
+
/** When set, server listens with TLS instead of plain HTTP. */
|
|
45
|
+
https?: HttpsConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Allowed Host header values. Empty/undefined = accept any (dev default).
|
|
48
|
+
* Set in production to mitigate Host-header attacks.
|
|
49
|
+
*/
|
|
50
|
+
allowedHosts?: string[];
|
|
51
|
+
/** Per-repo poller cadence in ms. Default 30_000. */
|
|
52
|
+
githubPollIntervalMs?: number;
|
|
53
|
+
tmuxProbePollIntervalMs?: number;
|
|
54
|
+
tmuxProbeTimeoutMs?: number;
|
|
55
|
+
tmuxProbeConcurrency?: number;
|
|
56
|
+
bootstrapRetryIntervalMs?: number;
|
|
57
|
+
}
|
|
58
|
+
export interface BaxianConfig {
|
|
59
|
+
review: ReviewConfig;
|
|
60
|
+
server: ServerConfig;
|
|
61
|
+
project: ProjectConfig[];
|
|
62
|
+
}
|
|
63
|
+
export type AgentRuntimeStatus = 'unknown' | 'idle' | 'pending' | 'working' | 'waiting' | 'error';
|
|
64
|
+
export type TmuxSessionStatus = 'unknown' | 'present' | 'absent' | 'unreachable';
|
|
65
|
+
export type TaskStatus = 'pending' | 'in_progress' | 'review' | 'fixing' | 'approved' | 'merged' | 'max_rounds' | 'failed' | 'cancelled';
|
|
66
|
+
export type TaskPhase = 'spec' | 'code';
|
|
67
|
+
export type AgentLifecycleStatus = 'ok' | 'awaiting_human';
|
|
68
|
+
export interface AgentBindingFacts {
|
|
69
|
+
id: string;
|
|
70
|
+
projectId: string;
|
|
71
|
+
taskId?: string;
|
|
72
|
+
worktreePath?: string;
|
|
73
|
+
repoPath?: string;
|
|
74
|
+
startedAt?: string;
|
|
75
|
+
updatedAt: string;
|
|
76
|
+
paneId?: string;
|
|
77
|
+
creationToken?: string;
|
|
78
|
+
status?: AgentLifecycleStatus;
|
|
79
|
+
awaitingPhase?: string;
|
|
80
|
+
awaitingReason?: string;
|
|
81
|
+
awaitingSince?: string;
|
|
82
|
+
injectedSkills?: InjectedSkillsRecord;
|
|
83
|
+
}
|
|
84
|
+
export interface InjectedSkillsRecord {
|
|
85
|
+
taskId: string;
|
|
86
|
+
paneId: string;
|
|
87
|
+
skills: string[];
|
|
88
|
+
}
|
|
89
|
+
export interface AgentErrorSummary {
|
|
90
|
+
id: string;
|
|
91
|
+
reason: string;
|
|
92
|
+
message: string;
|
|
93
|
+
occurredAt: string;
|
|
94
|
+
recommendation?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface AgentSnapshot {
|
|
97
|
+
id: string;
|
|
98
|
+
projectId: string;
|
|
99
|
+
runtimeStatus: AgentRuntimeStatus;
|
|
100
|
+
tmuxSessionStatus: TmuxSessionStatus;
|
|
101
|
+
stale: boolean;
|
|
102
|
+
observedAt?: string;
|
|
103
|
+
binding?: AgentBindingFacts;
|
|
104
|
+
latestError?: AgentErrorSummary;
|
|
105
|
+
latestBootstrapError?: AgentErrorSummary;
|
|
106
|
+
reason?: string;
|
|
107
|
+
message?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface TaskState {
|
|
110
|
+
id: string;
|
|
111
|
+
projectId: string;
|
|
112
|
+
title: string;
|
|
113
|
+
description: string;
|
|
114
|
+
preferredAgentId: string;
|
|
115
|
+
agentId: string;
|
|
116
|
+
qaAgentId?: string;
|
|
117
|
+
prNumber?: number;
|
|
118
|
+
prUrl?: string;
|
|
119
|
+
branch?: string;
|
|
120
|
+
/** Server-trusted PR head SHA — anchor for review.submitted staleness checks. */
|
|
121
|
+
latestHeadSha?: string;
|
|
122
|
+
reviewRound: number;
|
|
123
|
+
/** Spec review round, isolated from PR review round. */
|
|
124
|
+
specReviewRound?: number;
|
|
125
|
+
/** undefined ≡ 'code' for backward compatibility. */
|
|
126
|
+
phase?: TaskPhase;
|
|
127
|
+
/** Marker token for the current spec dispatch; regenerated each dispatch. */
|
|
128
|
+
specMarkerToken?: string;
|
|
129
|
+
status: TaskStatus;
|
|
130
|
+
createdAt: string;
|
|
131
|
+
updatedAt: string;
|
|
132
|
+
}
|
|
133
|
+
export type EventType = 'task.created' | 'task.assigned' | 'task.updated' | 'session.started' | 'session.completed' | 'pr.created' | 'pr.updated' | 'pr.merged' | 'review.dispatched' | 'review.submitted' | 'review.max_rounds' | 'spec.ready' | 'spec.review.submitted' | 'spec.fix.submitted' | 'agent.bootstrap_failed' | 'agent.bootstrap_succeeded' | 'agent.recovered' | 'agent.stream_started' | 'agent.stream_stopped' | 'human.intervention';
|
|
134
|
+
export interface BaxianEvent {
|
|
135
|
+
id: string;
|
|
136
|
+
type: EventType;
|
|
137
|
+
timestamp: string;
|
|
138
|
+
projectId: string;
|
|
139
|
+
agentId?: string;
|
|
140
|
+
taskId?: string;
|
|
141
|
+
data: Record<string, unknown>;
|
|
142
|
+
}
|
|
143
|
+
export type StreamSubMode = 'preview' | 'full';
|
|
144
|
+
export interface StreamSubscribeMsg {
|
|
145
|
+
op: 'subscribe';
|
|
146
|
+
subscriberId: string;
|
|
147
|
+
agentId: string;
|
|
148
|
+
mode: StreamSubMode;
|
|
149
|
+
}
|
|
150
|
+
export interface StreamUnsubscribeMsg {
|
|
151
|
+
op: 'unsubscribe';
|
|
152
|
+
subscriberId: string;
|
|
153
|
+
}
|
|
154
|
+
export interface StreamInputMsg {
|
|
155
|
+
op: 'input';
|
|
156
|
+
subscriberId: string;
|
|
157
|
+
data: string;
|
|
158
|
+
}
|
|
159
|
+
export interface StreamResizeMsg {
|
|
160
|
+
op: 'resize';
|
|
161
|
+
subscriberId: string;
|
|
162
|
+
cols: number;
|
|
163
|
+
rows: number;
|
|
164
|
+
}
|
|
165
|
+
export interface StreamPingMsg {
|
|
166
|
+
op: 'ping';
|
|
167
|
+
}
|
|
168
|
+
export type StreamClientMsg = StreamSubscribeMsg | StreamUnsubscribeMsg | StreamInputMsg | StreamResizeMsg | StreamPingMsg;
|
|
169
|
+
export interface StreamSnapshotMsg {
|
|
170
|
+
type: 'snapshot';
|
|
171
|
+
subscriberId: string;
|
|
172
|
+
cols: number;
|
|
173
|
+
rows: number;
|
|
174
|
+
data: string;
|
|
175
|
+
snapshotSeq: number;
|
|
176
|
+
}
|
|
177
|
+
export interface StreamDataMsg {
|
|
178
|
+
type: 'data';
|
|
179
|
+
agentId: string;
|
|
180
|
+
data: string;
|
|
181
|
+
seq: number;
|
|
182
|
+
}
|
|
183
|
+
export interface StreamSubscribedMsg {
|
|
184
|
+
type: 'subscribed';
|
|
185
|
+
subscriberId: string;
|
|
186
|
+
agentId: string;
|
|
187
|
+
cols: number;
|
|
188
|
+
rows: number;
|
|
189
|
+
snapshotSeq: number;
|
|
190
|
+
}
|
|
191
|
+
export interface StreamErrorMsg {
|
|
192
|
+
type: 'error';
|
|
193
|
+
subscriberId?: string;
|
|
194
|
+
agentId?: string;
|
|
195
|
+
code: string;
|
|
196
|
+
message: string;
|
|
197
|
+
}
|
|
198
|
+
export interface StreamSessionGoneMsg {
|
|
199
|
+
type: 'session_gone';
|
|
200
|
+
agentId: string;
|
|
201
|
+
}
|
|
202
|
+
export interface StreamPongMsg {
|
|
203
|
+
type: 'pong';
|
|
204
|
+
}
|
|
205
|
+
export type StreamServerMsg = StreamSnapshotMsg | StreamDataMsg | StreamSubscribedMsg | StreamErrorMsg | StreamSessionGoneMsg | StreamPongMsg;
|
|
206
|
+
export type PollerHealth = 'healthy' | 'degraded' | 'failed' | 'unknown';
|
|
207
|
+
export interface PollerSnapshot {
|
|
208
|
+
repo: string;
|
|
209
|
+
projectId: string;
|
|
210
|
+
intervalMs: number;
|
|
211
|
+
isPolling: boolean;
|
|
212
|
+
lastPollStartedAt?: string;
|
|
213
|
+
lastPollEndedAt?: string;
|
|
214
|
+
lastPollDurationMs?: number;
|
|
215
|
+
lastErrorAt?: string;
|
|
216
|
+
lastErrorMessage?: string;
|
|
217
|
+
consecutiveFailures: number;
|
|
218
|
+
health: PollerHealth;
|
|
219
|
+
}
|
|
220
|
+
export type EventsTopicAgents = 'agents';
|
|
221
|
+
export type EventsTopicAgent = `agent:${string}`;
|
|
222
|
+
export type EventsTopicTask = `task:${string}`;
|
|
223
|
+
export type EventsTopicProjectTasks = `project-tasks:${string}`;
|
|
224
|
+
export type EventsTopicPollers = 'pollers';
|
|
225
|
+
export type EventsTopic = EventsTopicAgents | EventsTopicAgent | EventsTopicTask | EventsTopicProjectTasks | EventsTopicPollers;
|
|
226
|
+
export type EventsClientMsg = {
|
|
227
|
+
op: 'subscribe';
|
|
228
|
+
topic: EventsTopic;
|
|
229
|
+
} | {
|
|
230
|
+
op: 'unsubscribe';
|
|
231
|
+
topic: EventsTopic;
|
|
232
|
+
} | {
|
|
233
|
+
op: 'ping';
|
|
234
|
+
};
|
|
235
|
+
export type EventsServerMsg = {
|
|
236
|
+
type: 'data';
|
|
237
|
+
topic: EventsTopicAgents;
|
|
238
|
+
data: AgentSnapshot[];
|
|
239
|
+
} | {
|
|
240
|
+
type: 'data';
|
|
241
|
+
topic: EventsTopicAgent;
|
|
242
|
+
data: AgentSnapshot | null;
|
|
243
|
+
} | {
|
|
244
|
+
type: 'data';
|
|
245
|
+
topic: EventsTopicTask;
|
|
246
|
+
data: TaskState | null;
|
|
247
|
+
} | {
|
|
248
|
+
type: 'data';
|
|
249
|
+
topic: EventsTopicProjectTasks;
|
|
250
|
+
data: TaskState[];
|
|
251
|
+
} | {
|
|
252
|
+
type: 'data';
|
|
253
|
+
topic: EventsTopicPollers;
|
|
254
|
+
data: PollerSnapshot[];
|
|
255
|
+
} | {
|
|
256
|
+
type: 'error';
|
|
257
|
+
topic?: EventsTopic;
|
|
258
|
+
code: string;
|
|
259
|
+
message: string;
|
|
260
|
+
} | {
|
|
261
|
+
type: 'pong';
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAiB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentRole } from '../shared/index.js';
|
|
2
|
+
export interface SkillFile {
|
|
3
|
+
relPath: string;
|
|
4
|
+
content: Buffer;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SkillDef {
|
|
8
|
+
name: string;
|
|
9
|
+
dir: string;
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
description: string;
|
|
13
|
+
files: SkillFile[];
|
|
14
|
+
}
|
|
15
|
+
export declare class SkillScanError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class SkillRegistry {
|
|
19
|
+
private sourceDir;
|
|
20
|
+
private builtinDir?;
|
|
21
|
+
private skills;
|
|
22
|
+
constructor(sourceDir: string, builtinDir?: string | undefined);
|
|
23
|
+
scan(): Promise<void>;
|
|
24
|
+
private loadFrom;
|
|
25
|
+
has(name: string): boolean;
|
|
26
|
+
get(name: string): SkillDef | undefined;
|
|
27
|
+
names(): string[];
|
|
28
|
+
skillsForPhase(role: AgentRole, phase: string): string[];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skill/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AA2FD,qBAAa,aAAa;IAKZ,OAAO,CAAC,SAAS;IAAU,OAAO,CAAC,UAAU,CAAC;IAJ1D,OAAO,CAAC,MAAM,CAA+B;gBAIzB,SAAS,EAAE,MAAM,EAAU,UAAU,CAAC,EAAE,MAAM,YAAA;IAE5D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAMb,QAAQ;IAoCtB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvC,KAAK,IAAI,MAAM,EAAE;IAIjB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAOzD"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import { TextDecoder } from 'node:util';
|
|
4
|
+
import { AGENT_PHASES } from '../shared/index.js';
|
|
5
|
+
export class SkillScanError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'SkillScanError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const MAX_SKILL_FILE_BYTES = 100 * 1024;
|
|
12
|
+
// XML 1.0 illegal control chars (tab/LF/CR valid; everything else in 0x00-0x1F is not).
|
|
13
|
+
const ILLEGAL_XML = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]/u;
|
|
14
|
+
const utf8Strict = new TextDecoder('utf-8', { fatal: true });
|
|
15
|
+
function decodeStrictUtf8(path, buf) {
|
|
16
|
+
let text;
|
|
17
|
+
try {
|
|
18
|
+
text = utf8Strict.decode(buf);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
22
|
+
throw new SkillScanError(`${path}: invalid UTF-8 (${message})`);
|
|
23
|
+
}
|
|
24
|
+
if (ILLEGAL_XML.test(text)) {
|
|
25
|
+
throw new SkillScanError(`${path}: contains XML-illegal control character`);
|
|
26
|
+
}
|
|
27
|
+
if (Buffer.byteLength(text, 'utf8') > MAX_SKILL_FILE_BYTES) {
|
|
28
|
+
throw new SkillScanError(`${path}: ${Buffer.byteLength(text, 'utf8')} bytes exceeds ${MAX_SKILL_FILE_BYTES} limit`);
|
|
29
|
+
}
|
|
30
|
+
return text;
|
|
31
|
+
}
|
|
32
|
+
// Narrow frontmatter parser: pulls a single-line `description: <value>` from the
|
|
33
|
+
// leading `---\n...\n---` block. Avoids a full YAML dependency.
|
|
34
|
+
function parseSkillDescription(content) {
|
|
35
|
+
if (!content.startsWith('---\n'))
|
|
36
|
+
return firstParagraph(content);
|
|
37
|
+
const end = content.indexOf('\n---', 4);
|
|
38
|
+
if (end === -1)
|
|
39
|
+
return firstParagraph(content);
|
|
40
|
+
const block = content.slice(4, end);
|
|
41
|
+
for (const line of block.split('\n')) {
|
|
42
|
+
const m = line.match(/^description:\s*(.*?)\s*$/);
|
|
43
|
+
if (m) {
|
|
44
|
+
return stripMatchedQuotes(m[1]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return firstParagraph(content.slice(end + 4));
|
|
48
|
+
}
|
|
49
|
+
function stripMatchedQuotes(v) {
|
|
50
|
+
if (v.length >= 2) {
|
|
51
|
+
const first = v[0];
|
|
52
|
+
const last = v[v.length - 1];
|
|
53
|
+
if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
|
|
54
|
+
return v.slice(1, -1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return v;
|
|
58
|
+
}
|
|
59
|
+
function firstParagraph(text) {
|
|
60
|
+
const trimmed = text.trim();
|
|
61
|
+
if (!trimmed)
|
|
62
|
+
return '';
|
|
63
|
+
const para = trimmed.split(/\n\s*\n/, 1)[0];
|
|
64
|
+
return para.replace(/\s+/g, ' ').slice(0, 200);
|
|
65
|
+
}
|
|
66
|
+
async function walk(dir, base = dir) {
|
|
67
|
+
const out = [];
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = await readdir(dir);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const entryPath = join(dir, entry);
|
|
77
|
+
let s;
|
|
78
|
+
try {
|
|
79
|
+
s = await stat(entryPath);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
continue; // broken symlink / race; skip
|
|
83
|
+
}
|
|
84
|
+
if (s.isDirectory()) {
|
|
85
|
+
out.push(...(await walk(entryPath, base)));
|
|
86
|
+
}
|
|
87
|
+
else if (s.isFile()) {
|
|
88
|
+
const buf = await readFile(entryPath);
|
|
89
|
+
const text = decodeStrictUtf8(entryPath, buf);
|
|
90
|
+
out.push({
|
|
91
|
+
relPath: relative(base, entryPath),
|
|
92
|
+
content: buf,
|
|
93
|
+
text,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
export class SkillRegistry {
|
|
100
|
+
sourceDir;
|
|
101
|
+
builtinDir;
|
|
102
|
+
skills = new Map();
|
|
103
|
+
// builtinDir holds the package-shipped skills (npm packaging puts them next to dist).
|
|
104
|
+
// sourceDir is the cfgDir/skills override — user customisations win on name collision,
|
|
105
|
+
// so installed users get a working set out of the box without copying anything.
|
|
106
|
+
constructor(sourceDir, builtinDir) {
|
|
107
|
+
this.sourceDir = sourceDir;
|
|
108
|
+
this.builtinDir = builtinDir;
|
|
109
|
+
}
|
|
110
|
+
async scan() {
|
|
111
|
+
this.skills.clear();
|
|
112
|
+
if (this.builtinDir)
|
|
113
|
+
await this.loadFrom(this.builtinDir);
|
|
114
|
+
await this.loadFrom(this.sourceDir);
|
|
115
|
+
}
|
|
116
|
+
async loadFrom(dir) {
|
|
117
|
+
let entries;
|
|
118
|
+
try {
|
|
119
|
+
entries = await readdir(dir);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
const entryPath = join(dir, entry);
|
|
126
|
+
let s;
|
|
127
|
+
try {
|
|
128
|
+
s = await stat(entryPath);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
continue; // broken symlink / race
|
|
132
|
+
}
|
|
133
|
+
if (!s.isDirectory())
|
|
134
|
+
continue;
|
|
135
|
+
const skillFile = join(entryPath, 'SKILL.md');
|
|
136
|
+
let skillBuf;
|
|
137
|
+
try {
|
|
138
|
+
skillBuf = await readFile(skillFile);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const skillMd = decodeStrictUtf8(skillFile, skillBuf);
|
|
144
|
+
const files = await walk(entryPath);
|
|
145
|
+
this.skills.set(entry, {
|
|
146
|
+
name: entry,
|
|
147
|
+
dir: entryPath,
|
|
148
|
+
path: skillFile,
|
|
149
|
+
content: skillMd,
|
|
150
|
+
description: parseSkillDescription(skillMd),
|
|
151
|
+
files,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
has(name) {
|
|
156
|
+
return this.skills.has(name);
|
|
157
|
+
}
|
|
158
|
+
get(name) {
|
|
159
|
+
return this.skills.get(name);
|
|
160
|
+
}
|
|
161
|
+
names() {
|
|
162
|
+
return [...this.skills.keys()];
|
|
163
|
+
}
|
|
164
|
+
skillsForPhase(role, phase) {
|
|
165
|
+
const phases = AGENT_PHASES[role];
|
|
166
|
+
if (!phases)
|
|
167
|
+
return [];
|
|
168
|
+
const phaseConfig = phases[phase];
|
|
169
|
+
if (!phaseConfig)
|
|
170
|
+
return [];
|
|
171
|
+
return phaseConfig.skills.filter((name) => this.skills.has(name));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skill/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Upstream sync record
|
|
2
|
+
|
|
3
|
+
This file tracks which `rockdai/agent-scripts` commit the synced skills under `skills/` are aligned with. Update by hand on every manual sync (we removed the automated sync script in favor of explicit, reviewable updates).
|
|
4
|
+
|
|
5
|
+
## Currently aligned
|
|
6
|
+
|
|
7
|
+
- Upstream: https://github.com/rockdai/agent-scripts
|
|
8
|
+
- Commit: `911beb66b0`
|
|
9
|
+
- Date: 2026-05-17
|
|
10
|
+
|
|
11
|
+
## Synced skills (replaced verbatim on each sync)
|
|
12
|
+
|
|
13
|
+
- `pr-feedback`
|
|
14
|
+
- `pr-review`
|
|
15
|
+
- `pr-recheck`
|
|
16
|
+
- `merge-sync`
|
|
17
|
+
- `spells`
|
|
18
|
+
|
|
19
|
+
## Local-only skills (never touched by sync)
|
|
20
|
+
|
|
21
|
+
- `baxian-rules` — baxian backend invariants (verdict marker grammar, PR marker, fail-and-fallback flow)
|
|
22
|
+
- `task-check` — baxian-specific pre-implementation check
|
|
23
|
+
|
|
24
|
+
## Intentionally NOT synced from upstream
|
|
25
|
+
|
|
26
|
+
- `code-review` — overlaps with `baxian-rules`; describes a chat-driven workflow that conflicts with baxian's backend-event model
|
|
27
|
+
- `issue-check` — baxian has no issue-handling phase
|
|
28
|
+
- `review-notify` — baxian dispatches dev↔qa via backend events; agents do not chat-notify peers
|
|
29
|
+
- `tmux-send` — agents run inside tmux panes themselves; injecting this is a strange loop
|
|
30
|
+
|
|
31
|
+
## How to sync
|
|
32
|
+
|
|
33
|
+
1. `git clone https://github.com/rockdai/agent-scripts /tmp/agent-scripts` (or `git pull` if already cloned)
|
|
34
|
+
2. Note the new HEAD SHA
|
|
35
|
+
3. For each name in the **Synced skills** list, copy `/tmp/agent-scripts/skills/<name>/` over `skills/<name>/`
|
|
36
|
+
4. `diff` to review the delta — reject anything that conflicts with `baxian-rules` overrides
|
|
37
|
+
5. Update the `Commit` and `Date` lines above
|
|
38
|
+
6. Commit + push on a new branch + open a PR
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: baxian-rules
|
|
3
|
+
description: General rules and conventions for all baxian-managed agents
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Baxian Agent Rules
|
|
7
|
+
|
|
8
|
+
You are an agent managed by the baxian platform.
|
|
9
|
+
|
|
10
|
+
## Communication Rules
|
|
11
|
+
- All collaboration happens through GitHub PR records (description, commits, reviews, comments).
|
|
12
|
+
- Never rely on chat memory or tmux output for cross-agent communication.
|
|
13
|
+
- PR is the single source of truth for the entire review process.
|
|
14
|
+
|
|
15
|
+
## PR Creation (Dev)
|
|
16
|
+
- The PR description MUST start with the marker `<!-- baxian:managed -->` on its own line. This is how the platform recognises a baxian-managed PR; without it events for the PR are ignored.
|
|
17
|
+
- If a human gave you special instructions (skip tests, override rules), record the authorization in the PR description or a PR comment.
|
|
18
|
+
|
|
19
|
+
## Code Review Response (Dev)
|
|
20
|
+
- Respond to EVERY finding. No exceptions.
|
|
21
|
+
- `Fixed` (on its own line) = you made the change.
|
|
22
|
+
- `Won't fix` (on its own line) + reason = you decided not to change it.
|
|
23
|
+
- Silent ignoring is never acceptable.
|
|
24
|
+
- For out-of-scope findings, follow the `pr-feedback` skill (create a follow-up GitHub Issue, then reply with the link).
|
|
25
|
+
|
|
26
|
+
## Code Review Reading (Both)
|
|
27
|
+
- Use `gh` commands with `--paginate` to read all feedback.
|
|
28
|
+
- Read all three sources: reviews, review comments, and issue comments.
|
|
29
|
+
- Never assume you've seen everything without checking.
|
|
30
|
+
|
|
31
|
+
## Authorization Independence (QA)
|
|
32
|
+
- A human authorization recorded in the PR does not automatically override risk assessment.
|
|
33
|
+
- Read the rationale, then judge independently whether it actually covers the risk before approving.
|
|
34
|
+
|
|
35
|
+
## QA Verdict Emission (baxian-specific)
|
|
36
|
+
baxian's backend derives a `review.submitted` verdict from one of:
|
|
37
|
+
1. A GitHub review with state `APPROVED` (→ approve).
|
|
38
|
+
2. A GitHub review with state `CHANGES_REQUESTED` (→ request changes).
|
|
39
|
+
3. A `COMMENTED` review whose body contains a single standalone line `<!-- baxian:<your-agent-id>:approve -->` or `<!-- baxian:<your-agent-id>:request-changes -->` outside fenced code blocks (verdict marker).
|
|
40
|
+
|
|
41
|
+
A bare `:+1:`, an emoji, or a generic positive comment is NOT recognized by the backend — only the three signals above advance the state machine.
|
|
42
|
+
|
|
43
|
+
### Verdict emission: fail-and-fallback (always do this)
|
|
44
|
+
|
|
45
|
+
When dev and qa share the same GitHub identity (common on solo / single-token setups), GitHub returns `422 Can not approve your own pull request` to `gh pr review --approve`. The qa agent MUST run the fail-and-fallback flow below every time — it is a no-op extra step in the multi-account case and the only path that works in the shared-account case.
|
|
46
|
+
|
|
47
|
+
To emit `APPROVE`:
|
|
48
|
+
|
|
49
|
+
1. Try `gh pr review N --approve`.
|
|
50
|
+
2. If it succeeds, you are done with the verdict signal. Skip to step 4.
|
|
51
|
+
3. If it fails for any reason, fall back: submit a COMMENTED review carrying the verdict marker. The marker MUST be on its own line, outside any fenced code block, and appear exactly once in the body:
|
|
52
|
+
```bash
|
|
53
|
+
gh pr review N --comment --body $'LGTM\n\n<!-- baxian:<your-agent-id>:approve -->'
|
|
54
|
+
```
|
|
55
|
+
4. After the verdict is durable on the PR, post a `:+1:` review comment as human-readable reinforcement: `gh pr review N --comment --body ':+1:'`. This is not a backend signal; it is a courtesy for human reviewers.
|
|
56
|
+
|
|
57
|
+
To emit `CHANGES_REQUESTED`, use the same fail-and-fallback pattern: try `gh pr review N --request-changes --body '<findings>'` first; on any failure, switch to `gh pr review N --comment --body $'<findings>\n\n<!-- baxian:<your-agent-id>:request-changes -->'`.
|
|
58
|
+
|
|
59
|
+
## Backend Dispatch (baxian overrides chat-driven skills)
|
|
60
|
+
baxian orchestrates dev↔qa hand-offs via backend events, not chat triggers. Concretely:
|
|
61
|
+
- You will NOT receive `pr N` / `review N` / `recheck N` / `issue N` chat triggers; baxian dispatches you via task / pane prompts.
|
|
62
|
+
- You do NOT need to "notify the peer agent" via `tmux-send` / `review-notify` / any chat transport; the backend takes over once your PR push / review submit lands.
|
|
63
|
+
- When an imported skill (`spells`, `pr-feedback`, `pr-review`, `pr-recheck`) describes a `tmux-send` / `review-notify` / `issue N → issue-check` branch, treat it as conditional and skip it in baxian.
|
|
64
|
+
|
|
65
|
+
## Scope Discipline
|
|
66
|
+
- Stay within the scope of the current task.
|
|
67
|
+
- If you discover something out of scope that needs fixing, open a GitHub Issue on the repo to track it.
|
|
68
|
+
- Never make unrelated changes in a PR without human authorization.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: merge-sync
|
|
3
|
+
description: Use when an agent workspace must synchronize after a pull request has merged, including project aliases like "merged" or "merged N", branch cleanup, main/default-branch updates, docs or agent-rule rereads, and peer notifications.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Merge Sync
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
After a PR merges, each agent workspace must update to the merged default branch and refresh any changed agent rules before doing more work. The workflow differs depending on whether the message came from a human on the merged branch owner side or from another agent.
|
|
11
|
+
|
|
12
|
+
Project-specific trigger aliases such as `merged` and `merged N` are compatibility shims. The reusable concept is "sync after PR merge".
|
|
13
|
+
|
|
14
|
+
## Identify Source
|
|
15
|
+
|
|
16
|
+
Read the project instructions to decide how merge-sync is triggered. Common patterns:
|
|
17
|
+
|
|
18
|
+
- Human-originated local sync: the agent that owned the PR is on or knows the PR's head branch.
|
|
19
|
+
- Peer-originated sync: another agent sends the PR number so this workspace can update without deleting an unrelated current branch.
|
|
20
|
+
|
|
21
|
+
If the PR number is missing, recover it from the current branch, recent PRs, or the user before deleting any branch.
|
|
22
|
+
|
|
23
|
+
## Human-Originated Sync
|
|
24
|
+
|
|
25
|
+
1. Fetch remote state and identify the PR head branch and default branch.
|
|
26
|
+
2. Switch to the default branch and pull the latest remote default branch.
|
|
27
|
+
3. Delete the merged local feature branch only after confirming it is the PR head branch.
|
|
28
|
+
4. Inspect merged file paths. If agent rules, docs, or skill pointers changed, reread the affected files before starting new work.
|
|
29
|
+
5. If the project has peer agents, notify them with the project-defined merge-sync message after local sync completes.
|
|
30
|
+
|
|
31
|
+
## Peer-Originated Sync
|
|
32
|
+
|
|
33
|
+
1. Fetch remote state, switch to the default branch, and pull latest.
|
|
34
|
+
2. Inspect the merged PR's changed files. Reread changed agent rules, docs, or skill pointers.
|
|
35
|
+
3. Optionally delete stale local branches for that PR if they are clearly associated with the merged PR.
|
|
36
|
+
4. Do not notify the peer again; merge-sync notifications must not bounce forever.
|
|
37
|
+
|
|
38
|
+
## Safety Rules
|
|
39
|
+
|
|
40
|
+
- Never delete the current branch unless it is confirmed to be the merged PR head branch.
|
|
41
|
+
- Never treat tmux or chat output as proof of merge; verify through the VCS or hosting provider.
|
|
42
|
+
- If docs or agent rules changed, reread them before accepting another task.
|