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.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -0
  3. data/lib/ecoportal/api/common/graphql/client.rb +0 -2
  4. data/lib/ecoportal/api/common/graphql/http_client.rb +6 -0
  5. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -17
  6. data/lib/ecoportal/api/graphql/base/file_container.rb +14 -14
  7. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +15 -15
  8. data/lib/ecoportal/api/graphql/base/location_structure.rb +27 -27
  9. data/lib/ecoportal/api/graphql/base/organization.rb +15 -15
  10. data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
  11. data/lib/ecoportal/api/graphql/base/page.rb +17 -16
  12. data/lib/ecoportal/api/graphql/base/template.rb +35 -0
  13. data/lib/ecoportal/api/graphql/base.rb +37 -35
  14. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +41 -41
  15. data/lib/ecoportal/api/graphql/compat/response.rb +35 -35
  16. data/lib/ecoportal/api/graphql/connection/action.rb +11 -11
  17. data/lib/ecoportal/api/graphql/connection/action_category.rb +11 -11
  18. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -11
  19. data/lib/ecoportal/api/graphql/connection/page.rb +11 -11
  20. data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -11
  21. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -11
  22. data/lib/ecoportal/api/graphql/connection.rb +17 -17
  23. data/lib/ecoportal/api/graphql/file_upload/client.rb +21 -10
  24. data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
  25. data/lib/ecoportal/api/graphql/fragment/force.rb +14 -10
  26. data/lib/ecoportal/api/graphql/fragment/location_node.rb +26 -26
  27. data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
  28. data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
  29. data/lib/ecoportal/api/graphql/fragment.rb +3 -0
  30. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +14 -14
  31. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -16
  32. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -18
  33. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -21
  34. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -28
  35. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -18
  36. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -23
  37. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -20
  38. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -20
  39. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -24
  40. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -20
  41. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -20
  42. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -20
  43. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -18
  44. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -18
  45. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -18
  46. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -251
  47. data/lib/ecoportal/api/graphql/input.rb +24 -24
  48. data/lib/ecoportal/api/graphql/logic/connection.rb +34 -34
  49. data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
  50. data/lib/ecoportal/api/graphql/model/page.rb +16 -15
  51. data/lib/ecoportal/api/graphql/model/person_member.rb +15 -15
  52. data/lib/ecoportal/api/graphql/model/template.rb +15 -0
  53. data/lib/ecoportal/api/graphql/model.rb +32 -30
  54. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -45
  55. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -40
  56. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +14 -14
  57. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -40
  58. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -40
  59. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -40
  60. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -40
  61. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +7 -7
  62. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +8 -7
  63. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -40
  64. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -40
  65. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -40
  66. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -40
  67. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -35
  68. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -35
  69. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -36
  70. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -40
  71. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -13
  72. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -46
  73. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +1 -1
  74. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +1 -1
  75. data/lib/ecoportal/api/graphql/mutation.rb +20 -20
  76. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +14 -14
  77. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -21
  78. data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -13
  79. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -13
  80. data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
  81. data/lib/ecoportal/api/graphql/payload/page.rb +20 -19
  82. data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -11
  83. data/lib/ecoportal/api/graphql/payload/register.rb +15 -11
  84. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +1 -1
  85. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +1 -1
  86. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +1 -1
  87. data/lib/ecoportal/api/graphql/payload.rb +23 -23
  88. data/lib/ecoportal/api/graphql/query/location_structures.rb +57 -57
  89. data/lib/ecoportal/api/graphql/query/page.rb +45 -45
  90. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +9 -3
  91. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +9 -3
  92. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -78
  93. data/lib/ecoportal/api/graphql/query.rb +27 -27
  94. data/lib/ecoportal/api/graphql.rb +9 -5
  95. data/lib/ecoportal/api/graphql_version.rb +1 -1
  96. metadata +9 -180
  97. data/.ai-assistance/bridge/CLAUDE.md +0 -338
  98. data/.ai-assistance/bridge/archive/.gitkeep +0 -0
  99. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +0 -29
  100. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +0 -18
  101. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +0 -42
  102. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +0 -115
  103. data/.ai-assistance/bridge/context/gemini-review-prompt.txt +0 -48
  104. data/.ai-assistance/bridge/context/gemini-review-response.md +0 -104
  105. data/.ai-assistance/bridge/context/project.md +0 -42
  106. data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
  107. data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
  108. data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +0 -48
  109. data/.ai-assistance/bridge/queue/.gitkeep +0 -1
  110. data/.ai-assistance/capabilities/CLAUDE.md +0 -27
  111. data/.ai-assistance/capabilities/assumptions-log.md +0 -80
  112. data/.ai-assistance/capabilities/code.md +0 -47
  113. data/.ai-assistance/capabilities/connectors.md +0 -37
  114. data/.ai-assistance/capabilities/cowork.md +0 -55
  115. data/.ai-assistance/code/OVERVIEW.md +0 -155
  116. data/.ai-assistance/code/data_fields.md +0 -242
  117. data/.ai-assistance/code/dependencies.md +0 -151
  118. data/.ai-assistance/code/diff_as_input.md +0 -234
  119. data/.ai-assistance/code/diff_pairing_engine.md +0 -243
  120. data/.ai-assistance/code/diff_service_deep_dive.md +0 -192
  121. data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +0 -55
  122. data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +0 -181
  123. data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +0 -192
  124. data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +0 -147
  125. data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +0 -277
  126. data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +0 -200
  127. data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +0 -228
  128. data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +0 -197
  129. data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +0 -243
  130. data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +0 -196
  131. data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +0 -132
  132. data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +0 -187
  133. data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +0 -236
  134. data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +0 -183
  135. data/.ai-assistance/code/ecoportal_schema_reference.md +0 -240
  136. data/.ai-assistance/code/filter_contract_matrix.md +0 -177
  137. data/.ai-assistance/code/graphql_domain_knowledge.md +0 -240
  138. data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +0 -71
  139. data/.ai-assistance/code/refactoring/opportunities.md +0 -251
  140. data/.ai-assistance/code/schema_analysis.md +0 -321
  141. data/.ai-assistance/code/search_filters.md +0 -868
  142. data/.ai-assistance/code/spec_coverage.md +0 -73
  143. data/.ai-assistance/code/template_diff_pairing_domain.md +0 -175
  144. data/.ai-assistance/code/workflow-command-guide.md +0 -466
  145. data/.ai-assistance/code/workflow-space.md +0 -353
  146. data/.ai-assistance/conventions/CLAUDE.md +0 -30
  147. data/.ai-assistance/conventions/code-working-tree-protocol.md +0 -199
  148. data/.ai-assistance/conventions/gitignore-rules.md +0 -42
  149. data/.ai-assistance/conventions/permission-guidance.md +0 -120
  150. data/.ai-assistance/integrations/README.md +0 -70
  151. data/.ai-assistance/integrations/gitkraken-mcp.md +0 -107
  152. data/.ai-assistance/integrations/gitlab-mcp.md +0 -123
  153. data/.ai-assistance/integrations/local-git.md +0 -60
  154. data/.ai-assistance/local_paths.example.md +0 -17
  155. data/.ai-assistance/projects/TODO.md +0 -118
  156. data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +0 -168
  157. data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +0 -60
  158. data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +0 -267
  159. data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +0 -53
  160. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +0 -102
  161. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +0 -139
  162. data/.ai-assistance/projects/compat-layer-audit/COMPAT_AUDIT.md +0 -244
  163. data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +0 -93
  164. data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +0 -244
  165. data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +0 -266
  166. data/.ai-assistance/projects/eco-helpers-compat/TODO.md +0 -86
  167. data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +0 -101
  168. data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +0 -177
  169. data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +0 -161
  170. data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +0 -125
  171. data/.ai-assistance/projects/ooze-graphql-native-migration/INVENTORY.md +0 -136
  172. data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +0 -126
  173. data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +0 -261
  174. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +0 -122
  175. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +0 -148
  176. data/.ai-assistance/projects/page-model/DECISIONS.md +0 -245
  177. data/.ai-assistance/projects/page-model/TODO.md +0 -190
  178. data/.ai-assistance/projects/qa-services-delivery/DECISIONS.md +0 -93
  179. data/.ai-assistance/projects/qa-services-delivery/INTENT.md +0 -76
  180. data/.ai-assistance/projects/qa-services-delivery/PHASE3-SCOPE.md +0 -115
  181. data/.ai-assistance/projects/qa-services-delivery/ROADMAP.md +0 -99
  182. data/.ai-assistance/projects/qa-services-delivery/TODO.md +0 -81
  183. data/.ai-assistance/projects/search-filter-builder/INTENT.md +0 -107
  184. data/.ai-assistance/projects/search-filter-builder/TODO.md +0 -131
  185. data/.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md +0 -87
  186. data/.ai-assistance/projects/template-automatic-build-maintenance/TODO.md +0 -108
  187. data/.ai-assistance/projects/template-diff-deploy/INTENT.md +0 -12
  188. data/.ai-assistance/projects/template-diff-deploy/TODO.md +0 -9
  189. data/.ai-assistance/projects/template-maintenance/DESIGN.md +0 -134
  190. data/.ai-assistance/projects/template-maintenance/PHASE0-FINDINGS.md +0 -93
  191. data/.ai-assistance/projects/template-maintenance/README.md +0 -14
  192. data/.ai-assistance/projects/template-model-logic/CATEGORY_CATALOG.md +0 -236
  193. data/.ai-assistance/projects/template-model-logic/CLASSIFICATION_SPIKE.md +0 -243
  194. data/.ai-assistance/projects/template-model-logic/DESIGN_NOTE.md +0 -154
  195. data/.ai-assistance/projects/workflow-space/TODO.md +0 -213
  196. data/.ai-assistance/reinstall-claude-desktop-windows.md +0 -136
  197. data/.ai-assistance/scripts/CLAUDE.md +0 -150
  198. data/.ai-assistance/scripts/bridge-inbox-check.sh +0 -75
  199. data/.ai-assistance/scripts/bridge-init.sh +0 -86
  200. data/.ai-assistance/scripts/bridge-status.sh +0 -44
  201. data/.ai-assistance/scripts/capabilities-check.ts +0 -104
  202. data/.ai-assistance/scripts/check-outbox.sh +0 -43
  203. data/.ai-assistance/scripts/dep_graph.rb +0 -91
  204. data/.ai-assistance/scripts/lock-acquire.sh +0 -103
  205. data/.ai-assistance/scripts/lock-multi.sh +0 -124
  206. data/.ai-assistance/scripts/lock-queue.sh +0 -94
  207. data/.ai-assistance/scripts/setup-mcps.test.ts +0 -188
  208. data/.ai-assistance/scripts/setup-mcps.ts +0 -234
  209. data/.ai-assistance/scripts/task-complete.ts +0 -74
  210. data/.ai-assistance/scripts/task-create.ts +0 -75
  211. data/.ai-assistance/scripts/task-read.ts +0 -125
  212. data/.ai-assistance/scripts/token-logger.js +0 -220
  213. data/.ai-assistance/scripts/token-report.ts +0 -158
  214. data/.ai-assistance/scripts/token-session-start.js +0 -66
  215. data/.ai-assistance/skills/ai-instructions/SKILL.md +0 -48
  216. data/.ai-assistance/skills/code-specs/SKILL.md +0 -69
  217. data/.ai-assistance/skills/corporate-policies/SKILL.md +0 -201
  218. data/.ai-assistance/skills/dep-graph/SKILL.md +0 -139
  219. data/.ai-assistance/skills/ep-ai-manager/SKILL.md +0 -417
  220. data/.ai-assistance/skills/gemini-assist/SKILL.md +0 -63
  221. data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +0 -205
  222. data/.ai-assistance/skills/gemini-assist/gemini_ask.py +0 -1
  223. data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +0 -240
  224. data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +0 -25
  225. data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +0 -261
  226. data/.ai-assistance/skills/procedural-memory/SKILL.md +0 -319
  227. data/.ai-assistance/skills/project-cycle/SKILL.md +0 -177
  228. data/.ai-assistance/skills/project-self-docs/SKILL.md +0 -181
  229. data/.ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py +0 -378
  230. data/.ai-assistance/skills/refactor/SKILL.md +0 -62
  231. data/.ai-assistance/skills/rubocop/SKILL.md +0 -93
  232. data/.ai-assistance/skills/ruby-scripting/SKILL.md +0 -215
  233. data/.ai-assistance/skills/spec-generation/SKILL.md +0 -72
  234. data/.ai-assistance/standards-version.json +0 -22
  235. data/.ai-assistance/token-budget.json +0 -32
  236. data/.ai-assistance/version.json +0 -39
  237. data/.claude/settings.json +0 -150
  238. data/.env.example +0 -18
  239. data/.gitattributes +0 -15
  240. data/.gitignore +0 -37
  241. data/.gitlab-ci.yml +0 -45
  242. data/.markdownlint.json +0 -4
  243. data/.rspec +0 -3
  244. data/.rubocop.yml +0 -121
  245. data/.ruby-version +0 -1
  246. data/.yardopts +0 -10
  247. data/CLAUDE.md +0 -243
  248. data/Gemfile +0 -30
  249. data/Rakefile +0 -90
  250. data/bin/console +0 -14
  251. data/bin/setup +0 -8
  252. data/bin/setup.ps1 +0 -6
  253. data/docs/self-docs/ARCHITECTURE.md +0 -88
  254. data/docs/self-docs/CHANGES.jsonl +0 -12
  255. data/docs/self-docs/COMPLIANCE.md +0 -79
  256. data/docs/self-docs/CONVENTIONS.md +0 -74
  257. data/docs/self-docs/INTEGRATIONS.md +0 -65
  258. data/docs/self-docs/OPERATIONS.md +0 -76
  259. data/docs/self-docs/OVERVIEW.md +0 -64
  260. data/docs/self-docs/STATUS.md +0 -73
  261. data/docs/self-docs/self-docs-index.json +0 -51
  262. data/docs/worklog.md +0 -977
  263. data/ecoportal-api-graphql.gemspec +0 -40
  264. data/scripts/auto-worker-scheduler.sh +0 -386
  265. data/tests/actions_get.rb +0 -7
  266. data/tests/contractor_entities_get.rb +0 -20
  267. data/tests/contractor_entity_create.rb +0 -19
  268. data/tests/contractor_entity_udpate.rb +0 -20
  269. data/tests/dump_page_model.rb +0 -74
  270. data/tests/dump_template_model.rb +0 -90
  271. data/tests/loc_structure_get.rb +0 -10
  272. data/tests/loc_structure_update.rb +0 -51
  273. data/tests/loc_structures_get.rb +0 -15
  274. data/tests/local_libs.rb +0 -20
  275. 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
- }
@@ -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
- }
@@ -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
@@ -1,4 +0,0 @@
1
- {
2
- "MD013": false,
3
- "MD024": false
4
- }
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper