@geraldmaron/construct 1.0.5 → 1.0.7

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 (268) hide show
  1. package/README.md +24 -18
  2. package/agents/contracts.json +617 -2
  3. package/agents/contracts.schema.json +83 -0
  4. package/agents/prompts/cx-accessibility.md +5 -3
  5. package/agents/prompts/cx-ai-engineer.md +9 -7
  6. package/agents/prompts/cx-architect.md +8 -6
  7. package/agents/prompts/cx-business-strategist.md +8 -6
  8. package/agents/prompts/cx-data-analyst.md +9 -7
  9. package/agents/prompts/cx-data-engineer.md +5 -3
  10. package/agents/prompts/cx-debugger.md +8 -6
  11. package/agents/prompts/cx-designer.md +7 -5
  12. package/agents/prompts/cx-devil-advocate.md +6 -4
  13. package/agents/prompts/cx-docs-keeper.md +7 -5
  14. package/agents/prompts/cx-engineer.md +7 -5
  15. package/agents/prompts/cx-evaluator.md +4 -2
  16. package/agents/prompts/cx-explorer.md +10 -8
  17. package/agents/prompts/cx-legal-compliance.md +4 -2
  18. package/agents/prompts/cx-operations.md +7 -5
  19. package/agents/prompts/cx-orchestrator.md +12 -10
  20. package/agents/prompts/cx-platform-engineer.md +7 -5
  21. package/agents/prompts/cx-product-manager.md +6 -4
  22. package/agents/prompts/cx-qa.md +10 -8
  23. package/agents/prompts/cx-rd-lead.md +11 -9
  24. package/agents/prompts/cx-release-manager.md +7 -5
  25. package/agents/prompts/cx-researcher.md +24 -22
  26. package/agents/prompts/cx-reviewer.md +9 -7
  27. package/agents/prompts/cx-security.md +12 -10
  28. package/agents/prompts/cx-sre.md +9 -7
  29. package/agents/prompts/cx-test-automation.md +5 -3
  30. package/agents/prompts/cx-trace-reviewer.md +10 -8
  31. package/agents/prompts/cx-ux-researcher.md +5 -3
  32. package/agents/registry.json +8 -3
  33. package/bin/construct +444 -53
  34. package/commands/build/feature.md +4 -4
  35. package/commands/build/fix.md +8 -8
  36. package/commands/design/access.md +3 -3
  37. package/commands/design/flow.md +3 -3
  38. package/commands/design/ui.md +4 -4
  39. package/commands/measure/experiment.md +5 -5
  40. package/commands/measure/metrics.md +3 -3
  41. package/commands/measure/results.md +4 -4
  42. package/commands/plan/api.md +3 -3
  43. package/commands/plan/challenge.md +3 -3
  44. package/commands/plan/decide.md +3 -3
  45. package/commands/plan/feature.md +7 -7
  46. package/commands/plan/requirements.md +3 -3
  47. package/commands/remember/context.md +5 -5
  48. package/commands/remember/handoff.md +3 -3
  49. package/commands/remember/runbook.md +3 -3
  50. package/commands/review/code.md +8 -8
  51. package/commands/review/quality.md +4 -4
  52. package/commands/review/security.md +3 -3
  53. package/commands/ship/ready.md +3 -3
  54. package/commands/ship/release.md +3 -3
  55. package/commands/ship/status.md +4 -4
  56. package/commands/understand/docs.md +3 -3
  57. package/commands/understand/this.md +4 -4
  58. package/commands/understand/why.md +8 -8
  59. package/commands/work/clean.md +14 -14
  60. package/commands/work/drive.md +10 -10
  61. package/commands/work/optimize-prompts.md +9 -9
  62. package/commands/work/parallel-review.md +8 -8
  63. package/db/schema/006_graph.sql +24 -0
  64. package/examples/provider-plugin/README.md +7 -7
  65. package/examples/seed-observations/README.md +6 -6
  66. package/examples/seed-observations/anti-patterns.md +14 -14
  67. package/examples/seed-observations/decisions.md +4 -4
  68. package/examples/seed-observations/patterns.md +14 -14
  69. package/lib/auto-docs.mjs +13 -8
  70. package/lib/boundary.mjs +126 -0
  71. package/lib/cache-strategy-google.js +26 -31
  72. package/lib/cli-commands.mjs +2 -2
  73. package/lib/comment-lint.mjs +134 -0
  74. package/lib/contracts/validate.mjs +323 -0
  75. package/lib/daemons/contract.mjs +210 -0
  76. package/lib/docs-verify.mjs +59 -6
  77. package/lib/doctor/cli.mjs +16 -1
  78. package/lib/doctor/index.mjs +3 -1
  79. package/lib/doctor/watchers/consistency.mjs +310 -0
  80. package/lib/doctor/watchers/mcp-protocol.mjs +232 -0
  81. package/lib/document-extract.mjs +211 -1
  82. package/lib/embed/cli.mjs +124 -3
  83. package/lib/embed/daemon.mjs +43 -4
  84. package/lib/embed/docs-lifecycle.mjs +1 -1
  85. package/lib/embed/inbox.mjs +2 -0
  86. package/lib/embed/scheduler.mjs +33 -5
  87. package/lib/evaluator-optimizer.mjs +2 -3
  88. package/lib/flavors/loader.mjs +1 -1
  89. package/lib/hooks/comment-lint.mjs +16 -0
  90. package/lib/hooks/mcp-audit.mjs +2 -1
  91. package/lib/hooks/proactive-activation.mjs +0 -14
  92. package/lib/hooks/rule-verifier.mjs +217 -0
  93. package/lib/hooks/session-optimize.mjs +2 -1
  94. package/lib/init-unified.mjs +55 -65
  95. package/lib/intake/classify.mjs +108 -24
  96. package/lib/intake/daemon.mjs +121 -0
  97. package/lib/intake/filesystem-queue.mjs +6 -1
  98. package/lib/intake/intake-config.mjs +2 -1
  99. package/lib/intake/prepare.mjs +0 -1
  100. package/lib/intake/session-prelude.mjs +7 -1
  101. package/lib/intake/traceability.mjs +90 -0
  102. package/lib/knowledge/graph.mjs +213 -0
  103. package/lib/knowledge/research-store.mjs +2 -0
  104. package/lib/maintenance/cleanup.mjs +315 -0
  105. package/lib/mcp/memory-bridge.mjs +276 -0
  106. package/lib/mcp/server.mjs +189 -1
  107. package/lib/mcp/tools/profile.mjs +270 -0
  108. package/lib/mcp/tools/workflow.mjs +25 -0
  109. package/lib/mcp-catalog.json +12 -8
  110. package/lib/mcp-platform-config.mjs +16 -8
  111. package/lib/migrations/index.mjs +106 -0
  112. package/lib/migrations/v1-baseline.mjs +33 -0
  113. package/lib/observation-store.mjs +9 -4
  114. package/lib/outcomes/record.mjs +2 -0
  115. package/lib/profiles/rebrand.mjs +46 -0
  116. package/lib/project-init-shared.mjs +12 -0
  117. package/lib/provider-capabilities.js +20 -7
  118. package/lib/providers/auth-manager.mjs +58 -17
  119. package/lib/reflect.mjs +49 -12
  120. package/lib/server/index.mjs +22 -28
  121. package/lib/session-store.mjs +6 -4
  122. package/lib/setup.mjs +14 -3
  123. package/lib/telemetry/client.mjs +5 -1
  124. package/lib/version.mjs +51 -0
  125. package/lib/worker/trace.mjs +5 -1
  126. package/package.json +4 -1
  127. package/personas/construct.md +3 -1
  128. package/platforms/claude/CLAUDE.md +6 -6
  129. package/rules/common/agents.md +2 -2
  130. package/rules/common/beads-hygiene.md +11 -11
  131. package/rules/common/code-review.md +1 -1
  132. package/rules/common/coding-style.md +1 -1
  133. package/rules/common/comments.md +8 -8
  134. package/rules/common/commit-approval.md +4 -4
  135. package/rules/common/cx-agent-routing.md +2 -2
  136. package/rules/common/cx-skill-routing.md +2 -2
  137. package/rules/common/development-workflow.md +3 -2
  138. package/rules/common/doc-ownership.md +2 -2
  139. package/rules/common/efficiency.md +3 -3
  140. package/rules/common/framing.md +1 -1
  141. package/rules/common/git-workflow.md +1 -1
  142. package/rules/common/no-fabrication.md +69 -0
  143. package/rules/common/patterns.md +1 -1
  144. package/rules/common/performance.md +1 -1
  145. package/rules/common/release-gates.md +7 -7
  146. package/rules/common/research.md +4 -4
  147. package/rules/common/review-before-change.md +58 -0
  148. package/rules/common/security.md +1 -1
  149. package/rules/common/skill-composition.md +8 -8
  150. package/rules/common/testing.md +1 -1
  151. package/rules/golang/coding-style.md +2 -2
  152. package/rules/golang/hooks.md +1 -1
  153. package/rules/golang/patterns.md +1 -1
  154. package/rules/golang/security.md +1 -1
  155. package/rules/golang/testing.md +1 -1
  156. package/rules/python/coding-style.md +1 -1
  157. package/rules/python/hooks.md +1 -1
  158. package/rules/python/patterns.md +1 -1
  159. package/rules/python/security.md +1 -1
  160. package/rules/python/testing.md +1 -1
  161. package/rules/swift/coding-style.md +3 -3
  162. package/rules/swift/hooks.md +2 -2
  163. package/rules/swift/patterns.md +2 -2
  164. package/rules/swift/security.md +4 -4
  165. package/rules/swift/testing.md +2 -2
  166. package/rules/typescript/coding-style.md +1 -1
  167. package/rules/typescript/hooks.md +1 -1
  168. package/rules/typescript/patterns.md +1 -1
  169. package/rules/typescript/security.md +1 -1
  170. package/rules/typescript/testing.md +1 -1
  171. package/rules/web/coding-style.md +1 -1
  172. package/rules/web/design-quality.md +1 -1
  173. package/rules/web/hooks.md +1 -1
  174. package/rules/web/patterns.md +1 -1
  175. package/rules/web/performance.md +1 -1
  176. package/rules/web/security.md +1 -1
  177. package/rules/web/testing.md +1 -1
  178. package/scripts/sync-agents.mjs +45 -14
  179. package/skills/ai/agent-dev.md +1 -1
  180. package/skills/ai/llm-security.md +1 -1
  181. package/skills/ai/ml-ops.md +6 -6
  182. package/skills/ai/orchestration-workflow.md +1 -1
  183. package/skills/ai/prompt-and-eval.md +1 -1
  184. package/skills/ai/prompt-optimizer.md +13 -13
  185. package/skills/ai/rag-system.md +1 -1
  186. package/skills/architecture/api-design.md +1 -1
  187. package/skills/architecture/caching.md +1 -1
  188. package/skills/architecture/cloud-native.md +1 -1
  189. package/skills/architecture/message-queue.md +1 -1
  190. package/skills/architecture/security-arch.md +1 -1
  191. package/skills/compliance/ai-disclosure.md +1 -1
  192. package/skills/compliance/data-privacy.md +1 -1
  193. package/skills/compliance/license-audit.md +2 -2
  194. package/skills/compliance/regulatory-review.md +1 -1
  195. package/skills/development/cpp.md +1 -1
  196. package/skills/development/go.md +1 -1
  197. package/skills/development/java.md +1 -1
  198. package/skills/development/kotlin.md +9 -9
  199. package/skills/development/mobile-crossplatform.md +13 -13
  200. package/skills/development/python.md +1 -1
  201. package/skills/development/rust.md +1 -1
  202. package/skills/development/shell.md +1 -1
  203. package/skills/development/swift.md +6 -6
  204. package/skills/development/typescript.md +1 -1
  205. package/skills/devops/ci-cd.md +5 -5
  206. package/skills/devops/containerization.md +9 -9
  207. package/skills/devops/cost-optimization.md +1 -1
  208. package/skills/devops/data-engineering.md +2 -2
  209. package/skills/devops/database.md +1 -1
  210. package/skills/devops/dependency-management.md +3 -3
  211. package/skills/devops/devsecops.md +1 -1
  212. package/skills/devops/git-workflow.md +1 -1
  213. package/skills/devops/incident-response.md +18 -18
  214. package/skills/devops/monorepo.md +5 -5
  215. package/skills/devops/observability.md +1 -1
  216. package/skills/devops/performance.md +1 -1
  217. package/skills/devops/testing.md +1 -1
  218. package/skills/docs/adr-workflow.md +2 -2
  219. package/skills/docs/backlog-proposal-workflow.md +1 -1
  220. package/skills/docs/customer-profile-workflow.md +1 -1
  221. package/skills/docs/document-ingest-workflow.md +1 -1
  222. package/skills/docs/evidence-ingest-workflow.md +1 -1
  223. package/skills/docs/init-docs.md +15 -15
  224. package/skills/docs/init-project.md +1 -1
  225. package/skills/docs/prd-workflow.md +3 -3
  226. package/skills/docs/prfaq-workflow.md +1 -1
  227. package/skills/docs/product-intelligence-review.md +1 -1
  228. package/skills/docs/product-intelligence-workflow.md +1 -1
  229. package/skills/docs/product-signal-workflow.md +9 -9
  230. package/skills/docs/research-workflow.md +10 -10
  231. package/skills/docs/runbook-workflow.md +2 -2
  232. package/skills/docs/strategy-workflow.md +3 -3
  233. package/skills/exploration/repo-map.md +11 -11
  234. package/skills/frameworks/django.md +15 -15
  235. package/skills/frameworks/nextjs.md +16 -16
  236. package/skills/frameworks/react.md +12 -12
  237. package/skills/frameworks/spring-boot.md +12 -12
  238. package/skills/frontend-design/accessibility.md +6 -6
  239. package/skills/frontend-design/component-patterns.md +1 -1
  240. package/skills/frontend-design/engineering.md +1 -1
  241. package/skills/frontend-design/state-management.md +1 -1
  242. package/skills/frontend-design/ui-aesthetics.md +1 -1
  243. package/skills/frontend-design/ux-principles.md +1 -1
  244. package/skills/operating/orchestration-reference.md +27 -27
  245. package/skills/quality-gates/review-work.md +3 -3
  246. package/skills/quality-gates/verify-change.md +1 -1
  247. package/skills/quality-gates/verify-module.md +1 -1
  248. package/skills/quality-gates/verify-quality.md +1 -1
  249. package/skills/quality-gates/verify-security.md +1 -1
  250. package/skills/routing.md +14 -14
  251. package/skills/security/blue-team.md +1 -1
  252. package/skills/security/code-audit.md +1 -1
  253. package/skills/security/pentest.md +1 -1
  254. package/skills/security/red-team.md +1 -1
  255. package/skills/security/threat-intel.md +1 -1
  256. package/skills/security/vuln-research.md +1 -1
  257. package/skills/utility/clean-code.md +2 -2
  258. package/templates/docs/changelog-entry.md +1 -1
  259. package/templates/docs/construct_guide.md +18 -18
  260. package/templates/docs/meta-prd.md +16 -16
  261. package/templates/docs/one-pager.md +1 -1
  262. package/templates/docs/prd-business.md +1 -1
  263. package/templates/docs/prd-platform.md +1 -1
  264. package/templates/docs/prd.md +17 -17
  265. package/templates/docs/research-brief.md +8 -8
  266. package/templates/docs/rfc.md +1 -1
  267. package/templates/docs/skill-artifact.md +1 -1
  268. package/templates/docs/strategy.md +1 -1
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/swift/security.md <one-line purpose>
2
+ rules/swift/security.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -14,9 +14,9 @@ paths:
14
14
 
