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
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# CLAUDE.md — ecoportal-api-graphql
|
|
2
|
+
|
|
3
|
+
AI agent instructions for working in this repository. Read this before touching any code.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Read these first — every session
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
docs/worklog.md ← current state, blockers, open questions
|
|
11
|
+
.ai-assistance/projects/<slug>/TODO.md ← active project task list
|
|
12
|
+
.ai-assistance/local/paths.json ← local paths to sibling repos (gitignored — machine-specific)
|
|
13
|
+
.ai-assistance/bridge/CLAUDE.md ← bridge protocol: format, lifecycle, cross-repo requests
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Repository Role
|
|
19
|
+
|
|
20
|
+
`ecoportal-api-graphql` is a **Ruby gem** that provides a GraphQL client layer on top of EcoPortal's REST API infrastructure. It sits between the upstream API gems and downstream consumer code.
|
|
21
|
+
|
|
22
|
+
**Dependency chain:**
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
[graphql-ruby] [graphql-client] [graphlient] (upstream, external/forked)
|
|
26
|
+
↓
|
|
27
|
+
ecoportal-api / ecoportal-api-v2 (upstream, team-managed)
|
|
28
|
+
↓
|
|
29
|
+
ecoportal-api-graphql ← THIS REPO
|
|
30
|
+
↓
|
|
31
|
+
eco-helpers (downstream, team-managed)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Backwards compatibility with `eco-helpers` must be preserved unless explicitly broken by the developer.
|
|
35
|
+
|
|
36
|
+
**For full dependency details — local paths, remotes, fork relationships, and access notes — see `.ai-assistance/code/dependencies.md`.**
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Key Folder Layout
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
lib/ecoportal/api/graphql/ Main gem code
|
|
44
|
+
base/ Base model classes (data structures)
|
|
45
|
+
builder/ Builder pattern classes
|
|
46
|
+
concerns/ Shared modules (mixins)
|
|
47
|
+
connection/ GraphQL connection types
|
|
48
|
+
error/ Error classes
|
|
49
|
+
fragment/ GraphQL fragment definitions
|
|
50
|
+
helpers/ Utility helpers
|
|
51
|
+
input/ Mutation input objects
|
|
52
|
+
interface/ GraphQL interface types
|
|
53
|
+
logic/ Query/mutation execution logic
|
|
54
|
+
model/ Domain model classes
|
|
55
|
+
mutation/ Mutation definitions
|
|
56
|
+
payload/ Mutation response payloads
|
|
57
|
+
query/ Query definitions
|
|
58
|
+
|
|
59
|
+
lib/ecoportal/api/common/graphql/ Shared/common GraphQL utilities
|
|
60
|
+
|
|
61
|
+
spec/ecoportal/ RSpec specs (mirrors lib/ structure)
|
|
62
|
+
tests/ Manual integration test scripts
|
|
63
|
+
.ai-assistance/ AI agent resources (see below)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## .ai-assistance/ Resources
|
|
69
|
+
|
|
70
|
+
All AI agent tooling lives under `.ai-assistance/`. **Read relevant docs before analysing code.**
|
|
71
|
+
|
|
72
|
+
| Path | Purpose |
|
|
73
|
+
|------|---------|
|
|
74
|
+
| `.ai-assistance/skills/` | Skill definitions — see each `SKILL.md` |
|
|
75
|
+
| `.ai-assistance/code/` | Code specs for AI (per-area markdown docs) |
|
|
76
|
+
| `.ai-assistance/code/dependencies.md` | Full dependency map with local paths and remote URLs |
|
|
77
|
+
| `.ai-assistance/code/refactoring/` | Refactoring opportunity log |
|
|
78
|
+
| `.ai-assistance/projects/` | Project intent, TODOs, and decision logs |
|
|
79
|
+
| `.ai-assistance/integrations/` | Optional dev tool integrations (GitLab MCP, GitKraken MCP, local git) |
|
|
80
|
+
|
|
81
|
+
### Commit authorship
|
|
82
|
+
|
|
83
|
+
**Default: developer only.** Do not add `Co-Authored-By: Claude ...` to commits unless
|
|
84
|
+
the developer explicitly requests it for a specific commit.
|
|
85
|
+
|
|
86
|
+
### Available Skills
|
|
87
|
+
|
|
88
|
+
| Skill | SKILL.md | Purpose |
|
|
89
|
+
|-------|----------|---------|
|
|
90
|
+
| `ep-ai-manager` | `.ai-assistance/skills/ep-ai-manager/SKILL.md` | Check alignment with ep-ai-standards |
|
|
91
|
+
| `ruby-scripting` | `.ai-assistance/skills/ruby-scripting/SKILL.md` | Guidelines for scripts using ecoportal gem stack |
|
|
92
|
+
| `gemini-assist` | `.ai-assistance/skills/gemini-assist/SKILL.md` | Offload large-context tasks to Gemini |
|
|
93
|
+
| `ai-instructions` | `.ai-assistance/skills/ai-instructions/SKILL.md` | Manage CLAUDE.md and skill files |
|
|
94
|
+
| `code-specs` | `.ai-assistance/skills/code-specs/SKILL.md` | Write/update AI-readable code documentation |
|
|
95
|
+
| `spec-generation` | `.ai-assistance/skills/spec-generation/SKILL.md` | Generate RSpec specs for backwards-compat |
|
|
96
|
+
| `refactor` | `.ai-assistance/skills/refactor/SKILL.md` | Identify and log refactoring opportunities |
|
|
97
|
+
| `project-cycle` | `.ai-assistance/skills/project-cycle/SKILL.md` | Project planning, TODOs, decisions |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Permissions & Autonomy
|
|
102
|
+
|
|
103
|
+
Read `.ai-assistance/conventions/permission-guidance.md` to understand:
|
|
104
|
+
- Which operations require confirmation vs. proceed autonomously (autonomy zones)
|
|
105
|
+
- When and how to suggest new allowlist entries to the developer
|
|
106
|
+
- Project vs. global scope for `settings.json` rules
|
|
107
|
+
- How to handle compound `cd path && cmd` patterns in sibling repos
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Running Tests
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Full suite
|
|
115
|
+
bundle exec rspec
|
|
116
|
+
|
|
117
|
+
# Single file
|
|
118
|
+
bundle exec rspec spec/ecoportal/api/graphql/input/search_conf_spec.rb
|
|
119
|
+
|
|
120
|
+
# Live AI tests (requires ANTHROPIC_API_KEY — loaded automatically from .env)
|
|
121
|
+
bundle exec rspec spec/ecoportal/api/graphql/input/search_conf/ai_generator_spec.rb --tag live
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Live tests:** `.env` is loaded via `dotenv` in `spec_helper.rb`. Add `ANTHROPIC_API_KEY=sk-ant-...` to `.env` (gitignored) — no need to export to shell.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Conventions
|
|
129
|
+
|
|
130
|
+
- **Namespace:** `Ecoportal::API::GraphQL` — capital G, Q, L, matching the `class GraphQL` declaration in `lib/ecoportal/api/graphql.rb`
|
|
131
|
+
- **File/class mirroring:** File path mirrors the class namespace exactly.
|
|
132
|
+
- **Spec mirroring:** Spec files mirror `lib/` structure under `spec/`.
|
|
133
|
+
- **Code spec docs:** For every area analysed, a corresponding `.ai-assistance/code/<area>.md` should exist or be created/updated.
|
|
134
|
+
- **No silent breaking changes:** Any change that affects the public interface of this gem must be noted in the active project's DECISIONS log and confirmed with the developer.
|
|
135
|
+
- **Gemini responses must be verified** before applying — Gemini hallucinates details. Always cross-check against actual code.
|
|
136
|
+
- **Rubocop:** All generated Ruby code must comply with `.rubocop.yml`. Run `bundle exec rubocop <file>` to verify.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## First Session on a New Machine
|
|
141
|
+
|
|
142
|
+
If `.ai-assistance/local_paths.md` does not exist, run the collaborator setup flow from the `project-cycle` skill **before** any other work. In short:
|
|
143
|
+
|
|
144
|
+
- Ask which upstream/downstream repos the developer has cloned locally.
|
|
145
|
+
- In Cowork: offer to connect each folder. In Claude Code: ask for the path or locate it via shell.
|
|
146
|
+
- Create `.ai-assistance/local_paths.md` from `.ai-assistance/local_paths.example.md` with their confirmed paths.
|
|
147
|
+
- If a repo isn't available locally, offer to fetch what's needed from the remote URL instead.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Before Starting Any Task
|
|
152
|
+
|
|
153
|
+
1. Check `.ai-assistance/local_paths.md` — if missing, run First Session setup above before proceeding.
|
|
154
|
+
2. Check `.ai-assistance/projects/` for an active project file.
|
|
155
|
+
3. Check `.ai-assistance/code/` for an existing spec doc covering the area you'll work in.
|
|
156
|
+
4. Check `.ai-assistance/code/dependencies.md` if the task touches upstream or downstream gems.
|
|
157
|
+
5. Check `.ai-assistance/code/refactoring/` for logged opportunities relevant to the area.
|
|
158
|
+
6. If none of the above exist for your area — create them as you go (see `code-specs` skill).
|
|
159
|
+
|
|
160
|
+
## Before Making Working Tree Changes (Claude Code only)
|
|
161
|
+
|
|
162
|
+
If you are about to modify files outside `bridge/inbox/` or `bridge/outbox/`, follow the
|
|
163
|
+
working tree safety protocol **before touching anything**:
|
|
164
|
+
|
|
165
|
+
Full protocol: `.ai-assistance/conventions/code-working-tree-protocol.md`
|
|
166
|
+
|
|
167
|
+
Summary:
|
|
168
|
+
1. Check for `.ai-assistance/bridge/LOCK` — stop and inform user if actively locked
|
|
169
|
+
2. Acquire lock (watermark: agent, user, timestamp, expiry, intent, files)
|
|
170
|
+
3. Check for unstaged changes that overlap with your planned files — if overlap, commit them first as `wip: <description>`; if no overlap, proceed without touching them
|
|
171
|
+
4. Apply your changes
|
|
172
|
+
5. Commit with a descriptive message
|
|
173
|
+
6. Release lock (`rm .ai-assistance/bridge/LOCK`)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Bridge: CoWork ↔ Claude Code
|
|
178
|
+
|
|
179
|
+
A file-based channel for delegating tasks between CoWork and Code.
|
|
180
|
+
Full protocol: `.ai-assistance/bridge/CLAUDE.md`
|
|
181
|
+
|
|
182
|
+
### On every Code session startup
|
|
183
|
+
|
|
184
|
+
**Before responding to the user, read the bridge status file:**
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
cat .ai-assistance/bridge/STATUS 2>/dev/null || echo "no status yet"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
The `SessionStart` hook runs `bridge-init.sh` automatically and writes its output to
|
|
191
|
+
`bridge/STATUS`. Reading this file tells you immediately whether there are pending tasks.
|
|
192
|
+
|
|
193
|
+
If `pending > 0`: tell the user "I have N pending bridge task(s): [list]" and ask whether
|
|
194
|
+
to process them now before starting other work.
|
|
195
|
+
|
|
196
|
+
If the STATUS file is missing (first session or hook didn't run): run manually:
|
|
197
|
+
```bash
|
|
198
|
+
bash .ai-assistance/scripts/bridge-init.sh
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Why Code doesn't report pending tasks automatically on startup
|
|
202
|
+
|
|
203
|
+
Claude Code is passive — it waits for a user prompt before doing anything, regardless
|
|
204
|
+
of what hooks run or what this file says. The `SessionStart` hook runs `bridge-init.sh`
|
|
205
|
+
and writes `bridge/STATUS`, but Code will not speak unprompted.
|
|
206
|
+
|
|
207
|
+
**The intended workflow:** at the start of each session, ask:
|
|
208
|
+
> "Any pending tasks?"
|
|
209
|
+
|
|
210
|
+
Code will read `bridge/STATUS` (already written by the hook) and report immediately.
|
|
211
|
+
This is one short question — the right tradeoff for an interactive tool.
|
|
212
|
+
|
|
213
|
+
Hook stdout is also not injected into Code's context — only the STATUS file is readable.
|
|
214
|
+
Do not attempt to use hook output as a message source; write to a file instead.
|
|
215
|
+
|
|
216
|
+
### Before writing a bridge task
|
|
217
|
+
|
|
218
|
+
Check `.ai-assistance/capabilities/[your-env].md` — only bridge what you genuinely cannot do yourself.
|
|
219
|
+
|
|
220
|
+
### Key paths
|
|
221
|
+
|
|
222
|
+
| Path | Purpose |
|
|
223
|
+
|------|---------|
|
|
224
|
+
| `.ai-assistance/bridge/inbox/` | Tasks waiting to be processed |
|
|
225
|
+
| `.ai-assistance/bridge/outbox/` | Completed results |
|
|
226
|
+
| `.ai-assistance/bridge/archive/` | Completed pairs (audit trail) |
|
|
227
|
+
| `.ai-assistance/bridge/STATUS` | Bridge status file written by bridge-init.sh on session start |
|
|
228
|
+
| `.ai-assistance/bridge/LOCK` | Working tree lock file (never commit; gitignored) |
|
|
229
|
+
| `.ai-assistance/capabilities/` | Per-environment capability registry |
|
|
230
|
+
| `.ai-assistance/capabilities/assumptions-log.md` | Dated assumptions + verification status |
|
|
231
|
+
| `.ai-assistance/conventions/` | Instruction file structure rules |
|
|
232
|
+
| `.ai-assistance/scripts/` | Token-offload scripts (see `scripts/CLAUDE.md`) |
|
data/Gemfile
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
|
-
source "https://rubygems.org"
|
|
2
|
-
|
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
|
4
|
-
|
|
5
|
-
# Specify your gem's dependencies in ecoportal-api.gemspec
|
|
6
|
-
gemspec
|
|
1
|
+
source "https://rubygems.org"
|
|
2
|
+
|
|
3
|
+
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
|
4
|
+
|
|
5
|
+
# Specify your gem's dependencies in ecoportal-api.gemspec
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
# Pin graphlient to our fork's FROZEN release branch `pre-v0.0.9` (a snapshot of the fork's
|
|
9
|
+
# master, which carries the DSL/directive work — #115 to_query_string/spread, #116 directives
|
|
10
|
+
# DSL / on(:Type) / fragment(:Name); lib/ is byte-identical to feature/directives-dsl-support).
|
|
11
|
+
# Frozen so the gem (and downstream repos) pin a stable ref, not a moving feature branch.
|
|
12
|
+
# Revisit when the fork cuts a real gem release (>= 0.8.x with these features published).
|
|
13
|
+
# Frozen: 2026-07-02.
|
|
14
|
+
gem 'graphlient', git: 'https://github.com/rellampec/graphlient.git',
|
|
15
|
+
branch: 'pre-v0.0.9'
|
|
16
|
+
|
|
17
|
+
# NOTE: no graphql-client override. It is a TRANSITIVE dependency of graphlient and
|
|
18
|
+
# resolves to the published 0.26.0 — this gem does not use graphql-client directly
|
|
19
|
+
# (queries go through the graphlient DSL; the Group-3 refactor removed `client.parse`),
|
|
20
|
+
# so the fork's revival MRs (#79–#82, still unattended upstream) are not required here.
|
|
21
|
+
# FUTURE: we plan to retake the graphql-client fork revival and land more graphlient +
|
|
22
|
+
# ecoportal-api-graphql features (and downstream) — re-introduce a pin at that point.
|
|
23
|
+
# See memory: project-fork-revival-strategy / project-graphql-client-redesign.
|
|
24
|
+
|
|
25
|
+
# Optional — only needed for SearchConf::AIGenerator live tests.
|
|
26
|
+
# Not added to gemspec; callers must install it themselves.
|
|
27
|
+
# Uses http source to bypass local SSL inspection (e.g. Norton Antivirus).
|
|
28
|
+
source 'http://rubygems.org' do
|
|
29
|
+
gem 'anthropic'
|
|
30
|
+
end
|
data/Rakefile
CHANGED
|
@@ -1,38 +1,90 @@
|
|
|
1
|
-
require 'bundler/gem_tasks'
|
|
2
|
-
require 'rspec/core/rake_task'
|
|
3
|
-
require 'rubocop/rake_task'
|
|
4
|
-
require 'yard'
|
|
5
|
-
require 'redcarpet'
|
|
6
|
-
|
|
7
|
-
desc 'run the specs'
|
|
8
|
-
RSpec::Core::RakeTask.new(:spec)
|
|
9
|
-
|
|
10
|
-
desc 'run rspec showing backtrace'
|
|
11
|
-
RSpec::Core::RakeTask.new(:spec_trace) do |task|
|
|
12
|
-
task.rspec_opts = ['--backtrace']
|
|
13
|
-
end
|
|
14
|
-
task :rspec_trace => :spec_trace
|
|
15
|
-
|
|
16
|
-
desc 'run rspec stopping on first fail, and show backtrace'
|
|
17
|
-
RSpec::Core::RakeTask.new(:spec_fast) do |task|
|
|
18
|
-
task.rspec_opts = ['--fail-fast', '--backtrace']
|
|
19
|
-
end
|
|
20
|
-
task :rspec_fast => :spec_fast
|
|
21
|
-
|
|
22
|
-
desc 'run rubocop diaplying cop names'
|
|
23
|
-
RuboCop::RakeTask.new(:rubocop) do |t|
|
|
24
|
-
t.options = ['--display-cop-names']
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# default task name is yard
|
|
28
|
-
desc 'Yard: generate all the documentation'
|
|
29
|
-
YARD::Rake::YardocTask.new(:doc) do |t|
|
|
30
|
-
#t.files = ['lib/**/*.rb']
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
desc '
|
|
34
|
-
task :
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
require 'bundler/gem_tasks'
|
|
2
|
+
require 'rspec/core/rake_task'
|
|
3
|
+
require 'rubocop/rake_task'
|
|
4
|
+
require 'yard'
|
|
5
|
+
require 'redcarpet'
|
|
6
|
+
|
|
7
|
+
desc 'run the specs'
|
|
8
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
9
|
+
|
|
10
|
+
desc 'run rspec showing backtrace'
|
|
11
|
+
RSpec::Core::RakeTask.new(:spec_trace) do |task|
|
|
12
|
+
task.rspec_opts = ['--backtrace']
|
|
13
|
+
end
|
|
14
|
+
task :rspec_trace => :spec_trace
|
|
15
|
+
|
|
16
|
+
desc 'run rspec stopping on first fail, and show backtrace'
|
|
17
|
+
RSpec::Core::RakeTask.new(:spec_fast) do |task|
|
|
18
|
+
task.rspec_opts = ['--fail-fast', '--backtrace']
|
|
19
|
+
end
|
|
20
|
+
task :rspec_fast => :spec_fast
|
|
21
|
+
|
|
22
|
+
desc 'run rubocop diaplying cop names'
|
|
23
|
+
RuboCop::RakeTask.new(:rubocop) do |t|
|
|
24
|
+
t.options = ['--display-cop-names']
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# default task name is yard
|
|
28
|
+
desc 'Yard: generate all the documentation'
|
|
29
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
|
30
|
+
#t.files = ['lib/**/*.rb']
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
desc 'Generate JSON dependency/structure map -> .ai-assistance/code/dep-graph.json'
|
|
34
|
+
task :dep_graph do
|
|
35
|
+
load '.ai-assistance/scripts/dep_graph.rb'
|
|
36
|
+
output = '.ai-assistance/code/dep-graph.json'
|
|
37
|
+
DepGraph.run(lib_dir: 'lib', output_path: output)
|
|
38
|
+
puts "Written -> #{output}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
desc 'Detect workflow-space schema drift: COMMAND_MAP vs stored introspection + SCHEMA_VERSION currency'
|
|
42
|
+
task :schema_drift do
|
|
43
|
+
require 'json'
|
|
44
|
+
|
|
45
|
+
schema_glob = '.ai-assistance/tmp/*_live_ep_graphql_schema.graphql.json'
|
|
46
|
+
schema_files = Dir[schema_glob]
|
|
47
|
+
abort "No schema file at #{schema_glob} — re-run introspection first" if schema_files.empty?
|
|
48
|
+
|
|
49
|
+
schema_path = schema_files.last
|
|
50
|
+
puts "Schema: #{schema_path}"
|
|
51
|
+
schema_date = File.basename(schema_path)[/\d{8}/]
|
|
52
|
+
|
|
53
|
+
schema = JSON.parse(File.read(schema_path))
|
|
54
|
+
types = schema.dig('data', '__schema', 'types').to_h { |t| [t['name'], t] }
|
|
55
|
+
wci = types['WorkflowCommandInput'] or abort('WorkflowCommandInput not found in schema')
|
|
56
|
+
|
|
57
|
+
schema_keys = Set.new(wci['inputFields'].map { |f| f['name'] })
|
|
58
|
+
|
|
59
|
+
cmd_src = File.read('lib/ecoportal/api/graphql/input/workflow_command.rb')
|
|
60
|
+
gem_keys = Set.new(cmd_src.scan(/^\s+(\w+):\s+'Ecoportal/).flatten)
|
|
61
|
+
|
|
62
|
+
added = (schema_keys - gem_keys).sort
|
|
63
|
+
removed = (gem_keys - schema_keys).sort
|
|
64
|
+
|
|
65
|
+
puts "\n=== WorkflowCommandInput (#{schema_keys.size} schema / #{gem_keys.size} gem) ==="
|
|
66
|
+
if added.empty? && removed.empty?
|
|
67
|
+
puts "In sync — no drift"
|
|
68
|
+
else
|
|
69
|
+
added.each { |k| puts " + #{k} (in schema, missing from COMMAND_MAP)" }
|
|
70
|
+
removed.each { |k| puts " - #{k} (in COMMAND_MAP, absent from schema)" }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
puts "\n=== SCHEMA_VERSION constants (expected #{schema_date}) ==="
|
|
74
|
+
mismatches = []
|
|
75
|
+
Dir['lib/**/*.rb'].each do |f|
|
|
76
|
+
File.read(f).scan(/SCHEMA_VERSION\s*=\s*'(\d+)'\.freeze/).each do |m|
|
|
77
|
+
mismatches << " #{f}: '#{m[0]}'" if m[0] != schema_date
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
mismatches.empty? ? puts("All match #{schema_date}") : mismatches.each { |m| puts m }
|
|
81
|
+
|
|
82
|
+
abort "\nDrift detected — update gem files before bumping schema date" unless added.empty? && removed.empty?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
desc 'default task: runs rubocop and rspec'
|
|
86
|
+
task :default do
|
|
87
|
+
Rake::Task[:rubocop].invoke
|
|
88
|
+
ensure
|
|
89
|
+
Rake::Task[:spec].invoke
|
|
90
|
+
end
|