ecoportal-api-graphql 1.3.13 → 1.3.16
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/CHANGELOG.md +87 -0
- data/lib/ecoportal/api/common/graphql/client.rb +0 -2
- data/lib/ecoportal/api/common/graphql/http_client.rb +6 -0
- data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -17
- data/lib/ecoportal/api/graphql/base/file_container.rb +14 -14
- data/lib/ecoportal/api/graphql/base/location_classification_type.rb +15 -15
- data/lib/ecoportal/api/graphql/base/location_structure.rb +27 -27
- data/lib/ecoportal/api/graphql/base/organization.rb +15 -15
- data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page.rb +17 -16
- data/lib/ecoportal/api/graphql/base/template.rb +35 -0
- data/lib/ecoportal/api/graphql/base.rb +37 -35
- data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +41 -41
- data/lib/ecoportal/api/graphql/compat/response.rb +35 -35
- data/lib/ecoportal/api/graphql/connection/action.rb +11 -11
- data/lib/ecoportal/api/graphql/connection/action_category.rb +11 -11
- data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -11
- data/lib/ecoportal/api/graphql/connection/page.rb +11 -11
- data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -11
- data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -11
- data/lib/ecoportal/api/graphql/connection.rb +17 -17
- data/lib/ecoportal/api/graphql/file_upload/client.rb +21 -10
- data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
- data/lib/ecoportal/api/graphql/fragment/force.rb +14 -10
- data/lib/ecoportal/api/graphql/fragment/location_node.rb +26 -26
- data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
- data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
- data/lib/ecoportal/api/graphql/fragment.rb +3 -0
- data/lib/ecoportal/api/graphql/input/contractor_entity.rb +14 -14
- data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -16
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -18
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -21
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -28
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -18
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -23
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -20
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -20
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -24
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -20
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -20
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -20
- data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -18
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -18
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -18
- data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -251
- data/lib/ecoportal/api/graphql/input.rb +24 -24
- data/lib/ecoportal/api/graphql/logic/connection.rb +34 -34
- data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
- data/lib/ecoportal/api/graphql/model/page.rb +16 -15
- data/lib/ecoportal/api/graphql/model/person_member.rb +15 -15
- data/lib/ecoportal/api/graphql/model/template.rb +15 -0
- data/lib/ecoportal/api/graphql/model.rb +32 -30
- data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -45
- data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +14 -14
- data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +7 -7
- data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +8 -7
- data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -35
- data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -35
- data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -36
- data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -13
- data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -46
- data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation.rb +20 -20
- data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +14 -14
- data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -21
- data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -13
- data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -13
- data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
- data/lib/ecoportal/api/graphql/payload/page.rb +20 -19
- data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -11
- data/lib/ecoportal/api/graphql/payload/register.rb +15 -11
- data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +1 -1
- data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +1 -1
- data/lib/ecoportal/api/graphql/payload/template/update_information.rb +1 -1
- data/lib/ecoportal/api/graphql/payload.rb +23 -23
- data/lib/ecoportal/api/graphql/query/location_structures.rb +57 -57
- data/lib/ecoportal/api/graphql/query/page.rb +45 -45
- data/lib/ecoportal/api/graphql/query/page_with_forces.rb +9 -3
- data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +9 -3
- data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -78
- data/lib/ecoportal/api/graphql/query.rb +27 -27
- data/lib/ecoportal/api/graphql.rb +9 -5
- data/lib/ecoportal/api/graphql_version.rb +1 -1
- metadata +9 -180
- data/.ai-assistance/bridge/CLAUDE.md +0 -338
- data/.ai-assistance/bridge/archive/.gitkeep +0 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +0 -29
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +0 -18
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +0 -42
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +0 -115
- data/.ai-assistance/bridge/context/gemini-review-prompt.txt +0 -48
- data/.ai-assistance/bridge/context/gemini-review-response.md +0 -104
- data/.ai-assistance/bridge/context/project.md +0 -42
- 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 +0 -48
- data/.ai-assistance/bridge/queue/.gitkeep +0 -1
- data/.ai-assistance/capabilities/CLAUDE.md +0 -27
- data/.ai-assistance/capabilities/assumptions-log.md +0 -80
- data/.ai-assistance/capabilities/code.md +0 -47
- data/.ai-assistance/capabilities/connectors.md +0 -37
- data/.ai-assistance/capabilities/cowork.md +0 -55
- data/.ai-assistance/code/OVERVIEW.md +0 -155
- data/.ai-assistance/code/data_fields.md +0 -242
- data/.ai-assistance/code/dependencies.md +0 -151
- data/.ai-assistance/code/diff_as_input.md +0 -234
- data/.ai-assistance/code/diff_pairing_engine.md +0 -243
- data/.ai-assistance/code/diff_service_deep_dive.md +0 -192
- data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +0 -55
- data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +0 -181
- data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +0 -192
- data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +0 -147
- data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +0 -277
- data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +0 -200
- data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +0 -228
- data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +0 -197
- data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +0 -243
- data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +0 -196
- data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +0 -132
- data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +0 -187
- data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +0 -236
- data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +0 -183
- data/.ai-assistance/code/ecoportal_schema_reference.md +0 -240
- data/.ai-assistance/code/filter_contract_matrix.md +0 -177
- data/.ai-assistance/code/graphql_domain_knowledge.md +0 -240
- data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +0 -71
- data/.ai-assistance/code/refactoring/opportunities.md +0 -251
- data/.ai-assistance/code/schema_analysis.md +0 -321
- data/.ai-assistance/code/search_filters.md +0 -868
- data/.ai-assistance/code/spec_coverage.md +0 -73
- data/.ai-assistance/code/template_diff_pairing_domain.md +0 -175
- data/.ai-assistance/code/workflow-command-guide.md +0 -466
- data/.ai-assistance/code/workflow-space.md +0 -353
- data/.ai-assistance/conventions/CLAUDE.md +0 -30
- data/.ai-assistance/conventions/code-working-tree-protocol.md +0 -199
- data/.ai-assistance/conventions/gitignore-rules.md +0 -42
- data/.ai-assistance/conventions/permission-guidance.md +0 -120
- data/.ai-assistance/integrations/README.md +0 -70
- data/.ai-assistance/integrations/gitkraken-mcp.md +0 -107
- data/.ai-assistance/integrations/gitlab-mcp.md +0 -123
- data/.ai-assistance/integrations/local-git.md +0 -60
- data/.ai-assistance/local_paths.example.md +0 -17
- data/.ai-assistance/projects/TODO.md +0 -118
- data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +0 -168
- data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +0 -60
- data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +0 -267
- data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +0 -53
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +0 -102
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +0 -139
- data/.ai-assistance/projects/compat-layer-audit/COMPAT_AUDIT.md +0 -244
- data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +0 -93
- data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +0 -244
- data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +0 -266
- data/.ai-assistance/projects/eco-helpers-compat/TODO.md +0 -86
- data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +0 -101
- data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +0 -177
- data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +0 -161
- data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +0 -125
- data/.ai-assistance/projects/ooze-graphql-native-migration/INVENTORY.md +0 -136
- data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +0 -126
- data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +0 -261
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +0 -122
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +0 -148
- data/.ai-assistance/projects/page-model/DECISIONS.md +0 -245
- data/.ai-assistance/projects/page-model/TODO.md +0 -190
- data/.ai-assistance/projects/qa-services-delivery/DECISIONS.md +0 -93
- data/.ai-assistance/projects/qa-services-delivery/INTENT.md +0 -76
- data/.ai-assistance/projects/qa-services-delivery/PHASE3-SCOPE.md +0 -115
- data/.ai-assistance/projects/qa-services-delivery/ROADMAP.md +0 -99
- data/.ai-assistance/projects/qa-services-delivery/TODO.md +0 -81
- data/.ai-assistance/projects/search-filter-builder/INTENT.md +0 -107
- data/.ai-assistance/projects/search-filter-builder/TODO.md +0 -131
- data/.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md +0 -87
- data/.ai-assistance/projects/template-automatic-build-maintenance/TODO.md +0 -108
- data/.ai-assistance/projects/template-diff-deploy/INTENT.md +0 -12
- data/.ai-assistance/projects/template-diff-deploy/TODO.md +0 -9
- data/.ai-assistance/projects/template-maintenance/DESIGN.md +0 -134
- data/.ai-assistance/projects/template-maintenance/PHASE0-FINDINGS.md +0 -93
- data/.ai-assistance/projects/template-maintenance/README.md +0 -14
- data/.ai-assistance/projects/template-model-logic/CATEGORY_CATALOG.md +0 -236
- data/.ai-assistance/projects/template-model-logic/CLASSIFICATION_SPIKE.md +0 -243
- data/.ai-assistance/projects/template-model-logic/DESIGN_NOTE.md +0 -154
- data/.ai-assistance/projects/workflow-space/TODO.md +0 -213
- data/.ai-assistance/reinstall-claude-desktop-windows.md +0 -136
- data/.ai-assistance/scripts/CLAUDE.md +0 -150
- data/.ai-assistance/scripts/bridge-inbox-check.sh +0 -75
- data/.ai-assistance/scripts/bridge-init.sh +0 -86
- data/.ai-assistance/scripts/bridge-status.sh +0 -44
- data/.ai-assistance/scripts/capabilities-check.ts +0 -104
- data/.ai-assistance/scripts/check-outbox.sh +0 -43
- data/.ai-assistance/scripts/dep_graph.rb +0 -91
- data/.ai-assistance/scripts/lock-acquire.sh +0 -103
- data/.ai-assistance/scripts/lock-multi.sh +0 -124
- data/.ai-assistance/scripts/lock-queue.sh +0 -94
- data/.ai-assistance/scripts/setup-mcps.test.ts +0 -188
- data/.ai-assistance/scripts/setup-mcps.ts +0 -234
- data/.ai-assistance/scripts/task-complete.ts +0 -74
- data/.ai-assistance/scripts/task-create.ts +0 -75
- data/.ai-assistance/scripts/task-read.ts +0 -125
- data/.ai-assistance/scripts/token-logger.js +0 -220
- data/.ai-assistance/scripts/token-report.ts +0 -158
- data/.ai-assistance/scripts/token-session-start.js +0 -66
- data/.ai-assistance/skills/ai-instructions/SKILL.md +0 -48
- data/.ai-assistance/skills/code-specs/SKILL.md +0 -69
- data/.ai-assistance/skills/corporate-policies/SKILL.md +0 -201
- data/.ai-assistance/skills/dep-graph/SKILL.md +0 -139
- data/.ai-assistance/skills/ep-ai-manager/SKILL.md +0 -417
- data/.ai-assistance/skills/gemini-assist/SKILL.md +0 -63
- data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +0 -205
- data/.ai-assistance/skills/gemini-assist/gemini_ask.py +0 -1
- data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +0 -240
- data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +0 -25
- data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +0 -261
- data/.ai-assistance/skills/procedural-memory/SKILL.md +0 -319
- data/.ai-assistance/skills/project-cycle/SKILL.md +0 -177
- data/.ai-assistance/skills/project-self-docs/SKILL.md +0 -181
- data/.ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py +0 -378
- data/.ai-assistance/skills/refactor/SKILL.md +0 -62
- data/.ai-assistance/skills/rubocop/SKILL.md +0 -93
- data/.ai-assistance/skills/ruby-scripting/SKILL.md +0 -215
- data/.ai-assistance/skills/spec-generation/SKILL.md +0 -72
- data/.ai-assistance/standards-version.json +0 -22
- data/.ai-assistance/token-budget.json +0 -32
- data/.ai-assistance/version.json +0 -39
- data/.claude/settings.json +0 -150
- data/.env.example +0 -18
- data/.gitattributes +0 -15
- data/.gitignore +0 -37
- data/.gitlab-ci.yml +0 -45
- data/.markdownlint.json +0 -4
- data/.rspec +0 -3
- data/.rubocop.yml +0 -121
- data/.ruby-version +0 -1
- data/.yardopts +0 -10
- data/CLAUDE.md +0 -243
- data/Gemfile +0 -30
- data/Rakefile +0 -90
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/bin/setup.ps1 +0 -6
- data/docs/self-docs/ARCHITECTURE.md +0 -88
- data/docs/self-docs/CHANGES.jsonl +0 -12
- data/docs/self-docs/COMPLIANCE.md +0 -79
- data/docs/self-docs/CONVENTIONS.md +0 -74
- data/docs/self-docs/INTEGRATIONS.md +0 -65
- data/docs/self-docs/OPERATIONS.md +0 -76
- data/docs/self-docs/OVERVIEW.md +0 -64
- data/docs/self-docs/STATUS.md +0 -73
- data/docs/self-docs/self-docs-index.json +0 -51
- data/docs/worklog.md +0 -977
- data/ecoportal-api-graphql.gemspec +0 -40
- data/scripts/auto-worker-scheduler.sh +0 -386
- data/tests/actions_get.rb +0 -7
- data/tests/contractor_entities_get.rb +0 -20
- data/tests/contractor_entity_create.rb +0 -19
- data/tests/contractor_entity_udpate.rb +0 -20
- data/tests/dump_page_model.rb +0 -74
- data/tests/dump_template_model.rb +0 -90
- data/tests/loc_structure_get.rb +0 -10
- data/tests/loc_structure_update.rb +0 -51
- data/tests/loc_structures_get.rb +0 -15
- data/tests/local_libs.rb +0 -20
- data/tests/validate_queries.rb +0 -127
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ruby-scripting
|
|
3
|
-
version: 0.1.0
|
|
4
|
-
description: >
|
|
5
|
-
AI coding assistant guidelines for internal Ruby scripts that consume ecoPortal's
|
|
6
|
-
Ruby gem stack (ecoportal-api-graphql, ecoportal-api, eco-helpers). Covers gem
|
|
7
|
-
authentication, GraphQL query patterns, mutation patterns, error handling, and
|
|
8
|
-
cross-platform script conventions (Windows/WSL/macOS/Linux).
|
|
9
|
-
triggers:
|
|
10
|
-
- ruby script
|
|
11
|
-
- internal script
|
|
12
|
-
- ecoportal-api
|
|
13
|
-
- graphql query
|
|
14
|
-
- ruby-scripting
|
|
15
|
-
- write a ruby script
|
|
16
|
-
applicable_to:
|
|
17
|
-
- ruby
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
# SKILL: Ruby Scripting (ecoPortal Internal)
|
|
21
|
-
|
|
22
|
-
**Purpose:** Guidelines for AI-assisted authoring of internal Ruby scripts that use the ecoPortal gem stack. These scripts run internally — no customer access; Ruby is not a customer-facing language at ecoPortal.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## When to Use
|
|
27
|
-
|
|
28
|
-
- Writing a new script that queries or mutates ecoPortal data via the GraphQL API
|
|
29
|
-
- Debugging or extending an existing script in `ruby_scripts/` or similar
|
|
30
|
-
- Any task involving `ecoportal-api-graphql`, `ecoportal-api`, or `eco-helpers`
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Gem Stack
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
ecoportal-api-graphql ← GraphQL client layer (mutations, queries, models)
|
|
38
|
-
↑
|
|
39
|
-
ecoportal-api / ecoportal-api-v2 ← REST API + base model infrastructure
|
|
40
|
-
↑
|
|
41
|
-
eco-helpers ← Utility helpers (pagination, bulk ops, etc.)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
**Before writing any API call**, check:
|
|
45
|
-
1. Does `eco-helpers` already have a helper for this operation? (It often does.)
|
|
46
|
-
2. Does `ecoportal-api-graphql` already have a model/mutation class?
|
|
47
|
-
3. Read `.ai-assistance/code/dependencies.md` in `ecoportal-api-graphql` for local paths.
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Authentication
|
|
52
|
-
|
|
53
|
-
```ruby
|
|
54
|
-
require 'ecoportal/api'
|
|
55
|
-
|
|
56
|
-
api = Ecoportal::API::V2.new(
|
|
57
|
-
key: ENV.fetch('EP_API_KEY'),
|
|
58
|
-
host: ENV.fetch('EP_API_HOST', 'live.ecoportal.com')
|
|
59
|
-
)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
Always use `ENV.fetch` (not `ENV[]`) — raises on missing key rather than silently using nil.
|
|
63
|
-
Store credentials in `.env` (gitignored). Never hardcode.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## GraphQL Query Pattern
|
|
68
|
-
|
|
69
|
-
```ruby
|
|
70
|
-
# Read models via GraphQL
|
|
71
|
-
result = api.graphql.query do |q|
|
|
72
|
-
q.current_organization do |org|
|
|
73
|
-
org.name
|
|
74
|
-
org.users(first: 50) do |conn|
|
|
75
|
-
conn.nodes do |user|
|
|
76
|
-
user.id
|
|
77
|
-
user.email
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Check for errors before using data
|
|
84
|
-
raise result.errors.map(&:message).join(', ') if result.errors.any?
|
|
85
|
-
users = result.data.current_organization.users.nodes
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Pagination:** use `eco-helpers` pagination helpers for large result sets rather than
|
|
89
|
-
writing manual cursor loops.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Mutation Pattern
|
|
94
|
-
|
|
95
|
-
```ruby
|
|
96
|
-
# Mutations require patchVer for types that use optimistic locking
|
|
97
|
-
# Always fetch before mutate for those types
|
|
98
|
-
current = api.graphql.query { ... }.data.some_item
|
|
99
|
-
result = api.graphql.mutate do |m|
|
|
100
|
-
m.update_item(input: {
|
|
101
|
-
id: current.id,
|
|
102
|
-
patch_ver: current.patch_ver, # required for patchVer types
|
|
103
|
-
name: "New Name"
|
|
104
|
-
}) do |payload|
|
|
105
|
-
payload.item { |i| i.id; i.name }
|
|
106
|
-
payload.errors { |e| e.message; e.path }
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
raise result.errors.map(&:message).join(', ') if result.errors.any?
|
|
111
|
-
raise result.data.update_item.errors.map(&:message).join(', ') \
|
|
112
|
-
if result.data.update_item.errors.any?
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
**patchVer rule:** any schema type with a `patchVer` field requires reading current value
|
|
116
|
-
before any update. See `graphql-schema-analysis` skill for detection.
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## Cross-Platform Script Conventions
|
|
121
|
-
|
|
122
|
-
These scripts run on developer machines (Windows/WSL, macOS, Linux CI):
|
|
123
|
-
|
|
124
|
-
```ruby
|
|
125
|
-
# ✅ Safe: Ruby's File/Pathname handles separators cross-platform
|
|
126
|
-
require 'pathname'
|
|
127
|
-
base = Pathname.new(File.dirname(__FILE__))
|
|
128
|
-
data_file = base / 'data' / 'input.json'
|
|
129
|
-
|
|
130
|
-
# ❌ Unsafe: hardcoded separators, or shell assumptions
|
|
131
|
-
data_file = "#{__dir__}\\data\\input.json" # breaks on Linux
|
|
132
|
-
`cat #{data_file}` # assumes Unix shell
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
**Environment detection:**
|
|
136
|
-
```ruby
|
|
137
|
-
WINDOWS = Gem.win_platform?
|
|
138
|
-
# Use for platform-specific paths only — prefer Pathname for everything else
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
**Output:** use `$stdout.puts` not `print` for script output. Use `$stderr.puts` for
|
|
142
|
-
errors. This allows the script to be piped and combined cleanly.
|
|
143
|
-
|
|
144
|
-
**Exit codes:** always `exit 0` on success, `exit 1` on error. Never let an unhandled
|
|
145
|
-
exception be the exit mechanism in production scripts.
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Error Handling
|
|
150
|
-
|
|
151
|
-
```ruby
|
|
152
|
-
begin
|
|
153
|
-
# API calls here
|
|
154
|
-
rescue Ecoportal::API::Errors::ApiError => e
|
|
155
|
-
$stderr.puts "API error: #{e.message} (status: #{e.status})"
|
|
156
|
-
exit 1
|
|
157
|
-
rescue => e
|
|
158
|
-
$stderr.puts "Unexpected error: #{e.class}: #{e.message}"
|
|
159
|
-
$stderr.puts e.backtrace.first(5).join("\n")
|
|
160
|
-
exit 1
|
|
161
|
-
end
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Script Structure Template
|
|
167
|
-
|
|
168
|
-
```ruby
|
|
169
|
-
#!/usr/bin/env ruby
|
|
170
|
-
# frozen_string_literal: true
|
|
171
|
-
#
|
|
172
|
-
# Script: <name>.rb
|
|
173
|
-
# Purpose: <one sentence>
|
|
174
|
-
# Usage: ruby <name>.rb [options]
|
|
175
|
-
# Dependencies: ecoportal-api-graphql, dotenv
|
|
176
|
-
#
|
|
177
|
-
# Run from repo root: bundle exec ruby scripts/<name>.rb
|
|
178
|
-
|
|
179
|
-
require 'bundler/setup'
|
|
180
|
-
require 'dotenv/load'
|
|
181
|
-
require 'ecoportal/api'
|
|
182
|
-
# ... other requires
|
|
183
|
-
|
|
184
|
-
api = Ecoportal::API::V2.new(
|
|
185
|
-
key: ENV.fetch('EP_API_KEY'),
|
|
186
|
-
host: ENV.fetch('EP_API_HOST', 'live.ecoportal.com')
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
begin
|
|
190
|
-
# main logic here
|
|
191
|
-
rescue => e
|
|
192
|
-
$stderr.puts "Error: #{e.class}: #{e.message}"
|
|
193
|
-
exit 1
|
|
194
|
-
end
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
---
|
|
198
|
-
|
|
199
|
-
## What NOT to do
|
|
200
|
-
|
|
201
|
-
- Don't write raw HTTP calls to the EcoPortal API — use the gem stack
|
|
202
|
-
- Don't paginate manually — use `eco-helpers` pagination
|
|
203
|
-
- Don't hardcode API keys, hosts, or org identifiers
|
|
204
|
-
- Don't use `pp` or `binding.pry` in committed scripts — use structured logging
|
|
205
|
-
- Don't assume a Unix shell — use Ruby cross-platform file handling
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## v0.1.0 limitations
|
|
210
|
-
|
|
211
|
-
This skill covers general patterns. For area-specific details (specific GraphQL models,
|
|
212
|
-
available mutation inputs, schema patterns), consult:
|
|
213
|
-
- `ecoportal-api-graphql/.ai-assistance/code/` for code specs
|
|
214
|
-
- `ecoportal-api-graphql/.ai-assistance/skills/graphql-schema-analysis/SKILL.md`
|
|
215
|
-
- Live schema introspection (see graphql-schema-analysis skill)
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# SKILL: Spec Generation
|
|
2
|
-
|
|
3
|
-
**Purpose:** Add RSpec specs that guard backwards compatibility and document expected behaviour, placed in the correct spec folder mirroring the lib/ structure.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## When to Use
|
|
8
|
-
|
|
9
|
-
- A change could break downstream consumers (primarily `eco-helpers`).
|
|
10
|
-
- A public method or interface is being added, changed, or removed.
|
|
11
|
-
- A bug is fixed — add a regression spec.
|
|
12
|
-
- A new class is added that other code will depend on.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Placement Rules
|
|
17
|
-
|
|
18
|
-
Spec files **mirror `lib/` structure** under `spec/`:
|
|
19
|
-
|
|
20
|
-
| Code file | Spec file |
|
|
21
|
-
|-----------|----------|
|
|
22
|
-
| `lib/ecoportal/api/graphql/model/action.rb` | `spec/ecoportal/api/graphql/model/action_spec.rb` |
|
|
23
|
-
| `lib/ecoportal/api/graphql/input/location_structure/draft.rb` | `spec/ecoportal/api/graphql/input/location_structure/draft_spec.rb` |
|
|
24
|
-
|
|
25
|
-
Create the folder path if it doesn't exist.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Spec Requirements
|
|
30
|
-
|
|
31
|
-
Each spec file for a changed area must have:
|
|
32
|
-
|
|
33
|
-
1. A description of the class/module under test.
|
|
34
|
-
2. At least one spec covering the public interface being changed.
|
|
35
|
-
3. For backwards-compat specs: a comment `# backwards-compat` so they're easily searched.
|
|
36
|
-
|
|
37
|
-
**Minimum spec template:**
|
|
38
|
-
|
|
39
|
-
```ruby
|
|
40
|
-
# frozen_string_literal: true
|
|
41
|
-
|
|
42
|
-
RSpec.describe Ecoportal::API::Graphql::<ClassName> do
|
|
43
|
-
# backwards-compat
|
|
44
|
-
describe '#<method>' do
|
|
45
|
-
subject { described_class.new(<args>) }
|
|
46
|
-
|
|
47
|
-
it '<expected behaviour>' do
|
|
48
|
-
expect(subject.<method>).to <matcher>
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## Linked to Code Specs for AI
|
|
57
|
-
|
|
58
|
-
Whenever a spec file is created or updated for an area, check the corresponding `.ai-assistance/code/<area>.md` doc:
|
|
59
|
-
- Does it mention this class/method?
|
|
60
|
-
- Does it reflect the current expected behaviour?
|
|
61
|
-
|
|
62
|
-
If not — update it. This redundancy is intentional: it saves AI agents from having to parse spec files to understand expected behaviour.
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Gemini Assist Integration
|
|
67
|
-
|
|
68
|
-
When generating specs for a large area, you may use `gemini-assist` to:
|
|
69
|
-
- Get a first-pass draft of spec cases given the source file.
|
|
70
|
-
- Check for edge cases you may have missed.
|
|
71
|
-
|
|
72
|
-
Always verify the generated specs run and match actual behaviour before committing.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"ep-ai-standards-version": "1.5.0",
|
|
3
|
-
"applied-at": "2026-06-13",
|
|
4
|
-
"project-type": [
|
|
5
|
-
"ruby"
|
|
6
|
-
],
|
|
7
|
-
"deferred": [],
|
|
8
|
-
"installed-components": {
|
|
9
|
-
"skills/ai-instructions": "0.0.0",
|
|
10
|
-
"skills/code-specs": "0.0.0",
|
|
11
|
-
"skills/corporate-policies": "1.0.0",
|
|
12
|
-
"skills/dep-graph": "0.0.0",
|
|
13
|
-
"skills/ep-ai-manager": "2.2.0",
|
|
14
|
-
"skills/gemini-assist": "0.0.0",
|
|
15
|
-
"skills/graphql-schema-analysis": "0.0.0",
|
|
16
|
-
"skills/project-cycle": "0.0.0",
|
|
17
|
-
"skills/project-self-docs": "0.2.0",
|
|
18
|
-
"skills/refactor": "0.0.0",
|
|
19
|
-
"skills/ruby-scripting": "0.1.0",
|
|
20
|
-
"skills/spec-generation": "0.0.0"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema_version": "1.0",
|
|
3
|
-
"project": {
|
|
4
|
-
"name": "ecoportal-api-graphql",
|
|
5
|
-
"priority": "medium",
|
|
6
|
-
"developer": "oscar@ecoportal.co.nz"
|
|
7
|
-
},
|
|
8
|
-
"weekly_quota": {
|
|
9
|
-
"total_tokens": null,
|
|
10
|
-
"target_utilization_pct": 75,
|
|
11
|
-
"reset_day": "monday"
|
|
12
|
-
},
|
|
13
|
-
"project_allocation": {
|
|
14
|
-
"priority_weights": { "high": 50, "medium": 30, "low": 20 }
|
|
15
|
-
},
|
|
16
|
-
"session_logging": {
|
|
17
|
-
"enabled": true,
|
|
18
|
-
"log_dir": ".ai-assistance/local/kpi",
|
|
19
|
-
"warn_at_pct": 80,
|
|
20
|
-
"prompt_category_at_stop": true
|
|
21
|
-
},
|
|
22
|
-
"task_categories": [
|
|
23
|
-
"coding", "bug_fixing", "bug_prevention",
|
|
24
|
-
"documentation", "communication", "post_release",
|
|
25
|
-
"troubleshooting", "integration_delivery", "skills_development"
|
|
26
|
-
],
|
|
27
|
-
|
|
28
|
-
"auto_worker": {
|
|
29
|
-
"enabled": true,
|
|
30
|
-
"dangerously_skip_permissions": false
|
|
31
|
-
}
|
|
32
|
-
}
|
data/.ai-assistance/version.json
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema": "1.0",
|
|
3
|
-
"note": "Tracks which features are installed in THIS .ai-assistance/ directory. Updated by install.sh on each deployment. Do NOT confuse with standards-version.json (ep-ai-standards compliance) — this is .ai-assistance/ infrastructure versioning.",
|
|
4
|
-
|
|
5
|
-
"installed_at": "2026-06-09",
|
|
6
|
-
"installed_from": "ep-ai-standards",
|
|
7
|
-
|
|
8
|
-
"features": {
|
|
9
|
-
"bridge_protocol": {
|
|
10
|
-
"version": "1.1.0",
|
|
11
|
-
"scripts": ["bridge-init.sh", "lock-acquire.sh", "lock-multi.sh", "lock-queue.sh", "bridge-status.sh", "check-outbox.sh"],
|
|
12
|
-
"directories": ["bridge/inbox", "bridge/outbox", "bridge/archive", "bridge/queue"],
|
|
13
|
-
"note": "v1.1.0 adds cross-repo locking (lock-multi.sh) and turn-request queue (lock-queue.sh, bridge/queue/)"
|
|
14
|
-
},
|
|
15
|
-
"token_budget": {
|
|
16
|
-
"version": "1.0.0",
|
|
17
|
-
"scripts": ["token-logger.js", "token-session-start.js", "token-report.ts"],
|
|
18
|
-
"config": "token-budget.json",
|
|
19
|
-
"hooks": ["Stop", "SessionStart"],
|
|
20
|
-
"note": "Automatic token tracking via Claude Code hooks. Requires Node.js."
|
|
21
|
-
},
|
|
22
|
-
"skills": {
|
|
23
|
-
"version": "1.0.0",
|
|
24
|
-
"directory": "skills/",
|
|
25
|
-
"note": "See skills/ for available SKILL.md files"
|
|
26
|
-
},
|
|
27
|
-
"capabilities_registry": {
|
|
28
|
-
"version": "1.0.0",
|
|
29
|
-
"directory": "capabilities/",
|
|
30
|
-
"files": ["code.md", "cowork.md", "connectors.md", "assumptions-log.md"]
|
|
31
|
-
},
|
|
32
|
-
"conventions": {
|
|
33
|
-
"version": "1.0.0",
|
|
34
|
-
"directory": "conventions/"
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
"how_agents_should_use_this": "Before invoking any feature, check features.<name> exists and is not null. If a feature is missing or null, the capability is not installed — do not assume it exists. Example: if features.token_budget is null, do not reference token logging commands."
|
|
39
|
-
}
|
data/.claude/settings.json
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"defaultMode": "auto",
|
|
4
|
-
"allowedTools": [
|
|
5
|
-
"Read"
|
|
6
|
-
],
|
|
7
|
-
"permissionRules": [
|
|
8
|
-
{
|
|
9
|
-
"tool": "Write",
|
|
10
|
-
"pattern": "/**",
|
|
11
|
-
"action": "allow"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"tool": "StrReplace",
|
|
15
|
-
"pattern": "/**",
|
|
16
|
-
"action": "allow"
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"allow": [
|
|
20
|
-
"WebFetch(domain:anthropic.com)",
|
|
21
|
-
"WebFetch(domain:npmjs.com)",
|
|
22
|
-
"Write(.glaudeignore)",
|
|
23
|
-
"Update(.glaudeignore)",
|
|
24
|
-
"Bash(rm .ai-assistance/bridge/LOCK)",
|
|
25
|
-
"Read(.git/**)",
|
|
26
|
-
"Read(**/rubygems/**)",
|
|
27
|
-
"Write(*.md)",
|
|
28
|
-
"Edit(.ai-assistance/**)",
|
|
29
|
-
"Update(.ai-assistance/**)",
|
|
30
|
-
"Write(.ai-assistance/**)",
|
|
31
|
-
"Write(lib/**)",
|
|
32
|
-
"Write(spec/**)",
|
|
33
|
-
"Bash(git status)",
|
|
34
|
-
"Bash(git diff *)",
|
|
35
|
-
"Bash(git log *)",
|
|
36
|
-
"Bash(git add *)",
|
|
37
|
-
"Bash(git commit *)",
|
|
38
|
-
"PowerShell(git status)",
|
|
39
|
-
"PowerShell(git diff *)",
|
|
40
|
-
"PowerShell(git log *)",
|
|
41
|
-
"PowerShell(git add *)",
|
|
42
|
-
"PowerShell(git commit *)",
|
|
43
|
-
"Bash(npm test)",
|
|
44
|
-
"Bash(npm run lint)",
|
|
45
|
-
"Bash(npm run build)",
|
|
46
|
-
"Bash(vitest *)",
|
|
47
|
-
"Bash(jest *)",
|
|
48
|
-
"PowerShell(npm test)",
|
|
49
|
-
"PowerShell(npm run lint)",
|
|
50
|
-
"PowerShell(npm run build)",
|
|
51
|
-
"Bash(black .)",
|
|
52
|
-
"Bash(pytest)",
|
|
53
|
-
"Bash(python -m unittest)",
|
|
54
|
-
"Bash(ruff check *)",
|
|
55
|
-
"Bash(bundle exec rspec *)",
|
|
56
|
-
"Bash(bundle exec rubocop *)",
|
|
57
|
-
"PowerShell(pytest)",
|
|
58
|
-
"PowerShell(python -m unittest)",
|
|
59
|
-
"PowerShell(ruff check *)",
|
|
60
|
-
"PowerShell(bundle exec rspec *)",
|
|
61
|
-
"PowerShell(bundle exec rubocop *)",
|
|
62
|
-
"Bash(node .ai-assistance/scripts/token-logger.js)",
|
|
63
|
-
"Bash(node .ai-assistance/scripts/token-session-start.js)",
|
|
64
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git status*)",
|
|
65
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git log*)",
|
|
66
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git diff*)",
|
|
67
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git show*)",
|
|
68
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git branch*)",
|
|
69
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git fetch*)",
|
|
70
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git checkout*)",
|
|
71
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git switch*)",
|
|
72
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git add*)",
|
|
73
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git commit*)",
|
|
74
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git rev-parse*)",
|
|
75
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git merge-base*)",
|
|
76
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git ls-remote*)",
|
|
77
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && git stash*)",
|
|
78
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && bundle exec rspec*)",
|
|
79
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && bundle exec rake test*)",
|
|
80
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && bundle exec rubocop*)",
|
|
81
|
-
"Bash(cd C:/ruby_scripts/git/graphlient && bundle install*)",
|
|
82
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git status*)",
|
|
83
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git log*)",
|
|
84
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git diff*)",
|
|
85
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git show*)",
|
|
86
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git branch*)",
|
|
87
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git fetch*)",
|
|
88
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git checkout*)",
|
|
89
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git switch*)",
|
|
90
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git add*)",
|
|
91
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git commit*)",
|
|
92
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git rev-parse*)",
|
|
93
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git merge-base*)",
|
|
94
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git ls-remote*)",
|
|
95
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && git stash*)",
|
|
96
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && bundle exec rake test*)",
|
|
97
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && bundle exec rubocop*)",
|
|
98
|
-
"Bash(cd C:/ruby_scripts/git/graphql-client && bundle install*)"
|
|
99
|
-
],
|
|
100
|
-
"deny": [
|
|
101
|
-
"Read(*.env)",
|
|
102
|
-
"Read(./.env*)",
|
|
103
|
-
"Read(./secrets/**)",
|
|
104
|
-
"Bash(*cat *.env*)",
|
|
105
|
-
"Bash(*grep *.env*)",
|
|
106
|
-
"Bash(printenv*)",
|
|
107
|
-
"Bash(env)",
|
|
108
|
-
"Write(.git/*)",
|
|
109
|
-
"Edit(.git/*)",
|
|
110
|
-
"Bash(git push *)",
|
|
111
|
-
"Bash(rm -rf *)"
|
|
112
|
-
]
|
|
113
|
-
},
|
|
114
|
-
"hooks": {
|
|
115
|
-
"SessionStart": [
|
|
116
|
-
{
|
|
117
|
-
"matcher": "",
|
|
118
|
-
"hooks": [
|
|
119
|
-
{
|
|
120
|
-
"type": "command",
|
|
121
|
-
"command": "bash .ai-assistance/scripts/bridge-init.sh 2>/dev/null || true"
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"type": "command",
|
|
125
|
-
"command": "node .ai-assistance/scripts/token-session-start.js 2>/dev/null || true"
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
"type": "command",
|
|
129
|
-
"command": "bash .ai-assistance/scripts/bridge-inbox-check.sh 2>/dev/null || true"
|
|
130
|
-
}
|
|
131
|
-
]
|
|
132
|
-
}
|
|
133
|
-
],
|
|
134
|
-
"Stop": [
|
|
135
|
-
{
|
|
136
|
-
"matcher": "",
|
|
137
|
-
"hooks": [
|
|
138
|
-
{
|
|
139
|
-
"type": "command",
|
|
140
|
-
"command": "node .ai-assistance/scripts/token-logger.js 2>/dev/null || true"
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"type": "command",
|
|
144
|
-
"command": "bash scripts/auto-worker-scheduler.sh 2>/dev/null || true"
|
|
145
|
-
}
|
|
146
|
-
]
|
|
147
|
-
}
|
|
148
|
-
]
|
|
149
|
-
}
|
|
150
|
-
}
|
data/.env.example
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Copy this file to .env and fill in your values.
|
|
2
|
-
# .env is git-ignored — never commit real keys.
|
|
3
|
-
|
|
4
|
-
# Gemini API key — get from https://aistudio.google.com/app/apikey
|
|
5
|
-
GEMINI_API_KEY=your-key-here
|
|
6
|
-
|
|
7
|
-
# Gemini model override — default is gemini-2.5-pro (best for large codebase analysis)
|
|
8
|
-
# Cheaper/faster alternatives:
|
|
9
|
-
# gemini-2.5-flash — good balance of speed and quality
|
|
10
|
-
# gemini-2.0-flash — fast, lower cost
|
|
11
|
-
# Run --list-models to see all available models for your key.
|
|
12
|
-
# GEMINI_MODEL=gemini-2.5-flash
|
|
13
|
-
|
|
14
|
-
# GitLab personal access token
|
|
15
|
-
# Create at: https://gitlab.ecoportal.co.nz/-/user_settings/personal_access_tokens
|
|
16
|
-
# Required scopes: read_api
|
|
17
|
-
GITLAB_TOKEN=your-token-here
|
|
18
|
-
GITLAB_URL=https://gitlab.ecoportal.co.nz
|
data/.gitattributes
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Normalize all text files to LF in git and on checkout.
|
|
2
|
-
# Claude Code writes LF; this prevents git from converting or warning.
|
|
3
|
-
* text=auto eol=lf
|
|
4
|
-
|
|
5
|
-
# Windows-only executables that genuinely need CRLF
|
|
6
|
-
*.bat text eol=crlf
|
|
7
|
-
*.cmd text eol=crlf
|
|
8
|
-
*.ps1 text eol=crlf
|
|
9
|
-
|
|
10
|
-
# Binary files — never touch line endings
|
|
11
|
-
*.png binary
|
|
12
|
-
*.jpg binary
|
|
13
|
-
*.pdf binary
|
|
14
|
-
*.docx binary
|
|
15
|
-
*.gem binary
|
data/.gitignore
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# it's a gem, ignore the lockfile
|
|
2
|
-
Gemfile.lock
|
|
3
|
-
|
|
4
|
-
.env
|
|
5
|
-
.ai-assistance/local_paths.md
|
|
6
|
-
# build artifacts
|
|
7
|
-
*.gem
|
|
8
|
-
/.bundle/
|
|
9
|
-
/vendor/bundle
|
|
10
|
-
/spec/reports/
|
|
11
|
-
/tmp/
|
|
12
|
-
/pkg/
|
|
13
|
-
|
|
14
|
-
# docs
|
|
15
|
-
/.yardoc
|
|
16
|
-
/_yardoc/
|
|
17
|
-
/coverage/
|
|
18
|
-
/doc/
|
|
19
|
-
|
|
20
|
-
# rspec failure tracking
|
|
21
|
-
.rspec_status
|
|
22
|
-
scratch.rb
|
|
23
|
-
tests/.byebug_history
|
|
24
|
-
|
|
25
|
-
.solargraph.yml
|
|
26
|
-
|
|
27
|
-
# AI assistance — local-only files
|
|
28
|
-
.ai-assistance/code/dep-graph.json
|
|
29
|
-
.ai-assistance/tmp/
|
|
30
|
-
.ai-assistance/local/
|
|
31
|
-
.ai-assistance/bridge/inbox/*.draft.md
|
|
32
|
-
.ai-assistance/bridge/inbox/*.local.md
|
|
33
|
-
.ai-assistance/bridge/LOCK
|
|
34
|
-
.ai-assistance/bridge/STATUS
|
|
35
|
-
.ai-assistance/capabilities/.env
|
|
36
|
-
.ai-assistance/scripts/*.env
|
|
37
|
-
.ai-assistance/scripts/node_modules/
|
data/.gitlab-ci.yml
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# CI pipeline for ecoportal-api-graphql
|
|
2
|
-
#
|
|
3
|
-
# First automated check on merge requests. Runs the RSpec suite NON-BLOCKING
|
|
4
|
-
# (allow_failure: true) — it reports pass/fail status without gating merges.
|
|
5
|
-
# Rationale (2026-07-10): add visibility now; tighten to a blocking gate later
|
|
6
|
-
# once the suite is reliably green on a clean runner.
|
|
7
|
-
#
|
|
8
|
-
# Live/AI specs (tagged :live) are excluded: they need ANTHROPIC_API_KEY + network.
|
|
9
|
-
# They already self-skip when the key is absent, but ~live keeps the runner off
|
|
10
|
-
# that path entirely.
|
|
11
|
-
#
|
|
12
|
-
# NOTE: graphlient resolves from a git fork (see Gemfile); ecoportal-api / -v2 come
|
|
13
|
-
# from rubygems. If a required floor (e.g. ecoportal-api-v2 >= 3.3.3) is not yet
|
|
14
|
-
# published, `bundle install` may fail on the runner — because this job is
|
|
15
|
-
# allow_failure, that surfaces as a warning rather than blocking the MR.
|
|
16
|
-
|
|
17
|
-
workflow:
|
|
18
|
-
rules:
|
|
19
|
-
# Merge-request pipelines.
|
|
20
|
-
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
21
|
-
# Avoid a duplicate branch pipeline when an MR is already open for the branch.
|
|
22
|
-
- if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
|
|
23
|
-
when: never
|
|
24
|
-
# Branch pipelines (incl. main/master pushes and feature branches without an MR).
|
|
25
|
-
- if: '$CI_COMMIT_BRANCH'
|
|
26
|
-
|
|
27
|
-
stages:
|
|
28
|
-
- test
|
|
29
|
-
|
|
30
|
-
rspec:
|
|
31
|
-
stage: test
|
|
32
|
-
image: ruby:3.2.2
|
|
33
|
-
allow_failure: true # non-blocking: surface failures, do not gate merges
|
|
34
|
-
variables:
|
|
35
|
-
BUNDLE_PATH: vendor/bundle # cache installed gems between pipelines
|
|
36
|
-
cache:
|
|
37
|
-
key: "ruby-322-bundle"
|
|
38
|
-
paths:
|
|
39
|
-
- vendor/bundle
|
|
40
|
-
before_script:
|
|
41
|
-
- ruby -v
|
|
42
|
-
- gem install bundler
|
|
43
|
-
- bundle install --jobs "$(nproc)" --retry 3
|
|
44
|
-
script:
|
|
45
|
-
- bundle exec rspec --tag ~live --format progress
|
data/.markdownlint.json
DELETED
data/.rspec
DELETED