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.
- checksums.yaml +4 -4
- data/.ai-assistance/bridge/CLAUDE.md +338 -0
- data/.ai-assistance/bridge/archive/.gitkeep +0 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +29 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +18 -0
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +42 -0
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +115 -0
- data/.ai-assistance/bridge/context/gemini-review-prompt.txt +48 -0
- data/.ai-assistance/bridge/context/gemini-review-response.md +104 -0
- data/.ai-assistance/bridge/context/project.md +42 -0
- data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +48 -0
- data/.ai-assistance/bridge/queue/.gitkeep +1 -0
- data/.ai-assistance/capabilities/CLAUDE.md +27 -0
- data/.ai-assistance/capabilities/assumptions-log.md +80 -0
- data/.ai-assistance/capabilities/code.md +47 -0
- data/.ai-assistance/capabilities/connectors.md +37 -0
- data/.ai-assistance/capabilities/cowork.md +55 -0
- data/.ai-assistance/code/OVERVIEW.md +155 -0
- data/.ai-assistance/code/data_fields.md +242 -0
- data/.ai-assistance/code/dependencies.md +151 -0
- data/.ai-assistance/code/diff_as_input.md +234 -0
- data/.ai-assistance/code/diff_service_deep_dive.md +192 -0
- data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +55 -0
- data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +181 -0
- data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +192 -0
- data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +147 -0
- data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +277 -0
- data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +200 -0
- data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +228 -0
- data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +197 -0
- data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +243 -0
- data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +196 -0
- data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +132 -0
- data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +187 -0
- data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +236 -0
- data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +183 -0
- data/.ai-assistance/code/ecoportal_schema_reference.md +240 -0
- data/.ai-assistance/code/graphql_domain_knowledge.md +230 -0
- data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +71 -0
- data/.ai-assistance/code/refactoring/opportunities.md +251 -0
- data/.ai-assistance/code/schema_analysis.md +321 -0
- data/.ai-assistance/code/search_filters.md +868 -0
- data/.ai-assistance/code/spec_coverage.md +73 -0
- data/.ai-assistance/code/workflow-command-guide.md +438 -0
- data/.ai-assistance/code/workflow-space.md +353 -0
- data/.ai-assistance/conventions/CLAUDE.md +30 -0
- data/.ai-assistance/conventions/code-working-tree-protocol.md +199 -0
- data/.ai-assistance/conventions/gitignore-rules.md +42 -0
- data/.ai-assistance/conventions/permission-guidance.md +120 -0
- data/.ai-assistance/integrations/README.md +70 -0
- data/.ai-assistance/integrations/gitkraken-mcp.md +107 -0
- data/.ai-assistance/integrations/gitlab-mcp.md +123 -0
- data/.ai-assistance/integrations/local-git.md +60 -0
- data/.ai-assistance/local_paths.example.md +17 -0
- data/.ai-assistance/projects/TODO.md +97 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +168 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +60 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +267 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +53 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +102 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +139 -0
- data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +93 -0
- data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +244 -0
- data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +266 -0
- data/.ai-assistance/projects/eco-helpers-compat/TODO.md +86 -0
- data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +101 -0
- data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +177 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +161 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +125 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +126 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +256 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +122 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +148 -0
- data/.ai-assistance/projects/page-model/DECISIONS.md +245 -0
- data/.ai-assistance/projects/page-model/TODO.md +190 -0
- data/.ai-assistance/projects/search-filter-builder/INTENT.md +107 -0
- data/.ai-assistance/projects/search-filter-builder/TODO.md +131 -0
- data/.ai-assistance/projects/template-maintenance/DESIGN.md +134 -0
- data/.ai-assistance/projects/workflow-space/TODO.md +213 -0
- data/.ai-assistance/reinstall-claude-desktop-windows.md +136 -0
- data/.ai-assistance/scripts/CLAUDE.md +150 -0
- data/.ai-assistance/scripts/bridge-init.sh +86 -0
- data/.ai-assistance/scripts/bridge-status.sh +44 -0
- data/.ai-assistance/scripts/capabilities-check.ts +104 -0
- data/.ai-assistance/scripts/check-outbox.sh +43 -0
- data/.ai-assistance/scripts/dep_graph.rb +91 -0
- data/.ai-assistance/scripts/lock-acquire.sh +103 -0
- data/.ai-assistance/scripts/lock-multi.sh +124 -0
- data/.ai-assistance/scripts/lock-queue.sh +94 -0
- data/.ai-assistance/scripts/setup-mcps.test.ts +188 -0
- data/.ai-assistance/scripts/setup-mcps.ts +234 -0
- data/.ai-assistance/scripts/task-complete.ts +74 -0
- data/.ai-assistance/scripts/task-create.ts +75 -0
- data/.ai-assistance/scripts/task-read.ts +125 -0
- data/.ai-assistance/scripts/token-logger.js +220 -0
- data/.ai-assistance/scripts/token-report.ts +158 -0
- data/.ai-assistance/scripts/token-session-start.js +66 -0
- data/.ai-assistance/skills/ai-instructions/SKILL.md +48 -0
- data/.ai-assistance/skills/code-specs/SKILL.md +69 -0
- data/.ai-assistance/skills/corporate-policies/SKILL.md +201 -0
- data/.ai-assistance/skills/dep-graph/SKILL.md +139 -0
- data/.ai-assistance/skills/ep-ai-manager/SKILL.md +417 -0
- data/.ai-assistance/skills/gemini-assist/SKILL.md +63 -0
- data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +205 -0
- data/.ai-assistance/skills/gemini-assist/gemini_ask.py +1 -0
- data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +240 -0
- data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +25 -0
- data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +261 -0
- data/.ai-assistance/skills/project-cycle/SKILL.md +177 -0
- data/.ai-assistance/skills/refactor/SKILL.md +62 -0
- data/.ai-assistance/skills/rubocop/SKILL.md +93 -0
- data/.ai-assistance/skills/ruby-scripting/SKILL.md +215 -0
- data/.ai-assistance/skills/spec-generation/SKILL.md +72 -0
- data/.ai-assistance/standards-version.json +21 -0
- data/.ai-assistance/token-budget.json +32 -0
- data/.ai-assistance/version.json +39 -0
- data/.claude/settings.json +146 -0
- data/.env.example +18 -0
- data/.gitattributes +15 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +121 -97
- data/CHANGELOG.md +673 -477
- data/CLAUDE.md +232 -0
- data/Gemfile +30 -6
- data/Rakefile +90 -38
- data/docs/worklog.md +574 -0
- data/ecoportal-api-graphql.gemspec +40 -40
- data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
- data/lib/ecoportal/api/common/graphql/client.rb +1 -1
- data/lib/ecoportal/api/common/graphql/http_client.rb +35 -3
- data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
- data/lib/ecoportal/api/common/graphql/model/as_input.rb +8 -5
- data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +3 -1
- data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +31 -23
- data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +54 -1
- data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
- data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
- data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
- data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
- data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
- data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
- data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
- data/lib/ecoportal/api/graphql/base/force.rb +65 -0
- data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
- data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
- data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
- data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +112 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
- data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
- data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
- data/lib/ecoportal/api/graphql/base/page/phased.rb +1 -0
- data/lib/ecoportal/api/graphql/base/page/section.rb +36 -0
- data/lib/ecoportal/api/graphql/base/page/section_collection.rb +79 -0
- data/lib/ecoportal/api/graphql/base/page.rb +2 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
- data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
- data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
- data/lib/ecoportal/api/graphql/base/register.rb +18 -0
- data/lib/ecoportal/api/graphql/base.rb +11 -0
- data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
- data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
- data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
- data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
- data/lib/ecoportal/api/graphql/builder/register.rb +27 -19
- data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
- data/lib/ecoportal/api/graphql/builder.rb +2 -0
- data/lib/ecoportal/api/graphql/compat/filter_translator.rb +107 -0
- data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
- data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
- data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
- data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
- data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
- data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
- data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
- data/lib/ecoportal/api/graphql/compat.rb +17 -0
- data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
- data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
- data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +21 -28
- data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
- data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
- data/lib/ecoportal/api/graphql/concerns.rb +4 -0
- data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
- data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
- data/lib/ecoportal/api/graphql/connection.rb +4 -0
- data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -0
- data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
- data/lib/ecoportal/api/graphql/fragment/action.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/action_category.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/force.rb +30 -0
- data/lib/ecoportal/api/graphql/fragment/location_draft.rb +2 -2
- data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/locations_error.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
- data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +395 -0
- data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
- data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
- data/lib/ecoportal/api/graphql/fragment/pagination.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment.rb +37 -27
- data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +25 -0
- data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
- data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
- data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
- data/lib/ecoportal/api/graphql/input/page.rb +26 -0
- data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
- data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
- data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
- data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
- data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
- data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
- data/lib/ecoportal/api/graphql/input/register.rb +13 -0
- data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
- data/lib/ecoportal/api/graphql/input/search_conf.rb +367 -0
- data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
- data/lib/ecoportal/api/graphql/input.rb +8 -0
- data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
- data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
- data/lib/ecoportal/api/graphql/logic/base_model.rb +2 -0
- data/lib/ecoportal/api/graphql/logic/base_query.rb +45 -2
- data/lib/ecoportal/api/graphql/logic/input.rb +15 -0
- data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
- data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
- data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
- data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
- data/lib/ecoportal/api/graphql/model/page.rb +1 -0
- data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
- data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
- data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
- data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
- data/lib/ecoportal/api/graphql/model/register.rb +10 -0
- data/lib/ecoportal/api/graphql/model.rb +8 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
- data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +2 -2
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +2 -2
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
- data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
- data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +51 -0
- data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
- data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
- data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
- data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
- data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
- data/lib/ecoportal/api/graphql/mutation.rb +8 -0
- data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
- data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
- data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
- data/lib/ecoportal/api/graphql/payload/ok_payload.rb +21 -0
- data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/draft.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page.rb +19 -0
- data/lib/ecoportal/api/graphql/payload/preset_view.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/register.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
- data/lib/ecoportal/api/graphql/payload.rb +11 -0
- data/lib/ecoportal/api/graphql/query/action.rb +1 -1
- data/lib/ecoportal/api/graphql/query/action_categories.rb +1 -1
- data/lib/ecoportal/api/graphql/query/actions.rb +2 -2
- data/lib/ecoportal/api/graphql/query/contractor_entities.rb +1 -1
- data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
- data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +2 -2
- data/lib/ecoportal/api/graphql/query/location_structure.rb +1 -1
- data/lib/ecoportal/api/graphql/query/location_structures.rb +1 -1
- data/lib/ecoportal/api/graphql/query/page.rb +45 -0
- data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
- data/lib/ecoportal/api/graphql/query/page_with_forces.rb +43 -0
- data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
- data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +59 -0
- data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
- data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
- data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
- data/lib/ecoportal/api/graphql/query.rb +11 -0
- data/lib/ecoportal/api/graphql.rb +60 -2
- data/lib/ecoportal/api/graphql_version.rb +5 -5
- data/scripts/auto-worker-scheduler.sh +386 -0
- data/tests/contractor_entity_create.rb +19 -19
- data/tests/contractor_entity_udpate.rb +20 -20
- data/tests/dump_page_model.rb +74 -0
- data/tests/loc_structure_get.rb +1 -2
- data/tests/loc_structure_update.rb +51 -51
- data/tests/loc_structures_get.rb +15 -15
- 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.
|