15
15
  ## Secret Management
16
16
 
17
- - Use **Keychain Services** for sensitive data (tokens, passwords, keys) never `UserDefaults`
17
+ - Use **Keychain Services** for sensitive data (tokens, passwords, keys): never `UserDefaults`
18
18
  - Use environment variables or `.xcconfig` files for build-time secrets
19
- - Never hardcode secrets in source decompilation tools extract them trivially
19
+ - Never hardcode secrets in source: decompilation tools extract them trivially
20
20
 
21
21
  ```swift
22
22
  let apiKey = ProcessInfo.processInfo.environment["API_KEY"]
@@ -27,7 +27,7 @@ guard let apiKey, !apiKey.isEmpty else {
27
27
 
28
28
  ## Transport Security
29
29
 
30
- - App Transport Security (ATS) is enforced by default do not disable it
30
+ - App Transport Security (ATS) is enforced by default: do not disable it
31
31
  - Use certificate pinning for critical endpoints
32
32
  - Validate all server certificates
33
33
 
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/swift/testing.md <one-line purpose>
2
+ rules/swift/testing.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -27,7 +27,7 @@ func userCreationValidatesEmail() throws {
27
27
 
28
28
  ## Test Isolation
29
29
 
30
- Each test gets a fresh instance set up in `init`, tear down in `deinit`. No shared mutable state between tests.
30
+ Each test gets a fresh instance: set up in `init`, tear down in `deinit`. No shared mutable state between tests.
31
31
 
32
32
  ## Parameterized Tests
33
33
 
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/typescript/coding-style.md <one-line purpose>
2
+ rules/typescript/coding-style.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/typescript/hooks.md <one-line purpose>
2
+ rules/typescript/hooks.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/typescript/patterns.md <one-line purpose>
2
+ rules/typescript/patterns.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/typescript/security.md <one-line purpose>
2
+ rules/typescript/security.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/typescript/testing.md <one-line purpose>
2
+ rules/typescript/testing.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/coding-style.md <one-line purpose>
2
+ rules/web/coding-style.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/design-quality.md <one-line purpose>
2
+ rules/web/design-quality.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/hooks.md <one-line purpose>
2
+ rules/web/hooks.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/patterns.md <one-line purpose>
2
+ rules/web/patterns.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/performance.md <one-line purpose>
2
+ rules/web/performance.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/security.md <one-line purpose>
2
+ rules/web/security.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- rules/web/testing.md <one-line purpose>
2
+ rules/web/testing.md: <one-line purpose>
3
3
 
4
4
  <2–6 line summary.>
5
5
  -->
@@ -121,6 +121,18 @@ if (validationErrors.length > 0) {
121
121
  process.exit(1);
122
122
  }
123
123
 
124
+ // Sync-time contract validation: contracts.json shape, schema refs, and
125
+ // producer/consumer name resolution against the registry above.
126
+ {
127
+ const { validateContractsFile } = await import("../lib/contracts/validate.mjs");
128
+ const contractsResult = validateContractsFile();
129
+ if (!contractsResult.ok) {
130
+ console.error("Contract validation failed:");
131
+ for (const err of contractsResult.errors) console.error(` - ${err}`);
132
+ process.exit(1);
133
+ }
134
+ }
135
+
124
136
  // --- Dry-run + lockfile + two-phase write infrastructure ---
125
137
 
126
138
  const DRY_RUN = process.argv.includes("--dry-run");
@@ -671,9 +683,13 @@ ${agentList || "(all specialists are internal — routed through Construct)"}`;
671
683
  if (!settings.mcpServers) settings.mcpServers = {};
