机组人员
一群无头特工的常设团队从一个 Tablation 板,在你控制的机器上做, 并向董事会汇报。
文档: https://crew.tablation.dev -从…开始
开始. 来源在
docs/.
每一个 座位 是董事会成员桌子上的一排,碰巧是一个机器人,
用简短的(prompts/<promptSet>/(参见下面的“提示集”)和一个切片
在队列中。一个座位在那张桌子上被命名,并回答了那个名字,在
队列文摘,并在评论中写在票上。全体船员
知道一次运行——什么要构建,什么被阻塞,什么已经发送
表数据,并且它所采取的每一步都可以作为状态更改或
对票发表评论。没有隐藏状态,没有队列,只有单板。
每个探员都有一份名单,上面写着:还有谁在船上, 每一行叫什么,是哪一行 持有 -使用的人 这艘船,还有他们的互动环节。分配的票证 每个座位都不能进候机室,不管它是什么位置,所以我 某人接管了某物而不与其他船员争抢。
今天的船员有四个投票席位,如下所述 default
提示设置(此回购附带的三车道开发/设计/QA策略)-见
下面的“提示集”用于其他人,并用于编写自己的提示集):
| 座位 | 拥有 | 短暂的 |
|---|---|---|
| dev | 批准的门票,不需要设计工作 | prompts/default/personas/lane-dev.md |
| 设计 | 已获批准的船票 需要设计 | prompts/default/personas/lane-design.md |
| 质量保证 | 一切都在 fixed 或者 qa不管是谁造的 | prompts/default/personas/lane-qa.md |
| 分类 | 机票被分配到分诊座位 | prompts/default/personas/lane-triage.md |
第五个角色, 一对,骑 crew agents sync 除了这四个
不是轮询的:它是一个实时的、交互式的会话(一个IDE
会话(而不是计划运行)在接触跟踪器时使用。它已经
没有机组座位,也从来没有被投票循环分配过票。 crew agents prompt pair 打印其当前角色文本(工作区管理员的)
Live编辑(如果有的话),否则为本地默认)
SessionStart 钩子在开始时提供给会话。
构建通道的共享策略(工作树,每个工作树有一个无状态调用)
周期,即开发/设计/QA交接) Crew Lane Agent 技巧,
这个 dev, 设计 和 质量保证 摘要包括一个
{{skill: Crew Lane Agent}} 在他们的第一条线上做记号。特工队继续前进
标记;在组装运行时展开包含,从
如果管理员编辑了工作区的Agent Skills行,则为本地的
skills/*.md 文件。因此,一个管理员编辑一个lane自己的句子不再分叉
共享策略。标记是 {{skill:,之后完全匹配的技能名称
修剪, }},在其自己的行或内嵌。这是故意不做的
[[table:key]] 记录链接:角色和技能不是工作区的行
表格。一个不知名的名字拒绝跑步;一种技能,包括自身(或技能)
循环)展开一次,并在运行中留下一个警告
总结;嵌套上限为3层,包含200 KB的文本。
crew agents sync 警告标记命名预设没有的技能
船。 分类 和 一对 是独立的(SELF_CONTAINED_ROLES 在
src/config.ts):既不削减工作树,也不构建或将任何东西交给QA,所以
这项政策只会错误地描述他们。在此更改之前,预设可能会分叉
还是船 personas/common.md它一直被固定在大楼的前面
三角裤。提示符上写的是规则,而不是历史;背后的事件
每条规则都保留在里面 docs/prompt-rationale.md.
除了人物角色,提示集也可以发布 技能 - - - - - -
prompts/<promptSet>/skills/*.md,每一个YAML frontmatter (name,
description)加上降价提示正文。技能不是座位,它不是
轮询而不是连接到每次运行的提示符中,只是同步到
工作空间的 Agent Skills 表,以便任何会话都可以通过名称获取它
需求。 crew agents sync [route] 将角色和技能结合在一起
Run -这里的“代理”指的是所有代理类型的资源团队,而不仅仅是
Agents表; crew skills sync [route] 是相同的create/update/
发散同步仅限于技能,因为你只碰过
skills/. crew connect 运行相同的同步(然后是座位密钥mint)
结束为管理键,因此新的工作区不需要第二个命令;一个成员
Key链接座位到现有的行,并被告知管理员必须运行它一次。
--no-agents-sync 跳过它,然后 --json 增加了 agents_synced 和 seat_key
stdout上的事件。示例用法-通过Epic调用Pair会话
grill_link 查找 Grill-Me 技能通过制表MCP工具
agent_skills_controller_get_skill 并遵循它。 prompts/default/skills/ grill-me.md 是一个发货的例子;其余的是建筑通道。”
情景程序(Worktree Setup, Running the Suite, Question and Investigation Tickets, Filing a Ticket, Ticket Attachments, Workspace Change Authorization, Design Pass), lane策略在步骤中对其进行命名
这需要每一个-每次运行都保持规则和最小的内联和
仅在应用时获取完整过程,因此开发运行永远不会
开罚单从来不付罚单的费用。 test/prompts.test.ts
检查角色名称的每个技能是否在相同的预设中发布。
每个周期运行一个角色,哪个角色持有最紧急的可操作票据
(src/priority.ts 决定,并且同一模块对代理的摘要进行排序
手,所以两者永远不会有分歧)。无论何时,QA的地位都高于构建角色
它有东西要检查。如果获胜的角色被证明什么都没有,它就可以
其实是这样的,这个循环会落到亚军而不是空转。
合并和部署是 不 一个特工的工作。代理阶段结束后,a 释放阶段获取远程拥有的任何东西,压缩合并每个经过验证的qa 分支,更新版本,编写变更日志并运行repo的部署 钩。无头会话永远不会被授予推送到生产环境的许可。
不能合并的分支是 交回,而不是跳过。释放
将其倒带,将基础合并到其自己的工作树中的分支中,然后返回
这张通往开发通道的票上的冲突还留在原地看——所以
解析它的座位是具有票的上下文的座位,QA检查
分辨率和其他变化一样。仅仅是陈旧的分支合并了
在这一点上很干净,没有人被吵醒。第二次冲突
停在 needs_info 而不是循环。
提示设置
上面的座位和他们的简报是政策,而不是机制——一个关于
如何 一个特定的工作空间喜欢工作,而不是工作人员本身
能做什么。 prompts/ 将其中不止一个作为完整的,准备运行的
政策:
| 目录 | 策略 |
|---|---|
prompts/default/ | 三车道-开发,设计(门控) 需要设计 国旗),质量保证。 |
prompts/dev-qa/ | 两条通道——开发人员构建一切,QA检查。没有设计门。 |
一条路线选择了一条 promptSet: 在 crew.yaml (见
crew.example.yaml) -在这个回购自己的名称下解析
prompts/,默认为 default 当省略。不同的路线
同一艘船可以运行不同的提示集,因为哪个工作流是一个工作空间
“想要”是关于工作空间的事实,而不是关于运行它的机器。
写自己的 预期的路径一旦发货预设没有
Fit:复制预设目录(cp -r prompts/default ~/my-crew-policy),
编辑它的散文,并指出 promptSet 在副本(~/my-crew-policy 或者一个
(相对路径)-不需要这个repo的分支。提示集是一个完整的,
一个独立的叉子 personas/lane-<role>.md 每个座位
(以及建筑概要中包含的共享策略技能),再加上其他任何技能 skills/*.md 它想要的,不是与另一个不同
一个;每个人物角色文件都被视为普通的散文({{skill: Name}} 包括扩大
,并将其连接在
每次运行的花名册/环境部分和队列摘要之前
(src/agent.ts的 assemblePrompt),因此没有模板层来
学习。保持散文的通用性: test/prompts.test.ts 预设失败
命名路径、命令、id、票证引用或日期。 prompts/dev-qa/ 是否有一个有效的修剪车道的例子
default 干净,包括未使用的 lane-design.md 存根每
预置今天仍然需要-见下一段为什么。
一个电流限制: 角色集本身是固定的 - - - - - - src/config.ts的
RoleName (dev, design, qa, triage, pair) -所以即使是一个提示集
没有实际意义的投票席位(dev-qa的 design)还需要一个
lane-<role>.md 把它们一一归档, pair 包括,或者 crew agents sync 和 planAgentRun 扔出去找它。 prompts/dev-qa/ lane-design.md 处理这个问题的方法是写一份简短的声明:“什么都不做,
你不应该有人手”——在你自己的投票席位上复制这种模式
政策不使用(pair 是从来没有轮询过的,所以它自己的简要只是需要吗
存在,而不是自我否定)。把座椅设置为策略定义的,所以
提示集可以直接添加或删除角色,这是一个较大的更改
提示集已经完成了,还没有完成。
一个工作空间必须提供什么
船员们从黑板上读出它的意思,而不是从它自己的来源。状态,
优先级顺序,以及哪个列扮演哪个角色 per-workspace
事实因为一艘船可以连接到几块各自制造的木板上
不同的选择。 docs/CONTRACT.md 文档的默认值和什么
如果命名不同,工作区必须重写。
安装
git clone <this repo> crew
cd crew
cp crew.example.yaml ~/.config/crew/crew.yaml
chmod 600 ~/.config/crew/crew.yaml # it holds an API key
$EDITOR ~/.config/crew/crew.yaml
bin/crew doctor # read-only preflight
配置存在于 ~/.config/crew/ 而不是在结帐:它描述
这个 机,因此重新安装或更换结帐不会丢失它。
crew 看起来在 $CREW_CONFIG,然后 $XDG_CONFIG_HOME/crew,然后
~/.config/crew/crew.yaml,然后才在收银台旁边。
crew connect 将工作空间/项目的id解析到状态树中
不用手动查找。 doctor 然后检查配置
现实:结账,PATH上的工具,代理二进制文件,回购的钩子,
董事会是否会回答。没有写入,唤醒代理或部署,直到
一条路线有 enabled: true.
项目结束后, crew connect 打印功能检查表
对于已登录的成员(写Crew和Ships表,创建Repos行,
Mint代理密钥,同步角色和技能): ok,或者 missing — ask a workspace admin for <capability>. 与 --json 是1 capabilities 标准输出上的事件。
Connect继续进行任何允许的事情;miss存储在路由中
已解决状态和 crew doctor 重复它们,直到重新连接找到授权
在的地方。
辅助工作区的地址为 <primary>:<slug>:
crew connect paradium:issues (或 paradium:issues/<project>,或者
--workspace-id paradium:issues)连接到它,路由,钥匙链
条目、座位密钥名称和repos目录都逐字携带该段
(paradium:issues/issues, ~/Crew/paradium:issues/<repo>). 仪显示
该目录中的冒号作为斜杠; --dir 覆盖位置。
然后把它作为一个真正的服务来安装:
bin/crew install # writes and loads this platform's own units
bin/crew install --dry-run # see what it would do first
bin/crew uninstall # unload and remove them
install 写三个独立的单位- run, release 和
passengers -并在每个主机上选择机制本身:在macOS上启动,a
systemd 用户 Linux上的unit(返回到crontab行,其中
systemctl 是不可用的),或者是Windows上的错误(尚未构建)。它总是
使用绝对解释器路径(process.execPath)和每个单位的点数
拥有自己的日志 不同的 比船员自己的文件-指向一个文件
是真的,每句台词都翻了一遍。
run 是一个 持续的服务: crew daemon的长时间循环
当有工作时,链条会立即循环,当没有工作时,链条就会退出
(launchd KeepAlive/ systemd Restart=on-failure 如果它崩溃了,重新启动它)。
安装它会启动它,就像安装其他服务一样。
bin/crew daemon start|stop|status|restart 控制相同的服务
直接-无需完全重新安装即可使用-除了在纯crontab上
回退,它不能监督持久进程,因此保留旧进程
one-shot-per-fire crew run 代替。 release 和 passengers 呆在
他们自己的固定计时器/crontab行,每次射击一次,一如既往
每次的第一次运行发生在一个间隔之后 install,每一种火都是一个
很少的API调用——只有当廉价的检查找到时,才会启动完整的代理会话
值得为之醒来的东西。
守护进程也会更新自己:在空闲时(不会在周期中),它会进行检查
自己安装的文件(src/dist/bin,或者二进制本身
编译后的安装)自启动以来已更改,如果是这样,则干净地退出
同样的崩溃恢复重启,然后重新启动它
现在在磁盘上。 crew daemon restart 立即强制执行此操作,以获得手册
git pull && crew daemon restart 而不是等待下一个空闲的滴答。
launchd/com.tablation.crew.plist 只是作为什么参考
install 生成-手工编辑和直接加载它仍然工作,但是
crew install/crew uninstall 是现在支持的路径。
命令
crew poll [route] decide a cycle and report it; writes nothing
crew run [route] [--role R] run the winning role's session, then release
crew daemon [route] run the persistent supervisor loop in the foreground
crew daemon start|stop|status control the installed `run` service directly
crew daemon restart stop then start it (force-picks-up an update)
crew release [route] merge what QA verified, version it, ship it
crew merge [route] merge verified branches and stop
crew deploy [route] release now, even with nothing new to merge
crew watch [route] live view of what the crew is doing
crew status [route] paused/running state, led by what the operator owes (needs_info assigned to them, needs_planning, ships needing attention)
crew doctor [route] [--fix] preflight; --fix enables clean routes, offers crew install
crew selftest [route] [--toolchain NAME] [--json] launch each toolchain as a run would and prove it reaches the tracker
crew sample-ticket [route] [--remove] [--dry-run] [--json] file one ticket on a throwaway repo that walks the dev, QA and release loop
crew ports [route] which checkout owns which ports, and what is up
crew reap [route] kill servers left behind by removed worktrees
crew drop [route] NNN remove a merged ticket's worktree and branch
crew worktree [route] NNN cut (or refresh) this run's worktree for a ticket from the remote; prints its path
crew sync [route] fast-forward the checkout and its worktrees from the remote
crew pause|resume [route] [R|release] pause everything, one role, or releases only (passengers keep running)
crew log [route] tail the log
crew inbox [--member NAME] your tickets across every workspace
crew connect WS[/PROJECT] resolve a workspace/project's ids into the state tree
crew repos add [ROUTE] [NAME] [PATH] attach a local checkout to a route in crew.yaml, creating its Repos row if missing (--dry-run previews)
crew repos list ROUTE the checkouts a route has, and the tracker Repos row each matches
crew repos check [PATH] validate a checkout's .crew.yaml (parse, release readiness, hook syntax) without attaching it (--route ROUTE, --strict, --json)
crew repos hooks [ROUTE] NAME suggest test/build hooks for a checkout (--write route|repo [--replace] writes them, --clear route removes them, --recipes, --hook KEY=CMD, --agent, --json)
crew install [--replace] write and load this platform's scheduler unit (macOS: clears a crew installed from another path)
crew uninstall [--all] unload and remove it (--all: every crew launchd unit, whichever path it came from)
每一个能改变某些事情的命令都需要 --dry-run.
一船多板
一艘船同时连接到几个工作区,并对它们的队列进行排序
一个板上的P0比另一个板上的P2更重要。该船已被识别
由 ship.name 在每个板的船舶表中匹配一行;一名船员是
通过电子邮件识别,因此同一个人在不同的工作空间都能被识别出来。
一个发展领域跨越 几个存储库,所以checkout是a
车票的财产,而不是航线的财产: repos: 对象中的每个名称进行映射
将board的Repos表放到这台机器上的一个目录中。甚至命名一个回购
这是一个封闭的列表-几艘船可以划分一个多回购区域
在他们之间工作,任何没有被命名的东西都是另一艘船的,
标志着 NO CHECKOUT 在摘要中而不是留白(留白会读)
如“work it here”,这是错误的目录)。
离开 repos: Out的意思正好相反:这艘船在服务
一切 董事会的Repos表列出,每个结账默认为
<reposBasePath>/<workspace>/<repoName> - - - - - - reposBasePath 是 ~/Crew
除非 ship: 或route-level reposBasePath: 否则说。回购
在它的派生路径中还不存在它会自动克隆到那里
当票据第一次真正需要它时(从Repos表自己的)
remote 列, owner/repo 通过SSH) -不是预先上 crew connect,
它只发现名字和远程,自己从不获取任何东西。
什么住在哪里?
bin/crew the entry point
src/ the implementation (Node, run directly via type stripping)
test/ its tests, including a fake board for integration runs
(the suite must pass with no crew.yaml, as on CI: a CLI-level test sets
CREW_CONFIG to a missing file instead of relying on the machine's own)
prompts/ prompt sets — prompts/<name>/personas/lane-<role>.md
+ prompts/<name>/skills/*.md
docs/ CONTRACT.md, REPO_SPEC.md, MIGRATION.md
launchd/ timer templates (edit the paths before installing)
crew.example.yaml copy to ~/.config/crew/crew.yaml
机组人员没有id,没有绝对路径,没有项目命令,也没有设备
的名字。任何特定于 机 属于 crew.yaml;任何东西
特定于 存储库 属于该存储库自己的 .crew.yaml
(docs/REPO_SPEC.md),声明它的平台、钩子、分支命名、
版本控制和发布模式:
| 钩 | 要求 | 它的用途是什么 |
|---|---|---|
test | 是 | 在发布之前运行套件 |
build | 是 | 构建它 |
deploy | 当 release.mode: local | 船这 |
setup | 否 | 准备一个新的工作树 |
ports | 否 | 打印此结帐的端口分配 |
version | 否 | 打印当前版本 |
bump | 否 | 制作并打印下一个 |
merged | 否 | 问铁匠铺是否有树枝落地 |
released | 否 | 确认提交是活动的(sha,或确切的版本) |
机组人员没有自己的命令:他们运行的一切都是为了测试,建造, 版本或发布存储库来自该存储库自己的文件。
一个钩子是异常,存在于 crew.yaml 而不是: notify,也就是
递给一个关卡(ok / warn / fail),标题和细节行
释放船只或被封锁。应该在哪里 所示 -桌面
通知、状态小部件、webhook、推送——都是关于机器的事实
看视频的人,而不是代码。定义none和释放状态
直接到日志。
回购是自己的 .crew.yaml 胜过任何重复的 crew.yaml,
crew doctor 将复制报告为漂移。客户端仍然可以进行配置
回购没有 .crew.yaml 它自己的。
状态
在macOS上运行,驱动这个项目自己的板。分诊是一种 座位,不是。 第二个过程-只有一个计时器要安装,而不是两个。
替换的bash实现已被删除。它的行为在哪里?
某些东西的唯一规范-优先级矩阵,QA摘要,
船员标签,它是作为固定装置被捕获的 test/fixtures/ 首先,
测试仍然使端口保持原来的功能。
突出:Linux没有端到端进行过练习,API密钥在
crew.yaml 明文,直到设备代码流和钥匙链存储的土地。