ecoportal-api-graphql 1.3.5 → 1.3.9

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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/.ai-assistance/bridge/CLAUDE.md +338 -0
  3. data/.ai-assistance/bridge/archive/.gitkeep +0 -0
  4. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +29 -0
  5. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +18 -0
  6. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +42 -0
  7. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +115 -0
  8. data/.ai-assistance/bridge/context/gemini-review-prompt.txt +48 -0
  9. data/.ai-assistance/bridge/context/gemini-review-response.md +104 -0
  10. data/.ai-assistance/bridge/context/project.md +42 -0
  11. data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
  12. data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
  13. data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +48 -0
  14. data/.ai-assistance/bridge/queue/.gitkeep +1 -0
  15. data/.ai-assistance/capabilities/CLAUDE.md +27 -0
  16. data/.ai-assistance/capabilities/assumptions-log.md +80 -0
  17. data/.ai-assistance/capabilities/code.md +47 -0
  18. data/.ai-assistance/capabilities/connectors.md +37 -0
  19. data/.ai-assistance/capabilities/cowork.md +55 -0
  20. data/.ai-assistance/code/OVERVIEW.md +155 -0
  21. data/.ai-assistance/code/data_fields.md +242 -0
  22. data/.ai-assistance/code/dependencies.md +151 -0
  23. data/.ai-assistance/code/diff_as_input.md +234 -0
  24. data/.ai-assistance/code/diff_service_deep_dive.md +192 -0
  25. data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +55 -0
  26. data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +181 -0
  27. data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +192 -0
  28. data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +147 -0
  29. data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +277 -0
  30. data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +200 -0
  31. data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +228 -0
  32. data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +197 -0
  33. data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +243 -0
  34. data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +196 -0
  35. data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +132 -0
  36. data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +187 -0
  37. data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +236 -0
  38. data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +183 -0
  39. data/.ai-assistance/code/ecoportal_schema_reference.md +240 -0
  40. data/.ai-assistance/code/graphql_domain_knowledge.md +230 -0
  41. data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +71 -0
  42. data/.ai-assistance/code/refactoring/opportunities.md +251 -0
  43. data/.ai-assistance/code/schema_analysis.md +321 -0
  44. data/.ai-assistance/code/search_filters.md +868 -0
  45. data/.ai-assistance/code/spec_coverage.md +73 -0
  46. data/.ai-assistance/code/workflow-command-guide.md +438 -0
  47. data/.ai-assistance/code/workflow-space.md +353 -0
  48. data/.ai-assistance/conventions/CLAUDE.md +30 -0
  49. data/.ai-assistance/conventions/code-working-tree-protocol.md +199 -0
  50. data/.ai-assistance/conventions/gitignore-rules.md +42 -0
  51. data/.ai-assistance/conventions/permission-guidance.md +120 -0
  52. data/.ai-assistance/integrations/README.md +70 -0
  53. data/.ai-assistance/integrations/gitkraken-mcp.md +107 -0
  54. data/.ai-assistance/integrations/gitlab-mcp.md +123 -0
  55. data/.ai-assistance/integrations/local-git.md +60 -0
  56. data/.ai-assistance/local_paths.example.md +17 -0
  57. data/.ai-assistance/projects/TODO.md +97 -0
  58. data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +168 -0
  59. data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +60 -0
  60. data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +267 -0
  61. data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +53 -0
  62. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +102 -0
  63. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +139 -0
  64. data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +93 -0
  65. data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +244 -0
  66. data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +266 -0
  67. data/.ai-assistance/projects/eco-helpers-compat/TODO.md +86 -0
  68. data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +101 -0
  69. data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +177 -0
  70. data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +161 -0
  71. data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +125 -0
  72. data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +126 -0
  73. data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +256 -0
  74. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +122 -0
  75. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +148 -0
  76. data/.ai-assistance/projects/page-model/DECISIONS.md +245 -0
  77. data/.ai-assistance/projects/page-model/TODO.md +190 -0
  78. data/.ai-assistance/projects/search-filter-builder/INTENT.md +107 -0
  79. data/.ai-assistance/projects/search-filter-builder/TODO.md +131 -0
  80. data/.ai-assistance/projects/template-maintenance/DESIGN.md +134 -0
  81. data/.ai-assistance/projects/workflow-space/TODO.md +213 -0
  82. data/.ai-assistance/reinstall-claude-desktop-windows.md +136 -0
  83. data/.ai-assistance/scripts/CLAUDE.md +150 -0
  84. data/.ai-assistance/scripts/bridge-init.sh +86 -0
  85. data/.ai-assistance/scripts/bridge-status.sh +44 -0
  86. data/.ai-assistance/scripts/capabilities-check.ts +104 -0
  87. data/.ai-assistance/scripts/check-outbox.sh +43 -0
  88. data/.ai-assistance/scripts/dep_graph.rb +91 -0
  89. data/.ai-assistance/scripts/lock-acquire.sh +103 -0
  90. data/.ai-assistance/scripts/lock-multi.sh +124 -0
  91. data/.ai-assistance/scripts/lock-queue.sh +94 -0
  92. data/.ai-assistance/scripts/setup-mcps.test.ts +188 -0
  93. data/.ai-assistance/scripts/setup-mcps.ts +234 -0
  94. data/.ai-assistance/scripts/task-complete.ts +74 -0
  95. data/.ai-assistance/scripts/task-create.ts +75 -0
  96. data/.ai-assistance/scripts/task-read.ts +125 -0
  97. data/.ai-assistance/scripts/token-logger.js +220 -0
  98. data/.ai-assistance/scripts/token-report.ts +158 -0
  99. data/.ai-assistance/scripts/token-session-start.js +66 -0
  100. data/.ai-assistance/skills/ai-instructions/SKILL.md +48 -0
  101. data/.ai-assistance/skills/code-specs/SKILL.md +69 -0
  102. data/.ai-assistance/skills/corporate-policies/SKILL.md +201 -0
  103. data/.ai-assistance/skills/dep-graph/SKILL.md +139 -0
  104. data/.ai-assistance/skills/ep-ai-manager/SKILL.md +417 -0
  105. data/.ai-assistance/skills/gemini-assist/SKILL.md +63 -0
  106. data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +205 -0
  107. data/.ai-assistance/skills/gemini-assist/gemini_ask.py +1 -0
  108. data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +240 -0
  109. data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +25 -0
  110. data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +261 -0
  111. data/.ai-assistance/skills/project-cycle/SKILL.md +177 -0
  112. data/.ai-assistance/skills/refactor/SKILL.md +62 -0
  113. data/.ai-assistance/skills/rubocop/SKILL.md +93 -0
  114. data/.ai-assistance/skills/ruby-scripting/SKILL.md +215 -0
  115. data/.ai-assistance/skills/spec-generation/SKILL.md +72 -0
  116. data/.ai-assistance/standards-version.json +21 -0
  117. data/.ai-assistance/token-budget.json +32 -0
  118. data/.ai-assistance/version.json +39 -0
  119. data/.claude/settings.json +146 -0
  120. data/.env.example +18 -0
  121. data/.gitattributes +15 -0
  122. data/.gitignore +13 -0
  123. data/.rubocop.yml +121 -97
  124. data/CHANGELOG.md +673 -477
  125. data/CLAUDE.md +232 -0
  126. data/Gemfile +30 -6
  127. data/Rakefile +90 -38
  128. data/docs/worklog.md +574 -0
  129. data/ecoportal-api-graphql.gemspec +40 -40
  130. data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
  131. data/lib/ecoportal/api/common/graphql/client.rb +1 -1
  132. data/lib/ecoportal/api/common/graphql/http_client.rb +35 -3
  133. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
  134. data/lib/ecoportal/api/common/graphql/model/as_input.rb +8 -5
  135. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +3 -1
  136. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +31 -23
  137. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +54 -1
  138. data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
  139. data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
  140. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
  141. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
  142. data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
  143. data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
  144. data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
  145. data/lib/ecoportal/api/graphql/base/force.rb +65 -0
  146. data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
  147. data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
  148. data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
  149. data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
  150. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
  151. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
  152. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
  153. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +112 -0
  154. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
  155. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
  156. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
  157. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
  158. data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
  159. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
  160. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
  161. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
  162. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
  163. data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
  164. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
  165. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
  166. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
  167. data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
  168. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
  169. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
  170. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
  171. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
  172. data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
  173. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
  174. data/lib/ecoportal/api/graphql/base/page/phased.rb +1 -0
  175. data/lib/ecoportal/api/graphql/base/page/section.rb +36 -0
  176. data/lib/ecoportal/api/graphql/base/page/section_collection.rb +79 -0
  177. data/lib/ecoportal/api/graphql/base/page.rb +2 -0
  178. data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
  179. data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
  180. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
  181. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
  182. data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
  183. data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
  184. data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
  185. data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
  186. data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
  187. data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
  188. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
  189. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
  190. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
  191. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
  192. data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
  193. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
  194. data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
  195. data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
  196. data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
  197. data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
  198. data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
  199. data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
  200. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
  201. data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
  202. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
  203. data/lib/ecoportal/api/graphql/base/register.rb +18 -0
  204. data/lib/ecoportal/api/graphql/base.rb +11 -0
  205. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
  206. data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
  207. data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
  208. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
  209. data/lib/ecoportal/api/graphql/builder/register.rb +27 -19
  210. data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
  211. data/lib/ecoportal/api/graphql/builder.rb +2 -0
  212. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +107 -0
  213. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
  214. data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
  215. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
  216. data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
  217. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
  218. data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
  219. data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
  220. data/lib/ecoportal/api/graphql/compat.rb +17 -0
  221. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
  222. data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
  223. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +21 -28
  224. data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
  225. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
  226. data/lib/ecoportal/api/graphql/concerns.rb +4 -0
  227. data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
  228. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
  229. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
  230. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
  231. data/lib/ecoportal/api/graphql/connection.rb +4 -0
  232. data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -0
  233. data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
  234. data/lib/ecoportal/api/graphql/fragment/action.rb +1 -1
  235. data/lib/ecoportal/api/graphql/fragment/action_category.rb +1 -1
  236. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +1 -1
  237. data/lib/ecoportal/api/graphql/fragment/force.rb +30 -0
  238. data/lib/ecoportal/api/graphql/fragment/location_draft.rb +2 -2
  239. data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -1
  240. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +1 -1
  241. data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
  242. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +395 -0
  243. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
  244. data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
  245. data/lib/ecoportal/api/graphql/fragment/pagination.rb +1 -1
  246. data/lib/ecoportal/api/graphql/fragment.rb +37 -27
  247. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +25 -0
  248. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
  249. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
  250. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
  251. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
  252. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
  253. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
  254. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
  255. data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
  256. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
  257. data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
  258. data/lib/ecoportal/api/graphql/input/page.rb +26 -0
  259. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
  260. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
  261. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
  262. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
  263. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
  264. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
  265. data/lib/ecoportal/api/graphql/input/register.rb +13 -0
  266. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
  267. data/lib/ecoportal/api/graphql/input/search_conf.rb +367 -0
  268. data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
  269. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
  270. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
  271. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
  272. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
  273. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
  274. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
  275. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +18 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
  277. data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
  278. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
  280. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
  281. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
  282. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
  283. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
  284. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
  285. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
  286. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
  287. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
  288. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
  289. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
  290. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
  291. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
  292. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
  293. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
  294. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
  295. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
  296. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
  297. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
  298. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
  299. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
  300. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
  301. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
  302. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
  303. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
  304. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
  305. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
  306. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
  307. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
  308. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
  309. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
  310. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
  311. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
  312. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
  313. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
  314. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
  315. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
  316. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
  317. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
  318. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
  319. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
  320. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
  321. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
  322. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
  323. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
  324. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
  325. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
  326. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
  327. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
  328. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
  329. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
  330. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
  331. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
  332. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
  333. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
  334. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
  335. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
  336. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
  337. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
  338. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
  339. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
  340. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
  341. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
  342. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
  343. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
  344. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
  345. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
  346. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
  347. data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
  348. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
  349. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
  350. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
  351. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
  352. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
  353. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
  354. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
  355. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
  356. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
  357. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
  358. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
  359. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
  360. data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
  361. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
  362. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
  363. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
  364. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
  365. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
  366. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
  367. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
  368. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
  369. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
  370. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
  371. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
  372. data/lib/ecoportal/api/graphql/input.rb +8 -0
  373. data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
  374. data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
  375. data/lib/ecoportal/api/graphql/logic/base_model.rb +2 -0
  376. data/lib/ecoportal/api/graphql/logic/base_query.rb +45 -2
  377. data/lib/ecoportal/api/graphql/logic/input.rb +15 -0
  378. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
  379. data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
  380. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
  381. data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
  382. data/lib/ecoportal/api/graphql/model/page.rb +1 -0
  383. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
  384. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
  385. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
  386. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
  387. data/lib/ecoportal/api/graphql/model/register.rb +10 -0
  388. data/lib/ecoportal/api/graphql/model.rb +8 -0
  389. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
  390. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
  391. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
  392. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
  393. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
  394. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
  395. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
  396. data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
  397. data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
  398. data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
  399. data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
  400. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +3 -3
  401. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +2 -2
  402. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +2 -2
  403. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +3 -3
  404. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +3 -3
  405. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
  406. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
  407. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +40 -0
  408. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
  409. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +40 -0
  410. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
  411. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +40 -0
  412. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
  413. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +51 -0
  414. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +40 -0
  415. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
  416. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
  417. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
  418. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
  419. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
  420. data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
  421. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
  422. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
  423. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +35 -0
  424. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
  425. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
  426. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
  427. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
  428. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
  429. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
  430. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
  431. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
  432. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
  433. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
  434. data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
  435. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
  436. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
  437. data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
  438. data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
  439. data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
  440. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
  441. data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
  442. data/lib/ecoportal/api/graphql/mutation.rb +8 -0
  443. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
  444. data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
  445. data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
  446. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
  447. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
  448. data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
  449. data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
  450. data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
  451. data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
  452. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +21 -0
  453. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
  454. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
  455. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
  456. data/lib/ecoportal/api/graphql/payload/page/draft.rb +13 -0
  457. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
  458. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
  459. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
  460. data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
  461. data/lib/ecoportal/api/graphql/payload/page.rb +19 -0
  462. data/lib/ecoportal/api/graphql/payload/preset_view.rb +11 -0
  463. data/lib/ecoportal/api/graphql/payload/register.rb +11 -0
  464. data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
  465. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
  466. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
  467. data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
  468. data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
  469. data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
  470. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
  471. data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
  472. data/lib/ecoportal/api/graphql/payload.rb +11 -0
  473. data/lib/ecoportal/api/graphql/query/action.rb +1 -1
  474. data/lib/ecoportal/api/graphql/query/action_categories.rb +1 -1
  475. data/lib/ecoportal/api/graphql/query/actions.rb +2 -2
  476. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +1 -1
  477. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
  478. data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +2 -2
  479. data/lib/ecoportal/api/graphql/query/location_structure.rb +1 -1
  480. data/lib/ecoportal/api/graphql/query/location_structures.rb +1 -1
  481. data/lib/ecoportal/api/graphql/query/page.rb +45 -0
  482. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
  483. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +43 -0
  484. data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
  485. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +59 -0
  486. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
  487. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
  488. data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
  489. data/lib/ecoportal/api/graphql/query.rb +11 -0
  490. data/lib/ecoportal/api/graphql.rb +60 -2
  491. data/lib/ecoportal/api/graphql_version.rb +5 -5
  492. data/scripts/auto-worker-scheduler.sh +386 -0
  493. data/tests/contractor_entity_create.rb +19 -19
  494. data/tests/contractor_entity_udpate.rb +20 -20
  495. data/tests/dump_page_model.rb +74 -0
  496. data/tests/loc_structure_get.rb +1 -2
  497. data/tests/loc_structure_update.rb +51 -51
  498. data/tests/loc_structures_get.rb +15 -15
  499. metadata +436 -5
