@hybridlabor-api/aos 4.13.1 → 4.14.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 (151) hide show
  1. package/.agents/AGENTS.md +8 -0
  2. package/.agents/nodes.json +5 -2
  3. package/.claude/hooks/conventional-commits.mjs +14 -15
  4. package/.claude/hooks/env-file-protection.mjs +14 -15
  5. package/.claude/hooks/go-gate.mjs +157 -13
  6. package/.claude/hooks/go-token.mjs +55 -0
  7. package/.claude/hooks/memb-inject.mjs +75 -62
  8. package/.claude/hooks/trail-autostart.mjs +27 -0
  9. package/.claude/settings.json +18 -0
  10. package/.claude/workflows/startcycle-dispatch.mjs +11 -4
  11. package/.opencode/plugins/bdb-aos.js +98 -121
  12. package/.opencode/plugins/lib/trail-autostart.js +38 -0
  13. package/CLAUDE.md +1 -1
  14. package/README.de.md +6 -10
  15. package/README.md +6 -10
  16. package/README.pt.md +6 -10
  17. package/THIRD_PARTY_NOTICES.md +19 -3
  18. package/assets/header-v5.png +0 -0
  19. package/bin/aos-acp.mjs +211 -0
  20. package/bin/aos-doctor.mjs +1 -1
  21. package/bin/aos-uninstall.mjs +2 -2
  22. package/docs/master-session-acp.md +51 -0
  23. package/installer.js +398 -65
  24. package/mcps/mcsc/packages/mcp/server.js +6 -7
  25. package/package.json +4 -3
  26. package/scripts/validate-skills.mjs +76 -0
  27. package/skills/basic/bdbmediastorm/SKILL.md +1 -1
  28. package/skills/basic/godmode-shipping/SKILL.md +3 -0
  29. package/skills/basic/master-session/SKILL.md +89 -0
  30. package/skills/basic/startcycle/SKILL.md +1 -1
  31. package/skills/basic/startcycle-graph/SKILL.md +2 -2
  32. package/skills/basic/startcycle-graph-user/SKILL.md +1 -1
  33. package/skills/basic/teamwork-preview/SKILL.md +1 -1
  34. package/skills/bdbrainstorm/SKILL.md +7 -1
  35. package/skills/global_config/agentic-harness-patterns/SKILL.md +257 -0
  36. package/skills/global_config/agentic-harness-patterns/metadata.json +10 -0
  37. package/skills/global_config/agentic-harness-patterns/references/agent-orchestration-pattern.md +97 -0
  38. package/skills/global_config/agentic-harness-patterns/references/bootstrap-sequence-pattern.md +106 -0
  39. package/skills/global_config/agentic-harness-patterns/references/context-engineering/compress-pattern.md +78 -0
  40. package/skills/global_config/agentic-harness-patterns/references/context-engineering/isolate-pattern.md +82 -0
  41. package/skills/global_config/agentic-harness-patterns/references/context-engineering/select-pattern.md +86 -0
  42. package/skills/global_config/agentic-harness-patterns/references/context-engineering-pattern.md +29 -0
  43. package/skills/global_config/agentic-harness-patterns/references/hook-lifecycle-pattern.md +111 -0
  44. package/skills/global_config/agentic-harness-patterns/references/memory-persistence-pattern.md +109 -0
  45. package/skills/global_config/agentic-harness-patterns/references/permission-gate-pattern.md +111 -0
  46. package/skills/global_config/agentic-harness-patterns/references/skill-runtime-pattern.md +104 -0
  47. package/skills/global_config/agentic-harness-patterns/references/task-decomposition-pattern.md +92 -0
  48. package/skills/global_config/agentic-harness-patterns/references/tool-registry-pattern.md +101 -0
  49. package/skills/global_config/agenttrail/SKILL.md +8 -0
  50. package/skills/global_config/agenttrail/bin/agenttrail.mjs +14 -0
  51. package/skills/global_config/agenttrail/bin/ensure.mjs +118 -0
  52. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +1 -1
  53. package/skills/global_config/bdb-memb-mcp/SKILL.md +4 -5
  54. package/skills/global_config/bdb-visual-edit/SKILL.md +51 -0
  55. package/skills/global_config/bdb-visual-edit/references/vite-react-source-attr.md +59 -0
  56. package/skills/global_config/bdb-visual-edit/scripts/pick-snippet.js +27 -0
  57. package/skills/global_config/bdb-visual-edit/scripts/sanitize-element.mjs +123 -0
  58. package/skills/global_config/factory-collect/SKILL.md +74 -0
  59. package/skills/global_config/factory-human-digest/SKILL.md +92 -0
  60. package/skills/global_config/factory-lookback/SKILL.md +95 -0
  61. package/skills/global_config/factory-review-prs/SKILL.md +63 -0
  62. package/skills/global_config/git-pr-review/SKILL.md +3 -0
  63. package/skills/global_config/grilling/SKILL.md +2 -0
  64. package/skills/global_config/mcsc/SKILL.md +1 -1
  65. package/skills/global_config/plan-arbiter/SKILL.md +125 -0
  66. package/skills/global_config/plan-canvas/SKILL.md +63 -9
  67. package/skills/global_config/plan-canvas/scripts/lib/loopback-guard.js +19 -3
  68. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/README.md +285 -0
  69. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/agent-trail.js +129 -0
  70. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/board-client.js +124 -0
  71. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/demo-plan/canvas.mdx +19 -0
  72. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/demo-plan/plan.mdx +18 -0
  73. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/recap-demo/plan.mdx +72 -0
  74. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/README.md +29 -0
  75. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/architecture.json +30 -0
  76. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/builder/00_architecture.html +14950 -0
  77. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/builder/canvas.mdx +511 -0
  78. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/builder/plan.mdx +208 -0
  79. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/recap/plan.mdx +102 -0
  80. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/showcase/standard/plan.md +136 -0
  81. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/signup-storyboard/canvas.mdx +124 -0
  82. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/examples/signup-storyboard/plan.mdx +37 -0
  83. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/index.js +188 -0
  84. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/kit.js +123 -0
  85. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/mdx.js +411 -0
  86. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/render.js +1291 -0
  87. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/architecture/meta.json +1 -0
  88. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/architecture/plan.mdx +195 -0
  89. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/architecture/standard.md +95 -0
  90. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/bugfix/meta.json +1 -0
  91. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/bugfix/plan.mdx +105 -0
  92. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/bugfix/standard.md +76 -0
  93. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/canvas.mdx +81 -0
  94. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/meta.json +1 -0
  95. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/plan.mdx +145 -0
  96. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/feature/standard.md +76 -0
  97. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/migration/meta.json +1 -0
  98. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/migration/plan.mdx +172 -0
  99. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/migration/standard.md +100 -0
  100. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap/meta.json +1 -0
  101. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap/plan.mdx +67 -0
  102. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap/standard.md +49 -0
  103. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/canvas.mdx +63 -0
  104. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/meta.json +1 -0
  105. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/plan.mdx +49 -0
  106. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-board/standard.md +39 -0
  107. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/meta.json +1 -0
  108. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/plan.mdx +118 -0
  109. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/recap-review/standard.md +57 -0
  110. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/meta.json +1 -0
  111. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/plan.mdx +173 -0
  112. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/release/standard.md +96 -0
  113. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/meta.json +1 -0
  114. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/plan.mdx +91 -0
  115. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/research/standard.md +54 -0
  116. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/canvas.mdx +53 -0
  117. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/meta.json +1 -0
  118. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/plan.mdx +225 -0
  119. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/templates/show-control/standard.md +111 -0
  120. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/theme.css +472 -0
  121. package/skills/global_config/plan-canvas/scripts/lib/plan-builder/trail.js +216 -0
  122. package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/markdown.js +1 -1
  123. package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/server.js +37 -4
  124. package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/ui.js +125 -29
  125. package/skills/global_config/plan-canvas/scripts/plan-canvas.js +196 -8
  126. package/skills/global_config/pr-recap/SKILL.md +47 -0
  127. package/skills/global_config/pr-recap/scripts/pr-recap.mjs +200 -0
  128. package/skills/global_config/quick-recap/SKILL.md +55 -0
  129. package/skills/global_config/stay-within-limits/SKILL.md +85 -0
  130. package/skills/global_config/triage/SKILL.md +3 -0
  131. package/skills/global_config/visual-edit/README.md +96 -0
  132. package/skills/global_config/visual-edit/SKILL.md +615 -0
  133. package/skills/global_config/visual-plan/README.md +93 -0
  134. package/skills/global_config/visual-plan/SKILL.md +544 -0
  135. package/skills/global_config/visual-plan/references/canvas.md +139 -0
  136. package/skills/global_config/visual-plan/references/connection.md +51 -0
  137. package/skills/global_config/visual-plan/references/document-quality.md +186 -0
  138. package/skills/global_config/visual-plan/references/exemplar.md +62 -0
  139. package/skills/global_config/visual-plan/references/local-files.md +99 -0
  140. package/skills/global_config/visual-plan/references/wireframe.md +319 -0
  141. package/skills/global_config/visual-recap/README.md +103 -0
  142. package/skills/global_config/visual-recap/SKILL.md +560 -0
  143. package/skills/global_config/visual-recap/references/connection.md +51 -0
  144. package/skills/global_config/visual-recap/references/local-files.md +99 -0
  145. package/skills/global_config/visual-recap/references/wireframe.md +319 -0
  146. package/skills/playbooks/pb-ci-fix/SKILL.md +49 -0
  147. package/skills/playbooks/pb-event-tracker/SKILL.md +45 -0
  148. package/skills/playbooks/pb-meeting-actions/SKILL.md +42 -0
  149. package/skills/playbooks/pb-project-new/SKILL.md +48 -0
  150. package/skills/playbooks/pb-week-plan/SKILL.md +45 -0
  151. package/assets/header-v4.jpg +0 -0
