@geraldmaron/construct 1.0.6 โ†’ 1.0.8

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 (218) hide show
  1. package/README.md +39 -34
  2. package/bin/construct +1403 -96
  3. package/commands/build/feature.md +1 -1
  4. package/commands/build/fix.md +1 -1
  5. package/commands/design/access.md +1 -1
  6. package/commands/design/flow.md +1 -1
  7. package/commands/design/ui.md +1 -1
  8. package/commands/measure/experiment.md +1 -1
  9. package/commands/measure/metrics.md +1 -1
  10. package/commands/measure/results.md +1 -1
  11. package/commands/plan/api.md +1 -1
  12. package/commands/plan/challenge.md +1 -1
  13. package/commands/plan/decide.md +1 -1
  14. package/commands/plan/feature.md +1 -1
  15. package/commands/plan/requirements.md +1 -1
  16. package/commands/remember/context.md +1 -1
  17. package/commands/remember/handoff.md +1 -1
  18. package/commands/remember/runbook.md +1 -1
  19. package/commands/review/code.md +1 -1
  20. package/commands/review/quality.md +1 -1
  21. package/commands/review/security.md +1 -1
  22. package/commands/ship/ready.md +1 -1
  23. package/commands/ship/release.md +1 -1
  24. package/commands/ship/status.md +1 -1
  25. package/commands/understand/docs.md +1 -1
  26. package/commands/understand/this.md +1 -1
  27. package/commands/understand/why.md +1 -1
  28. package/commands/work/clean.md +1 -1
  29. package/commands/work/drive.md +1 -1
  30. package/commands/work/optimize-prompts.md +2 -2
  31. package/commands/work/parallel-review.md +1 -1
  32. package/db/schema/007_tags.sql +30 -0
  33. package/db/schema/008_skill_usage.sql +24 -0
  34. package/db/schema/009_scheduler.sql +14 -0
  35. package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +1 -1
  36. package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +1 -1
  37. package/examples/internal/roles/engineer/bad/speculative-abstraction.md +1 -1
  38. package/examples/internal/roles/engineer/golden/read-before-write.md +1 -1
  39. package/examples/internal/roles/qa/bad/coverage-theater.md +1 -1
  40. package/examples/internal/roles/qa/golden/regression-gate.md +1 -1
  41. package/examples/seed-observations/decisions.md +1 -1
  42. package/lib/audit-skills.mjs +3 -3
  43. package/lib/auto-docs.mjs +8 -8
  44. package/lib/boundary.mjs +126 -0
  45. package/lib/cache-strategy-google.js +26 -31
  46. package/lib/cli-commands.mjs +276 -122
  47. package/lib/comment-lint.mjs +139 -1
  48. package/lib/completions.mjs +1 -1
  49. package/lib/config/schema.mjs +15 -1
  50. package/lib/contracts/validate.mjs +371 -0
  51. package/lib/daemons/contract.mjs +210 -0
  52. package/lib/distill.mjs +22 -4
  53. package/lib/doc-stamp.mjs +48 -0
  54. package/lib/docs-verify.mjs +59 -6
  55. package/lib/doctor/cli.mjs +16 -1
  56. package/lib/doctor/index.mjs +3 -1
  57. package/lib/doctor/watchers/consistency.mjs +360 -0
  58. package/lib/doctor/watchers/mcp-protocol.mjs +232 -0
  59. package/lib/document-extract.mjs +420 -17
  60. package/lib/document-ingest.mjs +2 -0
  61. package/lib/embed/cli.mjs +124 -3
  62. package/lib/embed/daemon.mjs +43 -4
  63. package/lib/embed/docs-lifecycle.mjs +1 -1
  64. package/lib/embed/inbox.mjs +50 -3
  65. package/lib/embed/role-framing.mjs +3 -3
  66. package/lib/embed/scheduler.mjs +33 -5
  67. package/lib/env-config.mjs +9 -3
  68. package/lib/evaluator-optimizer.mjs +2 -3
  69. package/lib/extractors/calendar.mjs +173 -0
  70. package/lib/extractors/shared/drop-info.mjs +22 -0
  71. package/lib/extractors/transcript.mjs +0 -0
  72. package/lib/gates-audit.mjs +8 -2
  73. package/lib/git-hooks/prepare-commit-msg +1 -1
  74. package/lib/headhunt.mjs +2 -2
  75. package/lib/hooks/agent-tracker.mjs +6 -11
  76. package/lib/hooks/comment-lint.mjs +16 -0
  77. package/lib/hooks/guard-bash.mjs +35 -14
  78. package/lib/hooks/mcp-audit.mjs +14 -1
  79. package/lib/hooks/pre-compact.mjs +92 -5
  80. package/lib/hooks/pre-push-gate.mjs +41 -8
  81. package/lib/hooks/proactive-activation.mjs +0 -14
  82. package/lib/hooks/registry-sync.mjs +2 -2
  83. package/lib/hooks/rule-verifier.mjs +217 -0
  84. package/lib/hooks/session-optimize.mjs +2 -1
  85. package/lib/hooks/stop-notify.mjs +7 -6
  86. package/lib/host-capabilities.mjs +10 -1
  87. package/lib/hygiene/scan.mjs +141 -0
  88. package/lib/init-unified.mjs +73 -65
  89. package/lib/install/stage-project.mjs +4 -4
  90. package/lib/intake/classify.mjs +309 -58
  91. package/lib/intake/daemon.mjs +121 -0
  92. package/lib/intake/filesystem-queue.mjs +31 -6
  93. package/lib/intake/intake-config.mjs +2 -1
  94. package/lib/intake/postgres-queue.mjs +45 -3
  95. package/lib/intake/prepare.mjs +3 -1
  96. package/lib/intake/quarantine.mjs +205 -0
  97. package/lib/intake/session-prelude.mjs +7 -1
  98. package/lib/intake/traceability.mjs +90 -0
  99. package/lib/knowledge/postgres-search.mjs +132 -0
  100. package/lib/knowledge/research-store.mjs +2 -0
  101. package/lib/knowledge/search.mjs +14 -4
  102. package/lib/maintenance/cleanup.mjs +315 -0
  103. package/lib/mcp/memory-bridge.mjs +276 -0
  104. package/lib/mcp/server.mjs +11 -3
  105. package/lib/mcp/tools/skills.mjs +32 -11
  106. package/lib/mcp/tools/workflow.mjs +25 -0
  107. package/lib/mcp-catalog.json +12 -8
  108. package/lib/mcp-platform-config.mjs +16 -8
  109. package/lib/migrations/index.mjs +106 -0
  110. package/lib/migrations/v1-baseline.mjs +33 -0
  111. package/lib/model-registry.mjs +1 -1
  112. package/lib/observation-store.mjs +9 -4
  113. package/lib/opencode-runtime-plugin.mjs +1 -1
  114. package/lib/orchestration-policy.mjs +4 -4
  115. package/lib/outcomes/record.mjs +2 -0
  116. package/lib/overrides/resolver.mjs +3 -3
  117. package/lib/parity.mjs +4 -4
  118. package/lib/policy/engine.mjs +2 -2
  119. package/lib/profiles/lifecycle.mjs +1 -1
  120. package/lib/profiles/rebrand.mjs +46 -0
  121. package/lib/project-init-shared.mjs +12 -0
  122. package/lib/prompt-metadata.mjs +4 -4
  123. package/lib/provider-capabilities.js +20 -7
  124. package/lib/providers/auth-manager.mjs +58 -17
  125. package/lib/providers/circuit-breaker.mjs +14 -0
  126. package/lib/providers/contract.mjs +67 -3
  127. package/lib/providers/creds.mjs +219 -0
  128. package/lib/providers/scaffold.mjs +107 -0
  129. package/lib/reflect.mjs +49 -12
  130. package/lib/role-preload.mjs +5 -0
  131. package/lib/roles/catalog.mjs +1 -1
  132. package/lib/roles/manifest.mjs +2 -2
  133. package/lib/scheduler/index.mjs +112 -0
  134. package/lib/scheduler/solo.mjs +183 -0
  135. package/lib/server/index.mjs +29 -29
  136. package/lib/server/insights.mjs +14 -12
  137. package/lib/server/langfuse-login.mjs +58 -0
  138. package/lib/server/static/assets/index-ab25c707.js +1 -1
  139. package/lib/session-store.mjs +6 -4
  140. package/lib/setup.mjs +14 -3
  141. package/lib/{agent-contracts-enforce.mjs โ†’ specialist-contracts-enforce.mjs} +4 -4
  142. package/lib/{agent-contracts.mjs โ†’ specialist-contracts.mjs} +9 -8
  143. package/lib/{agents โ†’ specialists}/postconditions.mjs +3 -3
  144. package/lib/{agents โ†’ specialists}/schema.mjs +6 -6
  145. package/lib/status.mjs +13 -11
  146. package/lib/storage/backup.mjs +2 -2
  147. package/lib/tags/lifecycle.mjs +278 -0
  148. package/lib/tags/vocabulary.mjs +140 -0
  149. package/lib/telemetry/client.mjs +5 -1
  150. package/lib/telemetry/otel-tracer.mjs +184 -0
  151. package/lib/telemetry/skill-calls.mjs +73 -12
  152. package/lib/uninstall/uninstall.mjs +1 -1
  153. package/lib/update.mjs +1 -1
  154. package/lib/validator.mjs +57 -56
  155. package/lib/version.mjs +51 -0
  156. package/lib/worker/trace.mjs +5 -1
  157. package/lib/workflows/instantiate.mjs +320 -0
  158. package/package.json +16 -3
  159. package/personas/construct.md +5 -3
  160. package/platforms/claude/CLAUDE.md +1 -1
  161. package/rules/common/development-workflow.md +2 -1
  162. package/rules/common/no-fabrication.md +69 -0
  163. package/rules/common/review-before-change.md +58 -0
  164. package/scripts/{sync-agents.mjs โ†’ sync-specialists.mjs} +171 -68
  165. package/skills/ai/prompt-optimizer.md +3 -3
  166. package/skills/exploration/dependency-graph-reading.md +98 -0
  167. package/skills/exploration/tracer-bullet-method.md +71 -0
  168. package/skills/exploration/unknown-codebase-onboarding.md +91 -0
  169. package/skills/operating/change-management.md +91 -0
  170. package/skills/operating/incident-response.md +75 -0
  171. package/skills/operating/oncall-rotation.md +95 -0
  172. package/skills/operating/orchestration-reference.md +2 -2
  173. package/skills/strategy/competitive-landscape.md +75 -0
  174. package/skills/strategy/market-research-methods.md +87 -0
  175. package/skills/strategy/narrative-arc.md +77 -0
  176. package/skills/strategy/pricing-positioning.md +94 -0
  177. package/specialists/contracts.json +1002 -0
  178. package/specialists/contracts.schema.json +83 -0
  179. package/specialists/policy-inventory.json +160 -0
  180. package/{agents โ†’ specialists}/prompts/cx-accessibility.md +3 -1
  181. package/{agents โ†’ specialists}/prompts/cx-ai-engineer.md +3 -1
  182. package/{agents โ†’ specialists}/prompts/cx-architect.md +3 -1
  183. package/{agents โ†’ specialists}/prompts/cx-business-strategist.md +3 -1
  184. package/{agents โ†’ specialists}/prompts/cx-data-analyst.md +3 -1
  185. package/{agents โ†’ specialists}/prompts/cx-data-engineer.md +3 -1
  186. package/{agents โ†’ specialists}/prompts/cx-debugger.md +3 -1
  187. package/{agents โ†’ specialists}/prompts/cx-designer.md +3 -1
  188. package/{agents โ†’ specialists}/prompts/cx-devil-advocate.md +3 -1
  189. package/{agents โ†’ specialists}/prompts/cx-docs-keeper.md +4 -2
  190. package/{agents โ†’ specialists}/prompts/cx-engineer.md +4 -2
  191. package/{agents โ†’ specialists}/prompts/cx-evaluator.md +3 -1
  192. package/{agents โ†’ specialists}/prompts/cx-explorer.md +3 -1
  193. package/{agents โ†’ specialists}/prompts/cx-legal-compliance.md +3 -1
  194. package/{agents โ†’ specialists}/prompts/cx-operations.md +3 -1
  195. package/{agents โ†’ specialists}/prompts/cx-orchestrator.md +4 -2
  196. package/{agents โ†’ specialists}/prompts/cx-platform-engineer.md +3 -1
  197. package/{agents โ†’ specialists}/prompts/cx-product-manager.md +3 -1
  198. package/{agents โ†’ specialists}/prompts/cx-qa.md +3 -1
  199. package/{agents โ†’ specialists}/prompts/cx-rd-lead.md +3 -1
  200. package/{agents โ†’ specialists}/prompts/cx-release-manager.md +3 -1
  201. package/{agents โ†’ specialists}/prompts/cx-researcher.md +3 -1
  202. package/{agents โ†’ specialists}/prompts/cx-reviewer.md +4 -2
  203. package/{agents โ†’ specialists}/prompts/cx-security.md +3 -1
  204. package/{agents โ†’ specialists}/prompts/cx-sre.md +4 -2
  205. package/{agents โ†’ specialists}/prompts/cx-test-automation.md +3 -1
  206. package/{agents โ†’ specialists}/prompts/cx-trace-reviewer.md +5 -3
  207. package/{agents โ†’ specialists}/prompts/cx-ux-researcher.md +3 -1
  208. package/{agents โ†’ specialists}/registry.json +651 -418
  209. package/{agents โ†’ specialists}/role-manifests.json +8 -8
  210. package/templates/docs/construct_guide.md +6 -6
  211. package/templates/docs/skill-artifact.md +1 -1
  212. package/templates/provider-scaffold/health.test.mjs +30 -0
  213. package/templates/provider-scaffold/index.mjs +48 -0
  214. package/templates/workflows/cross-team-handoff.yml +85 -0
  215. package/templates/workflows/engineering-onboarding.yml +77 -0
  216. package/templates/workflows/new-feature.yml +53 -0
  217. package/agents/contracts.json +0 -387
  218. /package/{agents โ†’ specialists}/teams.json +0 -0
