secopsctl:~$ docs

secopsctl / Go SDK — Roadmap

secopsctl is both a CLI and an importable, unofficial Go SDK for Google SecOps (danny.vn/secops/chronicle). This roadmap is the forward plan and sequencing; live build/validation status lives in CATALOG.md — this doc deliberately does not re-track maturity (it would drift). The guiding rule: design cleanly, port the parity slice first, then finish the surface — improving on the official Python wrapper where it is weak (see the // DEVIATION: markers in code).

Package map

danny.vn/secops
├── auth/         split credentials: OAuth/ADC (SIEM) + API key/AppKey (SOAR, key-auth)
├── chronicle/    the SIEM SDK (pure API, typed structs, no file I/O)
├── config/       instance config (YAML) load/validate/defaults
├── internal/
│   ├── cli/      cobra command tree (secopsctl)
│   └── mirror/   pull/push file mirroring on top of chronicle
└── cmd/secopsctl main

Future SecOps products are sibling packages so chronicle stays focused — today that is danny.vn/secops/soar. (Third-party EDR and chat/notification integrations are explicit non-goals; see below.)


Wave 1 — parity with the legacy Python tool (shipped — status in CATALOG)

Feature parity with the original secopstips:

Area SDK (chronicle/) Mirror / CLI
Rules rules.go — List/Get/Validate/Create, deployments pull_rules, push (create + disable)
Reference lists reflists.go pull_reflists
Data tables datatables.go pull_datatables (CSV)
Dashboards dashboards.go pull_dashboards (export CUSTOM)
Curated curated.go pull_curated + pull_curated_rules
Feeds feeds.go pull_feeds (secret redaction)
Parsers parsers.go pull_parsers (active CBN)
UDM search search.go query udm

CLI: info, pull <target>, push <target> (dry-run-guarded), query udm.

Deviations from the official wrapper (intentional)


Wave 2 — finish the secops-wrapper (v0.44.x) surface (mostly landed)

Most of this surface has already landed as chronicle/*.go files (case · alert · entity · ingest · stats · nl_search · gemini · data_export · investigations · watchlist · retrohunt · rule_exclusion · the *_write.go writers · …); the remaining gap is CLI verbs over the already-built SDK plus the few unbuilt files below. Per-file status is in CATALOG.md. Read the matching third_party/secops-wrapper/src/secops/chronicle/*.py when implementing.

Cross-cutting to add in Wave 2: per-resource etag round-trip on updates, view enums (rule/reference-list/dashboard), and a streaming/--as-list pagination helper for very large lists.


Wave 3 — features the wrapper does NOT cover

Kept generic and tenant-neutral. Full design: docs/SOAR-DESIGN.md — read it before implementing.

Wave 3 build-out — SOAR external API (Siemplify /api/external/v1) full surface

Why the external API (not keyless-over-ADC): the modern v1alpha SOAR methods on *-chronicle.googleapis.com (generateSoarAuthJwt, soarDomains.list, integrations) require the caller to be a workforce-identity-federated SOAR user; a plain ADC/OAuth token (even with roles/chronicle.soarAdmin) is rejected by the SOAR backend (404/500). The official Python secops SDK hits the same wall. So the AppKey-authenticated Siemplify external API is the path that works for real tenants — and it is by far the most complete surface.

Reference spec: third_party/siemplify-swagger.json (fetched from app.siemplify-soar.com/swagger/v1/swagger.json) — Chronicle SOAR API, OpenAPI 3.0.1, 448 paths / 484 operations / 27 tags, global security AppKey (header), base /api/external/v1. This is the authoritative map for what to implement. Goal: support as many users/operations as feasible, built on the existing soar/legacy tier + soar/internal/transport (External, AppKey).

Priority order (config + automation that fits pull → diff → push; skip UI/runtime noise like Homepage, CommandCenter, Agents, Reports, Dashboards):

  1. Connectors (9) — CRUD, cards, templates, fetch-sample-data, statistics.
  2. Jobs (10) — installed/templates, instances CRUD, run.
  3. Integrations (9) — installed integrations, instance config + settings.
  4. Playbooks (45) — CRUD, export/import, enable/disable, categories.
  5. Ontology (18) — entity mappings/relations (config-as-code).
  6. Case Management (135) — automation subset: close, comment, tag, assign, queue.
  7. Settings (89) — config subset: environments, networks, blacklists.

Discipline (Wave-3 testing): smoke-test live with the AppKey; read endpoints broadly (safe), write endpoints minimally with create → verify → delete only what we created (every write hits a live production instance). Do NOT git push until the user confirms.


The path to the final secopsctl — forward waves (4+)

Definition of done. An operator runs all of Google SecOps as code and triages live data from the terminal: full config-as-code (every reconcilable surface, both products) with safe pull → diff → push + prune + drift-detection; full operational triage (query → guarded act) for cases/alerts over the reliable path; reliable against Google’s flaky new APIs; secure (secret-at-rest, leak guard, no token on disk); and operable (CI, releases, completions, docs). Each wave ends validated (read round-trips clean; a gated write-smoke ran on an inert throwaway) with its CATALOG rows moved forward and design docs updated in the same change.

Waves are done strictly in order — one wave fully built and validated (its CATALOG rows moved forward, its design docs updated) before the next begins. The number is the sequence. Per-wave: Goal · Scope · Exit · Docs. Live status per surface lives in CATALOG.md.

Wave 4 — Case + alert triage (SOAR AppKey — the reliable lane) (done — reads live-validated; act verbs dry-run-validated)

Wave 5 — SIEM config plane onto the engine (in progress — data_tables landed + SIEM write-smoke harness; feeds/parsers/dashboards/curated next)

Wave 6 — Rules as code (finish the one bespoke surface)

Wave 7 — SOAR completion

Wave 8 — SIEM-native operational view (the unified SecOps surface)

Wave 9 — Reliability & safety hardening

Wave 10 — Distribution & operability

Wave 11 — Automation & scheduling (stretch)


Non-goals