672
684
  const registryMcp = registry.mcpServers ?? {};
673
685
  for (const [id, mcpDef] of Object.entries(registryMcp)) {
674
- const existing = JSON.stringify(settings.mcpServers[id] ?? "");
686
+ const existingEntry = settings.mcpServers[id];
687
+ const existing = JSON.stringify(existingEntry ?? "");
675
688
  const hasPlaceholder = existing.includes("__");
676
- if (settings.mcpServers[id] && !hasPlaceholder) continue;
689
+ const registryWantsCommand = !mcpDef.type && Array.isArray(mcpDef.args);
690
+ const existingIsRemote = existingEntry && (existingEntry.type === 'http' || existingEntry.type === 'remote');
691
+ const transportMismatch = registryWantsCommand && existingIsRemote;
692
+ if (existingEntry && !hasPlaceholder && !transportMismatch) continue;
677
693
  settings.mcpServers[id] = buildClaudeMcpEntry(id, mcpDef, process.env);
678
694
  }
679
695
  if (!DRY_RUN) fs.writeFileSync(claudeSettingsPath, JSON.stringify(settings, null, 2) + "\n");
@@ -711,8 +727,8 @@ function hasCodexMcpTable(text, id) {
711
727
  return new RegExp(`^\\[mcp_servers\\.(?:${escapeRegExp(id)}|${escapeRegExp(tomlString(id))})\\]`, "m").test(text);
712
728
  }
