Skip to content
Merged
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
700c360
perf: optimize startup performance with metadata tracking and update …
djm81 Jan 27, 2026
4b167dd
Merge branch 'main' into dev
djm81 Jan 27, 2026
e4782ea
fix: add missing ADO field mappings and assignee display (#145)
djm81 Jan 27, 2026
a2f6ac7
Merge branch 'main' into dev
djm81 Jan 27, 2026
c74a773
fix: mitigate code scanning vulnerabilities (#148)
djm81 Jan 27, 2026
af030dc
fix: detect GitHub remotes using ssh:// and git:// URLs
djm81 Jan 27, 2026
db827a0
chore: bump version to 0.26.9 and update changelog
djm81 Jan 27, 2026
1ade334
Merge branch 'main' into dev
djm81 Jan 27, 2026
5c1cb41
fix: compare GitHub SSH hostnames case-insensitively
djm81 Jan 27, 2026
68cc345
Merge branch 'main' into dev
djm81 Jan 27, 2026
dfeb7ca
Add openspec and workflow commands for transparency
djm81 Jan 27, 2026
9e1f22d
Add specs from openspec
djm81 Jan 27, 2026
115e402
Remove aisp change which wasn't implemented
djm81 Jan 27, 2026
2675361
Fix openspec gitignore pattern
djm81 Jan 27, 2026
573fb7b
Update gitignore
djm81 Jan 27, 2026
907501e
Update contribution standards to use openspec for SDD
djm81 Jan 27, 2026
568000c
Merge branch 'main' into dev
djm81 Jan 27, 2026
fe082f6
Migrate to new opsx openspec commands
djm81 Jan 27, 2026
036afbe
Migrate workflow and openspec config
djm81 Jan 28, 2026
5a1493f
fix: bump version to 0.26.10 for PyPI publish
djm81 Jan 28, 2026
da606a1
Update version and changelog
djm81 Jan 28, 2026
608f317
Add canonical user-friendly workitem url for ado workitems
djm81 Jan 28, 2026
719256c
Update to support OSPX
djm81 Jan 28, 2026
1f94d7c
Merge branch 'main' into dev
djm81 Jan 28, 2026
bbf730a
feat(backlog): implement refine --import-from-tmp and fix type-check …
djm81 Jan 28, 2026
080743a
Merge branch 'main' into dev
djm81 Jan 28, 2026
5ab46a5
Merge branch 'main' into dev
djm81 Jan 28, 2026
1cdfc66
feat: debug logs under ~/.specfact/logs and release 0.26.13 (#159)
djm81 Jan 29, 2026
6bd9d7f
Potential fix for pull request finding 'Empty except'
djm81 Jan 29, 2026
d7d194b
Fix unused variable review
djm81 Jan 29, 2026
39563fc
Fix unused variable review
djm81 Jan 29, 2026
d15485a
Fix type and test errors
djm81 Jan 29, 2026
6c9c9b9
Merge branch 'main' into dev
djm81 Jan 29, 2026
bd9b96a
Finalize change
djm81 Jan 29, 2026
c7e4546
Change for debug logs archived
djm81 Jan 29, 2026
09e8040
Merge branch 'main' into dev
djm81 Jan 29, 2026
642e1a9
fix: improve ADO backlog refine error logging and user-facing error U…
djm81 Jan 29, 2026
64365db
Merge branch 'main' into dev
djm81 Jan 29, 2026
0d0abba
feat: backlog refine --ignore-refined and --id, startup docs (fixes #…
djm81 Jan 30, 2026
aad02cd
Add change proposals for full scrum support
djm81 Jan 30, 2026
a3c3fb4
Merge branch 'main' into dev
djm81 Jan 30, 2026
1f054c5
Add support for systematic, structured issue creation with copilot help
djm81 Jan 30, 2026
899b9c2
feat(backlog): daily standup defaults, iteration/sprint, unassigned i…
djm81 Feb 3, 2026
b596766
Issue 179 resolution (#180)
djm81 Feb 3, 2026
bb7214f
Merge branch 'main' into dev
djm81 Feb 3, 2026
61a820c
fix(backlog): address CodeQL/Codex PR 181 findings
djm81 Feb 3, 2026
10fee30
Update openspec enforcement rules
djm81 Feb 3, 2026
8e770dc
Structure openspec changes
djm81 Feb 3, 2026
5782860
Fix ruff finding
djm81 Feb 3, 2026
05c592d
Fix linter issues with StrEnum and parameters
djm81 Feb 3, 2026
f7e3d0f
Fix tests and depcreation warnings
djm81 Feb 3, 2026
15d710b
Improve sync script
djm81 Feb 3, 2026
b223161
Merge branch 'main' into dev
djm81 Feb 3, 2026
870db6a
Add change for modular command registry
djm81 Feb 3, 2026
5404c18
Fix review finding on dev sync script
djm81 Feb 3, 2026
e4650dd
Update modular change proposal
djm81 Feb 4, 2026
c44013e
feat: CLI modular command registry and lazy load (arch-01) (#196)
djm81 Feb 4, 2026
542183c
docs: document CLI modules design; sync version and cleanup
djm81 Feb 4, 2026
c4b10d8
Archive modular change and specs
djm81 Feb 4, 2026
a7a83c2
Merge branch 'main' into dev
djm81 Feb 4, 2026
2faf547
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 4, 2026
b5d2680
Fix banner display on help screen
djm81 Feb 4, 2026
077ff3f
Improve action runner on main
djm81 Feb 4, 2026
7567149
Merge branch 'main' into dev
djm81 Feb 4, 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
69 changes: 49 additions & 20 deletions .github/workflows/pr-orchestrator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
runs-on: ubuntu-latest
outputs:
code_changed: ${{ steps.out.outputs.code_changed }}
skip_tests_dev_to_main: ${{ steps.out.outputs.skip_tests_dev_to_main }}
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -44,12 +45,21 @@ jobs:
- '!**/*.mdc'
- '!docs/**'
- id: out
env:
EVENT_NAME: ${{ github.event_name }}
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
PR_HEAD_REF: ${{ github.event.pull_request.head.ref }}
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
if [ "$EVENT_NAME" = "workflow_dispatch" ]; then
echo "code_changed=true" >> "$GITHUB_OUTPUT"
else
echo "code_changed=${{ steps.filter.outputs.code }}" >> "$GITHUB_OUTPUT"
fi
if [ "$EVENT_NAME" = "pull_request" ] && [ "$PR_BASE_REF" = "main" ] && [ "$PR_HEAD_REF" = "dev" ]; then
echo "skip_tests_dev_to_main=true" >> "$GITHUB_OUTPUT"
else
Comment on lines +58 to +60
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Guard dev→main skip against forked PRs

This condition only checks branch names, so any forked PR with head.ref named dev and base main will set skip_tests_dev_to_main=true and bypass the entire test/quality chain, even though that fork’s dev branch has not been validated on this repo. The skip should also verify the PR head repo matches github.repository (or head.repo.fork == false) to avoid CI bypass via a forked dev branch.

Useful? React with πŸ‘Β / πŸ‘Ž.

echo "skip_tests_dev_to_main=false" >> "$GITHUB_OUTPUT"
fi

tests:
name: Tests (Python 3.12)
Expand All @@ -62,9 +72,16 @@ jobs:
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: Skip full run (dev→main PR)
if: needs.changes.outputs.skip_tests_dev_to_main == 'true'
run: |
echo "βœ… Devβ†’main PR: tests already passed on dev; skipping full test run."

- uses: actions/checkout@v4
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'

- name: Set up Python 3.12
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
uses: actions/setup-python@v5
with:
python-version: "3.12"
Expand All @@ -73,31 +90,38 @@ jobs:
pyproject.toml

- name: Install hatch and coverage
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
run: |
python -m pip install --upgrade pip
pip install hatch coverage

- name: Create test output directories
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
shell: bash
run: |
mkdir -p logs/tests/junit logs/tests/coverage logs/tests/workflows

- name: Detect unit tests (to decide if coverage should run)
- name: Set run_unit_coverage (or skip for dev→main)
id: detect-unit
shell: bash
run: |
COUNT=$(find tests/unit -name "test_*.py" 2>/dev/null | wc -l)
if [ "$COUNT" -gt 0 ]; then
echo "run_unit_coverage=true" >> "$GITHUB_OUTPUT"
echo "RUN_UNIT_COVERAGE=true" >> "$GITHUB_ENV"
echo "Detected $COUNT unit test files. Will run coverage steps."
else
if [ "${{ needs.changes.outputs.skip_tests_dev_to_main }}" = "true" ]; then
echo "run_unit_coverage=false" >> "$GITHUB_OUTPUT"
echo "RUN_UNIT_COVERAGE=false" >> "$GITHUB_ENV"
echo "No unit tests detected. Skipping coverage steps."
else
COUNT=$(find tests/unit -name "test_*.py" 2>/dev/null | wc -l)
if [ "$COUNT" -gt 0 ]; then
echo "run_unit_coverage=true" >> "$GITHUB_OUTPUT"
echo "RUN_UNIT_COVERAGE=true" >> "$GITHUB_ENV"
echo "Detected $COUNT unit test files. Will run coverage steps."
else
echo "run_unit_coverage=false" >> "$GITHUB_OUTPUT"
echo "RUN_UNIT_COVERAGE=false" >> "$GITHUB_ENV"
echo "No unit tests detected. Skipping coverage steps."
fi
fi

- name: Run contract-first tests (no coverage)
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
shell: bash
env:
CONTRACT_FIRST_TESTING: "true"
Expand All @@ -110,14 +134,14 @@ jobs:
echo "E2E tests..." && hatch run contract-test-e2e || echo "⚠️ E2E tests incomplete"

- name: Run unit tests with coverage (3.12)
if: env.RUN_UNIT_COVERAGE == 'true'
if: needs.changes.outputs.skip_tests_dev_to_main != 'true' && env.RUN_UNIT_COVERAGE == 'true'
run: |
echo "πŸ§ͺ Running unit tests with coverage (3.12)..."
hatch -e hatch-test.py3.12 run run-cov
hatch -e hatch-test.py3.12 run xml

- name: Upload coverage artifacts
if: env.RUN_UNIT_COVERAGE == 'true'
if: needs.changes.outputs.skip_tests_dev_to_main != 'true' && env.RUN_UNIT_COVERAGE == 'true'
uses: actions/upload-artifact@v4
with:
name: coverage-reports
Expand All @@ -127,7 +151,8 @@ jobs:
compat-py311:
name: Compatibility (Python 3.11)
runs-on: ubuntu-latest
needs: tests
needs: [changes, tests]
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
permissions:
contents: read
steps:
Expand All @@ -154,7 +179,8 @@ jobs:
contract-first-ci:
name: Contract-First CI
runs-on: ubuntu-latest
needs: [tests, compat-py311]
needs: [changes, tests, compat-py311]
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
permissions:
contents: read
steps:
Expand All @@ -180,7 +206,8 @@ jobs:
cli-validation:
name: CLI Command Validation
runs-on: ubuntu-latest
needs: contract-first-ci
needs: [changes, contract-first-ci]
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
permissions:
contents: read
steps:
Expand All @@ -207,8 +234,8 @@ jobs:
quality-gates:
name: Quality Gates (Advisory)
runs-on: ubuntu-latest
needs: [tests]
if: needs.tests.outputs.run_unit_coverage == 'true'
needs: [changes, tests]
if: needs.changes.outputs.skip_tests_dev_to_main != 'true' && needs.tests.outputs.run_unit_coverage == 'true'
permissions:
contents: read
steps:
Expand Down Expand Up @@ -245,7 +272,8 @@ jobs:
type-checking:
name: Type Checking (basedpyright)
runs-on: ubuntu-latest
needs: [tests]
needs: [changes, tests]
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
permissions:
contents: read
steps:
Expand All @@ -270,7 +298,8 @@ jobs:
linting:
name: Linting (ruff, pylint)
runs-on: ubuntu-latest
needs: [tests]
needs: [changes, tests]
if: needs.changes.outputs.skip_tests_dev_to_main != 'true'
permissions:
contents: read
steps:
Expand Down Expand Up @@ -435,7 +464,7 @@ jobs:
run: |
# Use version from publish-pypi job output
VERSION="${{ needs.publish-pypi.outputs.version }}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "πŸ“¦ Version: $VERSION"

- name: Create GitHub Release
Expand Down
Loading