@@ -1,17 +1,34 @@
1
1
  /**
2
- * lib/cache-strategy-google.js โ€” Google Gemini cache strategy.
2
+ * lib/cache-strategy-google.js โ€” Google Gemini cache strategy (agnostic skeleton).
3
3
  *
4
- * Google uses cachedContent API (resource-based caching, not annotations).
5
- * Cache TTL: 1h via cachedContent resource.
6
- * Requires separate API call to create/update cached content.
4
+ * Gemini uses a resource-based cachedContent API rather than per-message
5
+ * annotations. Construct does not own that integration: this module exposes
6
+ * the same surface as the other cache-strategy adapters and resolves cached
7
+ * resources via a pluggable resolver. The default resolver returns null
8
+ * (no cached resource), which is the safe agnostic default โ€” callers will
9
+ * fall through to a fresh request. Provider plugins or operators can register
10
+ * a resolver via `setCachedContentResolver` to enable resource caching.
7
11
  */
8
12
  import { estimateTokens } from './token-engine.js';
9
13
 
10
14
  const GEMINI_CACHE_ENDPOINT = 'https://generativelanguage.googleapis.com/v1';
11
15
 
16
+ let cachedContentResolver = null;
17
+
18
+ /**
19
+ * Register a resolver responsible for producing a cachedContent resource name
20
+ * for a given system prompt. Contract:
21
+ * resolver({ systemText, caps, apiKey, modelId }) -> Promise<string|null>
22
+ * Returning null means no cached resource is available; the annotation is
23
+ * omitted and the request proceeds without a cached prefix.
24
+ */
25
+ export function setCachedContentResolver(resolver) {
26
+ cachedContentResolver = typeof resolver === 'function' ? resolver : null;
27
+ }
28
+
12
29
  /**
13
- * Annotate prompt structure for Google Gemini models.
14
- * Note: Gemini uses cachedContent API, not message annotations.
30
+ * Annotate prompt structure for Google Gemini models. Returns the shared
31
+ * annotation shape that every cache-strategy adapter emits.
15
32
  *
16
33
  * @param {object} promptStructure - { system, messages }
17
34
  * @param {object} caps - Provider capabilities
@@ -22,12 +39,10 @@ export async function annotate(promptStructure, caps, { apiKey, modelId } = {})
22
39
  const { system, messages } = promptStructure || {};
23
40
 
24
41
  let cachedContentName = null;
25
-
26
- if (apiKey && system) {
42
+ if (cachedContentResolver && apiKey && system) {
27
43
  try {
28
- cachedContentName = await createCachedContent(system, caps, apiKey, modelId);
29
- } catch (err) {
30
- }
44
+ cachedContentName = await cachedContentResolver({ systemText: system, caps, apiKey, modelId });
45
+ } catch { /* resolver failure is non-fatal โ€” fall through with no annotation */ }
31
46
  }