@@ -23,6 +23,16 @@
23
23
  }
24
24
  ]
25
25
  },
26
+ {
27
+ "matcher": "Agent|Task",
28
+ "hooks": [
29
+ {
30
+ "type": "command",
31
+ "command": "node \"$HOME/.claude/hooks/trail-autostart.mjs\"",
32
+ "timeout": 3
33
+ }
34
+ ]
35
+ },
26
36
  {
27
37
  "hooks": [
28
38
  {
@@ -105,6 +115,14 @@
105
115
  }
106
116
  ],
107
117
  "UserPromptSubmit": [
118
+ {
119
+ "hooks": [
120
+ {
121
+ "type": "command",
122
+ "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/go-token.mjs\""
123
+ }
124
+ ]
125
+ },
108
126
  {
109
127
  "hooks": [
110
128
  {
@@ -545,15 +545,20 @@ function reviewerStateNote() {
545
545
  );
546
546
  }
547
547
 
548
- // Injects each node's registry-declared skills as an explicit allowlist.
548
+ // Skills every node should know about (registry `common`), set once the registry is loaded.
549
+ let commonSkills = [];
550
+
551
+ // Injects the node's registry-declared skills plus the shared `common` set as
552
+ // the preferred skills. Other installed skills stay usable when they fit.
549
553
  // Applies to every node, build and sequential alike.
550
554
  function skillsNote(node) {
551
- const skills = Array.isArray(node?.skills) ? node.skills : [];
555
+ const own = Array.isArray(node?.skills) ? node.skills : [];
556
+ const skills = [...new Set([...commonSkills, ...own])];
552
557
  const parts = [];
553
558
  if (skills.length > 0) {
554
559
  parts.push(
555
- ` Use these skills for this work: ${skills.join(', ')}. ` +
556
- 'Do not reach for skills outside this list unless the task genuinely requires it.'
560
+ ` Prefer these skills for this work: ${skills.join(', ')}. ` +
561
+ 'Any other installed skill may be used when the task genuinely calls for it.'
557
562
  );
558
563
  }
559
564
  // A --skill flag is a hard requirement from the user, not the registry's
@@ -693,6 +698,7 @@ const REGISTRY_SCHEMA = {
693
698
  properties: {
694
699
  version: { type: 'number' },
695
700
  description: { type: 'string' },
701
+ common: { type: 'array', items: { type: 'string' } },
696
702
  nodes: {
697
703
  type: 'object',
698
704
  minProperties: 1,
@@ -733,6 +739,7 @@ const registryResult = await agent(
733
739
  );
734
740
 
735
741
  const registryNodes = registryResult?.nodes ?? {};
742
+ commonSkills = Array.isArray(registryResult?.common) ? registryResult.common.filter((s) => typeof s === 'string') : [];
736
743
  const missingNodeIds = REQUIRED_NODE_IDS.filter((id) => !registryNodes[id]);
737
744
  if (missingNodeIds.length > 0) {
738
745
  return await escalate(
@@ -4,7 +4,8 @@
4
4
  * Implements:
5
5
  * 1. tool.execute.before: Releases gatekeeper (go-gate). Guards outward-facing
6
6
  * or hard-to-reverse actions (git push, npm publish, npm version, rm -rf)
7
- * unless the user explicitly authorized it with the literal word "GO".
7
+ * unless the user explicitly authorized it with the literal word "GO", or a
8
+ * master session issued a GO token for this session (~/.aos/go/<name>.token).
8
9
  * 2. chat.message: Ambient memory injection (memB). Injects relevant project & user
9
10
  * memories as ephemeral context from ~/.MemBDB/memb.db via node:sqlite.
10
11
  * 3. tool.execute.before/after: Best-effort live-map telemetry for the AOS
@@ -15,21 +16,15 @@
15
16
  */
16
17
 
17
18
  import { existsSync, readFileSync } from 'node:fs';
18
- import os from 'node:os';
19
19
  import path from 'node:path';
20
20
 
21
- const GUARDED_PATTERNS = [
22
- /(?:^|[;&|]\s*)git\s+push\b/i,
23
- /(?:^|[;&|]\s*)npm\s+publish\b/i,
24
- /(?:^|[;&|]\s*)npm\s+version\b/i,
25
- /(?:^|[;&|]\s*)gh\s+pr\s+merge\b/i,
26
- /(?:^|[;&|]\s*)gh\s+release\s+create\b/i,
27
- /(?:^|[;&|]\s*)git\s+reset\s+--hard\b/i,
28
- /(?:^|[;&|]\s*)git\s+clean\s+-[a-zA-Z]*f\b/i,
29
- /(?:^|[;&|]\s*)rm\s+(?:-\w*[rR]\w*|--recursive)\b/i,
30
- ];
31
-
32
- let lastHumanPrompt = '';
21
+ // Decision logic lives in the shared hooks: installed copy next to this file
22
+ // (plugins/aos-hooks), else the repo's .claude/hooks. existsSync, not try/catch,
23
+ // so a broken installed hook fails loudly instead of silently falling back.
24
+ const HOOKS = existsSync(new URL('./aos-hooks/go-gate.mjs', import.meta.url)) ? './aos-hooks/' : '../../.claude/hooks/';
25
+ const hook = (f) => import(new URL(HOOKS + f, import.meta.url).href);
26
+ const [{ GUARDED_PATTERNS, tokenGrantsGo }, { issueGoToken }, { checkConventionalCommit }, { envFileReason }, { buildMemoryBlock }] =
27
+ await Promise.all(['go-gate.mjs', 'go-token.mjs', 'conventional-commits.mjs', 'env-file-protection.mjs', 'memb-inject.mjs'].map(hook));
33
28
 
34
29
  // ---------------------------------------------------------------------------
35
30
  // Graph gate (W-5, W-6)
@@ -125,14 +120,14 @@ function matchPipelineCommand(text) {
125
120
  return PIPELINE_COMMANDS.find(c => c.name === m[1].toLowerCase()) || null;
126
121
  }
127
122
 
128
- function isGuardedCommand(cmd) {
129
- if (typeof cmd !== 'string') return false;
130
- return GUARDED_PATTERNS.some((re) => re.test(cmd));
131
- }
132
-
133
- function verifyGoAuthorized(lastPrompt) {
134
- const trimmed = (lastPrompt || '').trim();
135
- return trimmed.toUpperCase() === 'GO';
123
+ // This session's name for the token: env (set by aos-acp / the user), else the
124
+ // OpenCode session title.
125
+ async function ownSessionName(client, sessionID) {
126
+ if (process.env.AOS_SESSION_NAME) return process.env.AOS_SESSION_NAME;
127
+ try {
128
+ const res = await client?.session?.get?.({ path: { id: sessionID } });
129
+ return res?.data?.title || '';
130
+ } catch { return ''; }
136
131
  }
137
132
 
138
133
  // Best-effort fire-and-forget telemetry for the AOS live map (agenttrail daemon).
@@ -179,83 +174,51 @@ function mapTrailToolInput(args, directory) {
179
174
  return mapped;
180
175
  }
181
176
 
182
- // Extract ambient memory from local memB database
183
- async function getMembContext(prompt, currentDir) {
184
- const home = os.homedir();
185
- const dbPath = path.join(home, '.MemBDB', 'memb.db');
186
- if (!existsSync(dbPath)) return null;
187
-
177
+ // Live-map autostart: on the first subagent spawn per session, ensure the agenttrail map runs
178
+ // and show its URL. Best-effort; never affects the gate logic.
179
+ const trailSeen = new Set();
180
+ async function trailAutostart(toolInput, directory, client) {
188
181
  try {
189
- const { DatabaseSync } = await import('node:sqlite');
190
- const db = new DatabaseSync(dbPath, { readOnly: true });
191
- db.exec('PRAGMA busy_timeout = 3000;');
192
-
193
- const contextItems = [];
194
-
195
- // Standing persona facts
196
- const personaFile = path.join(home, '.MemBDB', 'ambient-persona.txt');
197
- if (existsSync(personaFile)) {
198
- try {
199
- for (const line of readFileSync(personaFile, 'utf8').split('\n')) {
200
- const t = line.trim();
201
- if (t && !t.startsWith('#')) contextItems.push(`- ${t}`);
202
- }
203
- } catch {}
204
- }
205
-
206
- // Resolve project ID candidate
207
- let projectName = path.basename(currentDir);
208
- const pkgPath = path.join(currentDir, 'package.json');
209
- if (existsSync(pkgPath)) {
210
- try {
211
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
212
- if (pkg?.name) projectName = pkg.name;
213
- } catch {}
214
- }
215
-
216
- // Query project memories
217
- try {
218
- const sql = `
219
- SELECT payload FROM memb_vectors
220
- WHERE collection = 'bdb_agent_memory'
221
- AND (
222
- json_extract(payload, '$.project_id') = ?
223
- OR json_extract(payload, '$.metadata.project_id') = ?
224
- OR json_extract(payload, '$.project') = ?
225
- OR json_extract(payload, '$.metadata.project') = ?
226
- )
227
- ORDER BY rowid DESC
228
- LIMIT 3
229
- `;
230
- const rows = db.prepare(sql).all(projectName, projectName, projectName, projectName);
231
- for (const r of rows) {
232
- try {
233
- const p = JSON.parse(r.payload);
234
- const text = (p.memory || p.data || '').trim().replace(/\s+/g, ' ');
235
- if (text.length > 10) {
236
- contextItems.push(`- Project [${projectName}]: ${text.slice(0, 180)}`);
237
- }
238
- } catch {}
239
- }
240
- } catch {}
241
-
242
- db.close();
243
-
244
- if (contextItems.length === 0) return null;
245
- return `[AOS Ambient Memory - memB]\n${contextItems.join('\n')}`;
246
- } catch {
247
- return null;
248
- }
182
+ const lib = await import('./lib/trail-autostart.js');
183
+ if (!lib.isSpawnTool(toolInput.tool) || trailSeen.has(toolInput.sessionID)) return;
184
+ const r = lib.trailEnsure({ cwd: directory, sessionId: toolInput.sessionID });
185
+ if (!r) return;
186
+ trailSeen.add(toolInput.sessionID);
187
+ await client?.tui?.showToast?.({
188
+ body: { title: 'AOS agenttrail', message: r.url, variant: 'info' },
189
+ });
190
+ } catch {}
249
191
  }
250
192
 
251
193
  export default async function bdbAosPlugin(input) {
252
194
  const directory = input.directory || process.cwd();
253
195
 
196
+ // ponytail: entries live for the process lifetime (a few bytes per session); add cleanup if sessions ever pile up.
197
+ const sessions = new Map();
198
+ const sess = (id) => {
199
+ if (!sessions.has(id)) sessions.set(id, { prompt: '', parentID: null, identitySent: false });
200
+ return sessions.get(id);
201
+ };
202
+ const trail = (hook_event_name, session_id, extra = {}) =>
203
+ void postTrail({ hook_event_name, session_id, cwd: directory, agent: 'opencode', ...extra });
204
+
254
205
  return {
255
206
  // W-6 loop-keeper. Fires whenever a session goes idle. Reads the graph
256
207
  // state and, while work is still open, prompts the session to continue.
257
208
  // Never throws: a graph that cannot be read must not wedge the session.
258
209
  event: async ({ event }) => {
210
+ try {
211
+ const props = (event && event.properties) || {};
212
+ if (event?.type === 'session.created' && props.info?.id) {
213
+ sess(props.info.id).parentID = props.info.parentID ?? null;
214
+ trail('SessionStart', props.info.id);
215
+ } else if (event?.type === 'permission.updated') {
216
+ trail('Notification', props.sessionID, { message: props.title });
217
+ } else if (event?.type === 'session.idle' && props.sessionID) {
218
+ trail(sess(props.sessionID).parentID ? 'SubagentStop' : 'Stop', props.sessionID);
219
+ }
220
+ } catch {}
221
+
259
222
  try {
260
223
  if (!event || event.type !== 'session.idle') return;
261
224
  const sessionID = event.properties && event.properties.sessionID;
@@ -283,16 +246,19 @@ export default async function bdbAosPlugin(input) {
283
246
  },
284
247
 
285
248
  'chat.message': async (msgInput, msgOutput) => {
286
- // Capture the user prompt text for GO-gate verification
287
- const textParts = (msgOutput.parts || []).filter((p) => p && p.type === 'text' && typeof p.text === 'string');
249
+ const textParts = (msgOutput.parts || []).filter((p) => p && p.type === 'text' && typeof p.text === 'string' && !p.synthetic);
288
250
  const fullText = textParts.map((p) => p.text).join('\n').trim();
289
- if (fullText) {
290
- lastHumanPrompt = fullText;
291
- }
251
+ const s = sess(msgInput.sessionID);
252
+ s.prompt = fullText;
253
+
254
+ try {
255
+ if (!s.parentID) issueGoToken(fullText, { session_id: msgInput.sessionID, message_id: msgInput.messageID || msgOutput.message?.id });
256
+ } catch {}
292
257
 
293
- // Inject memB ambient memory
294
258
  try {
295
- const membContext = await getMembContext(fullText, directory);
259
+ const event = s.identitySent || s.parentID ? 'UserPromptSubmit' : 'SessionStart';
260
+ s.identitySent = true;
261
+ const membContext = await buildMemoryBlock({ event, prompt: fullText, cwd: directory });
296
262
  if (membContext) {
297
263
  msgOutput.parts.unshift({
298
264
  id: `memb-${Date.now()}`,
@@ -336,47 +302,65 @@ export default async function bdbAosPlugin(input) {
336
302
  const tool_name = mapTrailToolName(toolInput.tool);
337
303
  const tool_input = mapTrailToolInput(toolOutput?.args, directory);
338
304
  pendingArgs.set(toolInput.callID, tool_input);
339
- postTrail({
340
- hook_event_name: 'PreToolUse',
341
- session_id: toolInput.sessionID,
342
- cwd: directory,
343
- agent: 'opencode',
344
- tool_name,
345
- tool_input,
346
- });
305
+ trail('PreToolUse', toolInput.sessionID, { tool_name, tool_input });
347
306
  } catch {}
307
+ await trailAutostart(toolInput, directory, input.client);
348
308
  const toolName = (toolInput.tool || '').toLowerCase();
349
309
  // Intercept bash, terminal, or command execution tools
350
310
  if (toolName === 'bash' || toolName === 'terminal' || toolName === 'shell' || toolName === 'exec' || toolName === 'run_command') {
351
311
  const cmd = toolOutput?.args?.command || toolOutput?.args?.cmd || toolOutput?.args?.script || '';
352
- if (isGuardedCommand(cmd)) {
353
- let authorized = verifyGoAuthorized(lastHumanPrompt);
312
+ if (typeof cmd === 'string' && GUARDED_PATTERNS.some((re) => re.test(cmd))) {
313
+ const s = sess(toolInput.sessionID);
314
+ // An unanswered lookup is not proof of a root session: token-only for this call, not cached.
315
+ let tokenOnly = !!s.parentID;
316
+ if (!tokenOnly && input.client && toolInput.sessionID) {
317
+ try {
318
+ const res = await input.client.session.get({ path: { id: toolInput.sessionID } });
319
+ if (res?.data) s.parentID = res.data.parentID ?? null;
320
+ else tokenOnly = true;
321
+ } catch { tokenOnly = true; }
322
+ tokenOnly = tokenOnly || !!s.parentID;
323
+ }
324
+ // Subagent prompts are agent-written, so only a token can open their gate.
325
+ let authorized = !tokenOnly && s.prompt.toUpperCase() === 'GO';
354
326
 
355
- // If last cached prompt wasn't GO, query recent session messages via OpenCode client as fallback
356
- if (!authorized && input.client && toolInput.sessionID) {
327
+ // If this session's cached prompt wasn't GO, query recent session messages via OpenCode client as fallback
328
+ if (!authorized && !tokenOnly && input.client && toolInput.sessionID) {
357
329
  try {
358
330
  const res = await input.client.session.messages({ path: { id: toolInput.sessionID } });
359
331
  const msgs = res?.data || [];
360
332
  for (let i = msgs.length - 1; i >= 0; i--) {
361
333
  const m = msgs[i];
362
- if (m.role === 'user') {
334
+ if ((m.info?.role ?? m.role) === 'user') {
363
335
  const parts = m.parts || [];
364
- const text = parts.filter((p) => p.type === 'text').map((p) => p.text).join('\n').trim();
365
- if (text) {
366
- authorized = (text.toUpperCase() === 'GO');
367
- break;
368
- }
336
+ const text = parts.filter((p) => p.type === 'text' && !p.synthetic).map((p) => p.text).join('\n').trim();
337
+ authorized = text.toUpperCase() === 'GO';
338
+ break;
369
339
  }
370
340
  }
371
341
  } catch {}
372
342
  }
373
343
 
344
+ if (!authorized) {
345
+ authorized = tokenGrantsGo(await ownSessionName(input.client, toolInput.sessionID)).ok;
346
+ }
347
+
374
348
  if (!authorized) {
375
349
  throw new Error(
376
350
  `Blocked by BDB go-gate: Command "${cmd.slice(0, 80)}" is guarded and requires explicit authorization with the literal word "GO" before proceeding.`
377
351
  );
378
352
  }
379
353
  }
354
+ const reason = checkConventionalCommit(cmd);
355
+ if (reason) throw new Error(reason);
356
+ } else if (['write', 'edit', 'multiedit', 'patch', 'apply_patch'].includes(toolName)) {
357
+ const args = toolOutput?.args || {};
358
+ const paths = [args.filePath ?? ''];
359
+ for (const m of String(args.patchText ?? '').matchAll(/^\*\*\* (?:(?:Add|Update) File|Move to): (.+)$/gm)) paths.push(m[1].trim());
360
+ for (const f of paths) {
361
+ const reason = envFileReason(f);
362
+ if (reason) throw new Error(reason);
363
+ }
380
364
  }
381
365
  },
382
366
 
@@ -384,14 +368,7 @@ export default async function bdbAosPlugin(input) {
384
368
  try {
385
369
  const tool_input = pendingArgs.get(toolInput.callID);
386
370
  pendingArgs.delete(toolInput.callID);
387
- postTrail({
388
- hook_event_name: 'PostToolUse',
389
- session_id: toolInput.sessionID,
390
- cwd: directory,
391
- agent: 'opencode',
392
- tool_name: mapTrailToolName(toolInput.tool),
393
- tool_input,
394
- });
371
+ trail('PostToolUse', toolInput.sessionID, { tool_name: mapTrailToolName(toolInput.tool), tool_input });
395
372
  } catch {}
396
373
  },
397
374
  };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * OpenCode counterpart of the Claude PreToolUse agenttrail autostart.
3
+ * Pure and injectable so it is testable without OpenCode. Never throws.
4
+ * Tool args/prompts are deliberately not an input: nothing user-authored
5
+ * can reach the command line.
6
+ */
7
+
8
+ import { spawnSync as realSpawnSync } from 'node:child_process';
9
+
10
+ export const TRAIL_TIMEOUT_MS = 1800;
11
+ export const SPAWN_TOOLS = new Set(['task']);
12
+
13
+ export function isSpawnTool(tool) {
14
+ return SPAWN_TOOLS.has(String(tool || '').toLowerCase());
15
+ }
16
+
17
+ // Returns { url, hint } or null (no URL, binary missing, timeout, bad output).
18
+ export function trailEnsure({ spawnSync = realSpawnSync, env = process.env, cwd, sessionId } = {}) {
19
+ try {
20
+ const args = ['--ensure'];
21
+ if (cwd) args.push('--cwd', String(cwd));
22
+ if (sessionId) args.push('--session', String(sessionId));
23
+ args.push('--json');
24
+ const res = spawnSync(env.AOS_TRAIL_BIN || 'aos-trail', args, {
25
+ encoding: 'utf8',
26
+ timeout: TRAIL_TIMEOUT_MS,
27
+ killSignal: 'SIGKILL',
28
+ stdio: ['ignore', 'pipe', 'ignore'],
29
+ env,
30
+ });
31
+ if (!res || res.error || res.status !== 0) return null;
32
+ const out = JSON.parse(String(res.stdout || '').trim());
33
+ if (!out || typeof out.url !== 'string' || !out.url) return null;
34
+ return { url: out.url, hint: typeof out.hint === 'string' ? out.hint : null };
35
+ } catch {
36
+ return null;
37
+ }
38
+ }
package/CLAUDE.md CHANGED
@@ -23,7 +23,7 @@ These ship as Claude Code plugins and are the preferred path over shelling out
23
23
  to the underlying CLI, because they already handle wrapper flags, cost
24
24
  discipline, and the digest contract:
25
25
 
26
- - `antigravity:antigravity-delegate` — agy / Gemini
26
+ - `antigravity:delegate` — agy / Gemini
27
27
  - `opencode:opencode-rescue`
28
28
  - `codex:codex-rescue`
29
29
 
package/README.de.md CHANGED
@@ -1,4 +1,4 @@
1
- ![AOS — BDB Agent OS](assets/header-v4.jpg)
1
+ ![AOS — BDB Agent OS](assets/header-v5.png)
2
2
 
3
3
  🌐 **Language / Sprache / Idioma**: [ 🇬🇧 English ](README.md) | **Deutsch** | [ 🇵🇹 Português ](README.pt.md)
4
4
 
@@ -11,7 +11,7 @@
11
11
  [![CI](https://github.com/hybridlabor-api/aos/actions/workflows/ci.yml/badge.svg)](https://github.com/hybridlabor-api/aos/actions)
12
12
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
13
13
  [![node](https://img.shields.io/badge/node-%3E%3D20-blue.svg)](package.json)
14
- [![skills](https://img.shields.io/badge/skills-214%20curated-brightgreen.svg)](#skills)
14
+ [![skills](https://img.shields.io/badge/skills-224%20curated-brightgreen.svg)](#skills)
15
15
  [![MCPs](https://img.shields.io/badge/local%20MCPs-21-brightgreen.svg)](#mcp-server)
16
16
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#unterstützte-harnesses)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
@@ -27,7 +27,7 @@ Entwickelt für Nutzer, die bereits **Claude Code, Google Antigravity, Codex CLI
27
27
 
28
28
  Nach der Installation hast du:
29
29
 
30
- - **<!-- count:skills -->214<!-- /count --> Skills** in sechs Kategorien, von jedem Harness als `<name>/SKILL.md` auffindbar.
30
+ - **<!-- count:skills -->224<!-- /count --> Skills** in sechs Kategorien, von jedem Harness als `<name>/SKILL.md` auffindbar.
31
31
  - **<!-- count:agents -->13<!-- /count --> Subagents** (Architect, TechLead, Reviewer, die Godmodes, Security- und Silent-Failure-Reviewer) als natives Agenten-Format jedes Harness kompiliert.
32
32
  - **<!-- count:mcps -->21<!-- /count --> MCP-Server** für Creative Software, Betriebssystemsteuerung, Memory und Harness-übergreifende Delegation.
33
33
  - **Drei Pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user` — und ein **GO-Gate**, das `git push`, `npm publish`, `npm version` und rekursive `rm` mechanisch blockiert.
@@ -208,7 +208,7 @@ Installiere es durch den AOS Installer mit dem AOS CLI Target: `npx -y @hybridla
208
208
  npx skills add hybridlabor-api/aos
209
209
  ```
210
210
 
211
- Dies entdeckt alle <!-- count:skills -->214<!-- /count --> kuratierten Skills und installiert sie in das universelle `~/.agents/skills` Verzeichnis (verwendet von allen Harnesses und dem AOS CLI).
211
+ Dies entdeckt alle <!-- count:skills -->224<!-- /count --> kuratierten Skills und installiert sie in das universelle `~/.agents/skills` Verzeichnis (verwendet von allen Harnesses und dem AOS CLI).
212
212
 
213
213
  ---
214
214
 
@@ -249,7 +249,7 @@ Der Dispatcher-Graph kompiliert diese Agents, verfügbar als Claude Code Subagen
249
249
 
250
250
  ### Skills nach Kategorie
251
251
 
252
- <!-- count:skills -->214<!-- /count --> kuratierte Skills, von jedem Harness auffindbar:
252
+ <!-- count:skills -->224<!-- /count --> kuratierte Skills, von jedem Harness auffindbar:
253
253
 
254
254
  - **bdb-core** (31 Skills): Core AOS Infrastruktur, Pipelines, Tools und Utilities — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill` und mehr.
255
255
  - **design-ui-ux** (19 Skills): Frontend, UI Design, Barrierefreiheit, Tokens, Motion, Anti-Slop — `senior-frontend`, `ui-component`, `ui-review`, `tailwind-patterns`, `shadcn`, `wcag-audit-patterns` und mehr.
@@ -264,7 +264,7 @@ Der vollständige Katalog mit detaillierten Beschreibungen: [docs/skills_table.m
264
264
 
265
265
  ## Skills
266
266
 
267
- <!-- count:skills -->214<!-- /count --> Skills, kuratiert aus Open-Source- und proprietären Sammlungen, die die gesamte Software-Entwicklung und Creative-Pipeline abdecken. Jeder Skill ist ein Verzeichnis mit einem `SKILL.md` Frontmatter, das `name`, `description` und eine `category` erklärt: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
+ <!-- count:skills -->224<!-- /count --> Skills, kuratiert aus Open-Source- und proprietären Sammlungen, die die gesamte Software-Entwicklung und Creative-Pipeline abdecken. Jeder Skill ist ein Verzeichnis mit einem `SKILL.md` Frontmatter, das `name`, `description` und eine `category` erklärt: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
268
268
 
269
269
  **Persona Layer:** Die **Godmode** Skills sind spezialisierte Personas, die direkt den Build- und Shipping-Knoten des Dispatcher-Graphs zugeordnet sind:
270
270
 
@@ -411,10 +411,6 @@ flowchart LR
411
411
 
412
412
  `@hybridlabor-api/heimdall-token-saver`: komprimiert wiederholte CLI-Ausgabe über Ambient Hooks auf jedem Harness. Reduziert Token-Overhead bei großen Projekten. Skill: `token-saver-config`.
413
413
 
414
- ![Token savings with Heimdall Token Saver](assets/bdb_savings_graph_sketch.jpg)
415
-
416
- *Illustrative Skizze aus v3.x. Die Prozentwerte sind Schätzungen des Projekts, keine für dieses README durchgeführten Messungen.*
417
-
418
414
  ---
419
415
 
420
416
  ## Aktualisierung
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ![AOS — BDB Agent OS](assets/header-v4.jpg)
1
+ ![AOS — BDB Agent OS](assets/header-v5.png)
2
2
 
3
3
  🌐 **Language / Sprache / Idioma**: **English** | [ 🇩🇪 Deutsch ](README.de.md) | [ 🇵🇹 Português ](README.pt.md)
4
4
 
@@ -11,7 +11,7 @@
11
11
  [![CI](https://github.com/hybridlabor-api/aos/actions/workflows/ci.yml/badge.svg)](https://github.com/hybridlabor-api/aos/actions)
12
12
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
13
13
  [![node](https://img.shields.io/badge/node-%3E%3D20-blue.svg)](package.json)
14
- [![skills](https://img.shields.io/badge/skills-214%20curated-brightgreen.svg)](#skills)
14
+ [![skills](https://img.shields.io/badge/skills-224%20curated-brightgreen.svg)](#skills)
15
15
  [![MCPs](https://img.shields.io/badge/local%20MCPs-21-brightgreen.svg)](#mcp-servers)
16
16
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#supported-harnesses)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
@@ -27,7 +27,7 @@ Built for people who already run **Claude Code, Google Antigravity, Codex CLI, O
27
27
 
28
28
  After install you have:
29
29
 
30
- - **<!-- count:skills -->214<!-- /count --> skills** in six categories, discoverable by every harness as `<name>/SKILL.md`.
30
+ - **<!-- count:skills -->224<!-- /count --> skills** in six categories, discoverable by every harness as `<name>/SKILL.md`.
31
31
  - **<!-- count:agents -->13<!-- /count --> subagents** (Architect, TechLead, Reviewer, the Godmodes, security and silent-failure reviewers) compiled into each harness's native agent format.
32
32
  - **<!-- count:mcps -->21<!-- /count --> MCP servers** for creative software, OS control, memory and cross-harness delegation.
33
33
  - **Three pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user` — and a **GO gate** that mechanically blocks `git push`, `npm publish`, `npm version` and recursive `rm`.
@@ -208,7 +208,7 @@ Install it through the AOS installer with the AOS CLI target: `npx -y @hybridlab
208
208
  npx skills add hybridlabor-api/aos
209
209
  ```
210
210
 
211
- This discovers all <!-- count:skills -->214<!-- /count --> curated skills and installs them into the universal `~/.agents/skills` directory (used by all harnesses and the AOS CLI).
211
+ This discovers all <!-- count:skills -->224<!-- /count --> curated skills and installs them into the universal `~/.agents/skills` directory (used by all harnesses and the AOS CLI).
212
212
 
213
213
  ---
214
214
 
@@ -249,7 +249,7 @@ The dispatcher graph compiles these agents, available as Claude Code subagents a
249
249
 
250
250
  ### Skills by Category
251
251
 
252
- <!-- count:skills -->214<!-- /count --> curated skills, discoverable by every harness:
252
+ <!-- count:skills -->224<!-- /count --> curated skills, discoverable by every harness:
253
253
 
254
254
  - **bdb-core** (31 skills): Core AOS infrastructure, pipelines, tools, and utilities — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill`, and more.
255
255
  - **design-ui-ux** (19 skills): Frontend, UI design, accessibility, tokens, motion, anti-slop — `senior-frontend`, `ui-component`, `ui-review`, `tailwind-patterns`, `shadcn`, `wcag-audit-patterns`, and more.
@@ -264,7 +264,7 @@ The full catalog with detailed descriptions: [docs/skills_table.md](docs/skills_
264
264
 
265
265
  ## Skills
266
266
 
267
- <!-- count:skills -->214<!-- /count --> skills, curated from open-source and proprietary collections, covering the full software development and creative pipeline. Every skill is a directory with a `SKILL.md` frontmatter declaring `name`, `description`, and one `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
+ <!-- count:skills -->224<!-- /count --> skills, curated from open-source and proprietary collections, covering the full software development and creative pipeline. Every skill is a directory with a `SKILL.md` frontmatter declaring `name`, `description`, and one `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
268
268
 
269
269
  **Persona Layer:** The **Godmode** skills are specialized personas that directly map to the build and ship nodes of the dispatcher graph:
270
270
 
@@ -411,10 +411,6 @@ flowchart LR
411
411
 
412
412
  `@hybridlabor-api/heimdall-token-saver`: compresses repeated CLI output via ambient hooks on every harness. Reduces token overhead on large projects. Skill: `token-saver-config`.
413
413
 
414
- ![Token savings with Heimdall Token Saver](assets/bdb_savings_graph_sketch.jpg)
415
-
416
- *Illustrative sketch from v3.x. The percentages are the project's own estimates, not measurements made for this README.*
417
-
418
414
  ---
419
415
 
420
416
  ## Updating
package/README.pt.md CHANGED
@@ -1,4 +1,4 @@
1
- ![AOS — BDB Agent OS](assets/header-v4.jpg)
1
+ ![AOS — BDB Agent OS](assets/header-v5.png)
2
2
 
3
3
  🌐 **Language / Sprache / Idioma**: [ 🇬🇧 English ](README.md) | [ 🇩🇪 Deutsch ](README.de.md) | **Português**
4
4
 
@@ -11,7 +11,7 @@
11
11
  [![CI](https://github.com/hybridlabor-api/aos/actions/workflows/ci.yml/badge.svg)](https://github.com/hybridlabor-api/aos/actions)
12
12
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
13
13
  [![node](https://img.shields.io/badge/node-%3E%3D20-blue.svg)](package.json)
14
- [![skills](https://img.shields.io/badge/skills-214%20curated-brightgreen.svg)](#skills)
14
+ [![skills](https://img.shields.io/badge/skills-224%20curated-brightgreen.svg)](#skills)
15
15
  [![MCPs](https://img.shields.io/badge/local%20MCPs-21-brightgreen.svg)](#servidores-mcp)
16
16
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#harnesses-suportados)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
@@ -27,7 +27,7 @@ Construído para pessoas que já executam **Claude Code, Google Antigravity, Cod
27
27
 
28
28
  Após a instalação, você tem:
29
29
 
30
- - **<!-- count:skills -->214<!-- /count --> skills** em seis categorias, descobríveis por cada harness como `<name>/SKILL.md`.
30
+ - **<!-- count:skills -->224<!-- /count --> skills** em seis categorias, descobríveis por cada harness como `<name>/SKILL.md`.
31
31
  - **<!-- count:agents -->13<!-- /count --> subagentes** (Architect, TechLead, Reviewer, os Godmodes, revisores de segurança e falhas silenciosas) compilados em cada formato nativo de agente do harness.
32
32
  - **<!-- count:mcps -->21<!-- /count --> servidores MCP** para software criativo, controle de SO, memória e delegação entre harnesses.
33
33
  - **Três pipelines** — `/startcycle`, `/startcycle-graph`, `/startcycle-graph-user` — e um **portão GO** que bloqueia mecanicamente `git push`, `npm publish`, `npm version` e `rm` recursivo.
@@ -208,7 +208,7 @@ Instale através do instalador AOS com o alvo AOS CLI: `npx -y @hybridlabor-api/
208
208
  npx skills add hybridlabor-api/aos
209
209
  ```
210
210
 
211
- Isto descobre todas as <!-- count:skills -->214<!-- /count --> skills curadas e as instala no diretório universal `~/.agents/skills` (usado por todos os harnesses e o AOS CLI).
211
+ Isto descobre todas as <!-- count:skills -->224<!-- /count --> skills curadas e as instala no diretório universal `~/.agents/skills` (usado por todos os harnesses e o AOS CLI).
212
212
 
213
213
  ---
214
214
 
@@ -249,7 +249,7 @@ O grafo do dispatcher compila estes agentes, disponíveis como subagentes Claude
249
249
 
250
250
  ### Skills por Categoria
251
251
 
252
- <!-- count:skills -->214<!-- /count --> skills curadas, descobríveis por todo harness:
252
+ <!-- count:skills -->224<!-- /count --> skills curadas, descobríveis por todo harness:
253
253
 
254
254
  - **bdb-core** (31 skills): Infraestrutura AOS principal, pipelines, ferramentas e utilidades — `startcycle`, `startcycle-graph`, `startcycle-graph-user`, `agent-orchestrator`, `agenttrail`, `plan-canvas`, `aos-doctor`, `aos-store`, `bdb-dev-os-skill` e mais.
255
255
  - **design-ui-ux** (19 skills): Frontend, design UI, acessibilidade, tokens, movimento, anti-slop — `senior-frontend`, `ui-component`, `ui-review`, `tailwind-patterns`, `shadcn`, `wcag-audit-patterns` e mais.
@@ -264,7 +264,7 @@ O catálogo completo com descrições detalhadas: [docs/skills_table.md](docs/sk
264
264
 
265
265
  ## Skills
266
266
 
267
- <!-- count:skills -->214<!-- /count --> skills, curadas de coleções de código aberto e proprietárias, cobrindo o pipeline completo de desenvolvimento de software e criativo. Cada skill é um diretório com um `SKILL.md` frontmatter declarando `name`, `description` e uma `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
267
+ <!-- count:skills -->224<!-- /count --> skills, curadas de coleções de código aberto e proprietárias, cobrindo o pipeline completo de desenvolvimento de software e criativo. Cada skill é um diretório com um `SKILL.md` frontmatter declarando `name`, `description` e uma `category`: `bdb-core`, `design-ui-ux`, `engineering-method`, `engineering-hardware`, `media-eventtech`, `library`.
268
268
 
269
269
  **Camada de Persona:** As skills **Godmode** são personas especializadas que mapeiam diretamente para os nós de compilação e envio do grafo do dispatcher:
270
270
 
@@ -411,10 +411,6 @@ flowchart LR
411
411
 
412
412
  `@hybridlabor-api/heimdall-token-saver`: comprime saída CLI repetida via hooks ambiente em todo harness. Reduz sobrecarga de token em projetos grandes. Skill: `token-saver-config`.
413
413
 
414
- ![Token savings with Heimdall Token Saver](assets/bdb_savings_graph_sketch.jpg)
415
-
416
- *Esboço ilustrativo da v3.x. Os percentuais são estimativas do próprio projeto, não medições feitas para este README.*
417
-
418
414
  ---
419
415
 
420
416
  ## Atualizando