@@ -0,0 +1,120 @@
1
+ # AI Agent Permission Guidance
2
+
3
+ How Claude Code should help the developer reduce permission prompts over time,
4
+ without requiring them to watch the screen for confirmations on routine operations.
5
+
6
+ ---
7
+
8
+ ## When to suggest a new allowlist entry
9
+
10
+ Suggest adding a permission when **any** of these is true:
11
+
12
+ - A command pattern has prompted for confirmation **2+ times in the current session**
13
+ - The command is part of a **defined workflow** in this repo (e.g. bridge lock release,
14
+ running specs, rubocop checks) — suggest on first occurrence
15
+ - The command is clearly **read-only or reversible via git** and will recur regularly
16
+
17
+ Do **not** suggest permissions for:
18
+ - One-off exploratory commands unlikely to recur
19
+ - Interpreter invocations with arbitrary inline code (`ruby -e`, `python3 -c`, `node -e`)
20
+ - Anything that pushes to remote, modifies gem publish config, or touches main/master
21
+
22
+ ---
23
+
24
+ ## How to phrase the suggestion
25
+
26
+ Inline, at the end of the turn (never mid-task). One sentence:
27
+
28
+ > "Tip: add `Bash(bundle exec rspec *)` to `.claude/settings.json` → `permissions.allow`
29
+ > to skip this prompt in future sessions."
30
+
31
+ If it's a compound command (`cd path && cmd`), note that the bare pattern won't match
32
+ and explain the scope choice:
33
+
34
+ > "This command starts with `cd`, so `Bash(git commit *)` won't cover it.
35
+ > Add `Bash(cd C:/ruby_scripts/git/ecoportal-api-v2 && git commit *)` to that repo's
36
+ > `.claude/settings.json`, or add `Bash(git commit *)` to `~/.claude/settings.json`
37
+ > to cover all repos globally."
38
+
39
+ ---
40
+
41
+ ## Project vs global scope
42
+
43
+ | Rule type | Where to add | When |
44
+ |-----------|-------------|------|
45
+ | Repo-specific test/lint runners | `.claude/settings.json` (this repo) | When working only in this repo |
46
+ | Cross-repo git operations (`cd sibling && git *`) | Sibling repo's `.claude/settings.json` OR `~/.claude/settings.json` | When the sibling is a regular work target |
47
+ | Universal read/check operations | `~/.claude/settings.json` | When the same pattern recurs across multiple repos |
48
+ | `defaultMode: acceptEdits` | `.claude/settings.json` per repo, or global | When the developer is comfortable with auto-accepted edits in that scope |
49
+
50
+ ---
51
+
52
+ ## Permission pattern format
53
+
54
+ ```
55
+ Bash(<prefix>*) # prefix match — note the space before * for subcommands
56
+ Bash(<exact command>) # exact match — no wildcard
57
+ Read(<glob>) # file read allow/deny
58
+ WebFetch(domain:<host>) # network allow
59
+ ```
60
+
61
+ Compound command example:
62
+ ```
63
+ Bash(cd C:/ruby_scripts/git/ecoportal-api-v2 && git commit *)
64
+ ```
65
+
66
+ **Never** suggest wildcard patterns that grant arbitrary code execution:
67
+ `Bash(ruby *)`, `Bash(python3 *)`, `Bash(node *)`, `Bash(bundle exec *)` (too broad),
68
+ `Bash(bash *)`, `Bash(npm run *)`, etc.
69
+
70
+ `Bash(bundle exec rspec *)` and `Bash(bundle exec rubocop *)` are acceptable because
71
+ they are specific named tools, not arbitrary script runners.
72
+
73
+ ---
74
+
75
+ ## Autonomy zones — what Code can do without asking
76
+
77
+ These apply regardless of what is in `settings.json`. Follow them to avoid unnecessary
78
+ confirmation requests in conversation.
79
+
80
+ ### Zone 1 — Never prompt (fully autonomous)
81
+ - All file **reads** (any repo, any path)
82
+ - `git status`, `git log`, `git diff`, `git branch`, `git show` (already auto-allowed)
83
+ - `bundle exec rspec *`, `bundle exec rubocop *` (now in allowlist)
84
+ - Writing/editing files in `.ai-assistance/` (docs, logs, skills, specs)
85
+ - Reading bridge STATUS and LOCK files
86
+
87
+ ### Zone 2 — Act, then notify in the same turn
88
+ - Edit + commit any file in **this repo** on a non-main branch (follow working-tree protocol)
89
+ - Update `.ai-assistance/` docs in any local repo clone
90
+
91
+ ### Zone 3 — State intent, proceed unless told to stop
92
+ - First commit to a **sibling repo** in the current session — report the current branch,
93
+ state the intended commit, wait one exchange for objection before proceeding
94
+ - Creating a new branch — name it, state why, proceed unless redirected
95
+
96
+ ### Zone 4 — Always confirm before acting
97
+ - `git push` to any remote
98
+ - Any change to `main`/`master` directly
99
+ - Gemspec or Gemfile modifications
100
+ - Changes that affect the public API of this gem
101
+
102
+ ---
103
+
104
+ ## Suggesting workflow improvements
105
+
106
+ As the developer becomes familiar with routine tasks, proactively suggest improvements
107
+ to the agentic workflow — but only when:
108
+
109
+ 1. The same friction point has appeared **3+ times** across sessions (check memory)
110
+ 2. The suggestion is **safe** (versioned, recoverable via git, no external side effects)
111
+ 3. There is a **clear instruction file** where the improvement would live
112
+
113
+ Example triggers and suggestions:
114
+
115
+ | Friction observed | Suggested improvement |
116
+ |------------------|-----------------------|
117
+ | Repeated `cd sibling && git commit` prompts | Add pattern to sibling repo's `.claude/settings.json` |
118
+ | Repeated rubocop runs on same file | Offer to add a post-edit rubocop hook in `settings.json` |
119
+ | Repeated bridge LOCK release prompts | Already resolved — in allowlist |
120
+ | Cross-repo branch check on every session | Offer to add a session-start branch-summary script to bridge-init.sh |
@@ -0,0 +1,70 @@
1
+ # Optional Dev Integrations
2
+
3
+ This folder documents optional tool integrations that enhance AI-assisted development for this project. None are required to work on the codebase — but each one meaningfully reduces token usage, speeds up the project cycle, and gives AI agents richer context without manual copy-pasting.
4
+
5
+ ---
6
+
7
+ ## Available Integrations
8
+
9
+ | Integration | What it provides | Setup effort | Token savings |
10
+ |-------------|-----------------|--------------|---------------|
11
+ | [Local git diff](#local-git-no-setup) | Branch vs main diff, current branch detection | None — works today | Medium |
12
+ | [GitKraken MCP](./gitkraken-mcp.md) | Local git history, branches, commits, GitLab issue/MR context | Low (CLI + login) | High |
13
+ | [GitLab MCP](./gitlab-mcp.md) | Remote MR diffs, pipeline status, issue management, semantic code search | Medium (requires GitLab Duo) | High |
14
+
15
+ ---
16
+
17
+ ## Local Git (No Setup)
18
+
19
+ The simplest integration is already available: any AI agent can run `git` commands via the shell to understand the current branch state.
20
+
21
+ **What I use this for automatically:**
22
+ - Detecting whether you're on a feature branch or main
23
+ - Running `git diff main...HEAD --stat` at session start to understand what's in flight
24
+ - Checking `git log --oneline -10` to see recent commit history
25
+ - Updating project TODO/DECISIONS when a commit lands
26
+
27
+ **No configuration needed.** See [local-git.md](./local-git.md) for the full command reference I use.
28
+
29
+ ---
30
+
31
+ ## Lifecycle Benefits Summary
32
+
33
+ ### Without any integrations
34
+ Every session starts cold. I read files to understand what changed, ask you what branch we're on, and can't see pipeline or MR status without you pasting it in.
35
+
36
+ ### With GitKraken MCP
37
+ I can answer "what's the diff since main?", "what commits are on this branch?", and "what GitLab issues are open?" without any copy-pasting. Git context is live and accurate. Works entirely from local repos — no remote API calls needed for git operations.
38
+
39
+ ### With GitLab MCP
40
+ I can read MR diffs directly, check CI pipeline results, add inline review comments, create issues, and run semantic code searches against your GitLab instance. Closes the loop between local work and remote review without context switching.
41
+
42
+ ### Combined
43
+ At the start of a session: I check the branch, pull the diff vs main, cross-reference against the active project TODO, and know exactly where we left off — in seconds, with no prompting from you.
44
+
45
+ ---
46
+
47
+ ## Collaborator Setup
48
+
49
+ **The fast path — run the setup script:**
50
+
51
+ ```bash
52
+ npx ts-node .ai-assistance/scripts/setup-mcps.ts
53
+ ```
54
+
55
+ This handles GitKraken + GitLab in one go. It reads your GitLab PAT from `.env` as a
56
+ default so you usually just press Enter. Then restart Claude Desktop.
57
+
58
+ Prerequisites before running:
59
+ - GitKraken CLI installed and authenticated (`gk auth login`) — https://www.gitkraken.com/cli
60
+ - A GitLab PAT for `gitlab.ecoportal.co.nz` with scopes:
61
+ `read_api`, `read_repository`, `create_runner`, `ai_features`
62
+ Enable token rotation. Create at: https://gitlab.ecoportal.co.nz/-/user_settings/personal_access_tokens
63
+
64
+ **Why global config, not per-project?**
65
+ Claude Desktop MCP servers must be configured globally (`claude_desktop_config.json`).
66
+ The script writes to that file but is driven from this repo — teammates run it once per
67
+ machine and the repo docs explain what and why. Credentials are per-user and never committed.
68
+
69
+ **Manual setup:** See [gitkraken-mcp.md](./gitkraken-mcp.md) and [gitlab-mcp.md](./gitlab-mcp.md)
70
+ for full details if you prefer to configure by hand or need to troubleshoot.
@@ -0,0 +1,107 @@
1
+ # GitKraken MCP — Local Git Context for AI Agents
2
+
3
+ **What it is:** An MCP server bundled with GitLens (v17.5+) that gives AI agents live access to local Git operations, branch history, commit details, and GitLab issue/MR context — without exposing credentials or requiring per-repo configuration.
4
+
5
+ **Why it's useful here:** Works entirely from local clones. Every repo in our stack (`ecoportal-api`, `ecoportal-api-v2`, `graphlient`, `eco-helpers`) is cloned locally, so GitKraken MCP can read all of them without any remote API calls for git operations.
6
+
7
+ ---
8
+
9
+ ## Lifecycle Benefits
10
+
11
+ | Without | With |
12
+ |---------|------|
13
+ | "What branch are we on?" requires manual answer | Agent checks automatically |
14
+ | Commit history requires `git log` bash calls | Agent queries GitKraken MCP directly |
15
+ | GitLab issue context requires copy-paste | Agent fetches via MCP |
16
+ | Branch comparison requires reading multiple files | Agent diffs branches instantly |
17
+
18
+ **Token saving:** GitKraken MCP returns structured data for git queries, replacing bash output parsing and file reads. Estimated saving: 20–40% on session orientation tasks.
19
+
20
+ ---
21
+
22
+ ## Prerequisites
23
+
24
+ - GitLens 17.5 or later installed in VS Code / Cursor
25
+ - GitKraken account (your existing license covers this)
26
+ - GitKraken CLI (`gk`) installed and authenticated
27
+
28
+ **No API key needed.** Authentication is via your GitKraken account (browser OAuth).
29
+
30
+ ---
31
+
32
+ ## Setup: Claude Code (CLI)
33
+
34
+ ```bash
35
+ # 1. Install and authenticate the GitKraken CLI
36
+ gk auth login # opens browser for OAuth
37
+
38
+ # 2. Add the MCP server to Claude Code
39
+ claude mcp add -t stdio gitkraken gk mcp
40
+
41
+ # 3. Verify
42
+ claude mcp list # should show gitkraken
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Setup: Cowork / Claude Desktop
48
+
49
+ 1. Open Claude Desktop → **Settings** → **Developer** → **Edit Config**
50
+ 2. Add to `claude_desktop_config.json`:
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": {
55
+ "gitkraken": {
56
+ "command": "gk",
57
+ "args": ["mcp"]
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ 3. Save and restart Claude Desktop.
64
+
65
+ > **Note on args:** Gemini suggests `["mcp", "start"]` — the official GitKraken docs use `["mcp"]`. Both have been reported working; if one fails, try the other. The `gk mcp` command is the authoritative form per https://help.gitkraken.com/mcp/mcp-getting-started/
66
+ 4. On first use, a browser window will open for GitKraken OAuth — approve it.
67
+
68
+ ---
69
+
70
+ ## Setup: VS Code / Cursor (via GitLens)
71
+
72
+ The fastest path if you have GitLens installed:
73
+
74
+ 1. Open the Command Palette (`Ctrl/Cmd+Shift+P`)
75
+ 2. Run: `GitLens: Install GitKraken MCP Server`
76
+ 3. Done — no JSON editing required.
77
+
78
+ Alternatively use the deep link: https://gitkraken.dev/deeplink?product=gitlens&path=/link/command/install-mcp&ide=vscode
79
+
80
+ ---
81
+
82
+ ## Note on Local-Only Repos
83
+
84
+ The GitKraken MCP reads local git state directly via the `gk` CLI — it does **not** require the repo to be pushed to a remote to read branches, commits, or diffs. For GitLab-specific operations (issues, MRs), it connects through GitKraken's cloud service using your linked GitLab account.
85
+
86
+ If your repos are only local (not yet pushed): git history, branches, diffs, and commits all work. GitLab issue/MR features require the repo to exist on GitLab.
87
+
88
+ ---
89
+
90
+ ## Key Tools Available
91
+
92
+ - Branch listing and comparison
93
+ - Commit history and diff by commit
94
+ - Stash inspection
95
+ - GitLab issues assigned to you
96
+ - GitLab MR status and diffs (requires GitLab linked in GitKraken)
97
+
98
+ Full reference: https://help.gitkraken.com/mcp/mcp-tools-reference/
99
+
100
+ ---
101
+
102
+ ## Verify It's Working
103
+
104
+ In Claude Code or Cowork, ask:
105
+ > "What branch am I on in ecoportal-api-graphql and how many commits ahead of main is it?"
106
+
107
+ A working integration will answer immediately without a bash call.
@@ -0,0 +1,123 @@
1
+ # GitLab MCP — Remote Repository & MR Integration
2
+
3
+ > ⚠️ **Instance note:** `gitlab.ecoportal.co.nz` runs **Community Edition v18.10.1**.
4
+ > The official GitLab MCP server (requires Premium/Ultimate + GitLab Duo) is **not available**.
5
+ > This guide covers the community alternative, which works with any GitLab instance via a PAT.
6
+
7
+ ---
8
+
9
+ ## Community Alternative: `gitlab-mr-mcp`
10
+
11
+ **Repo:** https://github.com/kopfrechner/gitlab-mr-mcp
12
+
13
+ Works with GitLab CE/EE on any version. Provides the core MR workflow tools via the GitLab REST API and a personal access token.
14
+
15
+ ### What it provides
16
+
17
+ | Tool | What it does |
18
+ |------|-------------|
19
+ | List MRs for a project | See open/merged MRs |
20
+ | Get MR details | Title, status, reviewers, description |
21
+ | Get MR diffs | Full code diff for an MR — key for cycle-end review |
22
+ | Add MR comments | Post review comments without leaving the agent |
23
+ | List/get issues | Read issue details |
24
+
25
+ ### What it doesn't provide (vs official MCP)
26
+ - Semantic code search (requires Duo)
27
+ - Pipeline management
28
+ - Workitem notes (uses simpler comment API instead)
29
+
30
+ ---
31
+
32
+ ## Prerequisites
33
+
34
+ - Node.js installed
35
+ - A GitLab **personal access token** with the following scopes:
36
+
37
+ | Scope | Why |
38
+ |-------|-----|
39
+ | `read_api` | Read MRs, issues, diffs |
40
+ | `write_repository` | Post MR comments (notes) |
41
+
42
+ **Create a PAT:** GitLab → User avatar → Preferences → Access Tokens → Add new token.
43
+ Minimum scopes: `read_api`. Add `write_repository` only if you want to post comments.
44
+
45
+ Store the token in `.env` at repo root (already git-ignored):
46
+ ```
47
+ GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
48
+ GITLAB_URL=https://gitlab.ecoportal.co.nz
49
+ ```
50
+
51
+ ---
52
+
53
+ ## Setup: Claude Code (CLI)
54
+
55
+ ```bash
56
+ claude mcp add --transport stdio gitlab-mr \
57
+ npx -- -y @kopfrechner/gitlab-mr-mcp
58
+ ```
59
+
60
+ Then set environment variables in your shell profile or pass them inline:
61
+ ```bash
62
+ export GITLAB_TOKEN=glpat-xxxx
63
+ export GITLAB_URL=https://gitlab.ecoportal.co.nz
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Setup: Cowork / Claude Desktop
69
+
70
+ Add to `claude_desktop_config.json`
71
+ (Windows: `%APPDATA%\Claude\claude_desktop_config.json`):
72
+
73
+ ```json
74
+ {
75
+ "mcpServers": {
76
+ "gitlab-mr": {
77
+ "command": "npx",
78
+ "args": ["-y", "@kopfrechner/gitlab-mr-mcp"],
79
+ "env": {
80
+ "GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx",
81
+ "GITLAB_URL": "https://gitlab.ecoportal.co.nz"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ Save and restart Claude Desktop.
89
+
90
+ ---
91
+
92
+ ## Lifecycle Benefits
93
+
94
+ | Task | Without | With |
95
+ |------|---------|------|
96
+ | Check MR diff | Open browser, copy-paste | Agent fetches diff directly |
97
+ | Post review comment | Switch to browser | Agent posts inline |
98
+ | List open MRs | Manual | Agent queries directly |
99
+ | Cycle-end check | Manual MR review | Agent reads diff + confirms coverage |
100
+
101
+ **Token saving:** MR diffs arrive as structured data instead of requiring browser copy-paste or file reads. Particularly useful at cycle-end when confirming all TODO items made it into the MR.
102
+
103
+ ---
104
+
105
+ ## How AI Agents Use This in the Project Cycle
106
+
107
+ **At cycle-end (before merge):**
108
+ 1. Fetch MR diff — compare against project `TODO.md` to confirm all items are addressed.
109
+ 2. Post a structured summary comment to the MR.
110
+ 3. Flag any changed files not covered by a TODO item.
111
+
112
+ **During development:**
113
+ - List open MRs to check if a related change is already in review.
114
+ - Read MR descriptions when picking up a paused project.
115
+
116
+ ---
117
+
118
+ ## Verify It's Working
119
+
120
+ After setup, in Claude:
121
+ > "List open merge requests in project `oscar/ecoportal-api-graphql`"
122
+
123
+ Should return MR titles and status without any manual input.
@@ -0,0 +1,60 @@
1
+ # Local Git — No Setup Required
2
+
3
+ Git commands are available in any session via the shell. No API keys, no accounts, no configuration. This is the baseline git integration every AI agent should use by default.
4
+
5
+ ---
6
+
7
+ ## Commands Used Automatically
8
+
9
+ ### Session start — orientation
10
+ ```bash
11
+ # What branch am I on?
12
+ git branch --show-current
13
+
14
+ # Is this branch ahead of main? How far?
15
+ git rev-list --count main..HEAD
16
+
17
+ # What files have changed vs main?
18
+ git diff main...HEAD --stat
19
+
20
+ # Last 10 commits on this branch
21
+ git log --oneline -10
22
+ ```
23
+
24
+ ### Project cycle — understanding changes
25
+ ```bash
26
+ # Full diff of this branch vs main (code changes)
27
+ git diff main...HEAD
28
+
29
+ # Only changed file paths (cheaper — use this first)
30
+ git diff main...HEAD --name-only
31
+
32
+ # Diff of a specific file
33
+ git diff main...HEAD -- lib/ecoportal/api/graphql/model/action.rb
34
+
35
+ # What's staged but not committed?
36
+ git diff --cached --stat
37
+ ```
38
+
39
+ ### Cycle-end — before raising MR
40
+ ```bash
41
+ # Clean summary of all commits on this branch
42
+ git log main..HEAD --oneline
43
+
44
+ # Check for any uncommitted changes
45
+ git status --short
46
+
47
+ # Confirm target branch
48
+ git remote show origin | grep "HEAD branch"
49
+ ```
50
+
51
+ ---
52
+
53
+ ## How AI Agents Should Use This
54
+
55
+ 1. **At the start of every session** — run branch + diff stat to orient without reading files.
56
+ 2. **When updating project TODO** — check `git log` to see what's been committed since last session.
57
+ 3. **Before cycle-end Gemini review** — pull `git diff main...HEAD --name-only` to know exactly which files to pass to Gemini.
58
+ 4. **When unsure of current state** — `git status` is free. Use it.
59
+
60
+ This approach saves significant tokens: a `--stat` diff is ~20 lines; reading the same information from files could cost hundreds of lines of context.
@@ -0,0 +1,17 @@
1
+ # Local Paths — Developer-Specific
2
+
3
+ Copy this file to `.ai-assistance/local_paths.md` and fill in your own paths.
4
+ `.ai-assistance/local_paths.md` is git-ignored — never commit it.
5
+
6
+ ## My Local Clones
7
+
8
+ | Gem | Local path |
9
+ |-----|------------|
10
+ | `ecoportal-api` | /your/path/to/ecoportal-api |
11
+ | `ecoportal-api-v2` | /your/path/to/ecoportal-api-v2 |
12
+ | `graphlient` | /your/path/to/graphlient |
13
+ | `graphql-client` | /your/path/to/graphql-client |
14
+ | `eco-helpers` | /your/path/to/eco-helpers |
15
+
16
+ ## Notes
17
+ Add any machine-specific notes here (e.g. which repos you have checked out, branch notes, etc.)
@@ -0,0 +1,97 @@
1
+ # Project TODO
2
+
3
+ ## Pending
4
+
5
+ - [x] **Builder::Register** — `createRegister`, `updateRegister`, `destroyRegister` mutations.
6
+ `Base::Register`, `Model::Register`, `Input::Register::Create/Update`, `Payload::Register`.
7
+ `Builder::Register` with `create`, `update`, `destroy`, and `preset_view` sub-builder.
8
+ `GraphQL#register` exposed (singular, distinct from `#registers` compat layer).
9
+ *Done 2026-06-08*
10
+
11
+ - [ ] **Dashboards / Charts** — `Register.defaultDashboardId` and dashboard queries/mutations
12
+ are not yet wrapped. Backend has dashboard configuration tied to registers and organisations.
13
+ Scope: `Base::Dashboard` model, `Query::Dashboard(s)`, `Builder::Register#set_default_dashboard`.
14
+ Priority: medium — needed when scripts need to manage register dashboard configs.
15
+
16
+ - [x] **AI field mutations** — `generateAiSummary`, `generateSmartFill`,
17
+ `submitAiSummaryFeedback`, `submitSmartFillFeedback` fully wrapped.
18
+ `Mutation::AiSummary::Generate/SubmitFeedback`, `Mutation::SmartFill::Generate/SubmitFeedback`,
19
+ `Payload::AiSummaryGenerate`, `Payload::OkPayload`, `Base::AiSummaryVersion`.
20
+ `Builder::Page` wired: `generate_ai_summary`, `submit_ai_summary_feedback`,
21
+ `generate_smart_fill`, `submit_smart_fill_feedback`.
22
+ *Done 2026-06-08*
23
+
24
+ - [ ] **AI prompt review workflow** — AiSummary and SmartFill fields store an `instructions`
25
+ field (the AI prompt, template-configured by humans). No audit/review workflow exists.
26
+ The gem can read `field.instructions` on AiSummary/SmartFill instances already.
27
+ What's needed: a way to scan pages/templates for these instructions and surface them
28
+ for review. Possibly: `Query::PagesWithAiFields` + a review report script.
29
+ See `.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md` for context.
30
+ Priority: low/design — the need is real but the right interface is TBD.
31
+
32
+ - [x] **eP Meta AI scaffolding project** — Standalone template repo at
33
+ `C:\ruby_scripts\git\ecoPortal_ai_standards`. Bridge protocol, all scripts
34
+ (lock-acquire, task-read, task-create, setup-mcps, etc.), all skills, conventions,
35
+ integrations, capabilities registry, CLAUDE.md template ({{PLACEHOLDER}} vars),
36
+ ONBOARDING.md (15-min setup guide), `init-project.ts` bootstrap script.
37
+ Push to GitLab to share: `git@gitlab.ecoportal.co.nz:oscar/ecoPortal_ai_standards.git`
38
+ *Done 2026-06-08*
39
+
40
+ - [ ] **Commit unstaged changes** — Large set of modified files on `ai_dev_process` branch
41
+ not yet staged or committed. Review and commit once session is fully restored.
42
+
43
+ ## Bridge improvements (from Gemini review 2026-06-04)
44
+
45
+ - [x] **Security: Code must prompt before executing bridge-requested shell commands** —
46
+ Rule added to `.ai-assistance/bridge/CLAUDE.md` "Running Code non-interactively" section.
47
+ Code must surface any shell command to the user before running it, even in
48
+ skip-permissions mode. User denial → mark task FAILED.
49
+ *Done 2026-06-08*
50
+
51
+ - [x] **Atomic LOCK acquisition** — `scripts/lock-acquire.sh` implemented.
52
+ Uses temp-file + hard-link (atomic on POSIX/NTFS); falls back to bash `noclobber`.
53
+ Reports held-by agent/intent on contention. Auto-detects stale locks by mtime.
54
+ `bridge/CLAUDE.md` updated to reference it as the preferred acquisition method.
55
+ *Done 2026-06-08*
56
+
57
+ - [x] **Stale IN_PROGRESS recovery** — `bridge-init.sh` updated: scans for IN_PROGRESS
58
+ tasks older than 1 hour (via `stat` mtime), reports them in `stale_tasks` + `stale`
59
+ count in STATUS JSON. `bridge/CLAUDE.md` updated with Code's required response:
60
+ report to user, ask to reset to PENDING or mark FAILED.
61
+ *Done 2026-06-08*
62
+
63
+ - [x] **`task-read.ts` script** — `scripts/task-read.ts` implemented.
64
+ Parses all sections (title, status, created, from, to, context, request, expected,
65
+ result, notes) from inbox/outbox/archive files. Searches all bridge dirs automatically.
66
+ Output: structured JSON. Saves ~200 tokens per task read vs raw Markdown.
67
+ *Done 2026-06-08*
68
+
69
+ - [x] **Archive pruning convention** — Documented in `bridge/CLAUDE.md` "Archive pruning"
70
+ section: keep last 90 days or last 50 task pairs; git history is the audit trail;
71
+ prune manually when folder gets unwieldy.
72
+ *Done 2026-06-08*
73
+
74
+ ## File upload
75
+
76
+ - [ ] **File upload** — Support uploading files to attach to `File` and `ImageGallery`
77
+ data fields (and potentially Action file attachments at a later stage).
78
+ This is distinct from the `attach` operation (which links existing resources to
79
+ a target model). Upload requires direct multipart/form-data HTTP to a separate
80
+ endpoint before the GraphQL mutation references the resulting file ID.
81
+ Scope:
82
+ - Identify the upload endpoint and auth pattern (likely REST, not GraphQL)
83
+ - Create `HttpClient#upload(file_path:, ...)` or similar
84
+ - Create `Input::FileAttachment` to carry the resulting file container ID into mutations
85
+ - Wire into data field update inputs (Phase E concern for fields, sooner for Actions)
86
+ Priority: Medium — needed before data field updates can be fully functional.
87
+ Note: Actions file attachment may be needed sooner — track separately if it becomes urgent.
88
+
89
+ ## Completed
90
+
91
+ - [x] **Gemini design review of bridge architecture** — Done 2026-06-04. Response in
92
+ `.ai-assistance/bridge/context/gemini-review-response.md`.
93
+ - [x] **Regenerate GitLab PAT** — New token generated, April 2027 expiry, rotation enabled.
94
+ Updated in `.env` and documented in `integrations/gitlab-mcp.md`.
95
+ - [x] **Rename `.claude/` to `.ai-assistance/`** — Done 2026-06-04. All references updated
96
+ across scripts, CLAUDE.md, gitignore, and capabilities docs.
97
+ - [x] **MCP setup script** — `setup-mcps.ts` + tests written. Teammates run once per machine.