32
47
 
33
48
  return {
@@ -49,26 +64,6 @@ export async function annotate(promptStructure, caps, { apiKey, modelId } = {})
49
64
  };
50
65
  }
51
66
 
52
- async function createCachedContent(systemText, caps, apiKey, modelId) {
53
- // POST to https://generativelanguage.googleapis.com/v1/cachedContents
54
- // Body: { model: 'gemini-1.5-pro', contents: [{ parts: [{ text: systemText }] }] }
55
- // Returns: { name: 'cachedContents/abc123' }
56
-
57
- const model = extractModelName(modelId);
58
- const url = `${GEMINI_CACHE_ENDPOINT}/cachedContents?key=${apiKey}`;
59
-
60
- // This is async but we don't want to block dispatch
61
- // In production, this should be pre-cached
62
- // For now, return null (defer to Phase C follow-up with live probing)
63
- return null;
64
- }
65
-
66
- function extractModelName(modelId) {
67
- const id = String(modelId || '').toLowerCase();
68
- const match = id.match(/google\/(gemini-[^\/]+)/);
69
- return match ? match[1] : 'gemini-1.5-pro';
70
- }
71
-
72
67
  export async function capabilities() {
73
68
  return {
74
69
  supportsAnnotations: false,
@@ -199,14 +199,6 @@ export const CLI_COMMANDS = [
199
199
  { name: 'update', desc: 'Regenerate AUTO-managed regions' },
200
200
  ],
201
201
  },
202
- {
203
- name: 'models',
204
- emoji: '๐Ÿง ',
205
- category: 'Core',
206
- core: true,
207
- description: 'Manage AI model assignments',
208
- usage: 'construct models [--apply|--poll]',
209
- },
210
202
  {
211
203
  name: 'doctor',
212
204
  emoji: '๐Ÿฉบ',
@@ -273,145 +265,251 @@ export const CLI_COMMANDS = [
273
265
  description: 'Task graph management',
274
266
  usage: 'construct graph list|show|from-intake',
275
267
  },
268
+
269
+ // โ”€โ”€ Models & Integrations โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
276
270
  {
277
- name: 'memory',
278
- emoji: '๐Ÿ’ก',
279
- category: 'Work',
280
- core: false,
281
- description: 'Inspect memory layer',
282
- usage: 'construct memory stats|consolidate',
283
- },
284
- {
285
- name: 'reflect',
286
- emoji: '๐Ÿชž',
287
- category: 'Work',
288
- core: false,
289
- description: 'Capture improvement feedback',
290
- usage: 'construct reflect [--summary=<text>]',
291
- },
292
- {
293
- name: 'drop',
294
- emoji: '๐Ÿ“ฅ',
295
- category: 'Work',
296
- core: false,
297
- description: 'Ingest file from Downloads/Desktop',
298
- usage: 'construct drop [--list]',
299
- },
300
- {
301
- name: 'wireframe',
302
- emoji: 'โœ๏ธ',
303
- category: 'Work',
304
- core: false,
305
- description: 'Generate wireframes from description',
306
- usage: 'construct wireframe "<description>"',
307
- },
308
- {
309
- name: 'bootstrap',
310
- emoji: '๐ŸŒฑ',
311
- category: 'Work',
312
- core: false,
313
- description: 'Import seed observations',
314
- usage: 'construct bootstrap',
315
- },
316
- {
317
- name: 'team',
318
- emoji: '๐Ÿ‘ฅ',
319
- category: 'Work',
320
- core: false,
321
- description: 'Team review and templates',
322
- usage: 'construct team review|templates',
271
+ name: 'models',
272
+ emoji: '๐Ÿง ',
273
+ category: 'Models & Integrations',
274
+ description: 'Show or update model tier assignments',
275
+ usage: 'construct models [--poll|--apply|--reset|--tier=TIER|--set=MODEL|--prefer-free|--prefer-free-same-family]',
276
+ options: [
277
+ { flag: '--poll', desc: 'Query OpenRouter for currently free models' },
278
+ { flag: '--apply', desc: 'Auto-apply best free models and sync' },
279
+ { flag: '--reset', desc: 'Remove model overrides, restore defaults' },
280
+ { flag: '--tier=TIER', desc: 'Target tier: reasoning | standard | fast' },
281
+ { flag: '--set=MODEL_ID',desc: 'Set specific model for the tier' },
282
+ { flag: '--prefer-free', desc: 'When inferring sibling tiers, prefer free models where possible' },
283
+ { flag: '--prefer-free-same-family', desc: 'Prefer free siblings only when they stay in the same provider family' },
284
+ ],
323
285
  },
324
-
325
- // โ”€โ”€ Integrations โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
326
286
  {
327
287
  name: 'mcp',
328
288
  emoji: '๐Ÿ”Œ',
329
- category: 'Integrations',
330
- core: false,
289
+ category: 'Models & Integrations',
331
290
  description: 'Manage MCP integrations',
332
- usage: 'construct mcp list|add|remove',
333
- },
334
- {
335
- name: 'ollama',
336
- emoji: '๐Ÿฆ™',
337
- category: 'Integrations',
338
- core: false,
339
- description: 'Manage local Ollama models',
340
- usage: 'construct ollama status|pull|test',
291
+ usage: 'construct mcp <list|add|remove|info> [name]',
292
+ subcommands: [
293
+ { name: 'list', desc: 'Show all MCP integrations and status' },
294
+ { name: 'add', desc: 'Add an MCP integration interactively' },
295
+ { name: 'remove', desc: 'Remove an MCP integration' },
296
+ { name: 'info', desc: 'Show setup details for an integration' },
297
+ ],
341
298
  },
342
299
  {
343
300
  name: 'plugin',
344
301
  emoji: '๐Ÿงฉ',
345
- category: 'Integrations',
346
- core: false,
347
- description: 'Manage plugin manifests',
348
- usage: 'construct plugin list|validate',
302
+ category: 'Models & Integrations',
303
+ description: 'Manage external Construct plugin manifests',
304
+ usage: 'construct plugin <list|info|validate|init> [name]',
305
+ subcommands: [
306
+ { name: 'list', desc: 'Show loaded plugins and manifest sources' },
307
+ { name: 'info', desc: 'Show details for a plugin' },
308
+ { name: 'validate', desc: 'Validate all discovered plugin manifests' },
309
+ { name: 'init', desc: 'Create a starter plugin manifest in .cx/plugins/' },
310
+ ],
349
311
  },
350
312
  {
351
313
  name: 'hosts',
352
314
  emoji: '๐Ÿ–ฅ๏ธ',
353
- category: 'Integrations',
354
- core: false,
355
- description: 'Check host capabilities',
315
+ category: 'Models & Integrations',
316
+ description: 'Show host support for Construct orchestration',
356
317
  usage: 'construct hosts',
357
318
  },
358
319
  {
359
320
  name: 'claude:allow',
360
321
  emoji: '๐Ÿ”“',
361
- category: 'Integrations',
362
- core: false,
363
- description: 'Manage Claude Code permissions',
364
- usage: 'construct claude:allow list|add|check',
322
+ category: 'Models & Integrations',
323
+ description: 'Manage Claude Code `permissions.allow` from the outside (auto-classifier blocks the agent from editing it)',
324
+ usage: 'construct claude:allow <list|add|remove|check> [pattern...] [--apply]',
325
+ subcommands: [
326
+ { name: 'list', desc: 'Print every allowlist entry' },
327
+ { name: 'add', desc: 'Add one or more patterns (idempotent)' },
328
+ { name: 'remove', desc: 'Remove patterns' },
329
+ { name: 'check', desc: 'Detect branch-prefix gaps; `--apply` writes the suggestions' },
330
+ ],
365
331
  },
366
-
332
+
367
333
  // โ”€โ”€ Observability โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
368
334
  {
369
- name: 'cost',
370
- emoji: '๐Ÿ’ฐ',
335
+ name: 'review',
336
+ emoji: '๐Ÿ“ˆ',
371
337
  category: 'Observability',
372
- core: false,
373
- description: 'Token usage and cost breakdown',
374
- usage: 'construct cost [--days=N]',
338
+ description: 'Generate agent performance review from Langfuse trace backend',
339
+ usage: 'construct review [--days=N] [--agent=NAME] [--schedule]',
340
+ options: [
341
+ { flag: '--days=N', desc: 'Review window in days (default: 30)' },
342
+ { flag: '--agent=NAME', desc: 'Filter to a specific agent' },
343
+ { flag: '--out=PATH', desc: 'Output directory' },
344
+ { flag: '--json-only', desc: 'Write raw JSON only, skip markdown report' },
345
+ { flag: '--schedule', desc: 'Schedule automatic weekly reviews' },
346
+ { flag: '--cadence=CRON',desc: 'Cron expression for --schedule (default: Monday 9am)' },
347
+ ],
375
348
  },
376
349
  {
377
- name: 'efficiency',
378
- emoji: '๐Ÿงฎ',
350
+ name: 'optimize',
351
+ emoji: 'โš™๏ธ',
379
352
  category: 'Observability',
380
- core: false,
381
- description: 'Read efficiency metrics',
382
- usage: 'construct efficiency',
353
+ description: 'Prompt optimization using Langfuse trace quality scores',
354
+ usage: 'construct optimize <agent> [--dry-run] [--list]',
355
+ options: [
356
+ { flag: '--dry-run', desc: 'Preview changes without applying' },
357
+ { flag: '--list', desc: 'Show all agents with quality scores' },
358
+ { flag: '--threshold=N', desc: 'Quality threshold to trigger optimization (default: 0.7)' },
359
+ { flag: '--days=N', desc: 'Trace window in days (default: 7)' },
360
+ { flag: '--min-traces=N', desc: 'Minimum traces required (default: 20)' },
361
+ ],
383
362
  },
384
363
  {
385
- name: 'review',
386
- emoji: '๐Ÿ“ˆ',
364
+ name: 'telemetry-backfill',
365
+ emoji: '๐Ÿฉน',
387
366
  category: 'Observability',
388
- core: false,
389
- description: 'Agent performance review',
390
- usage: 'construct review [--days=N]',
367
+ description: 'Backfill sparse traces with observations (trace backend)',
368
+ usage: 'construct telemetry-backfill [--limit=N]',
369
+ options: [
370
+ { flag: '--limit=N', desc: 'Maximum sparse traces to backfill (default: 10)' },
371
+ { flag: '--best-effort', desc: 'Skip failures instead of exiting non-zero' },
372
+ ],
391
373
  },
392
374
  {
393
- name: 'optimize',
394
- emoji: 'โš™๏ธ',
375
+ name: 'eval-datasets',
376
+ emoji: '๐Ÿ“Š',
395
377
  category: 'Observability',
396
- core: false,
397
- description: 'Prompt optimization',
398
- usage: 'construct optimize <agent>',
378
+ description: 'Sync scored Langfuse traces into eval datasets for prompt regression testing',
379
+ usage: 'construct eval-datasets [--limit=N]',
380
+ options: [
381
+ { flag: '--limit=N', desc: 'Maximum scored traces to sync (default: 100)' },
382
+ ],
383
+ },
384
+ {
385
+ name: 'llm-judge',
386
+ emoji: 'โš–๏ธ',
387
+ category: 'Observability',
388
+ description: 'Run LLM-as-a-judge evaluations on unscored traces for continuous quality feedback',
389
+ usage: 'construct llm-judge [--limit=N] [--model=NAME]',
390
+ options: [
391
+ { flag: '--limit=N', desc: 'Maximum traces to evaluate (default: 10)' },
392
+ { flag: '--model=NAME', desc: 'LLM model to use for evaluation (default: claude-3-5-sonnet-20241022)' },
393
+ ],
394
+ },
395
+ {
396
+ name: 'efficiency',
397
+ emoji: '๐Ÿงฎ',
398
+ category: 'Observability',
399
+ description: 'Show read efficiency, repeated files, and context-budget guidance',
400
+ usage: 'construct efficiency [--json]',
401
+ options: [
402
+ { flag: '--json', desc: 'Output raw JSON' },
403
+ ],
399
404
  },
400
405
  {
401
406
  name: 'evals',
402
407
  emoji: '๐Ÿงช',
403
408
  category: 'Observability',
409
+ description: 'Show evaluator catalog for prompt and agent experiments',
410
+ usage: 'construct evals [--json]',
411
+ options: [
412
+ { flag: '--json', desc: 'Output raw JSON' },
413
+ ],
414
+ },
415
+ {
416
+ name: 'cleanup',
417
+ emoji: '๐Ÿงน',
418
+ category: 'Diagnostics',
419
+ description: 'Release dev-agent memory pressure by cleaning stale helper and bridge processes',
420
+ usage: 'construct cleanup [--pressure-release] [--quiet]',
421
+ options: [
422
+ { flag: '--pressure-release', desc: 'Also terminate stale cass index processes when swap is above threshold' },
423
+ { flag: '--quiet', desc: 'Suppress per-process output and only act on the current policy' },
424
+ ],
425
+ },
426
+
427
+ // โ”€โ”€ Teams & Audit โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
428
+ {
429
+ name: 'team',
430
+ emoji: '๐Ÿ‘ฅ',
431
+ category: 'Work',
432
+ description: 'Team review and template listing',
433
+ usage: 'construct team <review|templates>',
434
+ subcommands: [
435
+ { name: 'review', desc: 'Run telemetry-backed team performance review' },
436
+ { name: 'templates', desc: 'List available team templates from specialists/teams.json' },
437
+ ],
438
+ },
439
+ {
440
+ name: 'audit',
441
+ emoji: '๐Ÿ”',
442
+ category: 'Diagnostics',
443
+ description: 'Audit Construct internals and review the mutation trail',
444
+ usage: 'construct audit <skills|trail>',
445
+ subcommands: [
446
+ { name: 'skills', desc: 'Audit skill files for stub headers, broken references, and missing content' },
447
+ { name: 'trail', desc: 'Show the append-only audit trail of every mutation (agent, task, file, hash). Supports --verify, --agent, --tool, --since, --json.' },
448
+ ],
449
+ },
450
+ {
451
+ name: 'doc',
452
+ emoji: '๐Ÿ”',
453
+ category: 'Diagnostics',
454
+ description: 'Verify or inspect auditability stamps on Construct-generated markdown files',
455
+ usage: 'construct doc <verify|install-hooks> [path] [--json]',
456
+ subcommands: [
457
+ { name: 'verify', desc: 'Check body_hash stamps on one file or all .md files under a path. Exits non-zero if any fail.' },
458
+ { name: 'install-hooks', desc: 'Install the prepare-commit-msg git hook into .git/hooks/ for AI provenance trailers.' },
459
+ ],
460
+ },
461
+ {
462
+ name: 'bootstrap',
463
+ emoji: '๐ŸŒฑ',
464
+ category: 'Work',
465
+ description: 'Import seed observation corpus into local memory store for cold-start acceleration',
466
+ usage: 'construct bootstrap [--verbose]',
467
+ options: [
468
+ { flag: '--verbose', desc: 'Print each observation imported or skipped' },
469
+ ],
470
+ },
471
+ {
472
+ name: 'reflect',
473
+ emoji: '๐Ÿชž',
474
+ category: 'Work',
475
+ description: 'Capture improvement feedback from chat session and update Construct core',
476
+ usage: 'construct reflect [--target=<internal|how-tos|decisions>] [--summary=<text>]',
477
+ options: [
478
+ { flag: '--target=<internal|how-tos|decisions>', desc: 'Knowledge subdir to store feedback (default: internal)' },
479
+ { flag: '--summary=<text>', desc: 'Brief summary of the improvement feedback' },
480
+ ],
481
+ },
482
+ {
483
+ name: 'memory',
484
+ emoji: '๐Ÿ’ก',
485
+ category: 'Work',
404
486
  core: false,
405
- description: 'Evaluator catalog',
406
- usage: 'construct evals',
487
+ description: 'Inspect memory layer',
488
+ usage: 'construct memory stats|consolidate',
407
489
  },
408
490
  {
409
- name: 'llm-judge',
410
- emoji: 'โš–๏ธ',
411
- category: 'Observability',
491
+ name: 'drop',
492
+ emoji: '๐Ÿ“ฅ',
493
+ category: 'Work',
494
+ core: false,
495
+ description: 'Ingest file from Downloads/Desktop',
496
+ usage: 'construct drop [--list]',
497
+ },
498
+ {
499
+ name: 'wireframe',
500
+ emoji: 'โœ๏ธ',
501
+ category: 'Work',
502
+ core: false,
503
+ description: 'Generate wireframes from description',
504
+ usage: 'construct wireframe "<description>"',
505
+ },
506
+ {
507
+ name: 'ollama',
508
+ emoji: '๐Ÿฆ™',
509
+ category: 'Integrations',
412
510
  core: false,
413
- description: 'LLM-as-judge evaluations',
414
- usage: 'construct llm-judge',
511
+ description: 'Manage local Ollama models',
512
+ usage: 'construct ollama status|pull|test',
415
513
  },
416
514
 
417
515
  // โ”€โ”€ Advanced (hidden by default) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@@ -487,14 +585,6 @@ export const CLI_COMMANDS = [
487
585
  description: 'Embed mode management',
488
586
  usage: 'construct embed start|stop|status',
489
587
  },
490
- {
491
- name: 'audit',
492
- emoji: '๐Ÿ”',
493
- category: 'Advanced',
494
- core: false,
495
- description: 'Audit Construct internals',
496
- usage: 'construct audit skills|trail',
497
- },
498
588
  {
499
589
  name: 'backup',
500
590
  emoji: '๐Ÿ’พ',
@@ -527,14 +617,6 @@ export const CLI_COMMANDS = [
527
617
  description: 'Show version',
528
618
  usage: 'construct version | construct --version',
529
619
  },
530
- {
531
- name: 'cleanup',
532
- emoji: '๐Ÿงน',
533
- category: 'Advanced',
534
- core: false,
535
- description: 'Clean stale processes',
536
- usage: 'construct cleanup',
537
- },
538
620
  {
539
621
  name: 'skills',
540
622
  emoji: '๐ŸŽฏ',
@@ -559,6 +641,30 @@ export const CLI_COMMANDS = [
559
641
  description: 'Audit policy gates',
560
642
  usage: 'construct gates:audit',
561
643
  },
644
+ {
645
+ name: 'policy',
646
+ emoji: '๐Ÿ”’',
647
+ category: 'Advanced',
648
+ core: false,
649
+ description: 'Show active policy gates with enforcement details',
650
+ usage: 'construct policy show',
651
+ options: [
652
+ { flag: '--json', desc: 'Output as JSON' },
653
+ ],
654
+ },
655
+ {
656
+ name: 'ci',
657
+ emoji: 'โš™๏ธ',
658
+ category: 'Advanced',
659
+ core: false,
660
+ description: 'Local CI mirror: run CI jobs locally or view recent run status',
661
+ usage: 'construct ci <preview|status|list>',
662
+ options: [
663
+ { flag: '--job=<name>', desc: 'Run a single CI job by id or name fragment' },
664
+ { flag: '--list', desc: 'List all jobs without running them' },
665
+ { flag: '--full', desc: 'Include Docker/Trivy steps (requires Docker daemon)' },
666
+ ],
667
+ },
562
668
  {
563
669
  name: 'provider',
564
670
  emoji: '๐Ÿ”Œ',
@@ -575,6 +681,54 @@ export const CLI_COMMANDS = [
575
681
  description: 'Check auth status',
576
682
  usage: 'construct auth:status',
577
683
  },
684
+ {
685
+ name: 'tags',
686
+ emoji: '๐Ÿท',
687
+ category: 'Work',
688
+ core: false,
689
+ description: 'Manage the controlled tag vocabulary (propose, add, deprecate, audit)',
690
+ usage: 'construct tags <audit|propose|add|deprecate|archive|list|proposed>',
691
+ },
692
+ {
693
+ name: 'scheduler',
694
+ emoji: 'โฐ',
695
+ category: 'Advanced',
696
+ core: false,
697
+ description: 'Manage scheduled background jobs (tag-mining, doc-hygiene, skill-rollup)',
698
+ usage: 'construct scheduler <list|run|runner>',
699
+ },
700
+ {
701
+ name: 'creds',
702
+ emoji: '๐Ÿ”‘',
703
+ category: 'Integrations',
704
+ core: false,
705
+ description: 'Manage provider credentials (set, rotate, revoke, list)',
706
+ usage: 'construct creds <list|set|rotate|revoke|test>',
707
+ },
708
+ {
709
+ name: 'providers',
710
+ emoji: '๐Ÿ”Œ',
711
+ category: 'Integrations',
712
+ core: false,
713
+ description: 'Provider status, circuit-breaker reset, and resource discovery',
714
+ usage: 'construct providers <status|discover>',
715
+ },
716
+ {
717
+ name: 'workflow',
718
+ emoji: '๐Ÿ”„',
719
+ category: 'Work',
720
+ core: false,
721
+ description: 'Instantiate workflow templates (PRD-to-review chains, onboarding, handoffs)',
722
+ usage: 'construct workflow <list|show|new>',
723
+ },
724
+ {
725
+ name: 'telemetry',
726
+ emoji: '๐Ÿ“Š',
727
+ category: 'Observability',
728
+ core: false,
729
+ description: 'Query telemetry traces and latency data',
730
+ usage: 'construct telemetry query <latency|top-slow|errors|trace>',
731
+ },
578
732
  ];
579
733
 
580
734
  /** Flat list of all top-level command names (for completions). */