Skip to content

Commit f7c7731

Browse files
intel352claude
andcommitted
Add workflow-plugin-admin external plugin
Implements PluginProvider + ConfigProvider using the workflow SDK. Embeds config.yaml (admin routes) and ui_dist (admin UI placeholder), resolving asset paths to absolute on ConfigFragment() call. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 802d554 commit f7c7731

11 files changed

Lines changed: 3507 additions & 0 deletions

File tree

Makefile

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
.PHONY: build test install clean ui
2+
3+
BINARY_NAME = workflow-plugin-admin
4+
INSTALL_DIR ?= data/plugins/$(BINARY_NAME)
5+
6+
build:
7+
go build -o bin/$(BINARY_NAME) ./cmd/$(BINARY_NAME)
8+
9+
test:
10+
go test ./... -v -race
11+
12+
install: build
13+
mkdir -p $(DESTDIR)/$(INSTALL_DIR)
14+
cp bin/$(BINARY_NAME) $(DESTDIR)/$(INSTALL_DIR)/
15+
cp plugin.json $(DESTDIR)/$(INSTALL_DIR)/
16+
cp -r ui_dist $(DESTDIR)/$(INSTALL_DIR)/
17+
18+
clean:
19+
rm -rf bin/
20+
21+
ui:
22+
@echo "Building admin UI from workflow repo..."
23+
cd /tmp && rm -rf workflow-ui-build && git clone --depth 1 git@github.com:GoCodeAlone/workflow.git workflow-ui-build
24+
cd /tmp/workflow-ui-build/ui && npm ci && npx vite build
25+
rm -rf ui_dist && cp -r /tmp/workflow-ui-build/ui/dist ui_dist
26+
rm -rf /tmp/workflow-ui-build

