From 11a698c6966b12e81643015fe87fbbcb831157ef Mon Sep 17 00:00:00 2001 From: zoocityboy Date: Sun, 22 Feb 2026 11:22:10 +0100 Subject: [PATCH 1/2] feat: Add CI/CD workflows for building, publishing, and releasing Nocterm extension --- .github/workflows/ci-vscode-extension.yml | 44 ++++ .github/workflows/publish.yml | 67 +++++ .github/workflows/release-please.yml | 27 ++ .release-please-manifest.json | 3 + README.md | 15 +- package.json | 2 +- release-please-config.json | 11 + ...c-process-cicd-publish-vscode-extension.md | 222 ++++++++++++++++ spec/spec-process-cicd-release-please.md | 246 ++++++++++++++++++ 9 files changed, 632 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/ci-vscode-extension.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 .release-please-manifest.json create mode 100644 release-please-config.json create mode 100644 spec/spec-process-cicd-publish-vscode-extension.md create mode 100644 spec/spec-process-cicd-release-please.md diff --git a/.github/workflows/ci-vscode-extension.yml b/.github/workflows/ci-vscode-extension.yml new file mode 100644 index 0000000..e66e6ac --- /dev/null +++ b/.github/workflows/ci-vscode-extension.yml @@ -0,0 +1,44 @@ +name: CI VS Code Extension + +on: + pull_request: + branches: + - main + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ci-vscode-extension-${{ github.ref }} + cancel-in-progress: true + +jobs: + verify: + name: Build, Lint, Test + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Compile extension + run: npm run compile + + - name: Lint source + run: npm run lint + + - name: Run extension tests + run: xvfb-run -a npm test diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..5620f1d --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,67 @@ +name: Publish VS Code Extension + +on: + workflow_dispatch: + inputs: + dry_run: + description: Build and validate only (skip publish) + required: false + default: false + type: boolean + push: + tags: + - 'v*' + +permissions: + contents: read + +concurrency: + group: publish-vscode-extension-${{ github.ref }} + cancel-in-progress: false + +jobs: + publish: + name: Build and Publish + runs-on: ubuntu-latest + timeout-minutes: 20 + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Compile extension + run: npm run compile + + - name: Lint source + run: npm run lint + + - name: Package VSIX + run: npm run build:vsix + + - name: Upload VSIX artifact + uses: actions/upload-artifact@v4 + with: + name: nocterm-dev-vsix + path: out/nocterm-dev.vsix + + - name: Validate publish prerequisites + if: ${{ !inputs.dry_run }} + run: | + if [ -z "${VSCE_PAT}" ]; then + echo "VSCE_PAT is not set. Add it in repository secrets before publishing." + exit 1 + fi + + - name: Publish to VS Code Marketplace + if: ${{ !inputs.dry_run }} + run: npx @vscode/vsce publish --packagePath out/nocterm-dev.vsix --pat "${VSCE_PAT}" diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..11127f8 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,27 @@ +name: Release Please + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +concurrency: + group: release-please-${{ github.ref }} + cancel-in-progress: true + +jobs: + release-please: + name: Create Release PR or GitHub Release + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Run release-please + uses: googleapis/release-please-action@v4 + with: + config-file: release-please-config.json + manifest-file: .release-please-manifest.json diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..40ff6fe --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.0.2" +} diff --git a/README.md b/README.md index 38193fa..9dc9637 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ -# Nocterm Dev +# Nocterm Type-safe VS Code snippets for building Nocterm UI components in Dart. -![VS Code](https://img.shields.io/badge/VS%20Code-%5E1.109.0-007ACC?style=flat-square&logo=visualstudiocode&logoColor=white) -![TypeScript](https://img.shields.io/badge/Built%20with-TypeScript-3178C6?style=flat-square&logo=typescript&logoColor=white) -![Version](https://img.shields.io/badge/version-0.0.1-6f42c1?style=flat-square) +[![CI](https://github.com/zoocityboy/nocterm_vscode/actions/workflows/ci-vscode-extension.yml/badge.svg?branch=main)](https://github.com/zoocityboy/nocterm_vscode/actions/workflows/ci-vscode-extension.yml) +![Coverage](https://img.shields.io/badge/coverage-pending-lightgrey?style=flat-square) +![Version](https://img.shields.io/badge/version-0.0.2-6f42c1?style=flat-square) +![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&logo=typescript&logoColor=white) +[![License](https://img.shields.io/github/license/zoocityboy/nocterm_vscode?style=flat-square)](LICENSE) [Features](#features) • [Install](#install) • [Usage](#usage) • [Snippet Reference](#snippet-reference) • [Development](#development) +[Releases](https://github.com/zoocityboy/nocterm_vscode/releases) • [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=zoocityboy.nocterm-dev) + ## Features - Focused snippets for common Nocterm component patterns. @@ -17,6 +21,9 @@ Type-safe VS Code snippets for building Nocterm UI components in Dart. > [!IMPORTANT] > This extension currently contributes snippets for `dart` files only. +> [!NOTE] +> The coverage badge is marked as pending until coverage reporting is wired into CI. + ## Install ### From source (this repository) diff --git a/package.json b/package.json index 6f972b0..4ceae61 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "pretest": "npm run compile && npm run lint", "lint": "eslint src", "test": "vscode-test", - "build:vsix": "npx @vscode/vsce package -o out/" + "build:vsix": "npx @vscode/vsce package --out out/nocterm-dev.vsix" }, "devDependencies": { "@types/vscode": "^1.109.0", diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..8d09f0d --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "node", + "packages": { + ".": { + "package-name": "nocterm-dev", + "include-v-in-tag": true, + "changelog-path": "CHANGELOG.md" + } + } +} diff --git a/spec/spec-process-cicd-publish-vscode-extension.md b/spec/spec-process-cicd-publish-vscode-extension.md new file mode 100644 index 0000000..802596e --- /dev/null +++ b/spec/spec-process-cicd-publish-vscode-extension.md @@ -0,0 +1,222 @@ +--- +title: CI/CD Workflow Specification - Publish VS Code Extension +version: 1.0 +date_created: 2026-02-22 +last_updated: 2026-02-22 +owner: DevOps Team +tags: [process, cicd, github-actions, automation, vscode-extension, marketplace, publishing] +--- + +## Workflow Overview + +**Purpose**: Publish the extension package to the Visual Studio Code Marketplace through a controlled CI/CD workflow. +**Trigger Events**: Manual invocation and version-tag push events. +**Target Environments**: GitHub-hosted CI runner and VS Code Marketplace publish endpoint. + +## Execution Flow Diagram + +```mermaid +graph TD + A[Trigger Event] --> B[Source Checkout] + B --> C[Dependency Restore] + C --> D[Build and Lint] + D --> E[VSIX Packaging] + E --> F[Artifact Upload] + F --> G{Dry Run?} + G -->|Yes| H[Complete Without Publish] + G -->|No| I[Validate Secrets] + I --> J[Publish to Marketplace] + J --> K[End] + H --> K + + style A fill:#e1f5fe + style K fill:#e8f5e8 +``` + +## Jobs & Dependencies + +| Job Name | Purpose | Dependencies | Execution Context | +| -------- | ----------------------------------------- | ----------------------------------------------------- | ------------------------------------- | +| publish | Validate, package, and optionally publish | Trigger event, source access, and token for publish | Linux hosted runner with Node runtime | + +## Requirements Matrix + +### Functional Requirements + +| ID | Requirement | Priority | Acceptance Criteria | +| ------- | --------------------------------------------------------- | -------- | -------------------------------------------------------- | +| REQ-001 | Execute on manual request and version tags | High | Run starts for each configured trigger class | +| REQ-002 | Restore dependencies and compile extension sources | High | Build phase completes without compilation errors | +| REQ-003 | Enforce source quality validation before packaging | High | Lint gate passes before package creation | +| REQ-004 | Produce a VSIX artifact for each run | High | Packaged VSIX is available as a workflow artifact | +| REQ-005 | Support a non-publishing validation path | Medium | Dry-run mode completes without publish action | +| REQ-006 | Publish only when required credentials exist | High | Publish path fails fast when credential is missing | +| REQ-007 | Publish the generated VSIX package to Marketplace | High | Publish operation completes successfully | + +### Security Requirements + +| ID | Requirement | Implementation Constraint | +| ------- | ------------------------------------ | ---------------------------------------------------------- | +| SEC-001 | Publish credential is secret-scoped | Token is sourced from encrypted repository secrets | +| SEC-002 | CI permissions follow least privilege| Workflow permissions are limited to required read access | +| SEC-003 | Secret value is never logged | Execution path avoids echoing or persisting secret values | + +### Performance Requirements + +| ID | Metric | Target | Measurement Method | +| -------- | ------------------- | ------------- | --------------------------------------------------- | +| PERF-001 | End-to-end duration | ≤ 20 minutes | Workflow runtime timestamps from CI summary | +| PERF-002 | Packaging latency | ≤ 5 minutes | Time from build start to VSIX artifact creation | + +## Input/Output Contracts + +### Inputs + +```yaml +# Workflow Inputs +dry_run: boolean # Purpose: toggle publish step execution + +# Repository Triggers +tags: [v*] +manual_dispatch: true +``` + +### Outputs + +```yaml +# Job Outputs +build_artifact: file # Description: packaged VSIX extension artifact +publish_result: string # Description: publish outcome status in logs +``` + +### Secrets & Variables + +| Type | Name | Purpose | Scope | +| -------- | -------- | ------------------------------------------------------ | ------------------- | +| Secret | VSCE_PAT | Authenticates publish operation to VS Code Marketplace | Repository/Workflow | +| Variable | dry_run | Controls publish skip behavior for validation runs | Workflow input | + +## Execution Constraints + +### Runtime Constraints + +- **Timeout**: Single-job execution must not exceed 20 minutes. +- **Concurrency**: One run per source-ref group to avoid duplicate publish attempts. +- **Resource Limits**: Standard hosted-runner resources must support build and publish. + +### Environmental Constraints + +- **Runner Requirements**: Linux runner with Node-compatible environment. +- **Network Access**: Outbound connectivity to package registry and Marketplace endpoints. +- **Permissions**: Source read access plus secret retrieval on publish path. + +## Error Handling Strategy + +| Error Type | Response | Recovery Action | +| ------------------------- | ------------------------------ | ---------------------------------------------------- | +| Dependency/Build Failure | Stop run before packaging | Correct source/build definitions, then rerun | +| Lint Failure | Stop run before packaging | Resolve lint violations, then rerun | +| Packaging Failure | Stop run before publish | Fix packaging configuration, then rerun | +| Missing Credential | Fail fast in prerequisite check| Add/repair secret and rerun | +| Publish Failure | Mark workflow failed | Review response, adjust version/token, then rerun | + +## Quality Gates + +### Gate Definitions + +| Gate | Criteria | Bypass Conditions | +| ------------- | -------------------------------------------------- | ------------------------------------------- | +| Build Gate | Compilation succeeds with no errors | None | +| Lint Gate | Source passes configured lint rules | None | +| Packaging Gate| VSIX file is generated and stored | None | +| Publish Gate | Credential check passes and publish call succeeds | Dry-run mode intentionally bypasses publish | + +## Monitoring & Observability + +### Key Metrics + +- **Success Rate**: Target ≥ 99% for non-source-breaking changes. +- **Execution Time**: Track median and p95 workflow duration. +- **Resource Usage**: Monitor runner usage via CI timing and cache efficiency. + +### Alerting + +| Condition | Severity | Notification Target | +| ------------------------------------- | -------- | --------------------- | +| Publish step failure | High | Repository maintainers| +| Repeated build/lint failure trend | Medium | Development team | +| Missing credential on release path | High | Release owners | + +## Integration Points + +### External Systems + +| System | Integration Type | Data Exchange | SLA Requirements | +| --------------------------------- | --------------------- | ----------------------------- | ---------------------------------------- | +| npm registry | Dependency retrieval | Package metadata and tarballs | Available during CI execution window | +| VS Code Marketplace | Publish API | VSIX artifact and auth token | Endpoint accessible during release runs | +| GitHub Actions artifact storage | Artifact persistence | VSIX binary output | Artifact upload succeeds per run | + +### Dependent Workflows + +| Workflow | Relationship | Trigger Mechanism | +| -------------------------------- | --------------------------------------- | -------------------------------------- | +| Build/test workflows (if present)| Optional predecessor for release safety | Organizational policy or manual gating | + +## Compliance & Governance + +### Audit Requirements + +- **Execution Logs**: Retain run logs per repository and organization policy. +- **Approval Gates**: Use protected release/tag processes where required. +- **Change Control**: Update this specification before workflow behavior changes. + +### Security Controls + +- **Access Control**: Restrict secret management and release triggers to maintainers. +- **Secret Management**: Rotate publish token on schedule and on exposure risk. +- **Vulnerability Scanning**: Validate dependencies in standard security reviews. + +## Edge Cases & Exceptions + +### Scenario Matrix + +| Scenario | Expected Behavior | Validation Method | +| -------------------------------- | ------------------------------------------------- | -------------------------------------------- | +| Manual dry-run | Build/lint/package runs, publish is skipped | Verify publish step is not executed | +| Duplicate version publish attempt| Publish fails with version conflict | Observe marketplace conflict message in logs | +| Missing VSCE_PAT | Workflow fails before publish call | Validate prerequisite check output | +| Tag push without code readiness | Build/lint gates block release | Confirm no publish action occurs | + +## Validation Criteria + +### Workflow Validation + +- **VLD-001**: Tag trigger initiates one publish workflow run. +- **VLD-002**: Dry-run mode produces VSIX artifact and no publish action. +- **VLD-003**: Publish path requires valid secret and successful package creation. + +### Performance Benchmarks + +- **PERF-001**: Median runtime remains within target bound. +- **PERF-002**: Artifact generation completes within packaging target. + +## Change Management + +### Update Process + +1. **Specification Update**: Modify this document first. +2. **Review & Approval**: Obtain maintainer approval. +3. **Implementation**: Apply workflow changes in repository CI definitions. +4. **Testing**: Execute manual dry-run validation. +5. **Deployment**: Apply via merge/tag according to release policy. + +### Version History + +| Version | Date | Changes | Author | +| ------- | ---------- | ---------------------- | -------------- | +| 1.0 | 2026-02-22 | Initial specification | GitHub Copilot | + +## Related Specifications + +- [CI/CD Workflow Specification - Publish VS Code Extension](spec-process-cicd-publish-vscode-extension.md) diff --git a/spec/spec-process-cicd-release-please.md b/spec/spec-process-cicd-release-please.md new file mode 100644 index 0000000..1b50557 --- /dev/null +++ b/spec/spec-process-cicd-release-please.md @@ -0,0 +1,246 @@ +--- +title: CI/CD Workflow Specification - Release Please +version: 1.0 +date_created: 2026-02-22 +last_updated: 2026-02-22 +owner: DevOps Team +tags: [process, cicd, github-actions, automation, release-management, semantic-versioning, changelog] +--- + +## Workflow Overview + +**Purpose**: Automate release proposal and release publication by converting eligible commits into versioned release metadata. +**Trigger Events**: Push events on the default branch and manual workflow dispatch. +**Target Environments**: GitHub Actions runner and GitHub repository release interface. + +## Execution Flow Diagram + +```mermaid +graph TD + A[Trigger Event] --> B[Analyze Commits Since Last Release] + B --> C{Release Needed?} + C -->|No| D[No-op Completion] + C -->|Yes| E[Create or Update Release PR] + E --> F{Release PR Merged?} + F -->|No| G[Wait for Merge] + F -->|Yes| H[Create Release Tag and GitHub Release] + H --> I[Update Manifest and Changelog State] + I --> J[End] + D --> J + G --> J + + style A fill:#e1f5fe + style J fill:#e8f5e8 +``` + +## Jobs & Dependencies + +| Job Name | Purpose | Dependencies | Execution Context | +| -------------- | ----------------------------------------------------- | ----------------------------------------------- | ---------------------------- | +| release-please | Decide release eligibility and create PR/release flow | Trigger event and repository write permissions | Linux hosted GitHub runner | + +## Requirements Matrix + +### Functional Requirements + +| ID | Requirement | Priority | Acceptance Criteria | +| ------- | ------------------------------------------------------------- | -------- | -------------------------------------------------------------------- | +| REQ-001 | Evaluate commit history on each default-branch push | High | Workflow runs for each matching push event | +| REQ-002 | Support manual invocation for operational control | Medium | Workflow can be started through manual dispatch | +| REQ-003 | Create or update a release PR when releasable changes exist | High | Release PR is present and reflects pending version/changelog changes | +| REQ-004 | Produce version tag and release record after PR merge | High | New semantic version tag and release record are created | +| REQ-005 | Maintain changelog and version-manifest continuity | High | Changelog and manifest state reflect latest published release | + +### Security Requirements + +| ID | Requirement | Implementation Constraint | +| ------- | ------------------------------------------------ | ----------------------------------------------------------------- | +| SEC-001 | Workflow token access is least-privilege | Scope permissions to release content and pull request operations | +| SEC-002 | Release actions are limited to trusted branches | Trigger scope is restricted to the default branch release path | +| SEC-003 | Release metadata changes are auditable | All PR/tag/release mutations are recorded in repository history | + +### Performance Requirements + +| ID | Metric | Target | Measurement Method | +| -------- | -------------------------------- | ------------ | ------------------------------------------------- | +| PERF-001 | Median workflow runtime | ≤ 10 minutes | CI runtime statistics across successful runs | +| PERF-002 | Release PR update responsiveness | ≤ 5 minutes | Time from trigger to PR creation/update event | + +## Input/Output Contracts + +### Inputs + +```yaml +# Repository Triggers +branches: [main] +manual_dispatch: true + +# Release Metadata Sources +commit_messages: conventional_commits +manifest_file: release version baseline per package path +config_file: release strategy and package map +``` + +### Outputs + +```yaml +# Process Outputs +release_pr: pull_request # Description: pending release proposal when changes qualify +release_tag: string # Description: semantic version tag emitted after release PR merge +release_record: object # Description: published release metadata in repository releases +``` + +### Secrets & Variables + +| Type | Name | Purpose | Scope | +| -------- | -------------------- | ----------------------------------------------- | ----------- | +| Variable | release configuration| Defines package release strategy and semantics | Repository | +| Variable | release manifest | Tracks last published version per package path | Repository | + +## Execution Constraints + +### Runtime Constraints + +- **Timeout**: Each release-evaluation run should complete within 15 minutes. +- **Concurrency**: One active run per branch reference to prevent conflicting updates. +- **Resource Limits**: Standard hosted-runner resources should be sufficient for metadata-only operations. + +### Environmental Constraints + +- **Runner Requirements**: Linux hosted runner with GitHub API connectivity. +- **Network Access**: Access to GitHub repository APIs for PR, tag, and release operations. +- **Permissions**: Content write and pull-request write scopes are required for release mutations. + +## Error Handling Strategy + +- **Invalid release configuration** + - Response: Fail run and stop mutation + - Recovery: Correct config/manifest files and rerun +- **Missing release-eligible commits** + - Response: Exit without PR/release mutation + - Recovery: No action required +- **Pull request creation failure** + - Response: Fail run and preserve logs + - Recovery: Resolve branch/protection/API issue and rerun +- **Tag/release publication failure** + - Response: Fail run after PR merge attempt + - Recovery: Resolve conflict/permission issue and rerun or perform controlled retry + +## Quality Gates + +### Gate Definitions + +- **Commit Semantics Gate** + - Criteria: Commit metadata is parseable for release classification + - Bypass: None +- **Release PR Gate** + - Criteria: PR content includes version and changelog updates + - Bypass: None +- **Publication Gate** + - Criteria: Release PR is merged before tag/release publication + - Bypass: Manual dispatch still enforces merge rule + +## Monitoring & Observability + +### Key Metrics + +- **Success Rate**: Percentage of runs completing without operational errors. +- **Execution Time**: Median and p95 runtime for release evaluation. +- **Release Throughput**: Number of release PRs and published releases over time. + +### Alerting + +| Condition | Severity | Notification Target | +| ------------------------------------ | -------- | ------------------------ | +| Repeated release PR creation failure | High | Repository maintainers | +| Tag/release publish failure | High | Release owners | +| Configuration parse failure | Medium | CI/CD maintainers | + +## Integration Points + +### External Systems + +- **GitHub Pull Requests** + - Integration Type: Repository API mutation + - Data Exchange: Release PR title/body and version/changelog diffs + - SLA: Available during CI runtime window +- **Git Tags** + - Integration Type: Repository API mutation + - Data Exchange: Semantic version tag references + - SLA: Tag creation endpoint available +- **GitHub Releases** + - Integration Type: Repository API mutation + - Data Exchange: Release notes and version metadata + - SLA: Release publishing endpoint available + +### Dependent Workflows + +| Workflow | Relationship | Trigger Mechanism | +| ------------------------- | ---------------------------------------------------- | ---------------------------------------- | +| publish-vscode-extension | Consumes release tags to publish VSIX to Marketplace | Tag-based trigger after release creation | + +## Compliance & Governance + +### Audit Requirements + +- **Execution Logs**: Preserve workflow logs under repository retention policy. +- **Approval Gates**: Require PR review/merge policy for release proposal branch. +- **Change Control**: Update workflow specification before release-process modifications. + +### Security Controls + +- **Access Control**: Restrict workflow modification and merge permissions to maintainers. +- **Secret Management**: Use built-in token model with minimal required scope. +- **Vulnerability Scanning**: Validate release configuration changes through code review. + +## Edge Cases & Exceptions + +### Scenario Matrix + +- **No releasable commit types** + - Expected: Workflow completes without release PR + - Validation: Confirm no PR/tag creation activity +- **Existing release PR already open** + - Expected: Workflow updates existing PR instead of creating duplicate + - Validation: Verify single active release PR +- **Concurrent pushes on default branch** + - Expected: Concurrency policy serializes effective release mutation + - Validation: Confirm no conflicting duplicate release operations +- **Manifest/version drift from repository** + - Expected: Workflow fails or blocks mutation with actionable errors + - Validation: Review run logs and correct manifest/config + +## Validation Criteria + +### Workflow Validation + +- **VLD-001**: Default-branch push triggers release evaluation. +- **VLD-002**: Releasable commits generate a release PR with version/changelog updates. +- **VLD-003**: Merged release PR results in semantic tag and GitHub release. +- **VLD-004**: Non-releasable commits result in no release mutation. + +### Performance Benchmarks + +- **PERF-001**: Median runtime stays within defined target. +- **PERF-002**: PR creation/update latency stays within defined target. + +## Change Management + +### Update Process + +1. **Specification Update**: Modify this document first. +2. **Review & Approval**: Obtain maintainer review for process changes. +3. **Implementation**: Apply updates to workflow and release configuration files. +4. **Testing**: Validate via controlled push or manual workflow dispatch. +5. **Deployment**: Merge approved changes into default branch. + +### Version History + +| Version | Date | Changes | Author | +| ------- | ---------- | ------------------------------------ | -------------- | +| 1.0 | 2026-02-22 | Initial release-please specification | GitHub Copilot | + +## Related Specifications + +- [CI/CD Workflow Specification - Release Please](spec-process-cicd-release-please.md) +- [CI/CD Workflow Specification - Publish VS Code Extension](spec-process-cicd-publish-vscode-extension.md) From 134cfcbf7a36311546276c062d2c89d033b8752f Mon Sep 17 00:00:00 2001 From: zoocityboy Date: Sun, 22 Feb 2026 11:22:53 +0100 Subject: [PATCH 2/2] feat: Add CI workflow for building, linting, and testing the Nocterm extension --- .github/workflows/{ci-vscode-extension.yml => ci.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{ci-vscode-extension.yml => ci.yml} (100%) diff --git a/.github/workflows/ci-vscode-extension.yml b/.github/workflows/ci.yml similarity index 100% rename from .github/workflows/ci-vscode-extension.yml rename to .github/workflows/ci.yml