@groupby/ai-dev 0.5.12 → 0.5.14
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.
- package/package.json +1 -1
- package/teams/brain-studio/skills/docs-init/SKILL.md +405 -0
- package/teams/fhr-andromeda/github/PULL_REQUEST_TEMPLATE.md +51 -0
- package/teams/fhr-andromeda/github/copilot-instructions.md +47 -0
- package/teams/fhr-andromeda/instructions/CLAUDE.md +66 -0
- package/teams/fhr-andromeda/instructions/ai-instructions.md +312 -0
- package/teams/fhr-andromeda/instructions/architecture.md +181 -0
- package/teams/fhr-andromeda/instructions/code-review.md +127 -0
- package/teams/fhr-andromeda/instructions/coding-guidelines.md +139 -0
- package/teams/fhr-andromeda/instructions/domain.md +125 -0
- package/teams/fhr-andromeda/instructions/jira-ticket-template.md +55 -0
- package/teams/fhr-andromeda/instructions/modules/data-quality-frontend.md +57 -0
- package/teams/fhr-andromeda/instructions/modules/data-quality.md +62 -0
- package/teams/fhr-andromeda/instructions/modules/fhr-custom-transforms.md +59 -0
- package/teams/fhr-andromeda/instructions/modules/hop-dev-platform-frontend.md +60 -0
- package/teams/fhr-andromeda/instructions/modules/hop-dev-platform.md +62 -0
- package/teams/fhr-andromeda/instructions/modules/workflow-scripts.md +119 -0
- package/teams/fhr-andromeda/skills/fhr-pr/SKILL.md +71 -0
- package/teams/fhr-andromeda/skills/fhr-review/SKILL.md +78 -0
- package/teams/fhr-andromeda/skills/fhr-spec/SKILL.md +96 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Coding Guidelines - fhr-apache-hop
|
|
2
|
+
|
|
3
|
+
This file owns implementation conventions. It should define stable coding rules, not
|
|
4
|
+
architecture, workflow process, or module inventories.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. How to Apply These Guidelines
|
|
9
|
+
|
|
10
|
+
Apply rules in this order:
|
|
11
|
+
|
|
12
|
+
1. Safety and workflow rules in `.ai/ai-instructions.md`.
|
|
13
|
+
2. Architecture and module ownership from `.ai/architecture.md` and module-level `CLAUDE.md` files.
|
|
14
|
+
3. Existing local patterns in the target module.
|
|
15
|
+
4. Language and framework conventions in this file.
|
|
16
|
+
5. General clean-code judgement.
|
|
17
|
+
|
|
18
|
+
If local code conflicts with this file, follow the local pattern and mention the conflict in the
|
|
19
|
+
review note.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. Repository-Wide Hard Rules
|
|
24
|
+
|
|
25
|
+
- Do not introduce dependencies, frameworks, tools, or modules without explicit approval.
|
|
26
|
+
- Do not hardcode secrets, credentials, connection strings, customer-specific URLs, or local
|
|
27
|
+
paths.
|
|
28
|
+
- Do not leave `TODO`, `FIXME`, placeholder comments, or commented-out code.
|
|
29
|
+
- Match existing naming, formatting, structure, and test style in the target module.
|
|
30
|
+
- Generate tests for new or changed behaviour.
|
|
31
|
+
- Prefer small, focused changes over broad rewrites.
|
|
32
|
+
- Fail fast with clear, specific errors when required input or configuration is missing.
|
|
33
|
+
- Avoid duplication; before writing new code check whether the logic already exists somewhere
|
|
34
|
+
it logically belongs, and extend or reuse it.
|
|
35
|
+
- Use constants for repeated string literals and magic values; never use `split()` with magic
|
|
36
|
+
numeric indices — use named regex groups, string templates, or `pathlib` so the structure is
|
|
37
|
+
readable and resilient.
|
|
38
|
+
- Comments explain only the non-obvious *why* — a hidden constraint, a workaround, or a
|
|
39
|
+
non-obvious invariant. Never comment what the code already says.
|
|
40
|
+
- After removing or moving code, remove unused imports, dead methods, unreachable branches, and
|
|
41
|
+
tests that no longer cover live behaviour.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 3. Module Decision Table
|
|
46
|
+
|
|
47
|
+
| Module | Must do | Must not do |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| `data-quality` (reactive) | Stay non-blocking; compose reactive flows; test with `StepVerifier` | Call `.block()`; introduce synchronous persistence |
|
|
50
|
+
| `hop-dev-platform` (synchronous) | Use normal MVC/service/repository flow | Introduce `Mono`, `Flux`, or WebFlux patterns |
|
|
51
|
+
| `fhr-custom-transforms` (Hop plugins) | Follow existing Hop plugin lifecycle and metadata patterns | Treat plugins like Spring services |
|
|
52
|
+
| `workflow-scripts` (Python) | Keep scripts typed, logged, env-driven, and single-purpose | Use production `print()`, bare exceptions, or direct argument parsing |
|
|
53
|
+
| `hop-dev-platform-frontend`, `data-quality-frontend` (Angular) | Typed models, services for HTTP, PrimeNG UI, safe subscription cleanup | Call HTTP directly in components; introduce other UI libraries |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Java Guidelines
|
|
58
|
+
|
|
59
|
+
- Use Lombok for boilerplate in DTOs, entities, configuration objects, and Spring beans. Do not
|
|
60
|
+
manually write getters, setters, constructors, or equality methods.
|
|
61
|
+
- Use constructor injection for Spring beans (`@RequiredArgsConstructor`).
|
|
62
|
+
- Use structured logging (`@Slf4j` and `log.*`); never print to stdout.
|
|
63
|
+
- Keep validation at boundaries and throw meaningful domain exceptions.
|
|
64
|
+
- Keep mapping, persistence, transport, and business logic separated.
|
|
65
|
+
- Put transactions at the service boundary in synchronous persistence modules.
|
|
66
|
+
- For reactive modules, return reactive types from service and repository flows and never block.
|
|
67
|
+
- Java package roots: `com.fredhopper.*` for plugin and HDSys code; `com.data_quality.*` for
|
|
68
|
+
DQSys code.
|
|
69
|
+
|
|
70
|
+
### Java Tests
|
|
71
|
+
|
|
72
|
+
- Unit tests: JUnit 5 with `@ExtendWith(MockitoExtension.class)`.
|
|
73
|
+
- Integration tests: Spock/Groovy in `src/integration-test/groovy/`.
|
|
74
|
+
- Database integration tests: Testcontainers (real PostgreSQL containers, never in-memory
|
|
75
|
+
substitutes).
|
|
76
|
+
- Reactive tests: `StepVerifier` — never `.block()` in test assertions.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 5. Python Guidelines
|
|
81
|
+
|
|
82
|
+
- Follow PEP 8 and annotate all function signatures with types.
|
|
83
|
+
- Keep scripts single-purpose and structured consistently: imports → logger → constants →
|
|
84
|
+
helpers → `main()` → `if __name__ == "__main__"`.
|
|
85
|
+
- Use `logger_config.py` for logging; never use production `print()`.
|
|
86
|
+
- Use `arg_utils.py` for argument parsing; never parse raw command-line arguments directly.
|
|
87
|
+
- Read configuration from environment variables with sensible defaults; required variables must
|
|
88
|
+
fail fast with a clear error naming the missing variable.
|
|
89
|
+
- Catch specific exceptions, log with exception context (`exc_info=True`), and exit non-zero on
|
|
90
|
+
fatal workflow-step errors.
|
|
91
|
+
- Unit tests live in `src/test/python/test_<script_name>.py`; mock all external systems
|
|
92
|
+
(S3, Kafka, Kubernetes, PostgreSQL).
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 6. Angular Guidelines
|
|
97
|
+
|
|
98
|
+
- Use standalone components unless existing local code requires otherwise.
|
|
99
|
+
- Use PrimeNG only for UI components.
|
|
100
|
+
- One component per file; follow Angular naming conventions.
|
|
101
|
+
- Keep HTTP calls in services, never directly in components.
|
|
102
|
+
- Prefer `async` pipe for rendered observable state.
|
|
103
|
+
- Use manual subscriptions only for imperative side effects and always clean them up
|
|
104
|
+
(e.g. `takeUntilDestroyed`).
|
|
105
|
+
- Define reusable interfaces for API responses; avoid `any`.
|
|
106
|
+
- Component and service specs live alongside the source file.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 7. Database Guidelines
|
|
111
|
+
|
|
112
|
+
- Schema changes require new migrations; never modify existing migrations.
|
|
113
|
+
- Inspect current migrations before choosing a new migration name.
|
|
114
|
+
- Keep migrations backward-compatible where practical.
|
|
115
|
+
- Keep persistence models, migration changes, and API contracts aligned.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 8. Docker Guidelines
|
|
120
|
+
|
|
121
|
+
- Use minimal images and multi-stage builds where useful.
|
|
122
|
+
- Copy only required files; avoid broad context copies.
|
|
123
|
+
- Do not bake secrets, local paths, or environment-specific values into images.
|
|
124
|
+
- Match existing image naming and registry conventions.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 9. Final Code Cleanup Checklist
|
|
129
|
+
|
|
130
|
+
Before finishing any code change:
|
|
131
|
+
|
|
132
|
+
- No unused imports.
|
|
133
|
+
- No dead code or unreachable branches.
|
|
134
|
+
- No placeholder comments or commented-out code.
|
|
135
|
+
- No duplicated literals that should be constants.
|
|
136
|
+
- No `split()` with magic array indices.
|
|
137
|
+
- No direct logging or printing violations.
|
|
138
|
+
- No new unapproved dependencies.
|
|
139
|
+
- Tests cover changed behaviour and relevant error paths.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Domain Context - fhr-apache-hop
|
|
2
|
+
|
|
3
|
+
This file owns business terminology and domain concepts. It should explain what the system means,
|
|
4
|
+
not how the code is structured.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Fredhopper Context
|
|
9
|
+
|
|
10
|
+
Fredhopper powers product discovery for e-commerce, including search, navigation,
|
|
11
|
+
personalisation, recommendations, and catalogue indexing.
|
|
12
|
+
|
|
13
|
+
ETL 2.0 is the data pipeline platform that prepares customer catalogue data for Fredhopper
|
|
14
|
+
services. It replaces legacy ETL processes with a Kubernetes-native, event-driven model.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## ETL 2.0
|
|
19
|
+
|
|
20
|
+
ETL 2.0 processes customer catalogue data through extraction, transformation, quality checks,
|
|
21
|
+
and publication. It is designed around:
|
|
22
|
+
|
|
23
|
+
- Ephemeral runtime execution instead of long-lived per-customer process servers.
|
|
24
|
+
- Shared standard platform code with customer-specific configuration and customisation.
|
|
25
|
+
- Event-driven or scheduled execution.
|
|
26
|
+
- Observability and data-quality reporting as first-class outputs.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Core Systems
|
|
31
|
+
|
|
32
|
+
### HDSys
|
|
33
|
+
|
|
34
|
+
HDSys is the Hop Development System. It gives consultants browser-based workspaces for
|
|
35
|
+
developing, testing, and managing customer ETL customisations.
|
|
36
|
+
|
|
37
|
+
Key concepts:
|
|
38
|
+
|
|
39
|
+
- Workspace: an isolated browser-based ETL development environment.
|
|
40
|
+
- Standard package: shared ETL logic available to all customers.
|
|
41
|
+
- Customer customisation: customer-specific ETL changes managed through GitOps in `custom-etl`.
|
|
42
|
+
- Workspace lifecycle: creation, use, expiry, and cleanup of development environments.
|
|
43
|
+
|
|
44
|
+
### DQSys
|
|
45
|
+
|
|
46
|
+
DQSys is the Data Quality System. It stores and presents quality and operational signals from
|
|
47
|
+
ETL runs.
|
|
48
|
+
|
|
49
|
+
Key concepts:
|
|
50
|
+
|
|
51
|
+
- DQ check: a SQL validation rule applied to ETL output in the ETL database.
|
|
52
|
+
- DQ report: the results of one or more checks for an ETL run.
|
|
53
|
+
- ETL Dashboard: operational view of run status, timing, input type, and log links.
|
|
54
|
+
- Accumulated reporting: quality history across incremental and repeated runs.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## ETL Run Lifecycle
|
|
59
|
+
|
|
60
|
+
1. A customer catalogue change or schedule places a `trigger.json` file in S3.
|
|
61
|
+
2. An Argo event sensor detects the file and submits an Argo workflow.
|
|
62
|
+
3. Runtime context is prepared: input data is extracted, job configuration is assembled.
|
|
63
|
+
4. ETL packages (standard + customer-specific) are deployed onto a PVC.
|
|
64
|
+
5. Hop server runs the data transformation and writes results to the ETL database.
|
|
65
|
+
6. FAS XML files are generated from the transformation output.
|
|
66
|
+
7. Outputs and logs are published to S3; status signals are sent to Kafka.
|
|
67
|
+
8. DQ checks run against the ETL database output; results are written to DQSys.
|
|
68
|
+
9. ETL Dashboard data is populated in DQSys.
|
|
69
|
+
10. FAS loads the XML files (reindex), then signals completion via Kafka to DQSys.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Hop Project Names
|
|
74
|
+
|
|
75
|
+
The `hop_project_name` identifies the specific ETL pipeline to run. It is derived from
|
|
76
|
+
`service_type` and the input format by `extract_and_dispatch.py`:
|
|
77
|
+
|
|
78
|
+
| hop_project_name | service_type | Description |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `load-data-file` | fas | Full run, batch ZIP input |
|
|
81
|
+
| `load-data-stream` | fas | Full run, streaming (CIDP) input |
|
|
82
|
+
| `load-data-file-incremental` | fas | Incremental run, batch ZIP |
|
|
83
|
+
| `load-data-stream-incremental` | fas | Incremental run, streaming |
|
|
84
|
+
| `xml-writer` | fas | XML generation phase (derived from full runs) |
|
|
85
|
+
| `xml-writer-incremental` | fas | Incremental XML generation |
|
|
86
|
+
| `hop-generate` | suggest | Suggestion index generation |
|
|
87
|
+
| `hop-finalize` | upload | Upload finalisation |
|
|
88
|
+
|
|
89
|
+
The XML phase projects are never triggered directly; they are derived from the data-phase project
|
|
90
|
+
name by `initialize_job.py`. Suggest and upload service types do not have an XML phase.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Domain Terms
|
|
95
|
+
|
|
96
|
+
| Term | Meaning |
|
|
97
|
+
|---|---|
|
|
98
|
+
| Customer | Fredhopper client whose catalogue is processed |
|
|
99
|
+
| Instance | Environment or deployment context for a customer (e.g. `fas:live1`) |
|
|
100
|
+
| Service type | Top-level ETL variant: `fas`, `suggest`, or `upload` |
|
|
101
|
+
| Instance name | The environment part of the instance field (e.g. `live1` from `fas:live1`) |
|
|
102
|
+
| Catalogue | Product data provided by a customer |
|
|
103
|
+
| FAS | Fredhopper Asset Search, the core search and indexing service |
|
|
104
|
+
| FAS XML | XML output format consumed by FAS |
|
|
105
|
+
| Reindex | The process by which FAS loads and indexes the XML files produced by an ETL run |
|
|
106
|
+
| Full ETL | Run that processes the complete catalogue |
|
|
107
|
+
| Incremental ETL | Run that processes only changes since the last full run |
|
|
108
|
+
| Trigger ID | Stable identifier for a single ETL run; derived from `trigger.json` or the workflow timestamp; used as the primary key across DQ tables |
|
|
109
|
+
| Data ID | The trigger folder identifier (catalogue ID), as extracted from the S3 key |
|
|
110
|
+
| CIDP | Customer Integration Data Platform; the streaming input path (`load-data-stream`) |
|
|
111
|
+
| Argo | Workflow orchestration layer used by ETL 2.0 |
|
|
112
|
+
| Hop | Apache Hop runtime used for ETL transformation |
|
|
113
|
+
| Suggest | Search suggestion/typeahead data flow |
|
|
114
|
+
| Smart Suggest | Newer suggestion implementation |
|
|
115
|
+
| GitOps | Branch, pull request, and merge workflow for ETL customisations in `custom-etl` |
|
|
116
|
+
| TC/DC | Consultant roles that use HDSys for customer delivery |
|
|
117
|
+
| hop_job_config | The central per-run JSON contract produced by `initialize_job.py` and consumed by all downstream workflow steps |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Guidance for AI Agents
|
|
122
|
+
|
|
123
|
+
Use this file to understand vocabulary and business intent. For module ownership and system
|
|
124
|
+
structure, use `.ai/architecture.md`. For coding rules, use `.ai/coding-guidelines.md`. For
|
|
125
|
+
workflow rules, use `.ai/ai-instructions.md`.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Jira Ticket Template — ETL 2.0 AI-First Development
|
|
2
|
+
|
|
3
|
+
Paste the block below into the Jira ticket description. Fill in every section.
|
|
4
|
+
Hand the ticket URL (or paste the description) directly to the agent — it will read the harness and start.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Ticket
|
|
11
|
+
|
|
12
|
+
**Module**: `data-quality` | `hop-dev-platform` | `workflow-scripts` | `frontend` | `data-quality-frontend` | `fhr-custom-transforms`
|
|
13
|
+
**Agent**: *(from the module `CLAUDE.md` header — e.g. `Java Dev - data-quality`)*
|
|
14
|
+
**Cross-repo**: No | Yes — andromeda-argo-deployments also changes
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What to Build
|
|
19
|
+
|
|
20
|
+
*2–4 sentences. What the feature does and why it is needed. No implementation detail — just the goal.*
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Requirements
|
|
25
|
+
|
|
26
|
+
*Each line is one concrete behaviour. Use Given / When / Then. Be exact: field names, endpoint paths, status codes, env var names.*
|
|
27
|
+
|
|
28
|
+
- Given …, when …, then …
|
|
29
|
+
- Given …, when …, then …
|
|
30
|
+
- Given …, when …, then *(edge case / error path)*
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Do Not Touch
|
|
35
|
+
|
|
36
|
+
*Explicitly name files, classes, endpoints, or areas the agent must leave unchanged.*
|
|
37
|
+
|
|
38
|
+
- …
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Acceptance Criteria
|
|
43
|
+
|
|
44
|
+
*Verifiable by a reviewer who hasn't read the code. Tick these off before raising the PR.*
|
|
45
|
+
|
|
46
|
+
- [ ] …
|
|
47
|
+
- [ ] …
|
|
48
|
+
- [ ] All existing tests pass — no regressions.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Extra Context
|
|
53
|
+
|
|
54
|
+
*Only fill this in if the requirement cannot be derived from the harness files.*
|
|
55
|
+
*Leave blank if everything the agent needs is already in `CLAUDE.md`, `architecture.md`, `coding-guidelines.md`, or the module `CLAUDE.md`.*
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# CLAUDE.md - data-quality-frontend
|
|
2
|
+
|
|
3
|
+
**Agent type:** `Angular Dev - data-quality-frontend`
|
|
4
|
+
|
|
5
|
+
This file owns module-specific context for the DQSys frontend. Read it after the root harness
|
|
6
|
+
files. Inspect current source for exact routes, services, models, and component structure.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What This Module Is
|
|
11
|
+
|
|
12
|
+
`data-quality-frontend` is the DQSys web UI. It presents data-quality reports and ETL Dashboard
|
|
13
|
+
views backed by the `data-quality` service.
|
|
14
|
+
|
|
15
|
+
It should remain a client of backend APIs and must not duplicate backend business rules.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Architecture Constraints
|
|
20
|
+
|
|
21
|
+
- Use the module's existing Angular standalone-component pattern.
|
|
22
|
+
- Use PrimeNG for UI components only.
|
|
23
|
+
- Keep HTTP calls behind the module's existing API/service abstraction.
|
|
24
|
+
- Keep cross-cutting HTTP behaviour (auth headers, error handling) in the existing interceptor
|
|
25
|
+
pattern.
|
|
26
|
+
- Model API responses with typed interfaces; avoid `any`.
|
|
27
|
+
- Do not introduce parallel global state mechanisms when one already exists.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Integration Boundaries
|
|
32
|
+
|
|
33
|
+
This frontend depends on the `data-quality` API contract. Any backend API change must be
|
|
34
|
+
reflected in models, services, and tests.
|
|
35
|
+
|
|
36
|
+
When adding views that depend on customer, instance, report, or dashboard context, inspect the
|
|
37
|
+
current state-management pattern before implementing new state.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Testing Expectations
|
|
42
|
+
|
|
43
|
+
- Component and service tests use the module's existing Angular test setup (Karma/Jasmine).
|
|
44
|
+
- HTTP-facing tests mock backend calls through the service/API abstraction.
|
|
45
|
+
- Tests should cover loading, empty, error, and permission-relevant states where applicable.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Context to Confirm When Needed
|
|
50
|
+
|
|
51
|
+
Stop and ask, or inspect current source, when a task depends on:
|
|
52
|
+
|
|
53
|
+
- exact backend API response fields;
|
|
54
|
+
- current runtime configuration mechanism;
|
|
55
|
+
- authentication/session handling;
|
|
56
|
+
- shared instance or report-selection state;
|
|
57
|
+
- route structure or navigation contracts.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# CLAUDE.md - data-quality
|
|
2
|
+
|
|
3
|
+
**Agent type:** `Java Dev - data-quality`
|
|
4
|
+
|
|
5
|
+
This file owns module-specific context for the DQSys backend. Read it after the root harness
|
|
6
|
+
files. Inspect current source for exact classes, fields, and paths.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What This Module Is
|
|
11
|
+
|
|
12
|
+
`data-quality` is the DQSys backend. It receives data-quality and operational signals from ETL
|
|
13
|
+
workflow steps, persists report and dashboard data, and exposes APIs used by the DQSys frontend.
|
|
14
|
+
|
|
15
|
+
It is part of the reporting and control plane. It does not execute ETL transformations directly.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Architecture Constraints
|
|
20
|
+
|
|
21
|
+
- This module is fully reactive (Spring WebFlux + R2DBC).
|
|
22
|
+
- No `.block()` calls anywhere — not in production code, not in tests.
|
|
23
|
+
- All service and repository methods must return `Mono<T>` or `Flux<T>`.
|
|
24
|
+
- Schema changes are managed through new Flyway migrations only; inspect existing migrations
|
|
25
|
+
before choosing the next version number.
|
|
26
|
+
- Authentication and customer scoping must not be bypassed. New endpoints must inject
|
|
27
|
+
`AccountContext` via `@AuthenticationPrincipal` and scope queries to the authenticated
|
|
28
|
+
customer.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Integration Boundaries
|
|
33
|
+
|
|
34
|
+
This module is consumed by:
|
|
35
|
+
|
|
36
|
+
- DQSys frontend users through backend APIs.
|
|
37
|
+
- Workflow scripts that publish DQ and dashboard signals: `dq_execution.py`,
|
|
38
|
+
`dq_custom_checks.py`, and `populate_dashboard.py`.
|
|
39
|
+
|
|
40
|
+
When changing API or schema contracts, identify frontend and workflow-script impact explicitly.
|
|
41
|
+
See `.ai/code-review.md` for the cross-module caller checklist.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Testing Expectations
|
|
46
|
+
|
|
47
|
+
- Unit tests: JUnit 5 with `StepVerifier` for reactive assertions; never `.block()`.
|
|
48
|
+
- Integration tests: Spock/Groovy in `src/integration-test/groovy/`.
|
|
49
|
+
- Database integration tests: real PostgreSQL via Testcontainers.
|
|
50
|
+
- Security and customer-scope behaviour must be tested when endpoint access changes.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Context to Confirm When Needed
|
|
55
|
+
|
|
56
|
+
Stop and ask, or inspect current source, when a task depends on:
|
|
57
|
+
|
|
58
|
+
- exact API field names or response shapes;
|
|
59
|
+
- current migration state and next migration version number;
|
|
60
|
+
- customer/account scoping rules;
|
|
61
|
+
- check-template or custom-check configuration contracts;
|
|
62
|
+
- whether a workflow script consumes the changed contract.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# CLAUDE.md - fhr-custom-transforms
|
|
2
|
+
|
|
3
|
+
**Agent type:** `Java Dev - fhr-custom-transforms`
|
|
4
|
+
|
|
5
|
+
This file owns module-specific context for Fredhopper Apache Hop plugins. Read it after the
|
|
6
|
+
root harness files. Inspect current source for exact plugin names, metadata, and registration
|
|
7
|
+
patterns.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What This Module Is
|
|
12
|
+
|
|
13
|
+
`fhr-custom-transforms` provides Fredhopper-specific Apache Hop transforms used by ETL
|
|
14
|
+
packages. The module is packaged for use by the Hop runtime.
|
|
15
|
+
|
|
16
|
+
It owns transformation behaviour, plugin metadata, and plugin-level tests. It does not own
|
|
17
|
+
runtime or workflow orchestration.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Architecture Constraints
|
|
22
|
+
|
|
23
|
+
- Follow the existing Hop plugin lifecycle and base-class patterns.
|
|
24
|
+
- Keep configuration metadata separate from runtime processing state.
|
|
25
|
+
- Keep row-processing logic independent from UI/dialog code.
|
|
26
|
+
- Use Hop metadata APIs for row and field handling.
|
|
27
|
+
- Use existing factories and type abstractions instead of bypassing them.
|
|
28
|
+
- Dialog/UI code must use SWT only (no Swing or JavaFX) and must stay compatible with headless
|
|
29
|
+
test execution.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Integration Boundaries
|
|
34
|
+
|
|
35
|
+
This module is consumed by standard ETL packages and the Hop runtime image assembly. Changes can
|
|
36
|
+
affect pipeline compatibility, serialized Hop metadata, and customer ETL behaviour.
|
|
37
|
+
|
|
38
|
+
When changing plugin metadata, row schema, or output shape, consider existing pipeline
|
|
39
|
+
definitions and downstream consumers.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Testing Expectations
|
|
44
|
+
|
|
45
|
+
- Unit tests: JUnit 5; focus on transformation behaviour and metadata handling.
|
|
46
|
+
- Tests must avoid display-dependent SWT setup unless explicitly testing dialog-only code.
|
|
47
|
+
- Add regression tests for pipeline compatibility when changing serialized metadata or row
|
|
48
|
+
shape.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Context to Confirm When Needed
|
|
53
|
+
|
|
54
|
+
Stop and ask, or inspect current source, when a task depends on:
|
|
55
|
+
|
|
56
|
+
- exact Hop annotation or registration requirements;
|
|
57
|
+
- serialized plugin metadata compatibility;
|
|
58
|
+
- supported attribute/value type semantics;
|
|
59
|
+
- whether a change affects packaged standard ETL definitions.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# CLAUDE.md - hop-dev-platform-frontend
|
|
2
|
+
|
|
3
|
+
**Agent type:** `Angular Dev - hop-dev-platform-frontend`
|
|
4
|
+
|
|
5
|
+
This file owns module-specific context for the HDSys frontend. Read it after the root harness
|
|
6
|
+
files. Inspect current source for exact routes, services, guards, models, and component
|
|
7
|
+
structure.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What This Module Is
|
|
12
|
+
|
|
13
|
+
`hop-dev-platform-frontend` is the HDSys web UI. It lets consultants create and manage Hop
|
|
14
|
+
workspaces, provision customer data, and work through the GitOps flow for ETL customisations.
|
|
15
|
+
|
|
16
|
+
It should remain a client of `hop-dev-platform` APIs and must not duplicate backend workspace
|
|
17
|
+
or authorization rules.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Architecture Constraints
|
|
22
|
+
|
|
23
|
+
- Use the module's existing standalone-component pattern.
|
|
24
|
+
- Use PrimeNG for UI components only.
|
|
25
|
+
- Keep HTTP calls in Angular services.
|
|
26
|
+
- Keep route protection aligned with the existing authentication guard pattern.
|
|
27
|
+
- Model API responses with typed interfaces; avoid `any`.
|
|
28
|
+
- Use the existing state-management approach instead of creating parallel state stores.
|
|
29
|
+
- Keep API URLs compatible with the current dev and deployment proxy approach.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Integration Boundaries
|
|
34
|
+
|
|
35
|
+
This frontend depends on `hop-dev-platform` API, authentication, workspace lifecycle, and
|
|
36
|
+
GitOps contracts. Backend contract changes must be reflected in services, models, routes, and
|
|
37
|
+
tests.
|
|
38
|
+
|
|
39
|
+
When changing workspace or Git workflows, consider both user journey and backend authorization.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Testing Expectations
|
|
44
|
+
|
|
45
|
+
- Component and service tests use the module's existing Angular test setup (Karma/Jasmine).
|
|
46
|
+
- HTTP-facing tests use request-mocking utilities.
|
|
47
|
+
- Tests should cover loading, empty, error, and permission-relevant states where applicable.
|
|
48
|
+
- Route/auth changes need guard or navigation coverage.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Context to Confirm When Needed
|
|
53
|
+
|
|
54
|
+
Stop and ask, or inspect current source, when a task depends on:
|
|
55
|
+
|
|
56
|
+
- exact backend API response fields;
|
|
57
|
+
- current authentication and route-guard flow;
|
|
58
|
+
- workspace state-management behaviour;
|
|
59
|
+
- GitOps workflow states and actions;
|
|
60
|
+
- runtime configuration or API base-path handling.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# CLAUDE.md - hop-dev-platform
|
|
2
|
+
|
|
3
|
+
**Agent type:** `Java Dev - hop-dev-platform`
|
|
4
|
+
|
|
5
|
+
This file owns module-specific context for the HDSys backend. Read it after the root harness
|
|
6
|
+
files. Inspect current source for exact controllers, services, configuration classes, and DTOs.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What This Module Is
|
|
11
|
+
|
|
12
|
+
`hop-dev-platform` is the HDSys backend. It provisions and manages browser-based Hop workspaces
|
|
13
|
+
for ETL consultants and supports the GitOps workflow for customer customisations.
|
|
14
|
+
|
|
15
|
+
It owns backend APIs, workspace lifecycle orchestration, Kubernetes integration,
|
|
16
|
+
authentication, and supporting persistence for HDSys.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Architecture Constraints
|
|
21
|
+
|
|
22
|
+
- This module is synchronous Spring MVC — not reactive. No `Mono`, `Flux`, or WebFlux patterns.
|
|
23
|
+
- Kubernetes operations must go through the configured `KubernetesClient` bean; do not
|
|
24
|
+
instantiate a new client.
|
|
25
|
+
- All protected endpoints must go through the existing OAuth2 security filter chain; do not
|
|
26
|
+
add unprotected endpoints without explicit instruction.
|
|
27
|
+
- Use typed configuration for external systems and credentials.
|
|
28
|
+
- Put transactional write behaviour at the service boundary.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Integration Boundaries
|
|
33
|
+
|
|
34
|
+
This module integrates with:
|
|
35
|
+
|
|
36
|
+
- Kubernetes for workspace runtime resources;
|
|
37
|
+
- Git hosting for customer customisation workflows;
|
|
38
|
+
- the HDSys frontend through backend APIs.
|
|
39
|
+
|
|
40
|
+
When changing API, security, workspace lifecycle, or resource contracts, identify frontend and
|
|
41
|
+
runtime impact explicitly.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Testing Expectations
|
|
46
|
+
|
|
47
|
+
- Unit tests: JUnit 5 with Mockito.
|
|
48
|
+
- Integration tests: Spock/Groovy in `src/integration-test/groovy/`.
|
|
49
|
+
- Database integration tests: Testcontainers for PostgreSQL.
|
|
50
|
+
- Security-sensitive endpoint changes need authorization coverage.
|
|
51
|
+
- Kubernetes and Git integrations should be mocked unless explicitly running integration tests.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Context to Confirm When Needed
|
|
56
|
+
|
|
57
|
+
Stop and ask, or inspect current source, when a task depends on:
|
|
58
|
+
|
|
59
|
+
- workspace lifecycle and expiry behaviour;
|
|
60
|
+
- Kubernetes resource shape or naming contracts;
|
|
61
|
+
- Git repository naming and branch/merge rules;
|
|
62
|
+
- authentication, logout, or fine-grained authorization behaviour.
|