Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Every request must be reviewed and accepted by:

* @VeryGoodOpenSource/codeowners
Comment thread
marcossevilla marked this conversation as resolved.
Resolved
1 change: 1 addition & 0 deletions .github/cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"frontmatter",
"gemini",
"kevmoo",
"lycheeignore",
"mcp",
"opencode",
"prereqs",
Expand Down
30 changes: 30 additions & 0 deletions .github/workflows/check_links.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: check_links

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

on:
push:
branches:
- main
pull_request:
branches:
- main
schedule:
# Runs every Monday at 08:00 UTC
- cron: "0 8 * * 1"

jobs:
check_links:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- name: 🔗 Link Checker
uses: lycheeverse/lychee-action@v2
with:
# The repository is private, so GitHub links need a token to resolve.
token: ${{ secrets.GITHUB_TOKEN }}
args: ./**/*.md
fail: true
35 changes: 35 additions & 0 deletions .github/workflows/pub_publish.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: pub_publish

on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+*" # tag pattern on pub.dev: 'v{{version}}'
workflow_dispatch:

jobs:
publish:
permissions:
id-token: write # Required for authentication using OIDC
runs-on: ubuntu-latest

steps:
- name: 📚 Git Checkout
uses: actions/checkout@v7

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1.8.1
with:
sdk: "3.13.0"

- name: 📦 Install Dependencies
run: dart pub get

# plugin_source first: the CLI resolves it from pub.dev, so publishing
# the CLI against a version that is not there yet fails.
- name: 📢 Publish plugin_source
working-directory: packages/plugin_source
run: dart pub publish --force

- name: 📢 Publish vgv_ai_cli
working-directory: packages/vgv_ai_cli
run: dart pub publish --force
26 changes: 26 additions & 0 deletions .github/workflows/release_please.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: release_please

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

on:
workflow_dispatch:
push:
branches:
- main

permissions:
contents: read

jobs:
Comment thread
marcossevilla marked this conversation as resolved.
Resolved
release_please:
runs-on: ubuntu-latest

steps:
- name: 🚀 Release Please
uses: googleapis/release-please-action@v5
with:
token: ${{ secrets.RELEASE_PLEASE_TOKEN }}
manifest-file: ".release-please-manifest.json"
config-file: ".release-please-config.json"
20 changes: 0 additions & 20 deletions .github/workflows/vgv_ai_cli.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,26 +80,6 @@ jobs:
exit 1
fi

verify-version:
runs-on: ubuntu-latest
steps:
- name: 📚 Git Checkout
uses: actions/checkout@v7

- name: 🎯 Setup Dart
uses: dart-lang/setup-dart@v1.8.1
with:
sdk: "3.13.0"

- name: 📦 Install Dependencies
working-directory: packages/vgv_ai_cli
run: |
dart pub get

- name: 🔎 Verify version
working-directory: packages/vgv_ai_cli
run: dart run test --run-skipped -t version-verify

verify-pins:
runs-on: ubuntu-latest
steps:
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,7 @@ coverage/
docs/

tasks/

# Mason
.mason/
mason-lock.json
8 changes: 8 additions & 0 deletions .lycheeignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Lychee ignore patterns
# See https://github.com/lycheeverse/lychee for documentation

# Dart string interpolation quoted in docs, picked up as literal link text
\$\{

# Private sibling repositories the workflow token cannot read
^https://github\.com/VeryGoodOpenSource/vgv-wingspan
34 changes: 34 additions & 0 deletions .release-please-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"changelog-sections": [
{ "type": "feat", "section": "Features" },
{ "type": "fix", "section": "Bug Fixes" },
{ "type": "refactor", "section": "Refactors" },
{ "type": "chore", "section": "Miscellaneous Chores" },
{ "type": "docs", "section": "Docs" }
],
"pull-request-header": ":rotating_light: There are changes ready for release :rocket:\n\nℹ Merge this PR once the team confirms the release is ready.\n",
"group-pull-request-title-pattern": "chore: release ${branch}",
"include-component-in-tag": true,
"packages": {
"packages/vgv_ai_cli": {
"release-type": "dart",
"component": "vgv_ai_cli",
"changelog-path": "CHANGELOG.md",
"include-component-in-tag": false,
"extra-files": ["pubspec.yaml", "lib/src/version.dart"]
},
"packages/plugin_source": {
"release-type": "dart",
"component": "plugin_source",
"changelog-path": "CHANGELOG.md"
}
},
"plugins": [
{
"type": "linked-versions",
"groupName": "vgv_ai",
"components": ["vgv_ai_cli", "plugin_source"]
}
]
}
4 changes: 4 additions & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"packages/vgv_ai_cli": "0.1.0",
"packages/plugin_source": "0.1.0"
}
16 changes: 7 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,11 @@ dart run test test/src/commands/update_command_test.dart
# 'handles pub update errors' and 'handles pub update process errors')
dart run test --plain-name 'handles pub update'