713
729
 
714
- function isCodexMcpSupported(id) {
715
- return id !== "memory";
730
+ function isCodexMcpSupported() {
731
+ return true;
716
732
  }
717
733
 
718
734
  function syncCodex(entries) {
@@ -834,9 +850,13 @@ function syncVSCode() {
834
850
  if (!settings["github.copilot.mcpServers"]) settings["github.copilot.mcpServers"] = {};
835
851
  const mcpServers = settings["github.copilot.mcpServers"];
836
852
  for (const [id, mcpDef] of Object.entries(registryMcp)) {
837
- const existing = JSON.stringify(mcpServers[id] ?? "");
853
+ const existingEntry = mcpServers[id];
854
+ const existing = JSON.stringify(existingEntry ?? "");
838
855
  const hasPlaceholder = existing.includes("__");
839
- if (mcpServers[id] && !hasPlaceholder) continue;
856
+ const registryWantsCommand = !mcpDef.type && Array.isArray(mcpDef.args);
857
+ const existingIsRemote = existingEntry && (existingEntry.type === 'http' || existingEntry.type === 'remote');
858
+ const transportMismatch = registryWantsCommand && existingIsRemote;
859
+ if (existingEntry && !hasPlaceholder && !transportMismatch) continue;
840
860
  mcpServers[id] = buildClaudeMcpEntry(id, mcpDef, process.env);
841
861
  }
842
862
  settings["github.copilot.mcpServers"] = mcpServers;
@@ -862,9 +882,13 @@ function syncCursor() {
862
882
  const config = JSON.parse(fs.readFileSync(cursorMcpPath, "utf8"));
863
883
  if (!config.mcpServers) config.mcpServers = {};
864
884
  for (const [id, mcpDef] of Object.entries(registryMcp)) {
865
- const existing = JSON.stringify(config.mcpServers[id] ?? "");
885
+ const existingEntry = config.mcpServers[id];
886
+ const existing = JSON.stringify(existingEntry ?? "");
866
887
  const hasPlaceholder = existing.includes("__");
867
- if (config.mcpServers[id] && !hasPlaceholder) continue;
888
+ const registryWantsCommand = !mcpDef.type && Array.isArray(mcpDef.args);
889
+ const existingIsRemote = existingEntry && (existingEntry.type === 'http' || existingEntry.type === 'remote');
890
+ const transportMismatch = registryWantsCommand && existingIsRemote;
891
+ if (existingEntry && !hasPlaceholder && !transportMismatch) continue;
868
892
  config.mcpServers[id] = buildClaudeMcpEntry(id, mcpDef, process.env);
869
893
  }
870
894
  if (!DRY_RUN) fs.writeFileSync(cursorMcpPath, JSON.stringify(config, null, 2) + "\n");
@@ -963,14 +987,21 @@ function syncOpencode(entries) {
963
987
  for (const [id, mcpDef] of Object.entries(registryMcp)) {
964
988
  const openCodeId = getOpenCodeMcpId(id);
965
989
  if (openCodeId !== id) delete config.mcp[id];
966
- if (id === 'memory' && config.mcp.cass && !config.mcp[openCodeId]) {
967
- config.mcp[openCodeId] = config.mcp.cass;
968
- }
969
990
  if (id === 'memory') delete config.mcp.cass;
970
- const existing = JSON.stringify(config.mcp[openCodeId] ?? "");
971
- const hasPlaceholder = existing.includes("__") && existing.includes("__");
991
+
992
+ // Migrate the legacy cass-memory HTTP entry to the stdio bridge. cm v0.2.x
993
+ // rejects the MCP handshake (OpenCode surfaces 405 on the SSE GET), so
994
+ // any remote/http memory entry must be rewritten when the registry
995
+ // defines a command-based bridge.
996
+ const existingEntry = config.mcp[openCodeId];
997
+ const registryWantsCommand = !mcpDef.type && Array.isArray(mcpDef.args);
998
+ const existingIsRemote = existingEntry && (existingEntry.type === 'remote' || existingEntry.type === 'http');
999
+ const transportMismatch = registryWantsCommand && existingIsRemote;
1000
+
1001
+ const existing = JSON.stringify(existingEntry ?? "");
1002
+ const hasPlaceholder = existing.includes("__");
972
1003
  const argsHaveTemplates = (mcpDef.args ?? []).some((a) => typeof a === 'string' && a.includes('__'));
973
- if (!config.mcp[openCodeId] || hasPlaceholder || argsHaveTemplates) {
1004
+ if (!existingEntry || hasPlaceholder || argsHaveTemplates || transportMismatch) {
974
1005
  config.mcp[openCodeId] = buildOpenCodeMcpEntry(id, mcpDef, process.env).entry;
975
1006
  }
976
1007
  }
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/agent-dev.md AI Agent Development Use this skill when building AI agents, tool-use systems, or multi-agent workflo
2
+ skills/ai/agent-dev.md (AI Agent Development) Use this skill when building AI agents, tool-use systems, or multi-agent workflo
3
3
 
4
4
  Use this skill when building AI agents, tool-use systems, or multi-agent workflows. ## Agent Architecture
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/llm-security.md LLM Security Use this skill when securing LLM-powered applications against prompt injection,
2
+ skills/ai/llm-security.md (LLM Security) Use this skill when securing LLM-powered applications against prompt injection,
3
3
 
4
4
  Use this skill when securing LLM-powered applications against prompt injection, data leakage, and misuse. ## Prompt Injection
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/ml-ops.md ML Operations (MLOps) ```
2
+ skills/ai/ml-ops.md (ML Operations (MLOps)) ```
3
3
 
4
4
  ## The MLOps Lifecycle ```
5
5
  -->
@@ -86,7 +86,7 @@ Central store for model versions and deployment state:
86
86
 
87
87
  | Stage | Meaning |
88
88
  |---|---|
89
- | Staging | Candidate passes evaluation, not yet in production |
89
+ | Staging | Candidate: passes evaluation, not yet in production |
90
90
  | Production | Currently serving |
91
91
  | Archived | Superseded |
92
92
 
@@ -117,7 +117,7 @@ async def predict(req: PredictRequest) -> PredictResponse:
117
117
 
118
118
  ### A/B testing / Shadow mode
119
119
 
120
- - **Shadow mode**: new model receives traffic and logs predictions but does not serve users validate before switching
120
+ - **Shadow mode**: new model receives traffic and logs predictions but does not serve users: validate before switching
121
121
  - **A/B test**: split traffic (e.g., 10% new model) and measure business metrics, not just accuracy
122
122
  - Use a feature flag system to control routing
123
123
 
@@ -162,8 +162,8 @@ Trigger retraining when:
162
162
 
163
163
  ## Common Pitfalls
164
164
 
165
- - **Training-serving skew**: feature engineering in training differs from serving solve with a shared feature pipeline
166
- - **Data leakage**: future information in training features inflates metrics use strict temporal splits
165
+ - **Training-serving skew**: feature engineering in training differs from serving: solve with a shared feature pipeline
166
+ - **Data leakage**: future information in training features inflates metrics: use strict temporal splits
167
167
  - **Model staleness without detection**: set up drift monitoring day 1, not after the model degrades
168
168
  - **No rollback plan**: always keep N-1 model version in registry and test rollback procedure
169
- - **GPU waste**: jobs that could run on CPU scheduled on GPU profile resource usage
169
+ - **GPU waste**: jobs that could run on CPU scheduled on GPU: profile resource usage
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/orchestration-workflow.md Construct Orchestration Workflow Use this skill when the request involves agent orchestration, phase transitions,
2
+ skills/ai/orchestration-workflow.md (Construct Orchestration Workflow) Use this skill when the request involves agent orchestration, phase transitions,
3
3
 
4
4
  Use this skill when the request involves agent orchestration, phase transitions, task keys, handoff quality, workflow state, or project alignment. ## Core Model
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/prompt-and-eval.md Prompt Engineering and Evaluation Use this skill when designing prompts, evaluating model performance, or optimizi
2
+ skills/ai/prompt-and-eval.md (Prompt Engineering and Evaluation) Use this skill when designing prompts, evaluating model performance, or optimizi
3
3
 
4
4
  Use this skill when designing prompts, evaluating model performance, or optimizing LLM behavior. ## Prompt Structure
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/prompt-optimizer.md Closed-loop prompt auto-optimization guide.
2
+ skills/ai/prompt-optimizer.md: Closed-loop prompt auto-optimization guide.
3
3
 
4
4
  Uses telemetry traces and quality scores as the feedback signal, Claude as the optimizer,
5
5
  and the agent registry + construct sync as the deployment layer.
@@ -24,15 +24,15 @@ construct optimize --list
24
24
  construct optimize cx-debugger --threshold=0.65 --days=14 --min-traces=15
25
25
  ```
26
26
 
27
- The optimizer requires Python 3.12+ (`pip3` must be available). It will auto-install `dspy-ai` and `requests` on first run. Set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` in `.env`. DSPy uses the same LLM key Construct uses no separate setup.
27
+ The optimizer requires Python 3.12+ (`pip3` must be available). It will auto-install `dspy-ai` and `requests` on first run. Set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` in `.env`. DSPy uses the same LLM key Construct uses: no separate setup.
28
28
 
29
29
  ## When to run
30
30
 
31
31
  - Triggered by `/work:optimize-prompts` (manual) or the scheduled task `prompt-optimization-weekly`
32
32
  - Automatically suggested when `cx-trace-reviewer` finds an agent with median quality score below 0.65 over the past 7 days
33
- - Never run optimization on prompts with fewer than 20 scored traces insufficient signal
33
+ - Never run optimization on prompts with fewer than 20 scored traces: insufficient signal
34
34
 
35
- ## Step 1 Gather signal
35
+ ## Step 1: Gather signal
36
36
 
37
37
  Retrieve the current production prompt for the target agent from `agents/registry.json` (or the corresponding `promptFile` if using extracted prompts).
38
38
 
@@ -50,7 +50,7 @@ GET {CONSTRUCT_TELEMETRY_URL}/api/public/scores?traceId={id}&name=quality
50
50
 
51
51
  Filter to scores where `value < 0.7`. For each low-scoring trace, extract: the prompt used, the user input, the model output, the quality score, and any human comments.
52
52
 
53
- ## Step 2 Diagnose failure patterns
53
+ ## Step 2: Diagnose failure patterns
54
54
 
55
55
  Analyze the low-scoring traces as a batch. Identify recurring failure modes. Common patterns:
56
56
 
@@ -65,16 +65,16 @@ Analyze the low-scoring traces as a batch. Identify recurring failure modes. Com
65
65
 
66
66
  Write a failure summary: top 3 patterns with supporting trace count and representative examples.
67
67
 
68
- ## Step 3 Generate improved prompt
68
+ ## Step 3: Generate improved prompt
69
69
 
70
70
  Write an improved prompt that directly addresses the diagnosed failures. Rules:
71
71
 
72
- 1. **Keep what works** compare high-scoring traces (>0.8) to low-scoring ones. Only change what's associated with failures.
73
- 2. **Surgical edits, not rewrites** changing everything risks breaking current strengths. Identify the specific clauses that correlate with failures.
74
- 3. **Be explicit, not vague** if the failure is "too verbose", add a concrete rule ("respond in under 150 words for questions that fit on one line") not a general note ("be concise").
75
- 4. **Add a self-check instruction** append a brief checklist the agent runs before responding, derived from the top failure patterns.
72
+ 1. **Keep what works**: compare high-scoring traces (>0.8) to low-scoring ones. Only change what's associated with failures.
73
+ 2. **Surgical edits, not rewrites**: changing everything risks breaking current strengths. Identify the specific clauses that correlate with failures.
74
+ 3. **Be explicit, not vague**: if the failure is "too verbose", add a concrete rule ("respond in under 150 words for questions that fit on one line") not a general note ("be concise").
75
+ 4. **Add a self-check instruction**: append a brief checklist the agent runs before responding, derived from the top failure patterns.
76
76
 
77
- ## Step 4 Push to staging
77
+ ## Step 4: Push to staging
78
78
 
79
79
  Update the agent's prompt in `agents/registry.json` (or the corresponding `promptFile`) with a staging marker comment. Tag the version by writing to `.cx/decisions/prompt-staging-{agent}-{date}.md`.
80
80
 
@@ -82,7 +82,7 @@ Log the candidate prompt as a span attribute on a test run batch using `cx_trace
82
82
 
83
83
  Do not overwrite the production prompt in the registry until promotion is confirmed.
84
84
 
85
- ## Step 5 Monitor staging
85
+ ## Step 5: Monitor staging
86
86
 
87
87
  After at least 20 scored traces on the staging version:
88
88
  - Compare median quality score: staging vs production
@@ -91,7 +91,7 @@ After at least 20 scored traces on the staging version:
91
91
 
92
92
  To promote: update the agent registry with the accepted prompt and run `construct sync`.
93
93
 
94
- ## Step 6 Document the optimization
94
+ ## Step 6: Document the optimization
95
95
 
96
96
  Write to `.cx/decisions/` with:
97
97
  - Which agent was optimized
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/ai/rag-system.md RAG System Design Use this skill when building retrieval-augmented generation pipelines, vector se
2
+ skills/ai/rag-system.md (RAG System Design) Use this skill when building retrieval-augmented generation pipelines, vector se
3
3
 
4
4
  Use this skill when building retrieval-augmented generation pipelines, vector search, or knowledge-grounded AI systems. ## Document Processing
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/architecture/api-design.md API Design Use this skill when designing REST, GraphQL, or gRPC APIs.
2
+ skills/architecture/api-design.md (API Design) Use this skill when designing REST, GraphQL, or gRPC APIs.
3
3
 
4
4
  Use this skill when designing REST, GraphQL, or gRPC APIs. ## REST Design Principles
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/architecture/caching.md Caching Use this skill when designing caching strategies for applications, APIs, or infr
2
+ skills/architecture/caching.md (Caching) Use this skill when designing caching strategies for applications, APIs, or infr
3
3
 
4
4
  Use this skill when designing caching strategies for applications, APIs, or infrastructure. ## Cache Layers
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/architecture/cloud-native.md Cloud-Native Architecture Use this skill when designing containerized, orchestrated, or microservice-based
2
+ skills/architecture/cloud-native.md (Cloud-Native Architecture) Use this skill when designing containerized, orchestrated, or microservice-based
3
3
 
4
4
  Use this skill when designing containerized, orchestrated, or microservice-based systems. ## Container Best Practices
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/architecture/message-queue.md Message Queues and Event-Driven Architecture Use this skill when designing asynchronous communication, event-driven systems,
2
+ skills/architecture/message-queue.md (Message Queues and Event-Driven Architecture) Use this skill when designing asynchronous communication, event-driven systems,
3
3
 
4
4
  Use this skill when designing asynchronous communication, event-driven systems, or message-based integrations. ## When to Use Message Queues
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/architecture/security-arch.md Security Architecture Use this skill when designing authentication, authorization, network security, o
2
+ skills/architecture/security-arch.md (Security Architecture) Use this skill when designing authentication, authorization, network security, o
3
3
 
4
4
  Use this skill when designing authentication, authorization, network security, or zero-trust architectures. ## Zero Trust Principles
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/compliance/ai-disclosure.md AI Disclosure AI transparency, disclosure, and regulatory compliance.
2
+ skills/compliance/ai-disclosure.md (AI Disclosure) AI transparency, disclosure, and regulatory compliance.
3
3
 
4
4
  Use this skill when reviewing AI features for disclosure requirements, transparency obligations, or emerging AI regulation compliance.
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/compliance/data-privacy.md Data Privacy GDPR, CCPA, and data protection compliance patterns.
2
+ skills/compliance/data-privacy.md (Data Privacy) GDPR, CCPA, and data protection compliance patterns.
3
3
 
4
4
  Use this skill when reviewing data collection, storage, processing, or retention for privacy regulation compliance.
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/compliance/license-audit.md License Audit Dependency license review and open-source compliance.
2
+ skills/compliance/license-audit.md (License Audit) Dependency license review and open-source compliance.
3
3
 
4
4
  Use this skill when auditing dependency licenses, evaluating OSS compliance risk, or preparing license inventories for legal review.
5
5
  -->
@@ -24,7 +24,7 @@ Use this skill when auditing dependency licenses, evaluating OSS compliance risk
24
24
  3. Map each dependency to its SPDX license identifier
25
25
  4. Flag any dependency without a clear license file as unknown-risk
26
26
  5. Check for license changes between pinned versions and latest
27
- 6. Look past layer one transitive copyleft taints the whole tree
27
+ 6. Look past layer one: transitive copyleft taints the whole tree
28
28
 
29
29
  ## Red Flags
30
30
 
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/compliance/regulatory-review.md Regulatory Review Pre-ship compliance review checklist and process.
2
+ skills/compliance/regulatory-review.md (Regulatory Review) Pre-ship compliance review checklist and process.
3
3
 
4
4
  Use this skill when conducting a compliance review before shipping features that handle user data, financial transactions, AI decisions, or regulated content.
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/development/cpp.md C/C++ Best Practices Use this skill when writing, reviewing, or debugging C or C++ code.
2
+ skills/development/cpp.md (C/C++ Best Practices) Use this skill when writing, reviewing, or debugging C or C++ code.
3
3
 
4
4
  Use this skill when writing, reviewing, or debugging C or C++ code. ## Project Structure
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/development/go.md Go Best Practices Use this skill when writing, reviewing, or debugging Go code.
2
+ skills/development/go.md (Go Best Practices) Use this skill when writing, reviewing, or debugging Go code.
3
3
 
4
4
  Use this skill when writing, reviewing, or debugging Go code. ## Project Structure
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/development/java.md Java Best Practices Use this skill when writing, reviewing, or debugging Java or Kotlin code on the
2
+ skills/development/java.md (Java Best Practices) Use this skill when writing, reviewing, or debugging Java or Kotlin code on the
3
3
 
4
4
  Use this skill when writing, reviewing, or debugging Java or Kotlin code on the JVM. ## Project Structure
5
5
  -->
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/development/kotlin.md Kotlin / Android Development | Scope | Use when |
2
+ skills/development/kotlin.md (Kotlin / Android Development) | Scope | Use when |
3
3
 
4
4
  ## Coroutines & Flows ### Coroutine scope discipline
5
5
  -->
@@ -14,7 +14,7 @@ skills/development/kotlin.md — Kotlin / Android Development — | Scope | Use
14
14
  | `viewModelScope` | ViewModel-bound work; auto-cancelled on clear |
15
15
  | `lifecycleScope` | Fragment/Activity-bound; cancelled on destroy |
16
16
  | `rememberCoroutineScope()` | Compose-scoped; cancelled on composition exit |
17
- | `GlobalScope` | Never uncontrolled lifetime |
17
+ | `GlobalScope` | Never: uncontrolled lifetime |
18
18
 
19
19
  ```kotlin
20
20
  class ItemViewModel(private val repo: ItemRepository) : ViewModel() {
@@ -31,7 +31,7 @@ class ItemViewModel(private val repo: ItemRepository) : ViewModel() {
31
31
 
32
32
  ### Flow operators
33
33
 
34
- - `stateIn(scope, SharingStarted.WhileSubscribed(5_000), initial)` converts cold flow to hot StateFlow for UI consumption
34
+ - `stateIn(scope, SharingStarted.WhileSubscribed(5_000), initial)`: converts cold flow to hot StateFlow for UI consumption
35
35
  - `map`, `filter`, `distinctUntilChanged`, `debounce` for transform chains
36
36
  - `combine` for merging multiple flows
37
37
  - Use `flowOn(Dispatchers.IO)` for upstream CPU/IO work; do not switch dispatchers in the collector
@@ -43,7 +43,7 @@ class ItemViewModel(private val repo: ItemRepository) : ViewModel() {
43
43
  | `Dispatchers.Main` | UI updates |
44
44
  | `Dispatchers.IO` | Network, disk, database |
45
45
  | `Dispatchers.Default` | CPU-intensive work |
46
- | `Dispatchers.Unconfined` | Rarely only in tests |
46
+ | `Dispatchers.Unconfined` | Rarely: only in tests |
47
47
 
48
48
  ## Jetpack Compose
49
49
 
@@ -69,7 +69,7 @@ fun ItemList(items: List<Item>, onDelete: (Item) -> Unit) { ... }
69
69
 
70
70
  - `remember` expensive computations with stable keys
71
71
  - `key(id) { ... }` in lazy lists to preserve item identity
72
- - Avoid unstable lambdas use `remember { { ... } }` or stable function references
72
+ - Avoid unstable lambdas: use `remember { { ... } }` or stable function references
73
73
  - Enable Compose compiler metrics to detect recomposition hot spots
74
74
  - Prefer `LazyColumn` over `Column` for variable-length lists
75
75
 
@@ -134,7 +134,7 @@ Scoping: `@Singleton` for app-scoped, `@ActivityRetainedScoped` for ViewModel-li
134
134
 
135
135
  ## Common Pitfalls
136
136
 
137
- - `collect` in `Fragment.onViewCreated` without `repeatOnLifecycle(STARTED)` causes collection after view destruction
138
- - `StateFlow.value` reads in tests without collecting use `turbine` or `runTest { first() }`
139
- - Leaking `Activity` context into long-lived objects use `applicationContext`
140
- - `LazyColumn` with `items(list)` where `list` is `State<List<...>>` causing full recomposition use `key` param
137
+ - `collect` in `Fragment.onViewCreated` without `repeatOnLifecycle(STARTED)`: causes collection after view destruction
138
+ - `StateFlow.value` reads in tests without collecting: use `turbine` or `runTest { first() }`
139
+ - Leaking `Activity` context into long-lived objects: use `applicationContext`
140
+ - `LazyColumn` with `items(list)` where `list` is `State<List<...>>` causing full recomposition: use `key` param
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/development/mobile-crossplatform.md Mobile Cross-Platform Development Before choosing a framework, answer:
2
+ skills/development/mobile-crossplatform.md (Mobile Cross-Platform Development) Before choosing a framework, answer:
3
3
 
4
4
  ## Decision Framework: Native vs Cross-Platform Before choosing a framework, answer:
5
5
  -->
@@ -13,11 +13,11 @@ Before choosing a framework, answer:
13
13
  |---|---|---|
14
14
  | Platform-specific APIs needed (ARKit, Health, NFC)? | Yes | No |
15
15
  | Animation fidelity is a differentiator? | Yes | Partial |
16
- | Single team, both platforms? | | Yes |
16
+ | Single team, both platforms? |: | Yes |
17
17
  | Heavy use of platform OS widgets? | Yes | No |
18
- | App is primarily data-display / CRUD? | | Yes |
19
- | Existing web team? | | React Native |
20
- | Existing Kotlin/Swift team? | Native | |
18
+ | App is primarily data-display / CRUD? |: | Yes |
19
+ | Existing web team? |: | React Native |
20
+ | Existing Kotlin/Swift team? | Native |: |
21
21
 
22
22
  ---
23
23
 
@@ -42,7 +42,7 @@ Future<List<Item>> items(ItemsRef ref) async {
42
42
 
43
43
  ### Performance
44
44
 
45
- - `const` constructors everywhere possible eliminates widget rebuilds
45
+ - `const` constructors everywhere possible: eliminates widget rebuilds
46
46
  - `RepaintBoundary` around independently-animated subtrees
47
47
  - Profile with Flutter DevTools → CPU flame chart + widget rebuild tracker
48
48
  - `ListView.builder` for lazy lists; never `ListView(children: [...])` for long lists
@@ -78,8 +78,8 @@ testWidgets('shows items on load', (tester) async {
78
78
  ### New Architecture (React Native 0.74+)
79
79
 
80
80
  Enable the New Architecture by default on new projects. Key changes:
81
- - JSI replaces the async bridge sync native calls
82
- - Fabric replaces the native renderer concurrent React features work correctly
81
+ - JSI replaces the async bridge: sync native calls
82
+ - Fabric replaces the native renderer: concurrent React features work correctly
83
83
  - TurboModules replace native modules
84
84
 
85
85
  ### State & logic sharing with web
@@ -130,11 +130,11 @@ export default function ItemScreen() { ... }
130
130
 
131
131
  ## Common Pitfalls (both frameworks)
132
132
 
133
- - **Deep linking not tested until late** set up universal links / app links in week 1
134
- - **Push notifications complexity** Expo Notifications or Firebase Cloud Messaging; plan for permission states
135
- - **Over-the-air update strategy** define what can be OTA vs what requires App Store review
136
- - **Platform capability divergence** features available on iOS 17+ may be absent on Android 12; maintain a capability matrix
137
- - **Code signing automation** `fastlane match` (iOS) and keystore management (Android) require upfront investment; do it early
133
+ - **Deep linking not tested until late**: set up universal links / app links in week 1
134
+ - **Push notifications complexity**: Expo Notifications or Firebase Cloud Messaging; plan for permission states
135
+ - **Over-the-air update strategy**: define what can be OTA vs what requires App Store review
136
+ - **Platform capability divergence**: features available on iOS 17+ may be absent on Android 12; maintain a capability matrix
137
+ - **Code signing automation**: `fastlane match` (iOS) and keystore management (Android) require upfront investment; do it early
138
138
 
139
139
  ## When to go native anyway
140
140
 
@@ -1,5 +1,5 @@
1
1
  <!--
2
- skills/development/python.md Python Best Practices Use this skill when writing, reviewing, or debugging Python code.
2
+ skills/development/python.md (Python Best Practices) Use this skill when writing, reviewing, or debugging Python code.
3
3
 
4
4
  Use this skill when writing, reviewing, or debugging Python code. ## Project Structure
5
5
  -->