README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# workflow-plugin-admin
2+
3+
External plugin for the [workflow engine](https://github.com/GoCodeAlone/workflow) that provides the admin dashboard UI and config-driven admin routes.
4+
5+
## What it does
6+
7+
- Injects admin modules (HTTP server, JWT auth, SQLite, static file server) into the host engine config via `ConfigProvider`
8+
- Embeds the admin UI assets and extracts them on startup
9+
- Does not provide custom module types — all admin modules are native host types
10+
11+
## Build
12+
13+
```sh
14+
make build
15+
```
16+
17+
## Install
18+
19+
```sh
20+
make install DESTDIR=/path/to/workflow
21+
```
22+
23+
The plugin binary and assets are installed to `DESTDIR/data/plugins/workflow-plugin-admin/`.
24+
25+
## UI assets
26+
27+
The `ui_dist/` directory contains the built admin UI. To rebuild from source:
28+
29+
```sh
30+
make ui
31+
```
32+
33+
## Plugin SDK
34+
35+
This plugin follows the [workflow external plugin SDK](https://github.com/GoCodeAlone/workflow/tree/main/plugin/external/sdk) pattern. It implements `PluginProvider` and `ConfigProvider`.

cmd/workflow-plugin-admin/main.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Command workflow-plugin-admin is a workflow engine external plugin that
2+
// serves the admin dashboard UI and injects admin config routes into the host.
3+
// It runs as a subprocess and communicates with the host workflow engine via
4+
// the go-plugin protocol.
5+
package main
6+
7+
import (
8+
"github.com/GoCodeAlone/workflow-plugin-admin/internal"
9+
sdk "github.com/GoCodeAlone/workflow/plugin/external/sdk"
10+
)
11+
12+
func main() {
13+
sdk.Serve(internal.NewAdminPlugin())
14+
}

go.mod

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
module github.com/GoCodeAlone/workflow-plugin-admin
2+
3+
go 1.26
4+
5+
require (
6+
github.com/GoCodeAlone/workflow v0.1.7
7+
gopkg.in/yaml.v3 v3.0.1
8+
)
9+
10+
require (
11+
cel.dev/expr v0.25.1 // indirect
12+
cloud.google.com/go v0.123.0 // indirect
13+
cloud.google.com/go/auth v0.18.1 // indirect
14+
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
15+
cloud.google.com/go/compute/metadata v0.9.0 // indirect
16+
cloud.google.com/go/iam v1.5.3 // indirect
17+
cloud.google.com/go/monitoring v1.24.3 // indirect
18+
cloud.google.com/go/storage v1.60.0 // indirect
19+
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
20+
github.com/BurntSushi/toml v1.6.0 // indirect
21+
github.com/CrisisTextLine/modular v1.11.11 // indirect
22+
github.com/CrisisTextLine/modular/modules/auth v0.4.0 // indirect
23+
github.com/CrisisTextLine/modular/modules/eventbus/v2 v2.0.0 // indirect
24+
github.com/DataDog/datadog-go/v5 v5.4.0 // indirect
25+
github.com/GoCodeAlone/go-plugin v0.0.0-20260220090904-b4c35f0e4271 // indirect
26+
github.com/GoCodeAlone/yaegi v0.17.1 // indirect
27+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect
28+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect
29+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect
30+
github.com/IBM/sarama v1.46.3 // indirect
31+
github.com/Microsoft/go-winio v0.6.2 // indirect
32+
github.com/aws/aws-sdk-go-v2 v1.41.1 // indirect
33+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect
34+
github.com/aws/aws-sdk-go-v2/config v1.32.7 // indirect
35+
github.com/aws/aws-sdk-go-v2/credentials v1.19.7 // indirect
36+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect
37+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 // indirect
38+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 // indirect
39+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
40+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.17 // indirect
41+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
42+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.8 // indirect
43+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 // indirect
44+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.17 // indirect
45+
github.com/aws/aws-sdk-go-v2/service/kinesis v1.38.0 // indirect
46+
github.com/aws/aws-sdk-go-v2/service/s3 v1.96.0 // indirect
47+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect
48+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 // indirect
49+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect
50+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 // indirect
51+
github.com/aws/smithy-go v1.24.0 // indirect
52+
github.com/beorn7/perks v1.0.1 // indirect
53+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
54+
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
55+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
56+
github.com/cloudevents/sdk-go/v2 v2.16.2 // indirect
57+
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
58+
github.com/containerd/errdefs v1.0.0 // indirect
59+
github.com/containerd/errdefs/pkg v0.3.0 // indirect
60+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
61+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
62+
github.com/distribution/reference v0.6.0 // indirect
63+
github.com/docker/docker v28.5.2+incompatible // indirect
64+
github.com/docker/go-connections v0.6.0 // indirect
65+
github.com/docker/go-units v0.5.0 // indirect
66+
github.com/dustin/go-humanize v1.0.1 // indirect
67+
github.com/eapache/go-resiliency v1.7.0 // indirect
68+
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
69+
github.com/eapache/queue v1.1.0 // indirect
70+
github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect
71+
github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect
72+
github.com/fatih/color v1.18.0 // indirect
73+
github.com/felixge/httpsnoop v1.0.4 // indirect
74+
github.com/fsnotify/fsnotify v1.9.0 // indirect
75+
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
76+
github.com/go-logr/logr v1.4.3 // indirect
77+
github.com/go-logr/stdr v1.2.2 // indirect
78+
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
79+
github.com/golang/snappy v0.0.4 // indirect
80+
github.com/golobby/cast v1.3.3 // indirect
81+
github.com/google/s2a-go v0.1.9 // indirect
82+
github.com/google/uuid v1.6.0 // indirect
83+
github.com/googleapis/enterprise-certificate-proxy v0.3.11 // indirect
84+
github.com/googleapis/gax-go/v2 v2.17.0 // indirect
85+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect
86+
github.com/hashicorp/errwrap v1.1.0 // indirect
87+
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
88+
github.com/hashicorp/go-hclog v1.6.3 // indirect
89+
github.com/hashicorp/go-multierror v1.1.1 // indirect
90+
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
91+
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
92+
github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect
93+
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
94+
github.com/hashicorp/go-sockaddr v1.0.7 // indirect
95+
github.com/hashicorp/go-uuid v1.0.3 // indirect
96+
github.com/hashicorp/hcl v1.0.1-vault-7 // indirect
97+
github.com/hashicorp/vault/api v1.22.0 // indirect
98+
github.com/hashicorp/yamux v0.1.2 // indirect
99+
github.com/itchyny/gojq v0.12.18 // indirect
100+
github.com/itchyny/timefmt-go v0.1.7 // indirect
101+
github.com/jackc/pgpassfile v1.0.0 // indirect
102+
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
103+
github.com/jackc/pgx/v5 v5.7.5 // indirect
104+
github.com/jackc/puddle/v2 v2.2.2 // indirect
105+
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
106+
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
107+
github.com/jcmturner/gofork v1.7.6 // indirect
108+
github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect
109+
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
110+
github.com/json-iterator/go v1.1.12 // indirect
111+
github.com/klauspost/compress v1.18.3 // indirect
112+
github.com/mattn/go-colorable v0.1.14 // indirect
113+
github.com/mattn/go-isatty v0.0.20 // indirect
114+
github.com/mitchellh/go-homedir v1.1.0 // indirect
115+
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
116+
github.com/mitchellh/mapstructure v1.5.0 // indirect
117+
github.com/moby/docker-image-spec v1.3.1 // indirect
118+
github.com/moby/sys/sequential v0.6.0 // indirect
119+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
120+
github.com/modern-go/reflect2 v1.0.2 // indirect
121+
github.com/nats-io/nats.go v1.48.0 // indirect
122+
github.com/nats-io/nkeys v0.4.12 // indirect
123+
github.com/nats-io/nuid v1.0.1 // indirect
124+
github.com/ncruces/go-strftime v1.0.0 // indirect
125+
github.com/oklog/run v1.2.0 // indirect
126+
github.com/opencontainers/go-digest v1.0.0 // indirect
127+
github.com/opencontainers/image-spec v1.1.1 // indirect
128+
github.com/pierrec/lz4/v4 v4.1.22 // indirect
129+
github.com/pkg/errors v0.9.1 // indirect
130+
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
131+
github.com/prometheus/client_golang v1.19.1 // indirect
132+
github.com/prometheus/client_model v0.6.2 // indirect
133+
github.com/prometheus/common v0.48.0 // indirect
134+
github.com/prometheus/procfs v0.12.0 // indirect
135+
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect
136+
github.com/redis/go-redis/v9 v9.18.0 // indirect
137+
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
138+
github.com/ryanuber/go-glob v1.0.0 // indirect
139+
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
140+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
141+
go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect
142+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect
143+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect
144+
go.opentelemetry.io/otel v1.40.0 // indirect
145+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect
146+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 // indirect
147+
go.opentelemetry.io/otel/metric v1.40.0 // indirect
148+
go.opentelemetry.io/otel/sdk v1.40.0 // indirect
149+
go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect
150+
go.opentelemetry.io/otel/trace v1.40.0 // indirect
151+
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
152+
go.uber.org/atomic v1.11.0 // indirect
153+
go.uber.org/multierr v1.11.0 // indirect
154+
go.uber.org/zap v1.27.0 // indirect
155+
golang.org/x/crypto v0.48.0 // indirect
156+
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect
157+
golang.org/x/net v0.50.0 // indirect
158+
golang.org/x/oauth2 v0.35.0 // indirect
159+
golang.org/x/sync v0.19.0 // indirect
160+
golang.org/x/sys v0.41.0 // indirect
161+
golang.org/x/text v0.34.0 // indirect
162+
golang.org/x/time v0.14.0 // indirect
163+
google.golang.org/api v0.265.0 // indirect
164+
google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect
165+
google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect
166+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d // indirect
167+
google.golang.org/grpc v1.79.1 // indirect
168+
google.golang.org/protobuf v1.36.11 // indirect
169+
modernc.org/libc v1.67.6 // indirect
170+
modernc.org/mathutil v1.7.1 // indirect
171+
modernc.org/memory v1.11.0 // indirect
172+
modernc.org/sqlite v1.45.0 // indirect
173+
)

0 commit comments

Comments
 (0)