# Verify the generated version file is in sync (tagged, skipped by default)
dart run test --run-skipped -t version-verify

# Regenerate lib/src/version.dart after bumping the package version
dart run build_runner build

# Run the CLI from source
dart run bin/vgv_ai.dart --help
```

**Full test run with coverage** is the one exception. With the VGV AI Flutter Plugin active, a hook denies `dart test`, `flutter test`, `very_good test`, `dart create`, `flutter create`, `very_good create`, and `very_good packages` when they are the first two tokens of a Bash command (note `very_good packages get` is blocked while `dart pub get` is not), so run it through the `very_good_cli` MCP `test` tool instead. That tool takes no file path and no name filter, which is why the single-test commands above use `dart run test` — a form the hook does not catch, and the one CI itself uses for `verify-version`. The CI step, from the reusable `dart_package.yml` workflow, is equivalent to:
**Full test run with coverage** is the one exception. With the VGV AI Flutter Plugin active, a hook denies `dart test`, `flutter test`, `very_good test`, `dart create`, `flutter create`, `very_good create`, and `very_good packages` when they are the first two tokens of a Bash command (note `very_good packages get` is blocked while `dart pub get` is not), so run it through the `very_good_cli` MCP `test` tool instead. That tool takes no file path and no name filter, which is why the single-test commands above use `dart run test` — a form the hook does not catch,. The CI step, from the reusable `dart_package.yml` workflow, is equivalent to:

```bash
very_good dart test -j 4 --coverage --min-coverage 100 --optimization
Expand Down Expand Up @@ -116,7 +110,11 @@ A result with one status enum, such as `EntryHealth` or `ReversedEntry`, is buil

### Generated version file

`lib/src/version.dart` is generated by `build_version` from the `version:` field in `pubspec.yaml`. **Never edit it by hand** — regenerate with `build_runner` after bumping the version. `test/ensure_build_test.dart` verifies it is in sync; it is tagged `version-verify` and skipped by default (see `dart_test.yaml`).
`lib/src/version.dart` carries the version release-please writes. **Never edit it by hand**, and never bump a version by hand either.

Both packages release together. release-please bumps each package's own `pubspec.yaml`, and the `linked-versions` plugin holds them at the same version, so a fix in `plugin_source` releases the CLI too — which is how a pin bump reaches users. Two lines need the generic updater and carry an `x-release-please-version` marker: this file, and the `plugin_source:` constraint in the CLI's `pubspec.yaml`. Nothing else should ever get that marker.

The CLI is tagged `vX.Y.Z` and `plugin_source` as `plugin_source-vX.Y.Z`; `pub_publish.yaml` fires on the former.

## Code Conventions

Expand Down Expand Up @@ -147,7 +145,7 @@ This is a pure Dart CLI with no widgets, so the rule is: any skill gated on Flut

Each workflow under `.github/workflows/` is path-filtered, and every reusable workflow comes from very_good_workflows through the floating `@v2` tag.

