Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b4a3150
feat(fh-agent): site.spec.yaml → deployable edge-agent bundle compiler
May 30, 2026
0fb4ef9
feat(fh-agent): contract-schema validation via fh-builder subprocess
May 30, 2026
f29f5d2
docs(fh-agent): add ROADMAP.md alongside the CLI
May 30, 2026
d3134cc
chore(llmproxy): remove commented-out resilience.go stub
May 31, 2026
a00e795
chore(deps): add dependabot config for go, npm, actions
May 31, 2026
29604af
chore: add FUNDING.yml
May 31, 2026
da1bd3b
chore: add CODEOWNERS for routing reviews
May 31, 2026
fb9ad66
chore: add .editorconfig
May 31, 2026
464bd65
fix(engine): use constant-time compare for bearer token
May 31, 2026
dc24a2b
docs: add initial CHANGELOG.md with v1.0.1 backfill
May 31, 2026
13ba619
ci: add Spectral OpenAPI lint for contract/
May 31, 2026
690718b
fix(engine): expose /healthz without auth
May 31, 2026
85bad59
fix(httpclient): set default 30s timeout to avoid backend hangs
May 31, 2026
4c71a9d
ci: add lint workflow (golangci-lint + eslint)
May 31, 2026
a615599
chore: add issue-template chooser config
May 31, 2026
72f6144
chore(ts): switch workflow-core publish target to npmjs.org public re…
May 31, 2026
0a378fa
chore(ts): switch workflow-builder publish target to npmjs.org public…
May 31, 2026
39f33f7
docs(readme): rewrite hero with verified container size and real I/O …
May 31, 2026
49ac9a5
ci: add multi-arch container release workflow with cosign signing
May 31, 2026
e87f4c4
docs(readme): add go-version, stars, last-commit, and issues badges
May 31, 2026
bcc49ab
docs(releasing): update npm publish instructions for npmjs.org
May 31, 2026
6609ba0
ci: add CodeQL security scan for Go and TypeScript
May 31, 2026
b8e9bf6
docs(readme): add Why edge-agents comparison section before Quickstart
May 31, 2026
2098a52
ci: add gitleaks secret scan workflow
May 31, 2026
f640d45
docs(changelog): fix npm scope @foresthub → @foresthubai for ts packages
May 31, 2026
31f0b1b
ci: pin stoplightio/spectral-action version (drop @latest)
May 31, 2026
495846a
docs(codeowners): fix contract description (OpenAPI, not protobuf/JSO…
May 31, 2026
96b24a5
chore(llmproxy/config): remove leftover commented-out ResilienceConfi…
May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# EditorConfig — https://editorconfig.org
# Top-level config; no parent lookups beyond this file.
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true

# Go uses tabs (gofmt is non-negotiable).
[*.go]
indent_style = tab

# TS / JS / JSON — 2-space (matches Prettier + tsconfig conventions).
[*.{ts,tsx,js,jsx,mjs,cjs,json,jsonc}]
indent_style = space
indent_size = 2

# YAML — 2-space (contract/*.yaml, GitHub Actions).
[*.{yml,yaml}]
indent_style = space
indent_size = 2

# Markdown — preserve trailing spaces (two-space line-break trick).
[*.md]
trim_trailing_whitespace = false

# Makefiles require literal tabs.
[Makefile]
indent_style = tab

[**/Makefile]
indent_style = tab
31 changes: 31 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# CODEOWNERS — Review routing for edge-agents
#
# Syntax: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
# Order matters: the LAST matching pattern wins for a given file.
#
# NOTE: The @ForestHubAI/maintainers team must exist in the GitHub org
# (Org Settings → Teams) for these mentions to resolve. Without the team,
# GitHub will show "Unknown owner" warnings on the Branch protection /
# PR review UI but CODEOWNERS routing will silently no-op.

# ---------------------------------------------------------------------------
# Default owner — applies to anything not covered by a more specific rule below
# ---------------------------------------------------------------------------
* @ForestHubAI/maintainers

# ---------------------------------------------------------------------------
# Language subtrees
# ---------------------------------------------------------------------------
/go/ @ForestHubAI/maintainers
/ts/ @ForestHubAI/maintainers

# ---------------------------------------------------------------------------
# Contract subtree — CRITICAL: this is the source of truth. Drift between
# go/ and ts/ codegen from the OpenAPI 3.0.3 contracts must always be reviewed.
# ---------------------------------------------------------------------------
/contract/ @ForestHubAI/maintainers

# ---------------------------------------------------------------------------
# Repo meta: CI workflows, issue templates, CODEOWNERS itself
# ---------------------------------------------------------------------------
/.github/ @ForestHubAI/maintainers
18 changes: 18 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# GitHub Sponsors and other funding platforms for this repository.
# Reference: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository

github: ForestHubAI

# Additional platforms (uncomment to enable later):
# patreon: # Replace with a single Patreon username
# open_collective: # Replace with a single Open Collective username
# ko_fi: # Replace with a single Ko-fi username
# tidelift: # Replace with a single Tidelift platform-name/package-name
# community_bridge: # Replace with a single Community Bridge project-name
# liberapay: # Replace with a single Liberapay username
# issuehunt: # Replace with a single IssueHunt username
# lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name
# polar: # Replace with a single Polar username
# buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
# thanks_dev: # Replace with a single thanks.dev username
# custom: # Replace with up to 4 custom sponsorship URLs
31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Issue-template chooser config.
# Reference: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository
#
# Forces contributors to pick a structured template (bug_report / feature_request)
# instead of opening blank issues. The contact_links route off-topic intents
# (questions, security reports, commercial inquiries) to the right channel so
# the issue tracker stays focused on actionable engineering work.

blank_issues_enabled: false

contact_links:
- name: Question / Discussion
url: https://github.com/ForestHubAI/edge-agents/discussions
about: |
Have a question, an idea, or want to discuss usage? Please open a
GitHub Discussion instead of an issue. (If Discussions is not yet
enabled on this repo, this link will 404 until the maintainer turns
it on in Settings → Features.)

- name: Security Vulnerability
url: https://github.com/ForestHubAI/edge-agents/security/advisories/new
about: |
Please do NOT open a public issue for security vulnerabilities. Use
GitHub's private vulnerability reporting, or email root@foresthub.ai.
See .github/SECURITY.md for scope and process.

- name: Commercial License Inquiry
url: mailto:root@foresthub.ai
about: |
edge-agents is dual-licensed (AGPL-3.0-only + commercial). For use
cases that are incompatible with AGPL, contact root@foresthub.ai.
70 changes: 70 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
version: 2

updates:
# Go module (root of Go code is /go)
- package-ecosystem: "gomod"
directory: "/go"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
groups:
go-minor-and-patch:
applies-to: version-updates
update-types:
- "minor"
- "patch"
go-security:
applies-to: security-updates
update-types:
- "minor"
- "patch"

# npm workspace root (handles workflow-core, workflow-builder, app)
- package-ecosystem: "npm"
directory: "/ts"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "chore"
prefix-development: "chore"
include: "scope"
groups:
npm-minor-and-patch:
applies-to: version-updates
update-types:
- "minor"
- "patch"
npm-security:
applies-to: security-updates
update-types:
- "minor"
- "patch"

# GitHub Actions workflows
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "chore"
include: "scope"
groups:
actions-minor-and-patch:
applies-to: version-updates
update-types:
- "minor"
- "patch"
actions-security:
applies-to: security-updates
update-types:
- "minor"
- "patch"
51 changes: 51 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: CodeQL

on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
# Weekly on Sundays at 04:17 UTC. Off-peak, off the hour.
- cron: "17 4 * * 0"

permissions:
contents: read
actions: read
security-events: write

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
# CodeQL's modern "javascript-typescript" identifier covers ts/.
# "go" covers go/ — autobuild finds the module via go/go.mod.
language: [go, javascript-typescript]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Go
if: matrix.language == 'go'
uses: actions/setup-go@v5
with:
go-version-file: go/go.mod
cache-dependency-path: go/go.sum

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-and-quality

- name: Autobuild
uses: github/codeql-action/autobuild@v3

- name: Perform CodeQL analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
29 changes: 29 additions & 0 deletions .github/workflows/gitleaks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: gitleaks

on:
push:
pull_request:

permissions:
contents: read
pull-requests: write

jobs:
scan:
name: Scan for leaked secrets
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout (full history)
uses: actions/checkout@v4
with:
# gitleaks needs the full history to scan past commits, not just
# the diff. Shallow clone would miss anything before the last fetch.
fetch-depth: 0

- name: Run gitleaks
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# No GITLEAKS_LICENSE on purpose: it's a paid-tier key. Public repos
# get full functionality on the free tier without it.
43 changes: 43 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Lint

on:
pull_request:
branches: [main]
push:
branches: [main]

permissions:
contents: read

jobs:
go-lint:
name: Go (golangci-lint)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go/go.mod
cache-dependency-path: go/go.sum
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: latest
working-directory: go
args: --timeout=5m

ts-lint:
name: TS (eslint)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ts
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: ts/package-lock.json
- run: npm ci
- run: npm run lint
Loading
Loading