- `vgv_ai_cli.yaml` runs on changes to itself, `.github/cspell.json`, `packages/vgv_ai_cli/lib/**`, `packages/vgv_ai_cli/test/**`, `packages/vgv_ai_cli/pubspec.yaml`, `packages/plugin_source/lib/**`, `packages/plugin_source/pubspec.yaml`, `bricks/**` and `tool/**`. Its jobs are `semantic-pull-request`, `build` (the reusable `dart_package.yml` in `packages/vgv_ai_cli`), `spell-check`, `verify-bundle`, `verify-version` and `verify-pins`.
- `vgv_ai_cli.yaml` runs on changes to itself, `.github/cspell.json`, `packages/vgv_ai_cli/lib/**`, `packages/vgv_ai_cli/test/**`, `packages/vgv_ai_cli/pubspec.yaml`, `packages/plugin_source/lib/**`, `packages/plugin_source/pubspec.yaml`, `bricks/**` and `tool/**`. Its jobs are `semantic-pull-request`, `build` (the reusable `dart_package.yml` in `packages/vgv_ai_cli`), `spell-check`, `verify-bundle` and `verify-pins`.
- `plugin_source.yaml` runs on changes to itself and `packages/plugin_source/**`. Its jobs are `semantic-pull-request` and `build` (the reusable `dart_package.yml` in `packages/plugin_source`).
- Both `build` jobs also run the cognitive complexity check on their package's `lib`, which fails when any function scores above 15. Split a function that crosses it into smaller ones rather than raising the threshold. Run it locally with the `cognitive_complexity` scanner from [kevmoo/analytica.dart](https://github.com/kevmoo/analytica.dart/tree/main/packages/cognitive_complexity).
- `license_check.yaml` runs on changes to itself and either package's `pubspec.yaml`. Dependency licenses are restricted to `MIT`, `BSD-3-Clause`, `BSD-2-Clause`, `Apache-2.0`.
Expand Down
2 changes: 1 addition & 1 deletion packages/plugin_source/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026
Copyright (c) 2026 Very Good Ventures

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
3 changes: 2 additions & 1 deletion packages/plugin_source/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ description: >-
Resolves VGV Claude Code plugins to a directory on disk and parses them into
a harness-neutral asset model.
version: 0.1.0
publish_to: none
repository: https://github.com/VeryGoodOpenSource/vgv_ai_cli
issue_tracker: https://github.com/VeryGoodOpenSource/vgv_ai_cli/issues
resolution: workspace
environment:
sdk: ^3.13.0
Expand Down
2 changes: 1 addition & 1 deletion packages/vgv_ai_cli/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026
Copyright (c) 2026 Very Good Ventures

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 0 additions & 2 deletions packages/vgv_ai_cli/dart_test.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
tags:
version-verify:
skip: "Should only be run during pull request. Verifies if version file is updated."
pinned-plugins:
skip: "Clones the real pinned plugins over the network. Run in CI by verify-pins."
3 changes: 3 additions & 0 deletions packages/vgv_ai_cli/example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Example

`vgv_ai` is used from the terminal. See [../README.md](../README.md) for usage.
4 changes: 2 additions & 2 deletions packages/vgv_ai_cli/lib/src/version.dart
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// Generated code. Do not modify.
const packageVersion = '0.1.0';
// Managed by release-please. Do not edit by hand.
const packageVersion = '0.1.0'; // x-release-please-version
11 changes: 4 additions & 7 deletions packages/vgv_ai_cli/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: vgv_ai_cli
description: A CLI that configures Very Good AI coding agents and tooling
version: 0.1.0
# Not published. `plugin_source`, which this depends on, is `publish_to: none`,
# and the CLI is installed from source rather than pub.dev.
publish_to: none
repository: https://github.com/VeryGoodOpenSource/vgv_ai_cli
issue_tracker: https://github.com/VeryGoodOpenSource/vgv_ai_cli/issues
topics: [cli, ai, agents, tooling]
resolution: workspace
environment:
sdk: ^3.13.0
Expand All @@ -18,15 +18,12 @@ dependencies:
mason: ^0.1.0
mason_logger: ^0.3.6
path: ^1.9.1
plugin_source: ^0.1.0
plugin_source: ^0.1.0 # x-release-please-version
pub_semver: ^2.2.1
pub_updater: ^0.6.0
toml: ^0.18.0

dev_dependencies:
build_runner: ^2.16.2
build_verify: ^3.1.1
build_version: ^2.1.3
mocktail: ^1.0.5
test: ^1.33.0
very_good_analysis: ^11.0.0
Expand Down
12 changes: 0 additions & 12 deletions packages/vgv_ai_cli/test/ensure_build_test.dart

This file was deleted.

Loading
Loading