diff --git a/.all-contributorsrc b/.all-contributorsrc
index bdf2259..eff63dd 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -1,50 +1,50 @@
{
- "projectName": "ai-block-theme-template",
- "projectOwner": "lightspeedwp",
- "repoType": "github",
- "repoHost": "https://github.com",
- "projectDescription": "Starter repository for WordPress block theme projects with AI support", // Brief description of the project
- "projectWebsite": "https://lightspeedwp.agency", // Official project website
- "license": "GPL-3.0-or-later", // Project license identifier
- "files": [
- "README.md" // Files where contributor information will be displayed
- ],
- "imageSize": 100, // Size of contributor avatar images in pixels
- "commit": false, // Whether to automatically commit changes (false for manual control)
- "commitConvention": "conventional", // Commit message convention to follow
- "contributors": [
- // Array of project contributors
- {
- "login": "lightspeedwp", // GitHub username/organization handle
- "name": "LightSpeedWP", // Display name for the contributor
- "avatar_url": "https://avatars.githubusercontent.com/u/lightspeedwp?v=4", // GitHub avatar image URL
- "profile": "https://github.com/lightspeedwp", // Link to contributor's profile
- "contributions": [
- // Types of contributions made to the project
- "ideas", // Contributed ideas and concepts
- "fundingFinding", // Helped find funding for the project
- "projectManagement", // Managed project tasks and coordination
- "business" // Handled business aspects and strategy
- ]
- },
- {
- "login": "ashleyshaw", // GitHub username
- "name": "Ashley Shaw", // Full name of the contributor
- "avatar_url": "https://avatars.githubusercontent.com/u/ashleyshaw?v=4", // GitHub profile avatar
- "profile": "https://github.com/ashleyshaw", // Link to GitHub profile
- "contributions": [
- // Comprehensive list of contribution types
- "code", // Wrote code for the project
- "design", // Created design elements and UI/UX
- "doc", // Wrote or improved documentation
- "ideas", // Contributed ideas and feedback
- "infra", // Set up and maintained infrastructure
- "maintenance", // Ongoing project maintenance
- "projectManagement", // Managed project activities
- "test" // Wrote tests and performed testing
- ]
- }
- ],
- "contributorsPerLine": 7, // Number of contributors to display per line in the README
- "linkToUsage": true // Whether to include a link to all-contributors usage information
+ "projectName": "ai-block-theme-template",
+ "projectOwner": "lightspeedwp",
+ "repoType": "github",
+ "repoHost": "https://github.com",
+ "projectDescription": "Starter repository for WordPress block theme projects with AI support", // Brief description of the project
+ "projectWebsite": "https://lightspeedwp.agency", // Official project website
+ "license": "GPL-3.0-or-later", // Project license identifier
+ "files": [
+ "README.md" // Files where contributor information will be displayed
+ ],
+ "imageSize": 100, // Size of contributor avatar images in pixels
+ "commit": false, // Whether to automatically commit changes (false for manual control)
+ "commitConvention": "conventional", // Commit message convention to follow
+ "contributors": [
+ // Array of project contributors
+ {
+ "login": "lightspeedwp", // GitHub username/organization handle
+ "name": "LightSpeedWP", // Display name for the contributor
+ "avatar_url": "https://avatars.githubusercontent.com/u/lightspeedwp?v=4", // GitHub avatar image URL
+ "profile": "https://github.com/lightspeedwp", // Link to contributor's profile
+ "contributions": [
+ // Types of contributions made to the project
+ "ideas", // Contributed ideas and concepts
+ "fundingFinding", // Helped find funding for the project
+ "projectManagement", // Managed project tasks and coordination
+ "business" // Handled business aspects and strategy
+ ]
+ },
+ {
+ "login": "ashleyshaw", // GitHub username
+ "name": "Ashley Shaw", // Full name of the contributor
+ "avatar_url": "https://avatars.githubusercontent.com/u/ashleyshaw?v=4", // GitHub profile avatar
+ "profile": "https://github.com/ashleyshaw", // Link to GitHub profile
+ "contributions": [
+ // Comprehensive list of contribution types
+ "code", // Wrote code for the project
+ "design", // Created design elements and UI/UX
+ "doc", // Wrote or improved documentation
+ "ideas", // Contributed ideas and feedback
+ "infra", // Set up and maintained infrastructure
+ "maintenance", // Ongoing project maintenance
+ "projectManagement", // Managed project activities
+ "test" // Wrote tests and performed testing
+ ]
+ }
+ ],
+ "contributorsPerLine": 7, // Number of contributors to display per line in the README
+ "linkToUsage": true // Whether to include a link to all-contributors usage information
}
diff --git a/.github/ISSUE_TEMPLATE/01-bug-report.md b/.github/ISSUE_TEMPLATE/01-bug-report.md
index 8accacf..219607a 100644
--- a/.github/ISSUE_TEMPLATE/01-bug-report.md
+++ b/.github/ISSUE_TEMPLATE/01-bug-report.md
@@ -67,7 +67,7 @@ Add any other context about the problem here.
### Fixed
--
+-
## Definition of Ready (DoR) Checklist
@@ -84,4 +84,4 @@ Add any other context about the problem here.
- [ ] Tests updated/added to prevent regression
- [ ] Documentation updated if needed
- [ ] Changelog entry added
-- [ ] Fix verified in all affected environments
\ No newline at end of file
+- [ ] Fix verified in all affected environments
diff --git a/.github/ISSUE_TEMPLATE/02-feature-request.md b/.github/ISSUE_TEMPLATE/02-feature-request.md
index 0322b96..603ae30 100644
--- a/.github/ISSUE_TEMPLATE/02-feature-request.md
+++ b/.github/ISSUE_TEMPLATE/02-feature-request.md
@@ -33,7 +33,7 @@ What type of automation would this be?
- [ ] GitHub Actions workflow
- [ ] Test harness
- [ ] Documentation improvement
-- [ ] Other: _____
+- [ ] Other: **\_**
## Implementation considerations
@@ -74,4 +74,4 @@ Add any other context, mockups, or examples about the feature request here.
- [ ] Documentation created/updated
- [ ] Changelog entry added
- [ ] Feature demonstrated and verified
-- [ ] Performance impact assessed (if applicable)
\ No newline at end of file
+- [ ] Performance impact assessed (if applicable)
diff --git a/.github/ISSUE_TEMPLATE/03-documentation.md b/.github/ISSUE_TEMPLATE/03-documentation.md
index a0d26e2..20d1fc0 100644
--- a/.github/ISSUE_TEMPLATE/03-documentation.md
+++ b/.github/ISSUE_TEMPLATE/03-documentation.md
@@ -23,7 +23,7 @@ Describe what documentation needs to be created, updated, or improved.
- [ ] Setup/installation instructions
- [ ] Troubleshooting guides
- [ ] API documentation
-- [ ] Other: _____
+- [ ] Other: **\_**
## Proposed Changes
@@ -42,7 +42,7 @@ Who is this documentation for?
- [ ] DevOps engineers
- [ ] Project maintainers
- [ ] End users
-- [ ] Other: _____
+- [ ] Other: **\_**
## Additional Context
@@ -54,7 +54,7 @@ Add any other context about the documentation request here.
### Changed
--
+-
## Definition of Ready (DoR) Checklist
@@ -70,4 +70,4 @@ Add any other context about the documentation request here.
- [ ] Clear, concise, and well-organized
- [ ] Follows markdown style guidelines
- [ ] Changelog entry added (if applicable)
-- [ ] Documentation merged and published
\ No newline at end of file
+- [ ] Documentation merged and published
diff --git a/.github/ISSUE_TEMPLATE/04-task.md b/.github/ISSUE_TEMPLATE/04-task.md
index c53f161..69057fa 100644
--- a/.github/ISSUE_TEMPLATE/04-task.md
+++ b/.github/ISSUE_TEMPLATE/04-task.md
@@ -28,15 +28,15 @@ Why does this task need to be done? What value does it provide?
- [ ] Maintenance
- [ ] Infrastructure
- [ ] Testing
-- [ ] Other: _____
+- [ ] Other: **\_**
## Requirements
List specific requirements for completing this task.
-1.
-2.
-3.
+1.
+2.
+3.
## Success Criteria
@@ -52,7 +52,7 @@ Links to documentation, related issues, or context that might be helpful.
### Changed
--
+-
## Definition of Ready (DoR) Checklist
@@ -69,4 +69,4 @@ Links to documentation, related issues, or context that might be helpful.
- [ ] Tests added/updated as needed
- [ ] Documentation updated (if applicable)
- [ ] Changelog entry added (if applicable)
-- [ ] Changes merged and deployed
\ No newline at end of file
+- [ ] Changes merged and deployed
diff --git a/.github/ISSUE_TEMPLATE/05-refactoring.md b/.github/ISSUE_TEMPLATE/05-refactoring.md
index d8a8e9a..02399b2 100644
--- a/.github/ISSUE_TEMPLATE/05-refactoring.md
+++ b/.github/ISSUE_TEMPLATE/05-refactoring.md
@@ -37,7 +37,7 @@ What benefits will this refactoring provide?
- [ ] Reduced complexity
- [ ] Enhanced readability
- [ ] Easier testing
-- [ ] Other: _____
+- [ ] Other: **\_**
## Risks and Challenges
@@ -63,4 +63,4 @@ Any other context, code examples, or references that might help.
- [ ] Code coverage maintained or improved
- [ ] Documentation updated (if needed)
- [ ] Code review completed
-- [ ] Performance impact verified (if applicable)
\ No newline at end of file
+- [ ] Performance impact verified (if applicable)
diff --git a/.github/ISSUE_TEMPLATE/06-integration.md b/.github/ISSUE_TEMPLATE/06-integration.md
index 4cebd5d..6b9fb25 100644
--- a/.github/ISSUE_TEMPLATE/06-integration.md
+++ b/.github/ISSUE_TEMPLATE/06-integration.md
@@ -20,7 +20,7 @@ Describe the integration that's affected:
- [ ] CI/CD system
- [ ] Deployment platform
- [ ] Authentication system
-- [ ] Other: _____
+- [ ] Other: **\_**
## Current Behavior
@@ -39,9 +39,9 @@ What should be happening instead?
## Steps to Reproduce
-1.
-2.
-3.
+1.
+2.
+3.
## Logs or Error Messages
@@ -59,7 +59,7 @@ If you have ideas about how to fix the integration, please share them.
### Fixed
--
+-
## Definition of Ready (DoR) Checklist
@@ -76,4 +76,4 @@ If you have ideas about how to fix the integration, please share them.
- [ ] Documentation updated (if applicable)
- [ ] Changelog entry added
- [ ] Integration verified in all relevant environments
-- [ ] Security implications reviewed (if applicable)
\ No newline at end of file
+- [ ] Security implications reviewed (if applicable)
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index b5641ba..d18d600 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,11 +1,11 @@
blank_issues_enabled: false
contact_links:
- - name: ❓ Questions & Discussions
- url: https://github.com/lightspeedwp/scripts/discussions
- about: Ask questions, discuss best practices, or share ideas about our automation scripts
- - name: 📚 Documentation
- url: https://github.com/lightspeedwp/scripts/tree/main/docs
- about: Check our documentation for guides and examples
- - name: 📝 Contribution Guide
- url: https://github.com/lightspeedwp/scripts/blob/main/CONTRIBUTING.md
- about: Learn how to contribute to our automation scripts
\ No newline at end of file
+ - name: ❓ Questions & Discussions
+ url: https://github.com/lightspeedwp/scripts/discussions
+ about: Ask questions, discuss best practices, or share ideas about our automation scripts
+ - name: 📚 Documentation
+ url: https://github.com/lightspeedwp/scripts/tree/main/docs
+ about: Check our documentation for guides and examples
+ - name: 📝 Contribution Guide
+ url: https://github.com/lightspeedwp/scripts/blob/main/CONTRIBUTING.md
+ about: Learn how to contribute to our automation scripts
diff --git a/.github/PROJECT_META.client-delivery.md b/.github/PROJECT_META.client-delivery.md
index 8f780b1..89d6cfe 100644
--- a/.github/PROJECT_META.client-delivery.md
+++ b/.github/PROJECT_META.client-delivery.md
@@ -4,11 +4,11 @@
## Quick Start
-1) **Create Project** → Name `Client – {ClientName}`; Description with scope + contract link.
-2) **Add fields**: Status (Backlog, **To‑do**, In progress, In review, In QA, Done), Issue Type (Epic, Story, Task, Bug, Chore, Design, Research), Priority, Area, Theme, **Size (single‑select)**, Start Date, Deadline, **Milestone (iteration)**, Environment, Parent Issue, Sub‑issues Progress, Time (hours). Optional: Iteration.
-3) **Automations**: Auto‑add → Backlog; On Assignee → In progress; On linked PR → In review; On `status:needs-qa` → In QA; On close/merge → Done.
-4) **Pin views**: Board — Team Flow (group by Assignee), Backlog — Table, **QA Gate**, **UAT (Client)**, Roadmap, Blocked, Epics (Tracking) — Table/Roadmap.
-5) **Intake hygiene**: Create **Intake** view (`Status = Backlog` AND missing Assignee/Priority/Issue Type) and clear it weekly.
+1. **Create Project** → Name `Client – {ClientName}`; Description with scope + contract link.
+2. **Add fields**: Status (Backlog, **To‑do**, In progress, In review, In QA, Done), Issue Type (Epic, Story, Task, Bug, Chore, Design, Research), Priority, Area, Theme, **Size (single‑select)**, Start Date, Deadline, **Milestone (iteration)**, Environment, Parent Issue, Sub‑issues Progress, Time (hours). Optional: Iteration.
+3. **Automations**: Auto‑add → Backlog; On Assignee → In progress; On linked PR → In review; On `status:needs-qa` → In QA; On close/merge → Done.
+4. **Pin views**: Board — Team Flow (group by Assignee), Backlog — Table, **QA Gate**, **UAT (Client)**, Roadmap, Blocked, Epics (Tracking) — Table/Roadmap.
+5. **Intake hygiene**: Create **Intake** view (`Status = Backlog` AND missing Assignee/Priority/Issue Type) and clear it weekly.
## Status
diff --git a/.github/PROJECT_META.md b/.github/PROJECT_META.md
index 194601b..ec7d0c3 100644
--- a/.github/PROJECT_META.md
+++ b/.github/PROJECT_META.md
@@ -11,9 +11,9 @@ Automatically **add issues/PRs to the org Project** and keep Project **fields in
- **Triggers** on issue and PR events.
- **Adds the item** to the org Project using `LS_PROJECT_URL`.
- **Derives** and writes Project fields:
- - **Status** from `status:*` labels (closed/merged → `Done`; default **Backlog**).
- - **Priority** from `priority:*` labels.
- - **Type** from **PR head branch** (see PR labels).
+ - **Status** from `status:*` labels (closed/merged → `Done`; default **Backlog**).
+ - **Priority** from `priority:*` labels.
+ - **Type** from **PR head branch** (see PR labels).
## Setup requirements
diff --git a/.github/PROJECT_META.product-development.md b/.github/PROJECT_META.product-development.md
index 7d5d49e..578687a 100644
--- a/.github/PROJECT_META.product-development.md
+++ b/.github/PROJECT_META.product-development.md
@@ -4,11 +4,11 @@
## Quick Start
-1) **Create Project** → Name `Product – {ProductName}`; Description with objective + README/roadmap link.
-2) **Add fields**: Status (Backlog, **Ready**, In progress, In review, In QA, Done), Issue Type (Epic, Feature, Story, Task, Bug, Refactor, Design, Research, Chore), Priority, **Milestone/Release (vX.Y.Z)**, Area, Theme, **Size (single‑select)**, Start Date, Deadline, Environment, Parent Epic, Sub‑issues Progress, Time (hours). Optional: Iteration (Sprint).
-3) **Automations**: Auto‑add → Backlog; On Assignee → In progress; On linked PR → In review; On `status:needs-qa` → In QA; On close/merge → Done.
-4) **Release scaffolding**: Create Milestone `vX.Y.Z`; add scoped Features/Stories; pin **Release Gate — vX.Y.Z** view.
-5) **Pin views**: Release Gate, Tech Debt, Roadmap, Backlog — Table, Epics — Table/Roadmap/Board, Epic drill‑down (group by Parent Epic).
+1. **Create Project** → Name `Product – {ProductName}`; Description with objective + README/roadmap link.
+2. **Add fields**: Status (Backlog, **Ready**, In progress, In review, In QA, Done), Issue Type (Epic, Feature, Story, Task, Bug, Refactor, Design, Research, Chore), Priority, **Milestone/Release (vX.Y.Z)**, Area, Theme, **Size (single‑select)**, Start Date, Deadline, Environment, Parent Epic, Sub‑issues Progress, Time (hours). Optional: Iteration (Sprint).
+3. **Automations**: Auto‑add → Backlog; On Assignee → In progress; On linked PR → In review; On `status:needs-qa` → In QA; On close/merge → Done.
+4. **Release scaffolding**: Create Milestone `vX.Y.Z`; add scoped Features/Stories; pin **Release Gate — vX.Y.Z** view.
+5. **Pin views**: Release Gate, Tech Debt, Roadmap, Backlog — Table, Epics — Table/Roadmap/Board, Epic drill‑down (group by Parent Epic).
## Status
diff --git a/.github/PR_LABELS.md b/.github/PR_LABELS.md
index 7150dfc..46d58ed 100644
--- a/.github/PR_LABELS.md
+++ b/.github/PR_LABELS.md
@@ -8,11 +8,11 @@ Provide high‑signal, automated **PR labels** for review routing, release hygie
## How labels are applied
-1) **Paths → labels** via `.github/labeler.yml`:
- - `area:ci`, `area:dependencies`, `area:block-editor`, `area:theme`, `area:integration` …
- - `lang:php`, `lang:javascript`, `lang:css`, `lang:md` …
-2) **Branch prefixes → status** (on PR open):
- - `feat/`, `fix/`, `docs/`, `chore/`, `build/` → add **`status:needs-review`** by default.
+1. **Paths → labels** via `.github/labeler.yml`:
+ - `area:ci`, `area:dependencies`, `area:block-editor`, `area:theme`, `area:integration` …
+ - `lang:php`, `lang:javascript`, `lang:css`, `lang:md` …
+2. **Branch prefixes → status** (on PR open):
+ - `feat/`, `fix/`, `docs/`, `chore/`, `build/` → add **`status:needs-review`** by default.
### Optional branch→type mapping (for Projects)
diff --git a/.github/PULL_REQUEST_TEMPLATES/pr_bug.md b/.github/PULL_REQUEST_TEMPLATES/pr_bug.md
index 34eb0dc..d4a19b2 100644
--- a/.github/PULL_REQUEST_TEMPLATES/pr_bug.md
+++ b/.github/PULL_REQUEST_TEMPLATES/pr_bug.md
@@ -1,10 +1,8 @@
---
-
-name: "Bugfix PR"
-about: "Fix a defect/regression with clear repro, fix, and verification"
-title: "fix: {short summary}"
-labels: ["status:needs-review"]
-
+name: 'Bugfix PR'
+about: 'Fix a defect/regression with clear repro, fix, and verification'
+title: 'fix: {short summary}'
+labels: ['status:needs-review']
---
# Bugfix Pull Request
diff --git a/.github/PULL_REQUEST_TEMPLATES/pr_chore.md b/.github/PULL_REQUEST_TEMPLATES/pr_chore.md
index 7f86595..ab8c7d6 100644
--- a/.github/PULL_REQUEST_TEMPLATES/pr_chore.md
+++ b/.github/PULL_REQUEST_TEMPLATES/pr_chore.md
@@ -1,10 +1,8 @@
---
-
-name: "Chore PR"
-about: "Repo hygiene: configs, scripts, formatting — no behaviour change"
-title: "chore: {scope}"
-labels: ["status:needs-review"]
-
+name: 'Chore PR'
+about: 'Repo hygiene: configs, scripts, formatting — no behaviour change'
+title: 'chore: {scope}'
+labels: ['status:needs-review']
---
# Chore Pull Request
@@ -12,7 +10,6 @@ labels: ["status:needs-review"]
> This repository enforces changelog, release, and label automation for all PRs and issues.
> See the organisation-wide [Automation Governance & Release Strategy](https://github.com/lightspeedwp/.github/blob/main/AUTOMATION_GOVERNANCE.md) for required rules.
-
## Linked issues
-| File | Purpose |
-|------|---------|
-| [.github/copilot-instructions.md](.github/copilot-instructions.md) | Main Copilot & CodeRabbit integration, file index, and standards cross-reference |
-| [.github/custom-instructions.md](.github/custom-instructions.md) | Copilot custom instructions, role-based configuration |
-| [.github/prompts/prompts.md](.github/prompts/prompts.md) | Reusable prompt templates for Copilot Chat/CLI |
-| [.github/chatmodes/chatmodes.md](.github/chatmodes/chatmodes.md) | Scenario-based chat modes for development contexts |
-| [.github/instructions/contributor-types.md](.github/instructions/contributor-types.md) | Role-specific contributor standards and prompts |
-| [.github/instructions/shell-script-copilot.md](.github/instructions/shell-script-copilot.md) | Shell script automation standards and patterns |
-| [.github/instructions/markdown-copilot.md](.github/instructions/markdown-copilot.md) | Markdown/documentation standards and accessibility |
-| [.github/instructions/js-copilot.md](.github/instructions/js-copilot.md) | JavaScript/Node.js workflow standards |
-| [.github/instructions/python-copilot.md](.github/instructions/python-copilot.md) | Python scripting standards |
-| [.github/instructions/playwright-copilot.md](.github/instructions/playwright-copilot.md) | Playwright-specific Copilot instructions and MCP server automation |
+
+| File | Purpose |
+| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| [.github/copilot-instructions.md](.github/copilot-instructions.md) | Main Copilot & CodeRabbit integration, file index, and standards cross-reference |
+| [.github/custom-instructions.md](.github/custom-instructions.md) | Copilot custom instructions, role-based configuration |
+| [.github/prompts/prompts.md](.github/prompts/prompts.md) | Reusable prompt templates for Copilot Chat/CLI |
+| [.github/chatmodes/chatmodes.md](.github/chatmodes/chatmodes.md) | Scenario-based chat modes for development contexts |
+| [.github/instructions/contributor-types.md](.github/instructions/contributor-types.md) | Role-specific contributor standards and prompts |
+| [.github/instructions/shell-script-copilot.md](.github/instructions/shell-script-copilot.md) | Shell script automation standards and patterns |
+| [.github/instructions/markdown-copilot.md](.github/instructions/markdown-copilot.md) | Markdown/documentation standards and accessibility |
+| [.github/instructions/js-copilot.md](.github/instructions/js-copilot.md) | JavaScript/Node.js workflow standards |
+| [.github/instructions/python-copilot.md](.github/instructions/python-copilot.md) | Python scripting standards |
+| [.github/instructions/playwright-copilot.md](.github/instructions/playwright-copilot.md) | Playwright-specific Copilot instructions and MCP server automation |
+
diff --git a/.github/custom-instructions.md b/.github/custom-instructions.md
index 3f34202..234828e 100644
--- a/.github/custom-instructions.md
+++ b/.github/custom-instructions.md
@@ -49,8 +49,6 @@ All instructions follow the pattern: "You are a [role]. Follow our [framework/pa
└── LIGHTSPEED_AUTOMATION_HANDBOOK.md # Organization-wide documentation
```
-
-
## Usage Guidelines
1. **For Contributors**: Reference the appropriate instruction file based on your role and task. Use chat modes from [chatmodes/chatmodes.md](../chatmodes/chatmodes.md) for context-specific guidance. Scripts must follow repo standards: kebab-case naming, header comments, error handling (`set -euo pipefail`), and Bats test coverage.
diff --git a/.github/docs/auto-issue-type.md b/.github/docs/auto-issue-type.md
index 34f66e1..b5b1bd5 100644
--- a/.github/docs/auto-issue-type.md
+++ b/.github/docs/auto-issue-type.md
@@ -14,18 +14,18 @@ This workflow automatically assigns appropriate issue types to newly created iss
This workflow aligns with the organization-wide issue types defined in `org-wide-issue-types-v1-9.md`:
-| Issue Type | Color | Usage |
-|------------|-------|-------|
-| 🧩 Task | Blue #4393f8 | Small, well-defined work items |
-| 🐞 Bug | Red #9f3734 | Defects requiring fixes |
-| ✨ Feature | Green #3fb950 | New functionality |
-| 🎨 Design | Purple #ab7df8 | UI/UX work |
-| 🧭 Epic | Purple #ab7df8 | Large initiatives grouping multiple issues |
-| 📖 Story | Blue #4393f8 | User-focused feature descriptions |
-| 🔧 Improvement | Grey #9198a1 | Enhancements to existing functionality |
-| ♻️ Refactor | Grey #9198a1 | Code improvement without behavioral changes |
-| ⚙️ Build & CI | Blue #4393f8 | CI/CD and tooling improvements |
-| 📚 Documentation | Blue #4393f8 | Documentation updates |
+| Issue Type | Color | Usage |
+| ---------------- | -------------- | ------------------------------------------- |
+| 🧩 Task | Blue #4393f8 | Small, well-defined work items |
+| 🐞 Bug | Red #9f3734 | Defects requiring fixes |
+| ✨ Feature | Green #3fb950 | New functionality |
+| 🎨 Design | Purple #ab7df8 | UI/UX work |
+| 🧭 Epic | Purple #ab7df8 | Large initiatives grouping multiple issues |
+| 📖 Story | Blue #4393f8 | User-focused feature descriptions |
+| 🔧 Improvement | Grey #9198a1 | Enhancements to existing functionality |
+| ♻️ Refactor | Grey #9198a1 | Code improvement without behavioral changes |
+| ⚙️ Build & CI | Blue #4393f8 | CI/CD and tooling improvements |
+| 📚 Documentation | Blue #4393f8 | Documentation updates |
## Type Assignment Priority
diff --git a/.github/instructions/coding-standards.md b/.github/instructions/coding-standards.md
index 2233c1a..2c3ca6a 100644
--- a/.github/instructions/coding-standards.md
+++ b/.github/instructions/coding-standards.md
@@ -1,6 +1,7 @@
# Coding Standards Instruction
## Shell Script Coding Standards
+
- Use `#!/bin/bash` or `#!/usr/bin/env bash` as the shebang.
- Always set `set -euo pipefail` for robust error handling.
- Use kebab-case for filenames and functions.
@@ -15,6 +16,7 @@
- Follow [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html) and [ShellCheck Wiki](https://github.com/koalaman/shellcheck/wiki).
## WordPress Coding Standards
+
- For PHP, JavaScript, CSS, and HTML, follow the official [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/).
- Use [PHP_CodeSniffer](https://github.com/WordPress/WordPress-Coding-Standards) for PHP linting.
- Use [eslint-config-wordpress](https://www.npmjs.com/package/eslint-config-wordpress) for JS linting.
@@ -23,11 +25,13 @@
- Reference WordPress documentation for best practices and examples.
## Enforcement
+
- Coding standards are enforced via CodeRabbit, ShellCheck, markdownlint, ESLint, and PHP_CodeSniffer status checks.
- All PRs must pass linting and review for coding standards compliance.
- Reviewers should verify adherence to standards before approving changes.
## References
+
- [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/)
- [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html)
- [ShellCheck Wiki](https://github.com/koalaman/shellcheck/wiki)
diff --git a/.github/instructions/documentation-standards.md b/.github/instructions/documentation-standards.md
index 4faadea..d2c331b 100644
--- a/.github/instructions/documentation-standards.md
+++ b/.github/instructions/documentation-standards.md
@@ -1,56 +1,67 @@
# Documentation Standards Instruction
## README Requirements
+
- Every directory containing scripts, workflows, or tests must have a README.md.
- Each README must include:
- - Project or directory overview
- - Table of contents for long documents
- - Usage instructions for all scripts, workflows, or tests
- - Example commands and expected outputs
- - Description of automation features and integration points
- - Error handling and troubleshooting notes
- - Test coverage summary and status badge (if applicable)
- - Links to related documentation, governance, and instruction files
- - Changelog or release notes section (if relevant)
+ - Project or directory overview
+ - Table of contents for long documents
+ - Usage instructions for all scripts, workflows, or tests
+ - Example commands and expected outputs
+ - Description of automation features and integration points
+ - Error handling and troubleshooting notes
+ - Test coverage summary and status badge (if applicable)
+ - Links to related documentation, governance, and instruction files
+ - Changelog or release notes section (if relevant)
- All README files must pass markdownlint and be kept up to date with changes.
## In-line Documentation Requirements
+
- All scripts, workflows, and test files must include:
- - Header comments with name, description, usage, author, and date
- - Function/method comments describing purpose, parameters, and return values
- - Inline comments for complex logic, edge cases, and error handling
- - References to related documentation or instruction files where appropriate
+ - Header comments with name, description, usage, author, and date
+ - Function/method comments describing purpose, parameters, and return values
+ - Inline comments for complex logic, edge cases, and error handling
+ - References to related documentation or instruction files where appropriate
- Use consistent comment style and formatting for each language (Bash, JS, Python, YAML)
- Update in-line documentation whenever code is changed or refactored
## Enforcement
+
- Documentation standards are enforced via CodeRabbit and markdownlint status checks
- PRs must update documentation and in-line comments for new features, changes, or fixes
- Reviewers should verify documentation compliance before approving changes
## Example README Section
-```markdown
+
+````markdown
# Example Automation Script
## Overview
+
This script automates deployment for WordPress sites.
## Usage
+
```bash
./deploy-wordpress-site.sh --env staging
```
+````
## Features
+
- Automated deployment
- Error handling and logging
- Integration with CI workflows
## Test Coverage
+

## Changelog
+
- v1.0.0: Initial release
-```
+
+````
## Example In-line Documentation (Bash)
```bash
@@ -68,4 +79,4 @@ function deploy_site() {
# Validate environment argument
# ...existing code...
}
-```
+````
diff --git a/.github/instructions/playwright-copilot.md b/.github/instructions/playwright-copilot.md
index 59c5a98..33a4ab3 100644
--- a/.github/instructions/playwright-copilot.md
+++ b/.github/instructions/playwright-copilot.md
@@ -60,8 +60,8 @@ done
```yaml
- name: Start Playwright MCP server
run: |
- nohup npx playwright mcp-server &
- sleep 5
+ nohup npx playwright mcp-server &
+ sleep 5
- name: Run Playwright tests
run: npx playwright test
```
diff --git a/.github/issue-labeler.yml b/.github/issue-labeler.yml
index e7aab89..450209f 100644
--- a/.github/issue-labeler.yml
+++ b/.github/issue-labeler.yml
@@ -3,30 +3,30 @@
# Type labels
enhancement:
- - '\bfeat(ure)?\b|\badd\b|\bnew\b'
+ - '\bfeat(ure)?\b|\badd\b|\bnew\b'
bug:
- - '\bbug\b|\bfix\b|\bissue\b|\berror\b|\bfail(ed|ure)?\b|\bcrash(es|ed)?\b'
+ - '\bbug\b|\bfix\b|\bissue\b|\berror\b|\bfail(ed|ure)?\b|\bcrash(es|ed)?\b'
area:documentation:
- - '\bdoc(s|umentation)?\b'
+ - '\bdoc(s|umentation)?\b'
refactor:
- - '\brefactor\b|\bclean(up)?\b|\brestructure\b'
+ - '\brefactor\b|\bclean(up)?\b|\brestructure\b'
test:
- - '\btest(s|ing)?\b'
+ - '\btest(s|ing)?\b'
# Component labels
scripts:
- - '\bscript\b|\bbash\b|\bsh\b'
+ - '\bscript\b|\bbash\b|\bsh\b'
workflow:
- - '\bworkflow\b|\baction\b|\bgithub action\b'
+ - '\bworkflow\b|\baction\b|\bgithub action\b'
project:
- - '\bproject\b|\bprojects?\b|\bGitHub project\b'
+ - '\bproject\b|\bprojects?\b|\bGitHub project\b'
client-delivery:
- - '\bclient\b|\bdelivery\b|\bclient delivery\b'
+ - '\bclient\b|\bdelivery\b|\bclient delivery\b'
product-development:
- - '\bproduct\b|\bproduct development\b'
+ - '\bproduct\b|\bproduct development\b'
# Priority labels (if explicitly mentioned)
priority:high:
- - '\bhigh priority\b|\burgent\b|\bcritical\b'
+ - '\bhigh priority\b|\burgent\b|\bcritical\b'
priority:low:
- - '\blow priority\b|\bnice to have\b'
\ No newline at end of file
+ - '\blow priority\b|\bnice to have\b'
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 806cc88..7b60425 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -3,94 +3,94 @@
# File path patterns for labeling PRs
scripts:
- - scripts/**/*.sh
- - scripts/**/*.bash
- - scripts/*/
- - scripts/maintenance/**
- - scripts/deployment/**
- - scripts/project/**
- - scripts/testing/**
- - scripts/utility/**
+ - scripts/**/*.sh
+ - scripts/**/*.bash
+ - scripts/*/
+ - scripts/maintenance/**
+ - scripts/deployment/**
+ - scripts/project/**
+ - scripts/testing/**
+ - scripts/utility/**
tests:
- - tests/**/*.bats
- - tests/**/*.sh
- - tests/**/*.ts
- - tests/**/*.js
- - tests/**/*.spec.*
+ - tests/**/*.bats
+ - tests/**/*.sh
+ - tests/**/*.ts
+ - tests/**/*.js
+ - tests/**/*.spec.*
github-workflow:
- - .github/workflows/**
- - .github/actions/**
+ - .github/workflows/**
+ - .github/actions/**
workflows:
- - workflows/**
+ - workflows/**
area:documentation:
- - "*.md"
- - "**/*.md"
- - docs/**
+ - '*.md'
+ - '**/*.md'
+ - docs/**
configuration:
- - .github/*.yml
- - .github/*.yaml
- - "*.json"
- - "*.yml"
- - "*.yaml"
- - .shellcheckrc
- - .eslintrc*
- - .prettierrc*
- - .markdownlint*
+ - .github/*.yml
+ - .github/*.yaml
+ - '*.json'
+ - '*.yml'
+ - '*.yaml'
+ - .shellcheckrc
+ - .eslintrc*
+ - .prettierrc*
+ - .markdownlint*
# Language labels
lang:js:
- - "**/*.js"
- - "**/*.jsx"
- - "**/*.ts"
- - "**/*.tsx"
- - package.json
- - package-lock.json
- - tsconfig.json
- - .eslintrc*
-
+ - '**/*.js'
+ - '**/*.jsx'
+ - '**/*.ts'
+ - '**/*.tsx'
+ - package.json
+ - package-lock.json
+ - tsconfig.json
+ - .eslintrc*
+
lang:php:
- - "**/*.php"
- - composer.json
- - composer.lock
- - phpunit.xml*
-
+ - '**/*.php'
+ - composer.json
+ - composer.lock
+ - phpunit.xml*
+
lang:css:
- - "**/*.css"
- - "**/*.scss"
- - "**/*.sass"
- - "**/*.less"
-
+ - '**/*.css'
+ - '**/*.scss'
+ - '**/*.sass'
+ - '**/*.less'
+
lang:bash:
- - "**/*.sh"
- - "**/*.bash"
- - .bashrc
- - .bash_profile
+ - '**/*.sh'
+ - '**/*.bash'
+ - .bashrc
+ - .bash_profile
# Branch name patterns
client-delivery:
- - "client-delivery-*"
- - "client/*"
- - "clients/*"
+ - 'client-delivery-*'
+ - 'client/*'
+ - 'clients/*'
product-development:
- - "product-dev-*"
- - "product/*"
- - "feature/*"
+ - 'product-dev-*'
+ - 'product/*'
+ - 'feature/*'
# Commit message patterns (PR title typically)
-"size: small":
- - head-branch: "^.*$"
- title: "^(docs|chore|fix|style)(\\(.+\\))?: .*"
+'size: small':
+ - head-branch: '^.*$'
+ title: "^(docs|chore|fix|style)(\\(.+\\))?: .*"
-"size: medium":
- - head-branch: "^.*$"
- title: "^(feat|refactor)(\\(.+\\))?: .*"
+'size: medium':
+ - head-branch: '^.*$'
+ title: "^(feat|refactor)(\\(.+\\))?: .*"
-"size: large":
- - head-branch: "^.*$"
- title: "^(major|breaking|rewrite)(\\(.+\\))?: .*"
+'size: large':
+ - head-branch: '^.*$'
+ title: "^(major|breaking|rewrite)(\\(.+\\))?: .*"
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 12bef3a..6db86eb 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,10 +1,8 @@
---
-
-name: "Pull Request"
-about: "General changes, refactors, and maintenance"
-title: "PR: {short summary}"
-labels: ["status:needs-review"]
-
+name: 'Pull Request'
+about: 'General changes, refactors, and maintenance'
+title: 'PR: {short summary}'
+labels: ['status:needs-review']
---
# Pull Request
diff --git a/.github/workflows/ai-pr-reviewer.yml b/.github/workflows/ai-pr-reviewer.yml
index 2745d0d..f69ec2f 100644
--- a/.github/workflows/ai-pr-reviewer.yml
+++ b/.github/workflows/ai-pr-reviewer.yml
@@ -1,87 +1,84 @@
name: AI PR Review
permissions:
- contents: read
- pull-requests: write
+ contents: read
+ pull-requests: write
on:
- pull_request:
- pull_request_review_comment:
- types: [created]
+ pull_request:
+ pull_request_review_comment:
+ types: [created]
concurrency:
- group:
- ${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }}-${{ github.event_name == 'pull_request_review_comment' && 'pr_comment' || 'pr' }}
- cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}
+ group: ${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }}-${{ github.event_name == 'pull_request_review_comment' && 'pr_comment' || 'pr' }}
+ cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}
jobs:
- ai-review:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
+ ai-review:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
- - name: Setup Node
- uses: actions/setup-node@v5
- with:
- node-version: '20'
- cache: 'npm'
+ - name: Setup Node
+ uses: actions/setup-node@v5
+ with:
+ node-version: '20'
+ cache: 'npm'
- - name: Install dependencies
- run: npm ci
+ - name: Install dependencies
+ run: npm ci
- - name: Run build
- run: npm run build
+ - name: Run build
+ run: npm run build
+ - name: Update README and changelog tables
+ run: |
+ bash scripts/update-readme-and-changelog.sh
+ - name: Markdown lint
+ run: |
+ npx markdownlint README.md scripts/README.md tests/README.md workflows/README.md .github/README.md AGENTS.md .github/agents/*.md .github/instructions/*.md .github/prompts/prompts.md .github/chatmodes/chatmodes.md || true
- - name: Update README and changelog tables
- run: |
- bash scripts/update-readme-and-changelog.sh
+ - name: Lint and format check
+ run: |
+ npm run lint:js
+ npm run lint:sh
+ npm run format
- - name: Markdown lint
- run: |
- npx markdownlint README.md scripts/README.md tests/README.md workflows/README.md .github/README.md AGENTS.md .github/agents/*.md .github/instructions/*.md .github/prompts/prompts.md .github/chatmodes/chatmodes.md || true
+ - name: Run Bats tests
+ run: |
+ if command -v bats &> /dev/null; then
+ bats tests/
+ else
+ echo "Bats not installed, skipping shell tests."
+ fi
- - name: Lint and format check
- run: |
- npm run lint:js
- npm run lint:sh
- npm run format
+ - name: Check README and documentation
+ run: |
+ npx markdownlint README.md scripts/README.md tests/README.md workflows/README.md .github/README.md || true
- - name: Run Bats tests
- run: |
- if command -v bats &> /dev/null; then
- bats tests/
- else
- echo "Bats not installed, skipping shell tests."
- fi
-
- - name: Check README and documentation
- run: |
- npx markdownlint README.md scripts/README.md tests/README.md workflows/README.md .github/README.md || true
-
- - name: AI PR Review (CodeRabbit)
- uses: coderabbitai/ai-pr-reviewer@latest
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- with:
- debug: false
- review_simple_changes: true
- review_comment_lgtm: false
- review_paths: |
- README.md
- scripts/README.md
- tests/README.md
- workflows/README.md
- .github/README.md
- scripts/*.sh
- scripts/**/*.sh
- tests/*.bats
- tests/**/*.bats
- .github/instructions/*.md
- .github/prompts/prompts.md
- .github/chatmodes/chatmodes.md
- .github/agents/*.md
- AGENTS.md
+ - name: AI PR Review (CodeRabbit)
+ uses: coderabbitai/ai-pr-reviewer@latest
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ with:
+ debug: false
+ review_simple_changes: true
+ review_comment_lgtm: false
+ review_paths: |
+ README.md
+ scripts/README.md
+ tests/README.md
+ workflows/README.md
+ .github/README.md
+ scripts/*.sh
+ scripts/**/*.sh
+ tests/*.bats
+ tests/**/*.bats
+ .github/instructions/*.md
+ .github/prompts/prompts.md
+ .github/chatmodes/chatmodes.md
+ .github/agents/*.md
+ AGENTS.md
diff --git a/.github/workflows/all-contributors-update.yml b/.github/workflows/all-contributors-update.yml
index 66fd4ca..661d863 100644
--- a/.github/workflows/all-contributors-update.yml
+++ b/.github/workflows/all-contributors-update.yml
@@ -1,31 +1,31 @@
name: Update Contributors Table on PR Merge
on:
- pull_request:
- types:
- - closed
+ pull_request:
+ types:
+ - closed
jobs:
- update-contributors:
- if: github.event.pull_request.merged == true
- runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '18'
- - name: Install dependencies
- run: npm ci
- - name: Generate contributors table
- run: npx all-contributors generate
- - name: Commit and push changes
- run: |
- git config --global user.name 'github-actions[bot]'
- git config --global user.email 'github-actions[bot]@users.noreply.github.com'
- git add README.md
- git commit -m "chore: update contributors table [skip ci]" || echo "No changes to commit"
- git push
+ update-contributors:
+ if: github.event.pull_request.merged == true
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+ - name: Install dependencies
+ run: npm ci
+ - name: Generate contributors table
+ run: npx all-contributors generate
+ - name: Commit and push changes
+ run: |
+ git config --global user.name 'github-actions[bot]'
+ git config --global user.email 'github-actions[bot]@users.noreply.github.com'
+ git add README.md
+ git commit -m "chore: update contributors table [skip ci]" || echo "No changes to commit"
+ git push
diff --git a/.github/workflows/badges.yml b/.github/workflows/badges.yml
index 92b6711..b9282fc 100644
--- a/.github/workflows/badges.yml
+++ b/.github/workflows/badges.yml
@@ -1,66 +1,66 @@
name: Update Badges
on:
- push:
- branches: [ main, develop ]
- release:
- types: [published]
- workflow_dispatch:
+ push:
+ branches: [main, develop]
+ release:
+ types: [published]
+ workflow_dispatch:
permissions:
- contents: write
+ contents: write
jobs:
- update-badges:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Update badge references
- run: |
- BRANCH="${GITHUB_REF#refs/heads/}"
-
- # Update README badges to reflect current branch
- if [ -f "README.md" ]; then
- echo "Updating badges for branch: $BRANCH"
-
- # For main branch (release), show main branch status
- if [ "$BRANCH" = "main" ]; then
- sed -i 's/?branch=develop/?branch=main/g' README.md
- sed -i 's/alt=".*Development.*"/alt="Release Status"/g' README.md
- else
- # For develop and other branches, show develop status
- sed -i 's/?branch=main/?branch=develop/g' README.md
- sed -i 's/alt=".*Release.*"/alt="Development Status"/g' README.md
- fi
-
- # Check if changes were made
- if git diff --quiet README.md; then
- echo "No badge updates needed"
- else
- echo "Badge updates made"
- git config --local user.email "action@github.com"
- git config --local user.name "GitHub Action"
- git add README.md
- git commit -m "chore: update badges for $BRANCH branch [skip ci]"
- git push
- fi
- fi
-
- - name: Generate shield badges
- run: |
- # Create shields.json for custom badges if needed
- cat > shields.json << 'EOF'
- {
- "schemaVersion": 1,
- "label": "release",
- "message": "v0.1.0",
- "color": "blue"
- }
- EOF
-
- echo "Badge configuration updated"
\ No newline at end of file
+ update-badges:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Update badge references
+ run: |
+ BRANCH="${GITHUB_REF#refs/heads/}"
+
+ # Update README badges to reflect current branch
+ if [ -f "README.md" ]; then
+ echo "Updating badges for branch: $BRANCH"
+
+ # For main branch (release), show main branch status
+ if [ "$BRANCH" = "main" ]; then
+ sed -i 's/?branch=develop/?branch=main/g' README.md
+ sed -i 's/alt=".*Development.*"/alt="Release Status"/g' README.md
+ else
+ # For develop and other branches, show develop status
+ sed -i 's/?branch=main/?branch=develop/g' README.md
+ sed -i 's/alt=".*Release.*"/alt="Development Status"/g' README.md
+ fi
+
+ # Check if changes were made
+ if git diff --quiet README.md; then
+ echo "No badge updates needed"
+ else
+ echo "Badge updates made"
+ git config --local user.email "action@github.com"
+ git config --local user.name "GitHub Action"
+ git add README.md
+ git commit -m "chore: update badges for $BRANCH branch [skip ci]"
+ git push
+ fi
+ fi
+
+ - name: Generate shield badges
+ run: |
+ # Create shields.json for custom badges if needed
+ cat > shields.json << 'EOF'
+ {
+ "schemaVersion": 1,
+ "label": "release",
+ "message": "v0.1.0",
+ "color": "blue"
+ }
+ EOF
+
+ echo "Badge configuration updated"
diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml
index f2e0556..b0bb37c 100644
--- a/.github/workflows/changelog.yml
+++ b/.github/workflows/changelog.yml
@@ -1,65 +1,65 @@
name: Changelog Automation
on:
- pull_request:
- types: [opened, synchronize, reopened]
- workflow_call:
+ pull_request:
+ types: [opened, synchronize, reopened]
+ workflow_call:
permissions:
- contents: read
- pull-requests: read
+ contents: read
+ pull-requests: read
jobs:
- validate-changelog:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Check for changelog entry
- run: |
- # Skip changelog validation for release and documentation PRs
- if [[ "${{ github.head_ref }}" =~ ^(release/|chore/release|docs/) ]]; then
- echo "Skipping changelog validation for release/docs PR"
- exit 0
- fi
-
- # Check if CHANGELOG.md has been modified
- if git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -q "CHANGELOG.md"; then
- echo "✅ Changelog has been updated"
- else
- echo "❌ Please add a changelog entry to CHANGELOG.md"
- echo ""
- echo "Add your changes under the [Unreleased] section using this format:"
- echo ""
- echo "### Added"
- echo "- Description of new features"
- echo ""
- echo "### Changed"
- echo "- Description of changes"
- echo ""
- echo "### Fixed"
- echo "- Description of bug fixes"
- echo ""
- exit 1
- fi
-
- - name: Validate changelog format
- run: |
- # Basic validation of changelog format
- if ! grep -q "## \[Unreleased\]" CHANGELOG.md; then
- echo "❌ Changelog missing [Unreleased] section"
- exit 1
- fi
-
- if ! grep -q "### Added\|### Changed\|### Fixed\|### Deprecated\|### Removed\|### Security" CHANGELOG.md; then
- echo "⚠️ Consider using standard changelog sections (Added, Changed, Fixed, etc.)"
- fi
-
- echo "✅ Changelog format looks good"
+ validate-changelog:
+ runs-on: ubuntu-latest
- - name: Validate changelog links (PR/Issue/Commit)
- run: |
- chmod +x scripts/maintenance/validate-changelog-links.sh
- scripts/maintenance/validate-changelog-links.sh
\ No newline at end of file
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Check for changelog entry
+ run: |
+ # Skip changelog validation for release and documentation PRs
+ if [[ "${{ github.head_ref }}" =~ ^(release/|chore/release|docs/) ]]; then
+ echo "Skipping changelog validation for release/docs PR"
+ exit 0
+ fi
+
+ # Check if CHANGELOG.md has been modified
+ if git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -q "CHANGELOG.md"; then
+ echo "✅ Changelog has been updated"
+ else
+ echo "❌ Please add a changelog entry to CHANGELOG.md"
+ echo ""
+ echo "Add your changes under the [Unreleased] section using this format:"
+ echo ""
+ echo "### Added"
+ echo "- Description of new features"
+ echo ""
+ echo "### Changed"
+ echo "- Description of changes"
+ echo ""
+ echo "### Fixed"
+ echo "- Description of bug fixes"
+ echo ""
+ exit 1
+ fi
+
+ - name: Validate changelog format
+ run: |
+ # Basic validation of changelog format
+ if ! grep -q "## \[Unreleased\]" CHANGELOG.md; then
+ echo "❌ Changelog missing [Unreleased] section"
+ exit 1
+ fi
+
+ if ! grep -q "### Added\|### Changed\|### Fixed\|### Deprecated\|### Removed\|### Security" CHANGELOG.md; then
+ echo "⚠️ Consider using standard changelog sections (Added, Changed, Fixed, etc.)"
+ fi
+
+ echo "✅ Changelog format looks good"
+
+ - name: Validate changelog links (PR/Issue/Commit)
+ run: |
+ chmod +x scripts/maintenance/validate-changelog-links.sh
+ scripts/maintenance/validate-changelog-links.sh
diff --git a/.github/workflows/deploy-wordpress-site.yml b/.github/workflows/deploy-wordpress-site.yml
index 6550d97..c86c164 100644
--- a/.github/workflows/deploy-wordpress-site.yml
+++ b/.github/workflows/deploy-wordpress-site.yml
@@ -85,4 +85,3 @@ jobs:
else
echo "❌ Deployment to ${{ inputs.environment }} failed"
fi
-
diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml
index f225977..a303034 100644
--- a/.github/workflows/eslint.yml
+++ b/.github/workflows/eslint.yml
@@ -1,22 +1,22 @@
name: ESLint
on:
- push:
- branches: [main, develop]
- pull_request:
- branches: [main, develop]
+ push:
+ branches: [main, develop]
+ pull_request:
+ branches: [main, develop]
jobs:
- lint:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
- - name: Install dependencies
- run: npm ci
- - name: Run ESLint
- run: npx eslint '**/*.{js,ts}' --config eslint.config.mjs
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ - name: Install dependencies
+ run: npm ci
+ - name: Run ESLint
+ run: npx eslint '**/*.{js,ts}' --config eslint.config.mjs
diff --git a/.github/workflows/issue-labeler.yml b/.github/workflows/issue-labeler.yml
index 592e452..17159a2 100644
--- a/.github/workflows/issue-labeler.yml
+++ b/.github/workflows/issue-labeler.yml
@@ -1,22 +1,22 @@
-name: "Issue Labeler"
+name: 'Issue Labeler'
on:
- issues:
- types: [opened, edited, reopened]
- workflow_call:
+ issues:
+ types: [opened, edited, reopened]
+ workflow_call:
permissions:
- contents: read
- issues: write
+ contents: read
+ issues: write
jobs:
- label-issues:
- runs-on: ubuntu-latest
- steps:
- - uses: github/issue-labeler@v3.3
- with:
- repo-token: "${{ secrets.GITHUB_TOKEN }}"
- configuration-path: .github/issue-labeler.yml
- not-before: 2025-10-01T00:00:00Z
- enable-versioned-regex: 0
- include-title: 1
\ No newline at end of file
+ label-issues:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: github/issue-labeler@v3.3
+ with:
+ repo-token: '${{ secrets.GITHUB_TOKEN }}'
+ configuration-path: .github/issue-labeler.yml
+ not-before: 2025-10-01T00:00:00Z
+ enable-versioned-regex: 0
+ include-title: 1
diff --git a/.github/workflows/label-enforcement.yml b/.github/workflows/label-enforcement.yml
index 820e8f1..05de246 100644
--- a/.github/workflows/label-enforcement.yml
+++ b/.github/workflows/label-enforcement.yml
@@ -1,51 +1,51 @@
-name: "Label Standardization Enforcement"
+name: 'Label Standardization Enforcement'
on:
- schedule:
- # Run weekly on Sunday at 2:15 AM UTC
- - cron: '15 2 * * 0'
- # Allow manual runs
- workflow_dispatch:
- inputs:
- repo:
- description: 'Specific repo to sync (leave blank for all)'
- required: false
- default: ''
- dry_run:
- description: 'Dry run mode (true/false)'
- required: false
- default: 'true'
- strict_prune:
- description: 'Strictly prune non-standard labels (true/false)'
- required: false
- default: 'false'
+ schedule:
+ # Run weekly on Sunday at 2:15 AM UTC
+ - cron: '15 2 * * 0'
+ # Allow manual runs
+ workflow_dispatch:
+ inputs:
+ repo:
+ description: 'Specific repo to sync (leave blank for all)'
+ required: false
+ default: ''
+ dry_run:
+ description: 'Dry run mode (true/false)'
+ required: false
+ default: 'true'
+ strict_prune:
+ description: 'Strictly prune non-standard labels (true/false)'
+ required: false
+ default: 'false'
permissions:
- contents: read
- issues: write
- pull-requests: write
+ contents: read
+ issues: write
+ pull-requests: write
jobs:
- enforce-label-standards:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Repository
- uses: actions/checkout@v3
-
- - name: Set up GitHub CLI
- run: |
- gh --version
- env:
- GH_TOKEN: ${{ secrets.ORGANIZATION_PAT }}
-
- - name: Run Label Enforcement Script
- run: |
- chmod +x ./scripts/prune-labels.sh
- ./scripts/prune-labels.sh
- env:
- GITHUB_TOKEN: ${{ secrets.ORGANIZATION_PAT }}
- DRY_RUN: ${{ github.event.inputs.dry_run || 'true' }}
- STRICT_PRUNE: ${{ github.event.inputs.strict_prune || 'false' }}
- ONLY: ${{ github.event.inputs.repo }}
- # Protect patterns we don't want to automatically delete
- PROTECT_REGEX: '^(WIP|wontfix|duplicate|good-first-issue|help-wanted)$'
\ No newline at end of file
+ enforce-label-standards:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v3
+
+ - name: Set up GitHub CLI
+ run: |
+ gh --version
+ env:
+ GH_TOKEN: ${{ secrets.ORGANIZATION_PAT }}
+
+ - name: Run Label Enforcement Script
+ run: |
+ chmod +x ./scripts/prune-labels.sh
+ ./scripts/prune-labels.sh
+ env:
+ GITHUB_TOKEN: ${{ secrets.ORGANIZATION_PAT }}
+ DRY_RUN: ${{ github.event.inputs.dry_run || 'true' }}
+ STRICT_PRUNE: ${{ github.event.inputs.strict_prune || 'false' }}
+ ONLY: ${{ github.event.inputs.repo }}
+ # Protect patterns we don't want to automatically delete
+ PROTECT_REGEX: '^(WIP|wontfix|duplicate|good-first-issue|help-wanted)$'
diff --git a/.github/workflows/label-standardization.yml b/.github/workflows/label-standardization.yml
index 4af756e..71ca4ce 100644
--- a/.github/workflows/label-standardization.yml
+++ b/.github/workflows/label-standardization.yml
@@ -1,53 +1,53 @@
name: Label Standardization
on:
- # Schedule to run periodically to enforce standards across repositories
- schedule:
- - cron: '0 1 * * 1' # Run at 1 AM every Monday
-
- # Manual trigger
- workflow_dispatch:
- inputs:
- dry_run:
- description: 'Run in dry-run mode (no changes applied)'
- type: boolean
- default: false
- verbose:
- description: 'Verbose output'
- type: boolean
- default: true
+ # Schedule to run periodically to enforce standards across repositories
+ schedule:
+ - cron: '0 1 * * 1' # Run at 1 AM every Monday
+
+ # Manual trigger
+ workflow_dispatch:
+ inputs:
+ dry_run:
+ description: 'Run in dry-run mode (no changes applied)'
+ type: boolean
+ default: false
+ verbose:
+ description: 'Verbose output'
+ type: boolean
+ default: true
jobs:
- standardize-labels:
- runs-on: ubuntu-latest
- name: Standardize repository labels
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v3
-
- - name: Setup Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '16'
-
- - name: Install dependencies
- run: |
- npm install @octokit/rest @actions/core @actions/github
-
- - name: Run label standardization agent
- run: node .github/agents/label-standardization-agent.js
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- DRY_RUN: ${{ github.event.inputs.dry_run || false }}
- VERBOSE: ${{ github.event.inputs.verbose || true }}
-
- - name: Create summary
- run: |
- echo '## Label Standardization Results' >> $GITHUB_STEP_SUMMARY
- echo '' >> $GITHUB_STEP_SUMMARY
- echo 'Standardized labels according to organization-wide conventions:' >> $GITHUB_STEP_SUMMARY
- echo '- Non-standard language labels (js, php, etc.) → lang:* prefix' >> $GITHUB_STEP_SUMMARY
- echo '- Non-standard area labels (documentation, ci, etc.) → area:* prefix' >> $GITHUB_STEP_SUMMARY
- echo '' >> $GITHUB_STEP_SUMMARY
- echo 'See job logs for detailed results.' >> $GITHUB_STEP_SUMMARY
\ No newline at end of file
+ standardize-labels:
+ runs-on: ubuntu-latest
+ name: Standardize repository labels
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '16'
+
+ - name: Install dependencies
+ run: |
+ npm install @octokit/rest @actions/core @actions/github
+
+ - name: Run label standardization agent
+ run: node .github/agents/label-standardization-agent.js
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ DRY_RUN: ${{ github.event.inputs.dry_run || false }}
+ VERBOSE: ${{ github.event.inputs.verbose || true }}
+
+ - name: Create summary
+ run: |
+ echo '## Label Standardization Results' >> $GITHUB_STEP_SUMMARY
+ echo '' >> $GITHUB_STEP_SUMMARY
+ echo 'Standardized labels according to organization-wide conventions:' >> $GITHUB_STEP_SUMMARY
+ echo '- Non-standard language labels (js, php, etc.) → lang:* prefix' >> $GITHUB_STEP_SUMMARY
+ echo '- Non-standard area labels (documentation, ci, etc.) → area:* prefix' >> $GITHUB_STEP_SUMMARY
+ echo '' >> $GITHUB_STEP_SUMMARY
+ echo 'See job logs for detailed results.' >> $GITHUB_STEP_SUMMARY
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index dd4cc5d..8d89cc4 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -1,20 +1,20 @@
-name: "Pull Request Labeler"
+name: 'Pull Request Labeler'
on:
- pull_request:
- types: [opened, synchronize, reopened]
- workflow_call:
+ pull_request:
+ types: [opened, synchronize, reopened]
+ workflow_call:
permissions:
- contents: read
- pull-requests: write
+ contents: read
+ pull-requests: write
jobs:
- label:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/labeler@v4
- with:
- repo-token: "${{ secrets.GITHUB_TOKEN }}"
- configuration-path: .github/labeler.yml
- sync-labels: true
\ No newline at end of file
+ label:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/labeler@v4
+ with:
+ repo-token: '${{ secrets.GITHUB_TOKEN }}'
+ configuration-path: .github/labeler.yml
+ sync-labels: true
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index e3d483b..17913c7 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -1,105 +1,105 @@
name: Lint Code
on:
- push:
- branches: [ main, develop ]
- pull_request:
- branches: [ main, develop ]
- workflow_call:
+ push:
+ branches: [main, develop]
+ pull_request:
+ branches: [main, develop]
+ workflow_call:
permissions:
- contents: read
+ contents: read
jobs:
- shellcheck:
- name: ShellCheck
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Install ShellCheck
- run: |
- sudo apt-get update
- sudo apt-get install -y shellcheck
-
- - name: Run ShellCheck on scripts
- run: |
- echo "Running ShellCheck on shell scripts..."
- find scripts/ -name "*.sh" -type f | while read -r script; do
- echo "Checking: $script"
- shellcheck "$script" || exit 1
- done
-
- # Also check any shell scripts in root
- find . -maxdepth 1 -name "*.sh" -type f | while read -r script; do
- echo "Checking: $script"
- shellcheck "$script" || exit 1
- done
-
- - name: Run ShellCheck on test scripts
- run: |
- echo "Running ShellCheck on test scripts..."
- find tests/ -name "*.sh" -type f | while read -r script; do
- echo "Checking: $script"
- shellcheck "$script" || exit 1
- done
-
- markdown:
- name: Markdown Lint
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '18'
-
- - name: Install markdownlint-cli
- run: npm install -g markdownlint-cli
-
- - name: Run markdownlint
- run: |
- # Create markdownlint config if it doesn't exist
- if [ ! -f ".markdownlint.json" ]; then
- cat > .markdownlint.json << 'EOF'
- {
- "default": true,
- "MD013": false,
- "MD033": false,
- "MD041": false
- }
- EOF
- fi
-
- markdownlint README.md CHANGELOG.md CONTRIBUTING.md CODE_OF_CONDUCT.md || true
- echo "Markdown linting completed"
-
- validate-syntax:
- name: Validate Script Syntax
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Validate shell script syntax
- run: |
- echo "Validating shell script syntax..."
- for script in scripts/*.sh; do
- if [ -f "$script" ]; then
- echo "Validating syntax: $script"
- bash -n "$script"
- fi
- done
-
- for script in tests/*.sh; do
- if [ -f "$script" ]; then
- echo "Validating syntax: $script"
- bash -n "$script"
- fi
- done
\ No newline at end of file
+ shellcheck:
+ name: ShellCheck
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Install ShellCheck
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y shellcheck
+
+ - name: Run ShellCheck on scripts
+ run: |
+ echo "Running ShellCheck on shell scripts..."
+ find scripts/ -name "*.sh" -type f | while read -r script; do
+ echo "Checking: $script"
+ shellcheck "$script" || exit 1
+ done
+
+ # Also check any shell scripts in root
+ find . -maxdepth 1 -name "*.sh" -type f | while read -r script; do
+ echo "Checking: $script"
+ shellcheck "$script" || exit 1
+ done
+
+ - name: Run ShellCheck on test scripts
+ run: |
+ echo "Running ShellCheck on test scripts..."
+ find tests/ -name "*.sh" -type f | while read -r script; do
+ echo "Checking: $script"
+ shellcheck "$script" || exit 1
+ done
+
+ markdown:
+ name: Markdown Lint
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+
+ - name: Install markdownlint-cli
+ run: npm install -g markdownlint-cli
+
+ - name: Run markdownlint
+ run: |
+ # Create markdownlint config if it doesn't exist
+ if [ ! -f ".markdownlint.json" ]; then
+ cat > .markdownlint.json << 'EOF'
+ {
+ "default": true,
+ "MD013": false,
+ "MD033": false,
+ "MD041": false
+ }
+ EOF
+ fi
+
+ markdownlint README.md CHANGELOG.md CONTRIBUTING.md CODE_OF_CONDUCT.md || true
+ echo "Markdown linting completed"
+
+ validate-syntax:
+ name: Validate Script Syntax
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Validate shell script syntax
+ run: |
+ echo "Validating shell script syntax..."
+ for script in scripts/*.sh; do
+ if [ -f "$script" ]; then
+ echo "Validating syntax: $script"
+ bash -n "$script"
+ fi
+ done
+
+ for script in tests/*.sh; do
+ if [ -f "$script" ]; then
+ echo "Validating syntax: $script"
+ bash -n "$script"
+ fi
+ done
diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml
index 81329eb..7d7ef56 100644
--- a/.github/workflows/markdownlint.yml
+++ b/.github/workflows/markdownlint.yml
@@ -1,28 +1,28 @@
name: Markdown Lint
on:
- push:
- branches:
- - main
- - develop
- - 'release/**'
- pull_request:
- branches:
- - main
- - develop
- - 'release/**'
+ push:
+ branches:
+ - main
+ - develop
+ - 'release/**'
+ pull_request:
+ branches:
+ - main
+ - develop
+ - 'release/**'
jobs:
- markdownlint:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
- - name: Install dependencies
- run: npm ci
- - name: Run markdownlint
- run: npm run lint:md
+ markdownlint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ - name: Install dependencies
+ run: npm ci
+ - name: Run markdownlint
+ run: npm run lint:md
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6769ac8..aebec58 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,187 +1,187 @@
name: Release Automation
on:
- push:
- branches: [ main ]
- workflow_dispatch:
- inputs:
- version:
- description: 'Version to release (e.g., v0.1.0)'
- required: false
- type: string
+ push:
+ branches: [main]
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Version to release (e.g., v0.1.0)'
+ required: false
+ type: string
permissions:
- contents: write
- pull-requests: write
- issues: read
+ contents: write
+ pull-requests: write
+ issues: read
jobs:
- release:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
- with:
- fetch-depth: 0
- token: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '18'
-
- - name: Install dependencies
- run: |
- npm install -g auto-changelog
- sudo apt-get update && sudo apt-get install -y jq
-
- - name: Determine version
- id: version
- run: |
- if [ -n "${{ inputs.version }}" ]; then
- VERSION="${{ inputs.version }}"
- elif [ -f "package.json" ]; then
- VERSION="v$(jq -r '.version' package.json)"
- elif [ -f "VERSION" ]; then
- VERSION="v$(cat VERSION)"
- else
- # Increment patch version from latest tag
- LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
- IFS='.' read -ra ADDR <<< "${LATEST_TAG#v}"
- PATCH=$((${ADDR[2]} + 1))
- VERSION="v${ADDR[0]}.${ADDR[1]}.${PATCH}"
- fi
- echo "version=${VERSION}" >> $GITHUB_OUTPUT
- echo "Release version: ${VERSION}"
-
- - name: Update version files
- run: |
- VERSION="${{ steps.version.outputs.version }}"
- VERSION_NO_V="${VERSION#v}"
-
- # Update package.json if it exists
- if [ -f "package.json" ]; then
- jq --arg version "$VERSION_NO_V" '.version = $version' package.json > tmp.json && mv tmp.json package.json
- fi
-
- # Create/update VERSION file
- echo "$VERSION_NO_V" > VERSION
-
- # Update README badges to point to main branch for release
- if [ -f "README.md" ]; then
- sed -i 's/?branch=develop/?branch=main/g' README.md
- fi
-
- - name: Generate changelog
- run: |
- # Generate changelog using auto-changelog
- auto-changelog --template keepachangelog --unreleased-only --commit-limit false --hide-credit
-
- # Update changelog header
- VERSION="${{ steps.version.outputs.version }}"
- DATE=$(date +%Y-%m-%d)
-
- # Create proper changelog format
- if [ -f "CHANGELOG.md" ]; then
- # Backup existing changelog
- cp CHANGELOG.md CHANGELOG.md.bak
-
- # Create new changelog with proper format
- cat > CHANGELOG.md << 'CHANGELOG_EOF'
- # Changelog
-
- All notable changes to this project will be documented in this file.
-
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
- ## [0.1.0] - 2024-10-11
-
- ### Added
- - Initial release of LightSpeed WP automation scripts repository
- - GitHub Projects field management scripts and fixtures
- - Comprehensive documentation and governance files
- - Automated testing infrastructure with Bats
- - GitHub Actions workflows for CI/CD
- - Shell script linting and validation
-
- ### Changed
- - Restructured repository for better organization
- - Updated documentation for release process
-
- ### Fixed
- - Resolved GitHub Copilot API failures
- - Fixed test path mismatches
- - Corrected workflow configurations
-
- CHANGELOG_EOF
-
- # Replace version placeholder with actual version
- sed -i "s/## \[0\.1\.0\]/## [${VERSION#v}]/g" CHANGELOG.md
- sed -i "s/2024-10-11/${DATE}/g" CHANGELOG.md
- fi
-
- - name: Commit version updates
- run: |
- git config --local user.email "action@github.com"
- git config --local user.name "GitHub Action"
-
- VERSION="${{ steps.version.outputs.version }}"
-
- git add .
- git diff --staged --quiet || git commit -m "chore(release): ${VERSION}"
-
- - name: Create and push tag
- run: |
- VERSION="${{ steps.version.outputs.version }}"
-
- git tag -a "${VERSION}" -m "Release ${VERSION}"
- git push origin main --tags
-
- - name: Extract release notes
- id: release_notes
- run: |
- VERSION="${{ steps.version.outputs.version }}"
-
- # Extract release notes from changelog
- if [ -f "CHANGELOG.md" ]; then
- # Get content between the first two ## headers (current version)
- NOTES=$(sed -n '/^## \[/,/^## \[/p' CHANGELOG.md | sed '$d' | tail -n +2)
-
- if [ -z "$NOTES" ]; then
- NOTES="Release ${VERSION}"
- fi
- else
- NOTES="Release ${VERSION}"
- fi
-
- # Save to file for GitHub release
- echo "$NOTES" > release-notes.md
- echo "Release notes prepared"
-
- - name: Create GitHub Release
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: ${{ steps.version.outputs.version }}
- release_name: ${{ steps.version.outputs.version }}
- body_path: release-notes.md
- draft: false
- prerelease: false
-
- - name: Update badges after release
- run: |
- # Switch badges back to develop branch for ongoing development
- if [ -f "README.md" ]; then
- git checkout develop 2>/dev/null || git checkout -b develop
- git pull origin develop 2>/dev/null || true
-
- # Update badges to point back to develop
- sed -i 's/?branch=main/?branch=develop/g' README.md
-
- git add README.md
- git diff --staged --quiet || git commit -m "chore: update badges to track develop branch [skip ci]"
- git push origin develop 2>/dev/null || echo "Could not push to develop branch"
- fi
\ No newline at end of file
+ release:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+
+ - name: Install dependencies
+ run: |
+ npm install -g auto-changelog
+ sudo apt-get update && sudo apt-get install -y jq
+
+ - name: Determine version
+ id: version
+ run: |
+ if [ -n "${{ inputs.version }}" ]; then
+ VERSION="${{ inputs.version }}"
+ elif [ -f "package.json" ]; then
+ VERSION="v$(jq -r '.version' package.json)"
+ elif [ -f "VERSION" ]; then
+ VERSION="v$(cat VERSION)"
+ else
+ # Increment patch version from latest tag
+ LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
+ IFS='.' read -ra ADDR <<< "${LATEST_TAG#v}"
+ PATCH=$((${ADDR[2]} + 1))
+ VERSION="v${ADDR[0]}.${ADDR[1]}.${PATCH}"
+ fi
+ echo "version=${VERSION}" >> $GITHUB_OUTPUT
+ echo "Release version: ${VERSION}"
+
+ - name: Update version files
+ run: |
+ VERSION="${{ steps.version.outputs.version }}"
+ VERSION_NO_V="${VERSION#v}"
+
+ # Update package.json if it exists
+ if [ -f "package.json" ]; then
+ jq --arg version "$VERSION_NO_V" '.version = $version' package.json > tmp.json && mv tmp.json package.json
+ fi
+
+ # Create/update VERSION file
+ echo "$VERSION_NO_V" > VERSION
+
+ # Update README badges to point to main branch for release
+ if [ -f "README.md" ]; then
+ sed -i 's/?branch=develop/?branch=main/g' README.md
+ fi
+
+ - name: Generate changelog
+ run: |
+ # Generate changelog using auto-changelog
+ auto-changelog --template keepachangelog --unreleased-only --commit-limit false --hide-credit
+
+ # Update changelog header
+ VERSION="${{ steps.version.outputs.version }}"
+ DATE=$(date +%Y-%m-%d)
+
+ # Create proper changelog format
+ if [ -f "CHANGELOG.md" ]; then
+ # Backup existing changelog
+ cp CHANGELOG.md CHANGELOG.md.bak
+
+ # Create new changelog with proper format
+ cat > CHANGELOG.md << 'CHANGELOG_EOF'
+ # Changelog
+
+ All notable changes to this project will be documented in this file.
+
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+ ## [0.1.0] - 2024-10-11
+
+ ### Added
+ - Initial release of LightSpeed WP automation scripts repository
+ - GitHub Projects field management scripts and fixtures
+ - Comprehensive documentation and governance files
+ - Automated testing infrastructure with Bats
+ - GitHub Actions workflows for CI/CD
+ - Shell script linting and validation
+
+ ### Changed
+ - Restructured repository for better organization
+ - Updated documentation for release process
+
+ ### Fixed
+ - Resolved GitHub Copilot API failures
+ - Fixed test path mismatches
+ - Corrected workflow configurations
+
+ CHANGELOG_EOF
+
+ # Replace version placeholder with actual version
+ sed -i "s/## \[0\.1\.0\]/## [${VERSION#v}]/g" CHANGELOG.md
+ sed -i "s/2024-10-11/${DATE}/g" CHANGELOG.md
+ fi
+
+ - name: Commit version updates
+ run: |
+ git config --local user.email "action@github.com"
+ git config --local user.name "GitHub Action"
+
+ VERSION="${{ steps.version.outputs.version }}"
+
+ git add .
+ git diff --staged --quiet || git commit -m "chore(release): ${VERSION}"
+
+ - name: Create and push tag
+ run: |
+ VERSION="${{ steps.version.outputs.version }}"
+
+ git tag -a "${VERSION}" -m "Release ${VERSION}"
+ git push origin main --tags
+
+ - name: Extract release notes
+ id: release_notes
+ run: |
+ VERSION="${{ steps.version.outputs.version }}"
+
+ # Extract release notes from changelog
+ if [ -f "CHANGELOG.md" ]; then
+ # Get content between the first two ## headers (current version)
+ NOTES=$(sed -n '/^## \[/,/^## \[/p' CHANGELOG.md | sed '$d' | tail -n +2)
+
+ if [ -z "$NOTES" ]; then
+ NOTES="Release ${VERSION}"
+ fi
+ else
+ NOTES="Release ${VERSION}"
+ fi
+
+ # Save to file for GitHub release
+ echo "$NOTES" > release-notes.md
+ echo "Release notes prepared"
+
+ - name: Create GitHub Release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ steps.version.outputs.version }}
+ release_name: ${{ steps.version.outputs.version }}
+ body_path: release-notes.md
+ draft: false
+ prerelease: false
+
+ - name: Update badges after release
+ run: |
+ # Switch badges back to develop branch for ongoing development
+ if [ -f "README.md" ]; then
+ git checkout develop 2>/dev/null || git checkout -b develop
+ git pull origin develop 2>/dev/null || true
+
+ # Update badges to point back to develop
+ sed -i 's/?branch=main/?branch=develop/g' README.md
+
+ git add README.md
+ git diff --staged --quiet || git commit -m "chore: update badges to track develop branch [skip ci]"
+ git push origin develop 2>/dev/null || echo "Could not push to develop branch"
+ fi
diff --git a/.github/workflows/run-shell-tests.yml b/.github/workflows/run-shell-tests.yml
index de8ec5a..9f3e4cb 100644
--- a/.github/workflows/run-shell-tests.yml
+++ b/.github/workflows/run-shell-tests.yml
@@ -1,20 +1,20 @@
name: Run Shell Script Tests
on:
- push:
- branches: [ develop, main ]
- pull_request:
- branches: [ develop, main ]
+ push:
+ branches: [develop, main]
+ pull_request:
+ branches: [develop, main]
jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Set up Bats
- uses: bats-core/bats-action@v1
- - name: Run Bats tests
- run: |
- bats __tests__/*.bats
- bats tests/*.bats
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up Bats
+ uses: bats-core/bats-action@v1
+ - name: Run Bats tests
+ run: |
+ bats __tests__/*.bats
+ bats tests/*.bats
diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml
index 94563c8..6eb0090 100644
--- a/.github/workflows/shellcheck.yml
+++ b/.github/workflows/shellcheck.yml
@@ -1,24 +1,24 @@
name: Shell Script Lint
on:
- push:
- paths:
- - 'scripts/**/*.sh'
- pull_request:
- paths:
- - 'scripts/**/*.sh'
+ push:
+ paths:
+ - 'scripts/**/*.sh'
+ pull_request:
+ paths:
+ - 'scripts/**/*.sh'
jobs:
- shellcheck:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
- - name: Install dependencies
- run: npm ci
- - name: Run ShellCheck on all scripts
- run: npm run lint:sh
+ shellcheck:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ - name: Install dependencies
+ run: npm ci
+ - name: Run ShellCheck on all scripts
+ run: npm run lint:sh
diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml
index 6532f27..42294c4 100644
--- a/.github/workflows/test-all.yml
+++ b/.github/workflows/test-all.yml
@@ -1,61 +1,61 @@
name: Test All Scripts and Automation
on:
- push:
- branches:
- - develop
- - main
- pull_request:
- branches:
- - develop
- - main
- workflow_dispatch:
+ push:
+ branches:
+ - develop
+ - main
+ pull_request:
+ branches:
+ - develop
+ - main
+ workflow_dispatch:
jobs:
- bats-tests:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Install Bats
- run: |
- sudo apt-get update
- sudo apt-get install -y bats
- - name: Make scripts executable
- run: |
- find scripts -name "*.sh" -exec chmod +x {} \;
- - name: Run Bats tests (tests/)
- run: |
- bats tests/test-*.bats
- - name: Run Bats tests (__tests__/)
- run: |
- bats __tests__/*.bats || true
- - name: Test dry-run scripts
- run: |
- for script in tests/dry-run-*.sh; do
- if [ -f "$script" ]; then
- echo "Running dry-run: $script"
- ./$script
- fi
- done
- - name: Validate script syntax
- run: |
- for script in scripts/*.sh; do
- if [ -f "$script" ]; then
- echo "Checking syntax: $script"
- bash -n "$script"
- fi
- done
- playwright-tests:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
- - name: Install dependencies
- run: npm ci
- - name: Run Playwright tests
- run: npx playwright test
+ bats-tests:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Install Bats
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y bats
+ - name: Make scripts executable
+ run: |
+ find scripts -name "*.sh" -exec chmod +x {} \;
+ - name: Run Bats tests (tests/)
+ run: |
+ bats tests/test-*.bats
+ - name: Run Bats tests (__tests__/)
+ run: |
+ bats __tests__/*.bats || true
+ - name: Test dry-run scripts
+ run: |
+ for script in tests/dry-run-*.sh; do
+ if [ -f "$script" ]; then
+ echo "Running dry-run: $script"
+ ./$script
+ fi
+ done
+ - name: Validate script syntax
+ run: |
+ for script in scripts/*.sh; do
+ if [ -f "$script" ]; then
+ echo "Checking syntax: $script"
+ bash -n "$script"
+ fi
+ done
+ playwright-tests:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ - name: Install dependencies
+ run: npm ci
+ - name: Run Playwright tests
+ run: npx playwright test
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index dce0956..e4f5d98 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -1,118 +1,118 @@
name: Run Tests
on:
- push:
- branches: [ main, develop ]
- pull_request:
- branches: [ main, develop ]
- workflow_call:
- inputs:
- test-pattern:
- description: 'Pattern for test files to run'
- required: false
- type: string
- default: 'test-*.bats'
+ push:
+ branches: [main, develop]
+ pull_request:
+ branches: [main, develop]
+ workflow_call:
+ inputs:
+ test-pattern:
+ description: 'Pattern for test files to run'
+ required: false
+ type: string
+ default: 'test-*.bats'
permissions:
- contents: read
+ contents: read
jobs:
- test:
- name: Bats Tests
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Install Bats
- run: |
- sudo apt-get update
- sudo apt-get install -y bats
-
- - name: Install GitHub CLI (for some tests)
- run: |
- curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
- echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
- sudo apt update
- sudo apt install gh
-
- - name: Make scripts executable
- run: |
- find scripts/ -name "*.sh" -exec chmod +x {} \;
- find tests/ -name "*.sh" -exec chmod +x {} \;
-
- - name: Run Bats tests
- run: |
- echo "Running tests matching pattern: ${{ inputs.test-pattern || 'test-*.bats' }}"
-
- # Run tests and capture output
- if bats tests/${{ inputs.test-pattern || 'test-*.bats' }}; then
- echo "✅ All tests passed"
- else
- echo "❌ Some tests failed"
- exit 1
- fi
-
- - name: Test dry-run scripts
- run: |
- echo "Testing dry-run scripts..."
- for script in tests/dry-run-*.sh; do
- if [ -f "$script" ]; then
- echo "Running dry-run: $script"
- ./"$script" || echo "⚠️ Dry-run script $script failed or returned non-zero"
- fi
- done
-
- - name: Test script help functionality
- run: |
- echo "Testing script help functionality..."
- for script in scripts/*.sh; do
- if [ -f "$script" ] && [ -x "$script" ]; then
- echo "Testing help for: $script"
- if ./"$script" --help >/dev/null 2>&1 || ./"$script" -h >/dev/null 2>&1; then
- echo "✅ $script supports help"
- else
- echo "⚠️ $script does not support help flags"
- fi
- fi
- done
-
- integration:
- name: Integration Tests
- runs-on: ubuntu-latest
- needs: test
- if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Install dependencies
- run: |
- sudo apt-get update
- sudo apt-get install -y bats jq
-
- - name: Validate workflows
- run: |
- echo "Validating GitHub Actions workflows..."
- for workflow in .github/workflows/*.yml; do
- if [ -f "$workflow" ]; then
- echo "Validating: $workflow"
- # Basic YAML syntax validation
- python3 -c "import yaml; yaml.safe_load(open('$workflow'))" || exit 1
- fi
- done
-
- - name: Test script integration
- run: |
- echo "Running integration tests..."
-
- # Test that scripts can be sourced without errors
- for script in scripts/*.sh; do
- if [ -f "$script" ]; then
- echo "Testing source compatibility: $script"
- # Try to source the script to check for syntax errors
- bash -c "source '$script'; echo 'Source test passed'" >/dev/null 2>&1 || echo "⚠️ Script $script may have sourcing issues"
- fi
- done
\ No newline at end of file
+ test:
+ name: Bats Tests
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Install Bats
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y bats
+
+ - name: Install GitHub CLI (for some tests)
+ run: |
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
+ sudo apt update
+ sudo apt install gh
+
+ - name: Make scripts executable
+ run: |
+ find scripts/ -name "*.sh" -exec chmod +x {} \;
+ find tests/ -name "*.sh" -exec chmod +x {} \;
+
+ - name: Run Bats tests
+ run: |
+ echo "Running tests matching pattern: ${{ inputs.test-pattern || 'test-*.bats' }}"
+
+ # Run tests and capture output
+ if bats tests/${{ inputs.test-pattern || 'test-*.bats' }}; then
+ echo "✅ All tests passed"
+ else
+ echo "❌ Some tests failed"
+ exit 1
+ fi
+
+ - name: Test dry-run scripts
+ run: |
+ echo "Testing dry-run scripts..."
+ for script in tests/dry-run-*.sh; do
+ if [ -f "$script" ]; then
+ echo "Running dry-run: $script"
+ ./"$script" || echo "⚠️ Dry-run script $script failed or returned non-zero"
+ fi
+ done
+
+ - name: Test script help functionality
+ run: |
+ echo "Testing script help functionality..."
+ for script in scripts/*.sh; do
+ if [ -f "$script" ] && [ -x "$script" ]; then
+ echo "Testing help for: $script"
+ if ./"$script" --help >/dev/null 2>&1 || ./"$script" -h >/dev/null 2>&1; then
+ echo "✅ $script supports help"
+ else
+ echo "⚠️ $script does not support help flags"
+ fi
+ fi
+ done
+
+ integration:
+ name: Integration Tests
+ runs-on: ubuntu-latest
+ needs: test
+ if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y bats jq
+
+ - name: Validate workflows
+ run: |
+ echo "Validating GitHub Actions workflows..."
+ for workflow in .github/workflows/*.yml; do
+ if [ -f "$workflow" ]; then
+ echo "Validating: $workflow"
+ # Basic YAML syntax validation
+ python3 -c "import yaml; yaml.safe_load(open('$workflow'))" || exit 1
+ fi
+ done
+
+ - name: Test script integration
+ run: |
+ echo "Running integration tests..."
+
+ # Test that scripts can be sourced without errors
+ for script in scripts/*.sh; do
+ if [ -f "$script" ]; then
+ echo "Testing source compatibility: $script"
+ # Try to source the script to check for syntax errors
+ bash -c "source '$script'; echo 'Source test passed'" >/dev/null 2>&1 || echo "⚠️ Script $script may have sourcing issues"
+ fi
+ done
diff --git a/.github/workflows/update-readme-changelog.yml b/.github/workflows/update-readme-changelog.yml
index 3fa56c3..16a33b6 100644
--- a/.github/workflows/update-readme-changelog.yml
+++ b/.github/workflows/update-readme-changelog.yml
@@ -1,33 +1,33 @@
name: Update README and Changelog
on:
- pull_request:
- types:
- - closed
+ pull_request:
+ types:
+ - closed
jobs:
- update-docs:
- if: github.event.pull_request.merged == true
- runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '18'
- - name: Install dependencies
- run: npm ci
- - name: Update contributors table in README
- run: npx all-contributors generate
- - name: Update CHANGELOG.md
- run: npx auto-changelog -p --commit-limit 20 --output CHANGELOG.md
- - name: Commit and push changes
- run: |
- git config --global user.name 'github-actions[bot]'
- git config --global user.email 'github-actions[bot]@users.noreply.github.com'
- git add README.md CHANGELOG.md
- git commit -m "docs: update README and changelog [skip ci]" || echo "No changes to commit"
- git push
+ update-docs:
+ if: github.event.pull_request.merged == true
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+ - name: Install dependencies
+ run: npm ci
+ - name: Update contributors table in README
+ run: npx all-contributors generate
+ - name: Update CHANGELOG.md
+ run: npx auto-changelog -p --commit-limit 20 --output CHANGELOG.md
+ - name: Commit and push changes
+ run: |
+ git config --global user.name 'github-actions[bot]'
+ git config --global user.email 'github-actions[bot]@users.noreply.github.com'
+ git add README.md CHANGELOG.md
+ git commit -m "docs: update README and changelog [skip ci]" || echo "No changes to commit"
+ git push
diff --git a/.markdownlint.json b/.markdownlint.json
index 98a8cdd..155b8a2 100644
--- a/.markdownlint.json
+++ b/.markdownlint.json
@@ -1,5 +1,5 @@
{
- "default": true,
- "MD013": false, // Disable line length rule
- "MD033": false // Allow inline HTML
+ "default": true,
+ "MD013": false, // Disable line length rule
+ "MD033": false // Allow inline HTML
}
diff --git a/.prettierignore b/.prettierignore
index 7379f1a..7dd8a4d 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,3 +4,6 @@ build/
playwright-report/
coverage/
*.log
+*.yml
+*.yaml
+# Prettier has issues with YAML formatting in workflows
diff --git a/AGENTS.md b/AGENTS.md
index 01fbc26..b3cc3e1 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -5,6 +5,7 @@ This repository contains AI and automation agents to assist with GitHub project
## Purpose
This file serves as a registry for agent implementations in the repository, including:
+
- Custom GitHub Copilot agents
- Issue management automation agents
- Workflow automation agents
@@ -21,16 +22,16 @@ This file serves as a registry for agent implementations in the repository, incl
- **Usage:** Automatically runs when issues are opened or reopened
- **Standards:** Aligned with org-wide-issue-types-v1-9.md and project templates
- **Functionality:**
- - Analyzes issue template metadata, content, title, and labels
- - Determines appropriate issue type using the standardized types (Bug, Feature, Task, Epic, Story, etc.)
- - Updates GitHub ProjectsV2 issue type field
- - Adds issues to relevant projects if not already added
+ - Analyzes issue template metadata, content, title, and labels
+ - Determines appropriate issue type using the standardized types (Bug, Feature, Task, Epic, Story, etc.)
+ - Updates GitHub ProjectsV2 issue type field
+ - Adds issues to relevant projects if not already added
- **Definition of Done:**
- - Correctly identifies all standard issue types per org-wide standards
- - Prioritizes template metadata over content analysis
- - Documents behavior in .github/docs/auto-issue-type.md
- - Integrates with PR and issue templates
- - Follows the standard branch naming conventions when modified
+ - Correctly identifies all standard issue types per org-wide standards
+ - Prioritizes template metadata over content analysis
+ - Documents behavior in .github/docs/auto-issue-type.md
+ - Integrates with PR and issue templates
+ - Follows the standard branch naming conventions when modified
### label-standardization-agent
@@ -40,16 +41,16 @@ This file serves as a registry for agent implementations in the repository, incl
- **Usage:** Runs weekly and can be triggered manually via workflow_dispatch
- **Standards:** Aligned with org-wide-labels-v1-11.md and standard prefixes
- **Functionality:**
- - Detects non-standard labels with standard equivalents (e.g., "php" vs "lang:php")
- - Migrates issues/PRs from non-standard to standard labels
- - Removes redundant non-standard labels after migration
- - Supports dry-run mode for testing before applying changes
+ - Detects non-standard labels with standard equivalents (e.g., "php" vs "lang:php")
+ - Migrates issues/PRs from non-standard to standard labels
+ - Removes redundant non-standard labels after migration
+ - Supports dry-run mode for testing before applying changes
- **Definition of Done:**
- - Successfully standardizes all labels according to organization conventions
- - Properly migrates issues/PRs to use standard labels
- - Provides clear logging and summary reports
- - Integrates with existing label workflows
- - Documents behavior in .github/docs/label-standardization.md
+ - Successfully standardizes all labels according to organization conventions
+ - Properly migrates issues/PRs to use standard labels
+ - Provides clear logging and summary reports
+ - Integrates with existing label workflows
+ - Documents behavior in .github/docs/label-standardization.md
## Additional Automation Logic
@@ -67,16 +68,17 @@ Additional agent-related logic is managed via:
1. Create a new folder: `./github/agents/`
2. Add agent implementation files (e.g., `copilot-agent.js`, `review-agent.py`)
3. Document each agent in this file:
- - Name
- - Purpose
- - Integration points
- - Usage instructions
- - Maintenance notes
+ - Name
+ - Purpose
+ - Integration points
+ - Usage instructions
+ - Maintenance notes
## Example Entry (for future agents)
```markdown
### copilot-swe-agent
+
- **Purpose:** Automates code suggestions and review for SWE tasks
- **Location:** .github/agents/copilot-swe-agent.js
- **Integration:** GitHub Actions, Copilot Chat, CodeRabbit
diff --git a/CHANGELOG.md b/CHANGELOG.md
index de561e8..f3b54c9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,70 +1,11 @@
-# Changelog
+### Changelog
-All notable changes to this project will be documented in this file.
+All notable changes to this project will be documented in this file. Dates are displayed in UTC.
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
-## [Unreleased]
+#### 0.1.0
-### Added
-- Comprehensive CI/CD workflow automation
-- Badge automation for branch-specific status tracking
-- Enhanced test coverage with multiple test suites
-- ShellCheck integration for code quality
-
-### Fixed
-- Script shebang compatibility across different systems
-- Test path resolution issues
-
-## [0.1.0] - 2024-10-11
-
-### Added
-- Initial release of LightSpeed WP automation scripts repository
-- GitHub Projects field management scripts with comprehensive testing ([#9](https://github.com/lightspeedwp/scripts/pull/9))
-- Automated testing infrastructure using Bats framework
-- Release workflow with automated changelog generation
-- Comprehensive documentation including CONTRIBUTING.md, CODE_OF_CONDUCT.md
-- GitHub Actions workflows for testing and deployment
-- Shell script linting and validation tools
-- Project field management fixtures and examples
-- Label synchronization and pruning utilities
-
-### Changed
-- Restructured repository from simple scripts to comprehensive automation hub ([#1](https://github.com/lightspeedwp/scripts/pull/1))
-- Updated documentation structure and governance files ([#6](https://github.com/lightspeedwp/scripts/pull/6))
-- Enhanced GitHub Copilot prompt documentation ([#3](https://github.com/lightspeedwp/scripts/pull/3))
-
-### Fixed
-- Resolved GitHub Copilot API failures by restructuring prompts.md ([#7](https://github.com/lightspeedwp/scripts/pull/7))
-- Fixed test path mismatches and test infrastructure issues
-- Corrected workflow configurations and badge references
-
-### Infrastructure
-- [WIP] Add GitHub Projects field management scripts and fixtures [`#8`](https://github.com/lightspeedwp/scripts/pull/8)
-- fix: resolve GitHub Copilot API failures by restructuring prompts.md and cleaning up outdated docs [`#7`](https://github.com/lightspeedwp/scripts/pull/7)
-- [WIP] Update documentation and governance files for release v0.1.0 [`#6`](https://github.com/lightspeedwp/scripts/pull/6)
-- [WIP] Update documentation and governance files with Copilot instructions [`#3`](https://github.com/lightspeedwp/scripts/pull/3)
-- feat: Add scripts for GitHub project management and label synchronization [`#4`](https://github.com/lightspeedwp/scripts/pull/4)
-- Create comprehensive LightSpeed Automation & Governance Handbook [`#2`](https://github.com/lightspeedwp/scripts/pull/2)
-- Transform scripts repository into comprehensive lightspeedwp-automation hub [`#1`](https://github.com/lightspeedwp/scripts/pull/1)
-- Add GitHub workflow docs and project scripts [`40c5130`](https://github.com/lightspeedwp/scripts/commit/40c5130473f038928b7bfca2261e54378db24bd2)
-- Fix prompts.md AI interpretation issues and remove outdated github-workflow docs [`8767b70`](https://github.com/lightspeedwp/scripts/commit/8767b702676127bde4e72a05cb8412d31d12e9f5)
-- Changes before error encountered [`465c73e`](https://github.com/lightspeedwp/scripts/commit/465c73e8def0bcd76d3c685568074a4763cad6bf)
-- Complete restructuring to lightspeedwp-automation repository [`ecd580d`](https://github.com/lightspeedwp/scripts/commit/ecd580d3ec06cd4ed2cfe5ba44e5fa0f16552cef)
-- docs: update README and changelog [skip ci] [`1b059d3`](https://github.com/lightspeedwp/scripts/commit/1b059d36e5f34eb9120b9d288cbd2c8849ab171f)
-- Enhance documentation for GitHub Copilot prompts by standardizing placeholder usage and clarifying template patterns [`516c357`](https://github.com/lightspeedwp/scripts/commit/516c357f2d64c60a643c8082bdc5087b773eab5c)
-- Create coderabbit.yaml [`0c5566c`](https://github.com/lightspeedwp/scripts/commit/0c5566c00fe89fa795ec072bbe8482f7f24476f0)
-- docs: update README and changelog [skip ci] [`0d634d6`](https://github.com/lightspeedwp/scripts/commit/0d634d603e236bd22ab8cd4a104b24adfc1a2cc4)
-- Add CODE_OF_CONDUCT and DEVELOPMENT guides [`13e022c`](https://github.com/lightspeedwp/scripts/commit/13e022c4b89ea933bb361c55f708fe743efdfdda)
-- Update CHANGELOG with new sections and documentation [`1870716`](https://github.com/lightspeedwp/scripts/commit/18707161cbdd317a590c1b927906b08ed59a0254)
-- docs: update README and changelog [skip ci] [`f9a0707`](https://github.com/lightspeedwp/scripts/commit/f9a0707248a6371a34eebf8f424cd712db2b6d21)
-- Initial plan [`70bf542`](https://github.com/lightspeedwp/scripts/commit/70bf542d69e8b9e5a43fb0d1acaea1df82fb739d)
-- Initial plan [`b7e77e2`](https://github.com/lightspeedwp/scripts/commit/b7e77e2ef293c1d5a2f5478eb152d08cce08f50b)
-- feat: Add compare-branch input and fetch/diff logic to run-tests workflow [`2bfb591`](https://github.com/lightspeedwp/scripts/commit/2bfb5916f2eb84a2c99481e2fff2e0accad3fe93)
-- Add README.update-projects.md file [`fb58c77`](https://github.com/lightspeedwp/scripts/commit/fb58c773725df3d8092d6bb51abfcb8b19f8090e)
-- Initial plan [`e7c8e11`](https://github.com/lightspeedwp/scripts/commit/e7c8e11fb3e74e40446735c36fff9613737337be)
-- Add Copilot badge to README.md [`d8caa21`](https://github.com/lightspeedwp/scripts/commit/d8caa21a4a8c585d2a8ca407d09ad9ea7e2eadb1)
-- Initial plan [`f773bb2`](https://github.com/lightspeedwp/scripts/commit/f773bb27ea55f5244626a7ef528e9ee4d71c0610)
-- Initial plan [`b8e0343`](https://github.com/lightspeedwp/scripts/commit/b8e034335b3c91a42605a6321bd3e9270ae3256c)
-- Initial plan [`84db140`](https://github.com/lightspeedwp/scripts/commit/84db14095667b3b3c27de4298a76ac548cd68a66)
+- Initial assessment and planning for workspace configuration [`d03e46d`](https://github.com/lightspeedwp/scripts/commit/d03e46d0b813e833f9cfd3a9a502b175d30c567e)
+- Initial plan [`6a46cbb`](https://github.com/lightspeedwp/scripts/commit/6a46cbb65417ecdb3715f09f421be56692a3c846)
+- Add comprehensive automation scripts and tests for GitHub Projects [`9ea743f`](https://github.com/lightspeedwp/scripts/commit/9ea743ff661cf0d8b0ef7bc76a5258e1695c30cb)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f2cec80..861dc01 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,11 +2,11 @@
## Markdown Linting
-All Markdown files must pass linting using `markdownlint` before merging any pull request. Linting is enforced via GitHub Actions and must be a required status check for all release branches (main, develop, release/*). Fix all markdownlint errors before requesting review or merging.
+All Markdown files must pass linting using `markdownlint` before merging any pull request. Linting is enforced via GitHub Actions and must be a required status check for all release branches (main, develop, release/\*). Fix all markdownlint errors before requesting review or merging.
To run locally:
-```bash
+````bash
npm run lint:md
```markdown
@@ -43,7 +43,7 @@ brew install bats-core # macOS
# Make scripts executable
find . -name "*.sh" -exec chmod +x {} \;
-```
+````
## Contribution Guidelines
@@ -191,7 +191,6 @@ bats tests/test-script-name.bats
- Tag relevant maintainers if needed
- Check existing issues before creating new ones
-
### Teardown Instructions for Contributor Recognition Automation
If you need to remove contributor automation from this repository, follow these steps:
@@ -199,9 +198,9 @@ If you need to remove contributor automation from this repository, follow these
1. **Remove a Contributor**
- Edit `.all-contributorsrc` and remove the contributor's entry from the `contributors` array.
- Run:
- ```bash
- npx all-contributors generate
- ```
+ ```bash
+ npx all-contributors generate
+ ```
- Commit and push the updated README and `.all-contributorsrc`.
2. **Disable Contributor Update Workflow**
@@ -210,9 +209,9 @@ If you need to remove contributor automation from this repository, follow these
3. **Remove CLI Dependency**
- Uninstall the CLI tool:
- ```bash
- npm uninstall --save-dev all-contributors-cli
- ```
+ ```bash
+ npm uninstall --save-dev all-contributors-cli
+ ```
- Remove any related documentation from README and `.all-contributorsrc-docs.md` if desired.
4. **Clean Up Files**
diff --git a/README.md b/README.md
index 05928c8..aef53c2 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,11 @@
# lightspeedwp-automation
-
-
-
-
-
+
@@ -25,11 +21,8 @@
-
-
-
@@ -44,34 +37,29 @@
+npm install --save-dev all-contributors-cli
- npm install --save-dev all-contributors-cli
-
-
-
- ```
+````
- Add contributors:
- ```bash
- npx all-contributors add
- ```
+```bash
+npx all-contributors add
+````
+
- Generate the contributors table:
#### Contributor Configuration & Types
-
-
See [.all-contributorsrc-docs.md](.all-contributorsrc-docs.md) for:
-- Configuration options for contributor automation
-Reference this file in your README or CONTRIBUTING.md to explain how contributor recognition works and which contribution types are supported.
+- Configuration options for contributor automation
+ Reference this file in your README or CONTRIBUTING.md to explain how contributor recognition works and which contribution types are supported.
## CodeRabbit Review Automation
- Required status checks for linting (markdownlint) and tests before merging
- Minimum 2 review approvals for all PRs
- Auto-labeling and auto-assign for shell, docs, CI, and test files
-\n## Advanced Project Automation Scripts
-
+ \n## Advanced Project Automation Scripts
Scripts like `product_dev_project.sh` automate GitHub ProjectV2 provisioning, field management, item/issue linking, and governance. Features include:
@@ -80,8 +68,6 @@ Scripts like `product_dev_project.sh` automate GitHub ProjectV2 provisioning, fi
Centralized repository for LightSpeed WP organization automation scripts and CI/CD workflows.
-
-
This repository includes comprehensive GitHub Copilot instructions to assist with automation development:
- **[Custom Instructions](/.github/custom-instructions.md)**: Main Copilot configuration with role-based guidance
@@ -99,14 +85,13 @@ Shell scripts for automation tasks across the organization. All scripts follow k
**Naming Convention**: Use kebab-case for all script files (e.g., `deploy-site.sh`, `backup-database.sh`)
-
**Usage**:
- Bats test files for shell scripts
- Dry-run validation scripts
- Integration tests
- Mock environments for testing
-npm install # Installs Playwright, Prettier, and other dev dependencies
+ npm install # Installs Playwright, Prettier, and other dev dependencies
### 📁 `/.github/`
@@ -120,13 +105,16 @@ GitHub-specific templates, Copilot instructions, and configuration files.
npx playwright test
npx playwright test
+
- **Prompts & Chat Modes**: Reusable AI interaction patterns
- **GitHub Actions**: Organization-level workflow configurations
## Getting Started
+
## New Features & CLI Usage
### Key Automation Features
+
- MCP/Playwright server auto-activation and restart
- GitHub ProjectV2 automation (create, update, link, field/item/status management)
- Automatic issue type assignment for GitHub Projects
@@ -139,51 +127,58 @@ npx playwright test
The repository includes specialized automation agents that help with various tasks:
- **Issue Type Agent**: Automatically categorizes GitHub issues in Projects based on template metadata and content analysis
- - Location: `.github/agents/issue-type-agent.js` and `.github/workflows/auto-issue-type.yml`
- - Triggered by: Issues being opened or reopened
- - Functionality: Analyzes issue template metadata, content, and sets appropriate issue type in GitHub Projects
- - Standards: Follows org-wide-issue-types-v1-9.md specifications
+ - Location: `.github/agents/issue-type-agent.js` and `.github/workflows/auto-issue-type.yml`
+ - Triggered by: Issues being opened or reopened
+ - Functionality: Analyzes issue template metadata, content, and sets appropriate issue type in GitHub Projects
+ - Standards: Follows org-wide-issue-types-v1-9.md specifications
For more information on available agents, see [AGENTS.md](AGENTS.md).
### CLI Usage Examples
#### Start MCP Server
+
```bash
chmod +x scripts/start-mcp-server.sh
./scripts/start-mcp-server.sh
```
#### Run Project Automation Script
+
```bash
chmod +x scripts/project/product_dev_project.sh
./scripts/project/product_dev_project.sh --create --name "My Project" --owner "lightspeedwp"
```
#### Update Badges and Changelog
+
```bash
chmod +x scripts/maintenance/update-readme-and-changelog.sh
./scripts/maintenance/update-readme-and-changelog.sh
```
#### Run All Tests
+
```bash
bats tests/
```
#### Find all README files
+
```bash
chmod +x scripts/maintenance/find-readmes.sh
./scripts/maintenance/find-readmes.sh
```
### Error Handling Patterns
+
- All scripts use `set -euo pipefail` for robust error handling.
- CLI scripts validate required parameters and provide usage/help output.
- Errors are logged with timestamps and context for easier troubleshooting.
- Automated workflows enforce status checks and fail on lint/test errors.
### Markdownlint Compliance
+
- All documentation files are checked with markdownlint in CI.
- Use blank lines around code fences and lists.
- Avoid duplicate headings and ensure consistent heading structure.
@@ -192,46 +187,54 @@ chmod +x scripts/maintenance/find-readmes.sh
## Release & Changelog Instructions
### Automated Release Process
+
- On push to `main`, the release workflow:
- - Generates/updates `CHANGELOG.md` from commit history
- - Bumps version and tags the release
- - Publishes a GitHub Release with changelog details
- - All PRs must include a changelog entry in the required format (see PR template)
+ - Generates/updates `CHANGELOG.md` from commit history
+ - Bumps version and tags the release
+ - Publishes a GitHub Release with changelog details
+ - All PRs must include a changelog entry in the required format (see PR template)
### Changelog Entry Format
+
```md
### Added
+
- Short description of new features or scripts
### Changed
+
- Short description of changes or improvements
### Fixed
+
- Short description of bug fixes
### Security
+
- Short description of security updates
```
### Manual Release Fallback
+
If automation fails, releases can be created manually:
+
1. Update `CHANGELOG.md` with the latest changes
2. Bump the version in relevant files
3. Commit and tag the release:
- ```bash
- git add CHANGELOG.md
- git commit -m "chore(release): vX.Y.Z"
- git tag -a vX.Y.Z -m "Release vX.Y.Z"
- git push origin main --tags
- ```
+ ```bash
+ git add CHANGELOG.md
+ git commit -m "chore(release): vX.Y.Z"
+ git tag -a vX.Y.Z -m "Release vX.Y.Z"
+ git push origin main --tags
+ ```
4. Create a GitHub Release and paste the changelog entry
See [CHANGELOG.md](CHANGELOG.md) and [release workflow](.github/workflows/release.yml) for implementation details.
+
## Playwright Browser Testing
This repository uses [Playwright](https://playwright.dev/) for browser-based automation and testing.
-
Test files are located in `tests/` and use the `.spec.ts` extension.
### Playwright MCP Server Automation
@@ -252,8 +255,8 @@ npx playwright test
```yaml
- name: Start Playwright MCP server
run: |
- chmod +x scripts/start-mcp-server.sh
- ./scripts/start-mcp-server.sh
+ chmod +x scripts/start-mcp-server.sh
+ ./scripts/start-mcp-server.sh
- name: Run Playwright tests
run: npx playwright test
```
@@ -324,7 +327,6 @@ See `.github/workflows/lint.yml` for details.
- For ShellCheck errors, install via Homebrew (`brew install shellcheck`) or your package manager.
- For ESLint v9+ migration, use `eslint.config.js` instead of `.eslintrc.json`.
-
## Reference
- GitHub CLI (optional, for workflow management)
@@ -338,7 +340,7 @@ cd lightspeedwp-automation
### Running Tests
-```bash
+````bash
# Run all tests
### Automated Release Process
@@ -370,7 +372,7 @@ See `.github/workflows/release.yml` for details.
### Security
- Short description of security updates
-```
+````
- Changelog entries are required for all PRs and are included in the automated release process
- The PR template enforces changelog entry format and references automation
@@ -392,7 +394,6 @@ git push origin main --tags
1. Create a GitHub Release and paste the changelog entry
-
See [CHANGELOG.md](CHANGELOG.md) and [release workflow](.github/workflows/release.yml) for implementation details.
```bash
@@ -417,39 +418,41 @@ bats tests/test-script-name.bats
- **Tests**: Write comprehensive tests for all scripts
- **Templates**: Keep GitHub templates up-to-date with organization standards
-
## 📚 Major Documentation & Meta Files
All automation, workflow, and governance in this repository is aligned with the following documentation and meta files. Use this table as your central reference for standards, templates, and automation strategies:
-| File | Purpose |
-|------|---------|
-| [LIGHTSPEED_AUTOMATION_HANDBOOK.md](LIGHTSPEED_AUTOMATION_HANDBOOK.md) | Org-wide automation, governance, branching, and workflow standards |
-| [scripts/README.md](scripts/scripts/README.md) | Script usage, automation features, and GitHub Project automation details |
-| [scripts/update-projects/README.update-projects.md](scripts/update-projects/README.update-projects.md) | update-projects.sh usage, flags, testing, and validation |
-| [workflows/README.md](scripts/workflows/README.md) | Workflow usage, CI/CD pipeline templates, and deployment automation |
-| [tests/README.md](scripts/tests/README.md) | Test harnesses, Bats usage, and validation strategies |
-| [.github/README.md](scripts/.github/README.md) | GitHub templates, Copilot instructions, and configuration files |
-| [.github/PROJECT_META.md](scripts/.github/PROJECT_META.md) | Core project automation, field sync, and workflow logic |
-| [.github/PROJECT_META.product-development.md](scripts/.github/PROJECT_META.product-development.md) | Product development project template, fields, automations, and views |
-| [.github/PROJECT_META.client-delivery.md](scripts/.github/PROJECT_META.client-delivery.md) | Client delivery project template, fields, automations, and views |
-| [.github/ISSUE_LABELS.md](scripts/.github/ISSUE_LABELS.md) | Issue labeling strategy, status/priority/area conventions |
-| [.github/PR_LABELS.md](scripts/.github/PR_LABELS.md) | PR labeling strategy, branch/status mapping, changelog hygiene |
+| File | Purpose |
+| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
+| [LIGHTSPEED_AUTOMATION_HANDBOOK.md](LIGHTSPEED_AUTOMATION_HANDBOOK.md) | Org-wide automation, governance, branching, and workflow standards |
+| [scripts/README.md](scripts/scripts/README.md) | Script usage, automation features, and GitHub Project automation details |
+| [scripts/update-projects/README.update-projects.md](scripts/update-projects/README.update-projects.md) | update-projects.sh usage, flags, testing, and validation |
+| [workflows/README.md](scripts/workflows/README.md) | Workflow usage, CI/CD pipeline templates, and deployment automation |
+| [tests/README.md](scripts/tests/README.md) | Test harnesses, Bats usage, and validation strategies |
+| [.github/README.md](scripts/.github/README.md) | GitHub templates, Copilot instructions, and configuration files |
+| [.github/PROJECT_META.md](scripts/.github/PROJECT_META.md) | Core project automation, field sync, and workflow logic |
+| [.github/PROJECT_META.product-development.md](scripts/.github/PROJECT_META.product-development.md) | Product development project template, fields, automations, and views |
+| [.github/PROJECT_META.client-delivery.md](scripts/.github/PROJECT_META.client-delivery.md) | Client delivery project template, fields, automations, and views |
+| [.github/ISSUE_LABELS.md](scripts/.github/ISSUE_LABELS.md) | Issue labeling strategy, status/priority/area conventions |
+| [.github/PR_LABELS.md](scripts/.github/PR_LABELS.md) | PR labeling strategy, branch/status mapping, changelog hygiene |
All scripts, workflows, and automations in this repository are verified to follow the standards and strategies described in these files. Project provisioning, field sync, label/PR automation, and governance are fully aligned.
For detailed governance and workflow documentation, see the [LightSpeed Automation & Governance Handbook](LIGHTSPEED_AUTOMATION_HANDBOOK.md).
+
-| File | Purpose |
-|------|---------|
-| [.github/copilot-instructions.md](.github/copilot-instructions.md) | Main Copilot & CodeRabbit integration, file index, and standards cross-reference |
-| [.github/custom-instructions.md](.github/custom-instructions.md) | Copilot custom instructions, role-based configuration |
-| [.github/prompts/prompts.md](.github/prompts/prompts.md) | Reusable prompt templates for Copilot Chat/CLI |
-| [.github/chatmodes/chatmodes.md](.github/chatmodes/chatmodes.md) | Scenario-based chat modes for development contexts |
-| [.github/instructions/contributor-types.md](.github/instructions/contributor-types.md) | Role-specific contributor standards and prompts |
-| [.github/instructions/shell-script-copilot.md](.github/instructions/shell-script-copilot.md) | Shell script automation standards and patterns |
-| [.github/instructions/markdown-copilot.md](.github/instructions/markdown-copilot.md) | Markdown/documentation standards and accessibility |
-| [.github/instructions/js-copilot.md](.github/instructions/js-copilot.md) | JavaScript/Node.js workflow standards |
-| [.github/instructions/python-copilot.md](.github/instructions/python-copilot.md) | Python scripting standards |
-| [.github/instructions/playwright-copilot.md](.github/instructions/playwright-copilot.md) | Playwright-specific Copilot instructions and MCP server automation |
+
+| File | Purpose |
+| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| [.github/copilot-instructions.md](.github/copilot-instructions.md) | Main Copilot & CodeRabbit integration, file index, and standards cross-reference |
+| [.github/custom-instructions.md](.github/custom-instructions.md) | Copilot custom instructions, role-based configuration |
+| [.github/prompts/prompts.md](.github/prompts/prompts.md) | Reusable prompt templates for Copilot Chat/CLI |
+| [.github/chatmodes/chatmodes.md](.github/chatmodes/chatmodes.md) | Scenario-based chat modes for development contexts |
+| [.github/instructions/contributor-types.md](.github/instructions/contributor-types.md) | Role-specific contributor standards and prompts |
+| [.github/instructions/shell-script-copilot.md](.github/instructions/shell-script-copilot.md) | Shell script automation standards and patterns |
+| [.github/instructions/markdown-copilot.md](.github/instructions/markdown-copilot.md) | Markdown/documentation standards and accessibility |
+| [.github/instructions/js-copilot.md](.github/instructions/js-copilot.md) | JavaScript/Node.js workflow standards |
+| [.github/instructions/python-copilot.md](.github/instructions/python-copilot.md) | Python scripting standards |
+| [.github/instructions/playwright-copilot.md](.github/instructions/playwright-copilot.md) | Playwright-specific Copilot instructions and MCP server automation |
+
diff --git a/SECURITY.md b/SECURITY.md
index fc3504e..1868390 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,8 +2,8 @@
If you discover a security vulnerability in this project, please report it responsibly.
-- **Contact:** [support@lightspeedwp.agency](mailto:support@lightspeedwp.agency)
-- Please provide as much detail as possible so we can address the issue quickly.
+- **Contact:** [support@lightspeedwp.agency](mailto:support@lightspeedwp.agency)
+- Please provide as much detail as possible so we can address the issue quickly.
We follow the [WordPress Security Best Practices](https://developer.wordpress.org/security) and adhere to the [WordPress Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/).
diff --git a/SUPPORT.md b/SUPPORT.md
index 8891fbc..76ea90d 100644
--- a/SUPPORT.md
+++ b/SUPPORT.md
@@ -6,7 +6,7 @@ For bug reports or issues, please use the relevant issue template in our [GitHub
For paid support, contact our team:
-- **Email:** [support@lightspeedwp.agency](mailto:support@lightspeedwp.agency)
+- **Email:** [support@lightspeedwp.agency](mailto:support@lightspeedwp.agency)
We aim to respond to paid support requests within 2 business days.
diff --git a/TODO.md b/TODO.md
index d9d87fe..8cd1d6f 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,13 +1,13 @@
-
-
# Lightspeed Automation TODO List
## 🚨 Project Scripts & Field Automation — EXTREME DETAIL ROADMAP
+
This section documents, step-by-step, the actions required to fully update, refactor, and test the GitHub Project automation scripts and field CSVs for both client delivery and product development projects.
1. **Field Specification Extraction**
- - Review `client-delivery-field-specs-v1-1.md` and `product-development-field-specs-v1-1.md`.
- - Create a master list of all required fields for each project type, including:
+
+- Review `client-delivery-field-specs-v1-1.md` and `product-development-field-specs-v1-1.md`.
+- Create a master list of all required fields for each project type, including:
- Field name
- Field type (single_select, number, date, text, etc.)
- Options (for single_select fields)
@@ -16,56 +16,62 @@ This section documents, step-by-step, the actions required to fully update, refa
- Any default values or required logic
2. **CSV File Creation/Extension**
- - Update `fields.csv` to include all fields for both project types, using the format: `name,type,options(optional)`
- - If needed, create separate CSVs for client and product fields, or add a column for project type.
- - Ensure all single-select options and colors are included and sorted as per documentation (e.g., numeric prefixes for Size).
- - Update `additional-fields.csv` with any extra fields not present in the main CSV.
+
+- Update `fields.csv` to include all fields for both project types, using the format: `name,type,options(optional)`
+- If needed, create separate CSVs for client and product fields, or add a column for project type.
+- Ensure all single-select options and colors are included and sorted as per documentation (e.g., numeric prefixes for Size).
+- Update `additional-fields.csv` with any extra fields not present in the main CSV.
3. **Script Refactoring**
- - **A. update-projects.sh**
+
+- **A. update-projects.sh**
- Validate that the script reads all fields from the CSV(s).
- Ensure it can create, update, and delete all field types and options.
- Add logic to handle color codes for single-select options.
- Add support for new fields (from specs) if not already present.
- Ensure dry-run and live modes work for all field operations.
- - **B. client-delivery-project.sh**
+- **B. client-delivery-project.sh**
- Refactor to read field definitions from the CSV, or extend hardcoded logic to support all required fields.
- Ensure all fields from the client delivery spec are created with correct options and colors.
- Add error handling for missing or invalid field definitions.
- Document any limitations or manual steps required.
- - **C. product-dev-project.sh**
+- **C. product-dev-project.sh**
- Refactor to read field definitions from the CSV, or extend hardcoded logic to support all required fields.
- Ensure all fields from the product development spec are created with correct options and colors.
- Add error handling for missing or invalid field definitions.
- Document any limitations or manual steps required.
4. **Test Suite Expansion**
- - Review all Bats tests in project-scripts.
- - Add tests to validate creation of every required field for both project types.
- - Add tests for CSV-driven field creation, including edge cases (missing options, invalid types).
- - Add tests for dry-run and live modes.
- - Add tests for error handling and help output.
- - Ensure tests cover both field creation and update logic.
+
+- Review all Bats tests in project-scripts.
+- Add tests to validate creation of every required field for both project types.
+- Add tests for CSV-driven field creation, including edge cases (missing options, invalid types).
+- Add tests for dry-run and live modes.
+- Add tests for error handling and help output.
+- Ensure tests cover both field creation and update logic.
5. **Documentation Updates**
- - Update `README.md` to document:
+
+- Update `README.md` to document:
- All new fields and options
- CSV format and usage
- Script CLI usage and examples
- Error handling and limitations
- Test coverage and how to run tests
- - Update any related automation or workflow documentation.
+- Update any related automation or workflow documentation.
6. **Validation & QA**
- - Run all scripts in dry-run mode to verify output and field creation logic.
- - Run all scripts in live mode (on a test project) to verify actual field creation and updates.
- - Validate that all fields appear in GitHub Projects as expected, with correct options and colors.
- - Review logs and error messages for clarity and completeness.
+
+- Run all scripts in dry-run mode to verify output and field creation logic.
+- Run all scripts in live mode (on a test project) to verify actual field creation and updates.
+- Validate that all fields appear in GitHub Projects as expected, with correct options and colors.
+- Review logs and error messages for clarity and completeness.
7. **Governance & Integration**
- - Ensure all changes align with org-wide automation, branching, and labeling standards.
- - Update Copilot and CodeRabbit instructions to reflect new field automation logic.
- - Document integration points with other automation scripts and workflows.
+
+- Ensure all changes align with org-wide automation, branching, and labeling standards.
+- Update Copilot and CodeRabbit instructions to reflect new field automation logic.
+- Document integration points with other automation scripts and workflows.
**This section must be kept up-to-date as work progresses. Each step should be checked off only when fully complete and validated.**
@@ -109,7 +115,6 @@ Let me know if you want a migration plan, wrapper script examples, or help updat
Welcome! This file is your master roadmap for automating, refactoring, and documenting the scripts repository. It starts with a high-level plan of action, followed by a detailed, themed checklist. Use this to coordinate work, prioritize improvements, and ensure best practices across the organization.
-
## Table of Contents
1. [High-Level Plan of Action](#high-level-plan-of-action)
@@ -132,104 +137,92 @@ Welcome! This file is your master roadmap for automating, refactoring, and docum
---
-
## Priority Order
-
- [ ] Playwright Copilot & MCP server automation
-
- - Write Playwright-specific Copilot instructions for this repo, including MCP server auto-activation and restart logic. Ensure Playwright MCP and GitHub MCP servers are always running via workflow steps or process manager. Document setup, restart logic, and integration in README and instruction files.
+ - Write Playwright-specific Copilot instructions for this repo, including MCP server auto-activation and restart logic. Ensure Playwright MCP and GitHub MCP servers are always running via workflow steps or process manager. Document setup, restart logic, and integration in README and instruction files.
- [ ] Refactor Copilot & CodeRabbit instructions
-
- - Update Copilot custom instructions and CodeRabbit .yml to specifically understand this repo's scripts, add future-proof prompt examples, and define chat modes relevant to this repo. Cross-reference instruction sets and document how they interact for automation, review, and governance.
+ - Update Copilot custom instructions and CodeRabbit .yml to specifically understand this repo's scripts, add future-proof prompt examples, and define chat modes relevant to this repo. Cross-reference instruction sets and document how they interact for automation, review, and governance.
- [ ] GitHub project script refactor
-
- - Refactor and extend product_dev_project.sh to support all automatable ProjectV2 actions: create project, add fields, add items/issues, link repositories/teams, update project/fields/items/status. Plan helper functions for each mutation and CLI/GraphQL integration.
+ - Refactor and extend product_dev_project.sh to support all automatable ProjectV2 actions: create project, add fields, add items/issues, link repositories/teams, update project/fields/items/status. Plan helper functions for each mutation and CLI/GraphQL integration.
- [ ] Resume automation tasks
-
- - Continue with automation, documentation, and reliability improvements as listed below.
+ - Continue with automation, documentation, and reliability improvements as listed below.
- [ ] Add tests for new features
-
- - Add and expand Bats/Playwright tests for any new or refactored scripts and features.
+ - Add and expand Bats/Playwright tests for any new or refactored scripts and features.
---
-
## Project Automation
- [ ] Project Automation Complete
- [ ] Automate repo linking to project
- - Implement and test a helper function in product_dev_project.sh to link repositories to a GitHub ProjectV2 using the linkProjectV2ToRepository GraphQL mutation. Ensure CLI entry point is documented and error handling/logging is robust. Add Bats tests for this functionality.
+ - Implement and test a helper function in product_dev_project.sh to link repositories to a GitHub ProjectV2 using the linkProjectV2ToRepository GraphQL mutation. Ensure CLI entry point is documented and error handling/logging is robust. Add Bats tests for this functionality.
- [ ] Automate team linking to project
- - Implement and test a helper function in product_dev_project.sh to link teams to a GitHub ProjectV2 using the linkProjectV2ToTeam GraphQL mutation. Standardize CLI entry point, document usage, and add Bats tests. Validate error handling and logging.
+ - Implement and test a helper function in product_dev_project.sh to link teams to a GitHub ProjectV2 using the linkProjectV2ToTeam GraphQL mutation. Standardize CLI entry point, document usage, and add Bats tests. Validate error handling and logging.
- [ ] Automate project/field/item/status updates
- - Create update helpers for project, fields, items, and status in product_dev_project.sh using GraphQL mutations (updateProjectV2, updateProjectV2Field, updateProjectV2ItemFieldValue, updateProjectV2StatusUpdate). Ensure modularity, CLI entry points, and comprehensive Bats test coverage.
-
+ - Create update helpers for project, fields, items, and status in product_dev_project.sh using GraphQL mutations (updateProjectV2, updateProjectV2Field, updateProjectV2ItemFieldValue, updateProjectV2StatusUpdate). Ensure modularity, CLI entry points, and comprehensive Bats test coverage.
## Documentation & Instructions
- [ ] Documentation & Instructions Complete
- [ ] Document automation features
- - Update scripts/README.md to document all new script capabilities, CLI usage, helper functions, and automation scenarios. Include examples, error handling notes, and test coverage details. Ensure markdownlint compliance.
+ - Update scripts/README.md to document all new script capabilities, CLI usage, helper functions, and automation scenarios. Include examples, error handling notes, and test coverage details. Ensure markdownlint compliance.
- [ ] Release & changelog instructions integration
- - Expand Copilot and CodeRabbit instructions to include release and changelog automation, customer-facing changelog guidance, and best practices for using verified Marketplace actions and workflow_call. Reference changelog and release workflows in documentation and instructions.
-
+ - Expand Copilot and CodeRabbit instructions to include release and changelog automation, customer-facing changelog guidance, and best practices for using verified Marketplace actions and workflow_call. Reference changelog and release workflows in documentation and instructions.
## Automation Reliability
- [ ] Automation Reliability Complete
- [ ] Resolve remaining linting and test coverage issues
- - Review all shell scripts, markdown, and workflow files for unresolved linting errors (ShellCheck, markdownlint, ESLint, Prettier). Fix any outstanding issues, update CI workflows, and ensure all scripts and docs pass linting and tests. Document linting process and status checks in README.
-
+ - Review all shell scripts, markdown, and workflow files for unresolved linting errors (ShellCheck, markdownlint, ESLint, Prettier). Fix any outstanding issues, update CI workflows, and ensure all scripts and docs pass linting and tests. Document linting process and status checks in README.
## Automation & Testing
- [ ] Automation & Testing Complete
- [ ] Automate changelog and README updates
- - Write a script to automate changelog and README updates after each round of changes. Ensure changelog entries are generated, committed, and pushed, and README files are updated with new features, usage, and automation details.
+ - Write a script to automate changelog and README updates after each round of changes. Ensure changelog entries are generated, committed, and pushed, and README files are updated with new features, usage, and automation details.
- [ ] Extend Playwright test coverage
- - Write additional Playwright tests to extend coverage for this repository. Start by testing CLI entry points, error handling, automation scenarios, and integration with MCP server. Document test plan and coverage goals in README.
+ - Write additional Playwright tests to extend coverage for this repository. Start by testing CLI entry points, error handling, automation scenarios, and integration with MCP server. Document test plan and coverage goals in README.
- [ ] Chain CodeRabbit and Copilot PR reviews
- - Implement a workflow to chain CodeRabbit AI PR review and a Copilot review (using a free model). First invoke CodeRabbit for audit, then run Copilot review after CodeRabbit completes. Pass PR context/results between jobs if needed.
-
+ - Implement a workflow to chain CodeRabbit AI PR review and a Copilot review (using a free model). First invoke CodeRabbit for audit, then run Copilot review after CodeRabbit completes. Pass PR context/results between jobs if needed.
## Additional Automation & Refactoring Ideas
- [ ] Additional Automation & Refactoring Ideas Complete
- [ ] Package reusable scripts and helpers
- - Refactor common shell functions and automation logic into a toolkit or shared package for use across other org repos. Document usage and distribution strategy (e.g., submodule, release, npm, GitHub Action).
+ - Refactor common shell functions and automation logic into a toolkit or shared package for use across other org repos. Document usage and distribution strategy (e.g., submodule, release, npm, GitHub Action).
- [ ] Create persistent task tracking
- - Migrate session-based JSON task lists to a persistent file (e.g., tasks.json or tasks.md) for long-term tracking and team collaboration. Sync with todo.md as needed.
+ - Migrate session-based JSON task lists to a persistent file (e.g., tasks.json or tasks.md) for long-term tracking and team collaboration. Sync with todo.md as needed.
- [ ] Improve test coverage depth
- - Expand Bats and Playwright tests to cover edge cases, error handling, and integration scenarios. Add scenario-based tests for scripts with complex logic.
+ - Expand Bats and Playwright tests to cover edge cases, error handling, and integration scenarios. Add scenario-based tests for scripts with complex logic.
- [ ] Enhance documentation for packaging and distribution
- - Add a section to the README explaining how to package, version, and distribute scripts, helpers, and automation workflows for other repos.
+ - Add a section to the README explaining how to package, version, and distribute scripts, helpers, and automation workflows for other repos.
- [ ] Standardize script interfaces and error handling
- - Ensure all scripts have consistent CLI interfaces, help output, and robust error handling/logging. Add usage examples to documentation.
+ - Ensure all scripts have consistent CLI interfaces, help output, and robust error handling/logging. Add usage examples to documentation.
- [ ] Automate badge and contributor updates across multiple files
- - Extend badge/contributor automation to update all relevant README files, not just the root README.
+ - Extend badge/contributor automation to update all relevant README files, not just the root README.
- [ ] Document and automate changelog best practices
- - Create a guide for changelog entry standards and automate changelog generation for releases and major changes.
+ - Create a guide for changelog entry standards and automate changelog generation for releases and major changes.
- [ ] Integrate automation with org-wide governance
- - Align automation scripts and workflows with organization-wide branching, labeling, and project management strategies. Document integration points.
+ - Align automation scripts and workflows with organization-wide branching, labeling, and project management strategies. Document integration points.
diff --git a/docs/update-projects/client-delivery-automations-v1-1.md b/docs/update-projects/client-delivery-automations-v1-1.md
index 533da03..e7d6a86 100644
--- a/docs/update-projects/client-delivery-automations-v1-1.md
+++ b/docs/update-projects/client-delivery-automations-v1-1.md
@@ -21,29 +21,29 @@
## Order & conflict notes
-- Avoid loops: do **not** auto-move from **In QA → In review** on comment events.
+- Avoid loops: do **not** auto-move from **In QA → In review** on comment events.
- Manual overrides always win; automations should only react to clear, high-signal events (PR open/merge, label change).
---
## Reference — Definition of Ready (DoR)
-- [ ] Problem statement and outcome defined
-- [ ] Acceptance criteria written (Given/When/Then)
-- [ ] Designs or references attached (if relevant)
-- [ ] Dependencies identified and unblocked
-- [ ] Estimates agreed (Size and/or hours)
-- [ ] Test approach noted (how we’ll verify)
-- [ ] Stakeholders and approver listed
-- [ ] Environment clarified (Prototype/Staging/Live)
+- [ ] Problem statement and outcome defined
+- [ ] Acceptance criteria written (Given/When/Then)
+- [ ] Designs or references attached (if relevant)
+- [ ] Dependencies identified and unblocked
+- [ ] Estimates agreed (Size and/or hours)
+- [ ] Test approach noted (how we’ll verify)
+- [ ] Stakeholders and approver listed
+- [ ] Environment clarified (Prototype/Staging/Live)
## Reference — Definition of Done (DoD)
-- [ ] Acceptance criteria met
-- [ ] Unit/functional tests added or updated
-- [ ] A11y pass (key flows and components)
-- [ ] Docs updated (README/Changelog/Client notes)
-- [ ] Feature toggles/rollout considered
-- [ ] QA verified on Staging
-- [ ] UAT approved by client (if applicable)
-- [ ] Release notes prepared; monitoring in place
+- [ ] Acceptance criteria met
+- [ ] Unit/functional tests added or updated
+- [ ] A11y pass (key flows and components)
+- [ ] Docs updated (README/Changelog/Client notes)
+- [ ] Feature toggles/rollout considered
+- [ ] QA verified on Staging
+- [ ] UAT approved by client (if applicable)
+- [ ] Release notes prepared; monitoring in place
diff --git a/docs/update-projects/client-delivery-cadence-v1-1.md b/docs/update-projects/client-delivery-cadence-v1-1.md
index e34a91f..d936963 100644
--- a/docs/update-projects/client-delivery-cadence-v1-1.md
+++ b/docs/update-projects/client-delivery-cadence-v1-1.md
@@ -11,16 +11,16 @@ Keep client work flowing from intake → UAT → release with clear checkpoints,
## Weekly rhythm (Mon–Fri)
- **Mon — Intake & Plan (45–60m)**
- - View: **Backlog (Priority)**; clear **Intake** subset (missing Assignee/Priority/Type).
- - Actions: confirm **Theme/Area**, set **Priority/Size**, add **Start Date/Deadline** for time-bound items.
+ - View: **Backlog (Priority)**; clear **Intake** subset (missing Assignee/Priority/Type).
+ - Actions: confirm **Theme/Area**, set **Priority/Size**, add **Start Date/Deadline** for time-bound items.
- **Tue — Build Focus**
- - View: **Board (by Assignee)**; swarm **Blocked** and live **S0/S1** bugs first.
+ - View: **Board (by Assignee)**; swarm **Blocked** and live **S0/S1** bugs first.
- **Wed — QA Prep & Reviews**
- - Views: **QA Gate**, **UAT (Staging)**. Ensure test notes and staging links on each item.
+ - Views: **QA Gate**, **UAT (Staging)**. Ensure test notes and staging links on each item.
- **Thu — UAT Day**
- - Client UAT window; triage feedback into **Bugs/Tasks** for the current Milestone/Phase.
+ - Client UAT window; triage feedback into **Bugs/Tasks** for the current Milestone/Phase.
- **Fri — Ship & Sweep**
- - Ship when ready; close **Done**; move stragglers to next **Milestone**; update **Epic Tracking**.
+ - Ship when ready; close **Done**; move stragglers to next **Milestone**; update **Epic Tracking**.
## Ceremonies
diff --git a/docs/update-projects/client-delivery-field-specs-v1-1.md b/docs/update-projects/client-delivery-field-specs-v1-1.md
index 0c14da7..f16558c 100644
--- a/docs/update-projects/client-delivery-field-specs-v1-1.md
+++ b/docs/update-projects/client-delivery-field-specs-v1-1.md
@@ -7,13 +7,13 @@
## Theme
-* **Field:** Theme
-* **Purpose:** Strategic lens explaining *why/what programme* the work supports.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation or triage
-* **Who sets:** PM/Lead
-* **Options & colours:**
+- **Field:** Theme
+- **Purpose:** Strategic lens explaining _why/what programme_ the work supports.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation or triage
+- **Who sets:** PM/Lead
+- **Options & colours:**
| Fields | description | colour |
| --------------------------- | ----------------------------- | ------- |
@@ -30,21 +30,21 @@
| SEO | Technical SEO | #C2E0C6 |
| Release & Deployment | Rollouts, flags, rollback | #006B75 |
-* **Defaults:** None
-* **Do:** Pick one; change only if the *why* changes; use *Release & Deployment* for rollout work.
-* **Don’t:** Duplicate **Area**; set multiple themes.
-* **Examples:** Wetu import mapping → Content Management · Web vitals fixes → Performance
-* **Related fields:** Area, Milestone, Phase
+- **Defaults:** None
+- **Do:** Pick one; change only if the _why_ changes; use _Release & Deployment_ for rollout work.
+- **Don’t:** Duplicate **Area**; set multiple themes.
+- **Examples:** Wetu import mapping → Content Management · Web vitals fixes → Performance
+- **Related fields:** Area, Milestone, Phase
## Area
-* **Field:** Area
-* **Purpose:** Who/where primarily executes the work.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation
-* **Who sets:** PM/Lead
-* **Options & colours:**
+- **Field:** Area
+- **Purpose:** Who/where primarily executes the work.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation
+- **Who sets:** PM/Lead
+- **Options & colours:**
| Fields | description | colour |
| ----------------- | --------------------------- | ------- |
@@ -57,21 +57,21 @@
| Analytics | GA4/GTM, dashboards | #C2E0C6 |
| A11y | Accessibility fixes/reviews | #DB61A2 |
-* **Defaults:** None
-* **Do:** Choose the executing lane; split if two teams truly own parts.
-* **Don’t:** Encode outcomes—use **Theme** for that.
-* **Examples:** CloudFront config → Deployment/DevOps · Copy migration → Content
-* **Related fields:** Theme, Assignee
+- **Defaults:** None
+- **Do:** Choose the executing lane; split if two teams truly own parts.
+- **Don’t:** Encode outcomes—use **Theme** for that.
+- **Examples:** CloudFront config → Deployment/DevOps · Copy migration → Content
+- **Related fields:** Theme, Assignee
## Priority
-* **Field:** Priority
-* **Purpose:** Scheduling urgency for all issues.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation; refine in grooming
-* **Who sets:** PM/Lead
-* **Options & colours:**
+- **Field:** Priority
+- **Purpose:** Scheduling urgency for all issues.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation; refine in grooming
+- **Who sets:** PM/Lead
+- **Options & colours:**
| Fields | description | colour |
| ------ | ------------------------------- | ------- |
@@ -79,21 +79,21 @@
| Medium | Planned/standard work | #0052CC |
| Low | Nice-to-have/backlog | #C2E0C6 |
-* **Defaults:** Medium
-* **Do:** Use **High** for firm deadlines/live impact; otherwise start **Medium**.
-* **Don’t:** Encode bug impact here (that’s **Severity**).
-* **Examples:** Legal notice by Friday → High · Copy tidy → Low
-* **Related fields:** Severity, Phase
+- **Defaults:** Medium
+- **Do:** Use **High** for firm deadlines/live impact; otherwise start **Medium**.
+- **Don’t:** Encode bug impact here (that’s **Severity**).
+- **Examples:** Legal notice by Friday → High · Copy tidy → Low
+- **Related fields:** Severity, Phase
## Severity
-* **Field:** Severity
-* **Purpose:** Impact level for **Bugs** only.
-* **Type:** Single-select
-* **Applies to:** Issues (Bug)
-* **When to set:** Bug creation/triage
-* **Who sets:** QA/Engineer; confirmed by Lead
-* **Options & colours:**
+- **Field:** Severity
+- **Purpose:** Impact level for **Bugs** only.
+- **Type:** Single-select
+- **Applies to:** Issues (Bug)
+- **When to set:** Bug creation/triage
+- **Who sets:** QA/Engineer; confirmed by Lead
+- **Options & colours:**
| Fields | description | colour |
| ------------- | ------------------------------ | ------- |
@@ -103,47 +103,47 @@
| S3 – Minor | Limited impact/workaround | #BFD4F2 |
| S4 – Trivial | Cosmetic/typo | #E1E4E8 |
-* **Defaults:** None
-* **Do:** Keep independent from **Priority**; escalate only with context.
-* **Don’t:** Set on non-Bugs.
-* **Examples:** Checkout down → S0 · Typo on About → S4
-* **Related fields:** Priority, Environment
+- **Defaults:** None
+- **Do:** Keep independent from **Priority**; escalate only with context.
+- **Don’t:** Set on non-Bugs.
+- **Examples:** Checkout down → S0 · Typo on About → S4
+- **Related fields:** Priority, Environment
## Size
-* **Field:** Size
-* **Purpose:** Coarse effort bucket to aid sorting and capacity planning.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation/triage (update after discovery if needed)
-* **Who sets:** Lead/Engineer
-* **Options & colours:** *(numeric prefixes enforce sort order)*
-
-| Fields | description | colour |
-| ------------ | ------------------------- | ------- |
-| 0 – Unknown | Not yet sized | #E1E4E8 |
-| 1 – XS | Trivial (≤2h) | #BFD4F2 |
-| 2 – S | Small (≤0.5d) | #C5DEF5 |
-| 3 – M | Medium (1–2d) | #58A6FF |
-| 4 – L | Large (2–3d) | #4393F8 |
-| 5 – XL | Very large (≈1 week) | #D4C5F9 |
-| 6 – XXL | Huge (≈1–2 weeks) | #AB7DF8 |
-
-* **Defaults:** 0 – Unknown
-* **Do:** Keep rough; refine as understanding improves; combine with **Estimate** for budgeting.
-* **Don’t:** Treat as a commitment; use **Deadline**/**Milestone** for dates.
-* **Examples:** Favicon tidy → XS · Theme PHP upgrade → L
-* **Related fields:** Estimate, Priority
+- **Field:** Size
+- **Purpose:** Coarse effort bucket to aid sorting and capacity planning.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation/triage (update after discovery if needed)
+- **Who sets:** Lead/Engineer
+- **Options & colours:** _(numeric prefixes enforce sort order)_
+
+| Fields | description | colour |
+| ----------- | -------------------- | ------- |
+| 0 – Unknown | Not yet sized | #E1E4E8 |
+| 1 – XS | Trivial (≤2h) | #BFD4F2 |
+| 2 – S | Small (≤0.5d) | #C5DEF5 |
+| 3 – M | Medium (1–2d) | #58A6FF |
+| 4 – L | Large (2–3d) | #4393F8 |
+| 5 – XL | Very large (≈1 week) | #D4C5F9 |
+| 6 – XXL | Huge (≈1–2 weeks) | #AB7DF8 |
+
+- **Defaults:** 0 – Unknown
+- **Do:** Keep rough; refine as understanding improves; combine with **Estimate** for budgeting.
+- **Don’t:** Treat as a commitment; use **Deadline**/**Milestone** for dates.
+- **Examples:** Favicon tidy → XS · Theme PHP upgrade → L
+- **Related fields:** Estimate, Priority
## Phase
-* **Field:** Phase
-* **Purpose:** Communicate pre/post-launch flow.
-* **Type:** Single-select
-* **Applies to:** Both (esp. Epics)
-* **When to set:** Triage; update across release window
-* **Who sets:** PM
-* **Options & colours:**
+- **Field:** Phase
+- **Purpose:** Communicate pre/post-launch flow.
+- **Type:** Single-select
+- **Applies to:** Both (esp. Epics)
+- **When to set:** Triage; update across release window
+- **Who sets:** PM
+- **Options & colours:**
| Fields | description | colour |
| ----------- | ------------------ | ------- |
@@ -153,21 +153,21 @@
| Post-launch | Follow-ups, polish | #C2E0C6 |
| Maintenance | Warranty/BAU fixes | #9198A1 |
-* **Defaults:** Pre-launch
-* **Do:** Move to Staging/UAT during test; use Maintenance for warranty.
-* **Don’t:** Replace **Status** with Phase.
-* **Examples:** UAT fixes → Staging/UAT · Warranty bug → Maintenance
-* **Related fields:** Milestone, Environment, Status
+- **Defaults:** Pre-launch
+- **Do:** Move to Staging/UAT during test; use Maintenance for warranty.
+- **Don’t:** Replace **Status** with Phase.
+- **Examples:** UAT fixes → Staging/UAT · Warranty bug → Maintenance
+- **Related fields:** Milestone, Environment, Status
## Release type
-* **Field:** Release type
-* **Purpose:** Optionally classify client drops.
-* **Type:** Single-select
-* **Applies to:** Epics/Issues tied to a drop
-* **When to set:** Cut planning
-* **Who sets:** PM/Lead
-* **Options & colours:**
+- **Field:** Release type
+- **Purpose:** Optionally classify client drops.
+- **Type:** Single-select
+- **Applies to:** Epics/Issues tied to a drop
+- **When to set:** Cut planning
+- **Who sets:** PM/Lead
+- **Options & colours:**
| Fields | description | colour |
| ------ | ---------------------- | ------- |
@@ -176,21 +176,21 @@
| Patch | Small fixes | #C2E0C6 |
| Hotfix | Urgent live correction | #F85149 |
-* **Defaults:** None
-* **Do:** Use Hotfix for out-of-band live fixes.
-* **Don’t:** Force SemVer on content-only phases.
-* **Examples:** Post-launch sweep → Patch · Analytics tag fix → Hotfix
-* **Related fields:** Milestone, Phase
+- **Defaults:** None
+- **Do:** Use Hotfix for out-of-band live fixes.
+- **Don’t:** Force SemVer on content-only phases.
+- **Examples:** Post-launch sweep → Patch · Analytics tag fix → Hotfix
+- **Related fields:** Milestone, Phase
## Environment
-* **Field:** Environment
-* **Purpose:** Where the change is targeted/tested.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation or first PR
-* **Who sets:** Engineer/QA
-* **Options & colours:**
+- **Field:** Environment
+- **Purpose:** Where the change is targeted/tested.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation or first PR
+- **Who sets:** Engineer/QA
+- **Options & colours:**
| Fields | description | colour |
| --------- | --------------- | ------- |
@@ -198,21 +198,21 @@
| Staging | QA/UAT | #BFD4F2 |
| Live | Production | #0E8A16 |
-* **Defaults:** Staging
-* **Do:** Keep updated as work moves.
-* **Don’t:** Use as proxy for severity.
-* **Examples:** Dry-run import → Prototype · Go-live checklist → Live
-* **Related fields:** Phase, Severity
+- **Defaults:** Staging
+- **Do:** Keep updated as work moves.
+- **Don’t:** Use as proxy for severity.
+- **Examples:** Dry-run import → Prototype · Go-live checklist → Live
+- **Related fields:** Phase, Severity
## Status
-* **Field:** Status
-* **Purpose:** Workflow state for execution.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Auto + manual
-* **Who sets:** Automation + team
-* **Options & colours:**
+- **Field:** Status
+- **Purpose:** Workflow state for execution.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Auto + manual
+- **Who sets:** Automation + team
+- **Options & colours:**
| Fields | description | colour |
| ----------- | ------------------ | ------- |
@@ -223,21 +223,21 @@
| In QA | Testing/validation | #FBCA04 |
| Done | Complete/merged | #E1E4E8 |
-* **Defaults:** Backlog
-* **Do:** Let PR/labels move it; override only if needed.
-* **Don’t:** Encode phase gates here.
-* **Examples:** PR opened → In review · `status:needs-qa` → In QA
-* **Related fields:** Phase, Environment
+- **Defaults:** Backlog
+- **Do:** Let PR/labels move it; override only if needed.
+- **Don’t:** Encode phase gates here.
+- **Examples:** PR opened → In review · `status:needs-qa` → In QA
+- **Related fields:** Phase, Environment
## Issue Type
-* **Field:** Issue Type
-* **Purpose:** Nature of the work item.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation
-* **Who sets:** Creator; confirmed by PM
-* **Options & colours:**
+- **Field:** Issue Type
+- **Purpose:** Nature of the work item.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation
+- **Who sets:** Creator; confirmed by PM
+- **Options & colours:**
| Fields | description | colour |
| -------- | -------------------------- | ------- |
@@ -249,74 +249,74 @@
| Design | UI/UX design output | #AB7DF8 |
| Research | Investigation/spike | #9198A1 |
-* **Defaults:** Task
-* **Do:** Use Story for user-facing value; Chore for non-user ops.
-* **Don’t:** Mislabel Bugs as Chores.
-* **Examples:** Copy QA batch → Task · Favicon tidy → Chore
-* **Related fields:** Severity, Priority
+- **Defaults:** Task
+- **Do:** Use Story for user-facing value; Chore for non-user ops.
+- **Don’t:** Mislabel Bugs as Chores.
+- **Examples:** Copy QA batch → Task · Favicon tidy → Chore
+- **Related fields:** Severity, Priority
## Milestone
-* **Field:** Milestone
-* **Purpose:** Group scope to a delivery window/outcome.
-* **Type:** Iteration
-* **Applies to:** Both (Epics preferred)
-* **When to set:** Planning
-* **Who sets:** PM
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Name outcomes (e.g., UAT-1, Go-Live) or release tags; maintain rolling future iterations.
-* **Don’t:** Over-granulate or backdate without note.
-* **Examples:** Go-Live checklist → “Go-Live” iteration
-* **Related fields:** Phase, Release type
-* **Iteration schedule (example):**
-
-| Iteration name | Start (YYYY-MM-DD) | End (YYYY-MM-DD) | Notes |
-| ------------------- | ------------------ | ---------------- | ---------------- |
-| UAT-1 | 2025-10-20 | 2025-10-31 | 2‑week UAT cycle |
-| Go-Live | 2025-11-03 | 2025-11-07 | Launch window |
+- **Field:** Milestone
+- **Purpose:** Group scope to a delivery window/outcome.
+- **Type:** Iteration
+- **Applies to:** Both (Epics preferred)
+- **When to set:** Planning
+- **Who sets:** PM
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Name outcomes (e.g., UAT-1, Go-Live) or release tags; maintain rolling future iterations.
+- **Don’t:** Over-granulate or backdate without note.
+- **Examples:** Go-Live checklist → “Go-Live” iteration
+- **Related fields:** Phase, Release type
+- **Iteration schedule (example):**
+
+| Iteration name | Start (YYYY-MM-DD) | End (YYYY-MM-DD) | Notes |
+| -------------- | ------------------ | ---------------- | ---------------- |
+| UAT-1 | 2025-10-20 | 2025-10-31 | 2‑week UAT cycle |
+| Go-Live | 2025-11-03 | 2025-11-07 | Launch window |
## Estimate
-* **Field:** Estimate
-* **Purpose:** Numeric estimate for planning (hours).
-* **Type:** Number
-* **Applies to:** Both
-* **When to set:** Creation/triage; updated in refinement
-* **Who sets:** Engineer/Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use whole hours; show **Field sum** in board/table groups.
-* **Don’t:** Mix hours and points in the same project.
-* **Examples:** “Homepage copy tidy” → 2; “Theme PHP upgrade” → 16
-* **Related fields:** Size, Deadline
+- **Field:** Estimate
+- **Purpose:** Numeric estimate for planning (hours).
+- **Type:** Number
+- **Applies to:** Both
+- **When to set:** Creation/triage; updated in refinement
+- **Who sets:** Engineer/Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use whole hours; show **Field sum** in board/table groups.
+- **Don’t:** Mix hours and points in the same project.
+- **Examples:** “Homepage copy tidy” → 2; “Theme PHP upgrade” → 16
+- **Related fields:** Size, Deadline
## Start Date
-* **Field:** Start Date
-* **Purpose:** When work is expected to begin (roadmap).
-* **Type:** Date
-* **Applies to:** Both
-* **When to set:** When scheduled
-* **Who sets:** PM/Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use **YYYY-MM-DD**; use roadmap layout with **Start/Deadline** as axes.
-* **Don’t:** Backfill without comment.
-* **Examples:** UAT hardening → 2025-10-22
-* **Related fields:** Deadline, Milestone
+- **Field:** Start Date
+- **Purpose:** When work is expected to begin (roadmap).
+- **Type:** Date
+- **Applies to:** Both
+- **When to set:** When scheduled
+- **Who sets:** PM/Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use **YYYY-MM-DD**; use roadmap layout with **Start/Deadline** as axes.
+- **Don’t:** Backfill without comment.
+- **Examples:** UAT hardening → 2025-10-22
+- **Related fields:** Deadline, Milestone
## Deadline
-* **Field:** Deadline
-* **Purpose:** Target completion date.
-* **Type:** Date
-* **Applies to:** Both
-* **When to set:** When scheduled or at cut planning
-* **Who sets:** PM/Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use **YYYY-MM-DD**; protect with scope control; surface in views.
-* **Don’t:** Treat as SLA for research spikes.
-* **Examples:** Legal page update → 2025-11-01
-* **Related fields:** Start Date, Priority
+- **Field:** Deadline
+- **Purpose:** Target completion date.
+- **Type:** Date
+- **Applies to:** Both
+- **When to set:** When scheduled or at cut planning
+- **Who sets:** PM/Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use **YYYY-MM-DD**; protect with scope control; surface in views.
+- **Don’t:** Treat as SLA for research spikes.
+- **Examples:** Legal page update → 2025-11-01
+- **Related fields:** Start Date, Priority
diff --git a/docs/update-projects/client-delivery-project-template-v1-6.md b/docs/update-projects/client-delivery-project-template-v1-6.md
index 49efa64..5e66d25 100644
--- a/docs/update-projects/client-delivery-project-template-v1-6.md
+++ b/docs/update-projects/client-delivery-project-template-v1-6.md
@@ -25,56 +25,56 @@ Backlog → To-do → In progress → In review → In QA → Done
### Views
-- **Board (by Assignee)** — *board*
+- **Board (by Assignee)** — _board_
Group by **Assignee** · Sort **Priority desc** · **Field sum:** Estimate
-- **Backlog (Priority)** — *table*
- Filter **Status = Backlog** · Sort **Priority desc, Size asc** *(Size uses numeric prefixes to enforce order)* · **Field sum:** Estimate
+- **Backlog (Priority)** — _table_
+ Filter **Status = Backlog** · Sort **Priority desc, Size asc** _(Size uses numeric prefixes to enforce order)_ · **Field sum:** Estimate
-- **QA Gate** — *table*
+- **QA Gate** — _table_
Filter **Status ∈ {In review, In QA}** · **Group by Environment** · Sort **Severity desc, Priority desc**
-- **UAT (Staging)** — *table*
+- **UAT (Staging)** — _table_
Filter **Environment = Staging** AND **Status ∈ {In review, In QA}**
-- **Epics — Tracking (Table)** — *table*
+- **Epics — Tracking (Table)** — _table_
Filter **Issue Type = Epic** · Group by **Phase** · Sort **Priority desc**
-- **Epics — Roadmap (Table)** — *table*
+- **Epics — Roadmap (Table)** — _table_
Filter **Issue Type = Epic** · Group by **Theme** · Sort **Phase, Priority**
-- **Epics — Board** — *board*
+- **Epics — Board** — _board_
Filter **Issue Type = Epic** · Group by **Status**
-- **Roadmap (Dates)** — *roadmap*
+- **Roadmap (Dates)** — _roadmap_
Start field = **Start Date** · Target field = **Deadline** · Group by **Theme**
-- **Blocked** — *table*
+- **Blocked** — _table_
Filter **Label = blocked** OR **Status note contains "blocked"**
### Automations
-- On item added → **Status = Backlog**
-- On assignee set → **Status = In progress**
-- On PR opened → **Status = In review**
-- On label `status:needs-qa` → **Status = In QA**
+- On item added → **Status = Backlog**
+- On assignee set → **Status = In progress**
+- On PR opened → **Status = In review**
+- On label `status:needs-qa` → **Status = In QA**
- On PR merged / issue closed → **Status = Done**
### Cadence
-- Weekly grooming (prioritise **High**, then **Medium**)
-- Daily stand-up (focus on **Blocked** view)
-- UAT every Thursday; ship as needed
-- *(Optional)* Mid-week triage; fortnightly show-and-tell; monthly retro
+- Weekly grooming (prioritise **High**, then **Medium**)
+- Daily stand-up (focus on **Blocked** view)
+- UAT every Thursday; ship as needed
+- _(Optional)_ Mid-week triage; fortnightly show-and-tell; monthly retro
### Field defaults
-- **Priority:** **Medium** (default)
-- **Phase:** **Pre-launch** (default)
-- **Environment:** **Staging** (default)
-- **Size:** **0 – Unknown** (default)
-- **Theme, Area:** set at triage (choose exactly **one** Theme per item)
-- **Estimate/Start Date/Deadline:** set when scheduled
+- **Priority:** **Medium** (default)
+- **Phase:** **Pre-launch** (default)
+- **Environment:** **Staging** (default)
+- **Size:** **0 – Unknown** (default)
+- **Theme, Area:** set at triage (choose exactly **one** Theme per item)
+- **Estimate/Start Date/Deadline:** set when scheduled
- **Milestone (Iteration):** optional for client windows (e.g., UAT-1, Go-Live)
### Definition of Ready (DoR) — Checklist
diff --git a/docs/update-projects/client-delivery-views-v1-1.md b/docs/update-projects/client-delivery-views-v1-1.md
index 18cdeba..cfeca5a 100644
--- a/docs/update-projects/client-delivery-views-v1-1.md
+++ b/docs/update-projects/client-delivery-views-v1-1.md
@@ -6,17 +6,17 @@
## Summary table
-| View name | Type | Filter | Group by | Sort | Extras |
-|--------------------------|---------|------------------------------------------------------------------------|----------------|--------------------------------|---------------------------|
-| Board (by Assignee) | Board | — | Assignee | Priority ↓ | **Field sum:** Estimate |
-| Backlog (Priority) | Table | `Status = Backlog` | — | Priority ↓, Size ↑ | **Field sum:** Estimate |
-| QA Gate | Table | `Status IN {In review, In QA}` | Environment | Severity ↓, Priority ↓ | — |
-| UAT (Staging) | Table | `Environment = Staging AND Status IN {In review, In QA}` | — | Priority ↓ | — |
-| Epics — Tracking (Table) | Table | `Issue Type = Epic` | Phase | Priority ↓ | — |
-| Epics — Roadmap (Table) | Table | `Issue Type = Epic` | Theme | Phase ↑, Priority ↓ | — |
-| Epics — Board | Board | `Issue Type = Epic` | Status | Priority ↓ | — |
-| Roadmap (Dates) | Roadmap | — | Theme | — | Start = **Start Date** · Target = **Deadline** |
-| Blocked | Table | `label = blocked OR status note CONTAINS "blocked"` | — | Priority ↓ | — |
+| View name | Type | Filter | Group by | Sort | Extras |
+| ------------------------ | ------- | -------------------------------------------------------- | ----------- | ---------------------- | ---------------------------------------------- |
+| Board (by Assignee) | Board | — | Assignee | Priority ↓ | **Field sum:** Estimate |
+| Backlog (Priority) | Table | `Status = Backlog` | — | Priority ↓, Size ↑ | **Field sum:** Estimate |
+| QA Gate | Table | `Status IN {In review, In QA}` | Environment | Severity ↓, Priority ↓ | — |
+| UAT (Staging) | Table | `Environment = Staging AND Status IN {In review, In QA}` | — | Priority ↓ | — |
+| Epics — Tracking (Table) | Table | `Issue Type = Epic` | Phase | Priority ↓ | — |
+| Epics — Roadmap (Table) | Table | `Issue Type = Epic` | Theme | Phase ↑, Priority ↓ | — |
+| Epics — Board | Board | `Issue Type = Epic` | Status | Priority ↓ | — |
+| Roadmap (Dates) | Roadmap | — | Theme | — | Start = **Start Date** · Target = **Deadline** |
+| Blocked | Table | `label = blocked OR status note CONTAINS "blocked"` | — | Priority ↓ | — |
> **Tip (Size ordering):** Use numeric prefixes in Size values (e.g., `1 – XS`, `2 – S`, … `6 – XXL`) so **Sort by Size ↑** follows the intended order.
@@ -34,32 +34,32 @@ Use these columns unless noted: **Title, Assignee, Priority, Size, Severity, Env
## How to create
-1) Open your Project → **Views** → **+ New view**.
-2) Choose **Table / Board / Roadmap**.
-3) Apply the **Filter**, **Group**, **Sort**, and **Columns** from the table above.
-4) Rename the view exactly as listed.
-5) For **Field sum**, click the column menu on **Estimate** → **Show sum**.
+1. Open your Project → **Views** → **+ New view**.
+2. Choose **Table / Board / Roadmap**.
+3. Apply the **Filter**, **Group**, **Sort**, and **Columns** from the table above.
+4. Rename the view exactly as listed.
+5. For **Field sum**, click the column menu on **Estimate** → **Show sum**.
---
## Reference — Definition of Ready (DoR)
-- [ ] Problem statement and outcome defined
-- [ ] Acceptance criteria written (Given/When/Then)
-- [ ] Designs or references attached (if relevant)
-- [ ] Dependencies identified and unblocked
-- [ ] Estimates agreed (Size and/or hours)
-- [ ] Test approach noted (how we’ll verify)
-- [ ] Stakeholders and approver listed
-- [ ] Environment clarified (Prototype/Staging/Live)
+- [ ] Problem statement and outcome defined
+- [ ] Acceptance criteria written (Given/When/Then)
+- [ ] Designs or references attached (if relevant)
+- [ ] Dependencies identified and unblocked
+- [ ] Estimates agreed (Size and/or hours)
+- [ ] Test approach noted (how we’ll verify)
+- [ ] Stakeholders and approver listed
+- [ ] Environment clarified (Prototype/Staging/Live)
## Reference — Definition of Done (DoD)
-- [ ] Acceptance criteria met
-- [ ] Unit/functional tests added or updated
-- [ ] A11y pass (key flows and components)
-- [ ] Docs updated (README/Changelog/Client notes)
-- [ ] Feature toggles/rollout considered
-- [ ] QA verified on Staging
-- [ ] UAT approved by client (if applicable)
-- [ ] Release notes prepared; monitoring in place
+- [ ] Acceptance criteria met
+- [ ] Unit/functional tests added or updated
+- [ ] A11y pass (key flows and components)
+- [ ] Docs updated (README/Changelog/Client notes)
+- [ ] Feature toggles/rollout considered
+- [ ] QA verified on Staging
+- [ ] UAT approved by client (if applicable)
+- [ ] Release notes prepared; monitoring in place
diff --git a/docs/update-projects/product-development-automations-v1-1.md b/docs/update-projects/product-development-automations-v1-1.md
index a00fb3a..02d12a4 100644
--- a/docs/update-projects/product-development-automations-v1-1.md
+++ b/docs/update-projects/product-development-automations-v1-1.md
@@ -21,28 +21,28 @@
## Order & conflict notes
-- Avoid loops: do **not** auto-move from **In QA → In review** on comment events.
+- Avoid loops: do **not** auto-move from **In QA → In review** on comment events.
- Manual overrides always win; automations should only react to clear, high-signal events (PR open/merge, label change).
---
## Reference — Definition of Ready (DoR)
-- [ ] Problem, rationale, and success metric stated
-- [ ] Acceptance criteria (Given/When/Then)
-- [ ] Design/spec attached (where needed)
-- [ ] Dependencies mapped; rollout/flags planned
-- [ ] Test approach and risk noted
-- [ ] Estimate added (Size and/or hours)
-- [ ] Milestone/Iteration assigned (vX.Y.Z in scope)
-- [ ] Fields set: Issue Type, Priority, Size, Theme, Area, Environment
+- [ ] Problem, rationale, and success metric stated
+- [ ] Acceptance criteria (Given/When/Then)
+- [ ] Design/spec attached (where needed)
+- [ ] Dependencies mapped; rollout/flags planned
+- [ ] Test approach and risk noted
+- [ ] Estimate added (Size and/or hours)
+- [ ] Milestone/Iteration assigned (vX.Y.Z in scope)
+- [ ] Fields set: Issue Type, Priority, Size, Theme, Area, Environment
## Reference — Definition of Done (DoD)
-- [ ] All acceptance criteria met
-- [ ] Tests added/updated; CI green
-- [ ] A11y, performance, and security checks
-- [ ] Docs and changelog updated
-- [ ] Version bump (where required)
-- [ ] QA pass on staging
-- [ ] Release notes drafted; monitors/alerts set
+- [ ] All acceptance criteria met
+- [ ] Tests added/updated; CI green
+- [ ] A11y, performance, and security checks
+- [ ] Docs and changelog updated
+- [ ] Version bump (where required)
+- [ ] QA pass on staging
+- [ ] Release notes drafted; monitors/alerts set
diff --git a/docs/update-projects/product-development-cadence-v1-1.md b/docs/update-projects/product-development-cadence-v1-1.md
index 87b4e61..0c8119a 100644
--- a/docs/update-projects/product-development-cadence-v1-1.md
+++ b/docs/update-projects/product-development-cadence-v1-1.md
@@ -11,11 +11,11 @@ Ship product increments on a regular train (**vX.Y.Z**), with tight QA, changelo
## Monthly release train
- **Week 1 — Scope & Plan**
- - Set Milestone **vX.Y.0**; select Features/Stories; create **Release Gate — vX.Y.Z** view.
+ - Set Milestone **vX.Y.0**; select Features/Stories; create **Release Gate — vX.Y.Z** view.
- **Week 2–3 — Build**
- - Drive via **Board (by Assignee)**; prioritise **P1/P0**; keep PRs small and linked.
+ - Drive via **Board (by Assignee)**; prioritise **P1/P0**; keep PRs small and linked.
- **Week 4 — Freeze & Cut**
- - **Code freeze (24–48h)**; **QA Gate** on RC; **Release PR → main**; **tag** and publish notes.
+ - **Code freeze (24–48h)**; **QA Gate** on RC; **Release PR → main**; **tag** and publish notes.
## Weekly rhythm (Mon–Fri)
diff --git a/docs/update-projects/product-development-field-specs-v1-1.md b/docs/update-projects/product-development-field-specs-v1-1.md
index ac32f94..e941623 100644
--- a/docs/update-projects/product-development-field-specs-v1-1.md
+++ b/docs/update-projects/product-development-field-specs-v1-1.md
@@ -7,13 +7,13 @@
## Theme
-* **Field:** Theme
-* **Purpose:** Strategic programme for product work.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation/triage
-* **Who sets:** PM/Lead
-* **Options & colours:** *(same set/colours as Client delivery; table repeated for clarity)*
+- **Field:** Theme
+- **Purpose:** Strategic programme for product work.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation/triage
+- **Who sets:** PM/Lead
+- **Options & colours:** _(same set/colours as Client delivery; table repeated for clarity)_
| Fields | description | colour |
| --------------------------- | ----------------------------- | ------- |
@@ -30,21 +30,21 @@
| SEO | Technical SEO | #C2E0C6 |
| Release & Deployment | Rollouts, flags, rollback | #006B75 |
-* **Defaults:** None
-* **Do:** Tie to roadmap pillar.
-* **Don’t:** Duplicate **Area**.
-* **Examples:** theme.json tokens → Design System
-* **Related fields:** Area, Milestone
+- **Defaults:** None
+- **Do:** Tie to roadmap pillar.
+- **Don’t:** Duplicate **Area**.
+- **Examples:** theme.json tokens → Design System
+- **Related fields:** Area, Milestone
## Area
-* **Field:** Area
-* **Purpose:** Primary engineering lane owning the change.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation
-* **Who sets:** PM/Tech Lead
-* **Options & colours:**
+- **Field:** Area
+- **Purpose:** Primary engineering lane owning the change.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation
+- **Who sets:** PM/Tech Lead
+- **Options & colours:**
| Fields | description | colour |
| ----------------- | --------------------------- | ------- |
@@ -56,21 +56,21 @@
| Analytics | GA4/GTM, dashboards | #C2E0C6 |
| A11y | Accessibility fixes/reviews | #DB61A2 |
-* **Defaults:** None
-* **Do:** Use Build & CI for pipelines/tests; DevOps for infra/release tooling.
-* **Don’t:** Put Content here unless product truly owns it.
-* **Examples:** Playwright flake fix → Build & CI
-* **Related fields:** Theme
+- **Defaults:** None
+- **Do:** Use Build & CI for pipelines/tests; DevOps for infra/release tooling.
+- **Don’t:** Put Content here unless product truly owns it.
+- **Examples:** Playwright flake fix → Build & CI
+- **Related fields:** Theme
## Priority
-* **Field:** Priority
-* **Purpose:** Scheduling urgency in the train.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation; refine in planning
-* **Who sets:** PM/Lead
-* **Options & colours:**
+- **Field:** Priority
+- **Purpose:** Scheduling urgency in the train.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation; refine in planning
+- **Who sets:** PM/Lead
+- **Options & colours:**
| Fields | description | colour |
| ------ | --------------------------- | ------- |
@@ -78,21 +78,21 @@
| Medium | Planned work | #0052CC |
| Low | Opportunistic/tech debt | #C2E0C6 |
-* **Defaults:** Medium
-* **Do:** Let OKRs/release gates drive High.
-* **Don’t:** Use as impact proxy for bugs.
-* **Examples:** Security patch for release → High
-* **Related fields:** Severity, Release type
+- **Defaults:** Medium
+- **Do:** Let OKRs/release gates drive High.
+- **Don’t:** Use as impact proxy for bugs.
+- **Examples:** Security patch for release → High
+- **Related fields:** Severity, Release type
## Severity
-* **Field:** Severity
-* **Purpose:** Impact for **Bugs** (hotfix vs train).
-* **Type:** Single-select
-* **Applies to:** Issues (Bug)
-* **When to set:** Triage
-* **Who sets:** Eng/QA; Lead confirms
-* **Options & colours:**
+- **Field:** Severity
+- **Purpose:** Impact for **Bugs** (hotfix vs train).
+- **Type:** Single-select
+- **Applies to:** Issues (Bug)
+- **When to set:** Triage
+- **Who sets:** Eng/QA; Lead confirms
+- **Options & colours:**
| Fields | description | colour |
| ------------- | ------------------------------ | ------- |
@@ -102,47 +102,47 @@
| S3 – Minor | Limited impact/workaround | #BFD4F2 |
| S4 – Trivial | Cosmetic/typo | #E1E4E8 |
-* **Defaults:** None
-* **Do:** S0/S1 may trigger **Hotfix**.
-* **Don’t:** Auto-escalate Priority without context.
-* **Examples:** Data loss bug → S0
-* **Related fields:** Priority, Release type, Environment
+- **Defaults:** None
+- **Do:** S0/S1 may trigger **Hotfix**.
+- **Don’t:** Auto-escalate Priority without context.
+- **Examples:** Data loss bug → S0
+- **Related fields:** Priority, Release type, Environment
## Size
-* **Field:** Size
-* **Purpose:** Coarse effort bucket to aid sorting and capacity planning.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation/triage (update after discovery if needed)
-* **Who sets:** Lead/Engineer
-* **Options & colours:** *(numeric prefixes enforce sort order)*
-
-| Fields | description | colour |
-| ------------ | ------------------------- | ------- |
-| 0 – Unknown | Not yet sized | #E1E4E8 |
-| 1 – XS | Trivial (≤2h) | #BFD4F2 |
-| 2 – S | Small (≤0.5d) | #C5DEF5 |
-| 3 – M | Medium (1–2d) | #58A6FF |
-| 4 – L | Large (2–3d) | #4393F8 |
-| 5 – XL | Very large (≈1 week) | #D4C5F9 |
-| 6 – XXL | Huge (≈1–2 weeks) | #AB7DF8 |
-
-* **Defaults:** 0 – Unknown
-* **Do:** Keep rough; refine as understanding improves; combine with **Estimate** for budgeting.
-* **Don’t:** Treat as a commitment; use **Milestone** for release gating.
-* **Examples:** Block bindings refactor → L
-* **Related fields:** Estimate, Priority
+- **Field:** Size
+- **Purpose:** Coarse effort bucket to aid sorting and capacity planning.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation/triage (update after discovery if needed)
+- **Who sets:** Lead/Engineer
+- **Options & colours:** _(numeric prefixes enforce sort order)_
+
+| Fields | description | colour |
+| ----------- | -------------------- | ------- |
+| 0 – Unknown | Not yet sized | #E1E4E8 |
+| 1 – XS | Trivial (≤2h) | #BFD4F2 |
+| 2 – S | Small (≤0.5d) | #C5DEF5 |
+| 3 – M | Medium (1–2d) | #58A6FF |
+| 4 – L | Large (2–3d) | #4393F8 |
+| 5 – XL | Very large (≈1 week) | #D4C5F9 |
+| 6 – XXL | Huge (≈1–2 weeks) | #AB7DF8 |
+
+- **Defaults:** 0 – Unknown
+- **Do:** Keep rough; refine as understanding improves; combine with **Estimate** for budgeting.
+- **Don’t:** Treat as a commitment; use **Milestone** for release gating.
+- **Examples:** Block bindings refactor → L
+- **Related fields:** Estimate, Priority
## Release type
-* **Field:** Release type
-* **Purpose:** Classify versioned releases (SemVer + hotfix lane).
-* **Type:** Single-select
-* **Applies to:** Both (esp. Epics)
-* **When to set:** Planning/freeze
-* **Who sets:** PM/Release Lead
-* **Options & colours:**
+- **Field:** Release type
+- **Purpose:** Classify versioned releases (SemVer + hotfix lane).
+- **Type:** Single-select
+- **Applies to:** Both (esp. Epics)
+- **When to set:** Planning/freeze
+- **Who sets:** PM/Release Lead
+- **Options & colours:**
| Fields | description | colour |
| ------ | ----------------------------- | ------- |
@@ -151,21 +151,21 @@
| Patch | Bugfix roll-ups | #C2E0C6 |
| Hotfix | Out-of-band critical fix | #F85149 |
-* **Defaults:** Minor
-* **Do:** Map tag/branch to type where possible.
-* **Don’t:** Call internal refactors “Major” unless breaking.
-* **Examples:** v2.1.3 rollup → Patch · Critical prod fix → Hotfix
-* **Related fields:** Milestone, Theme
+- **Defaults:** Minor
+- **Do:** Map tag/branch to type where possible.
+- **Don’t:** Call internal refactors “Major” unless breaking.
+- **Examples:** v2.1.3 rollup → Patch · Critical prod fix → Hotfix
+- **Related fields:** Milestone, Theme
## Phase
-* **Field:** Phase
-* **Purpose:** Lightweight gate around the train (freeze/UAT/post).
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Around release window
-* **Who sets:** PM
-* **Options & colours:**
+- **Field:** Phase
+- **Purpose:** Lightweight gate around the train (freeze/UAT/post).
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Around release window
+- **Who sets:** PM
+- **Options & colours:**
| Fields | description | colour |
| ----------- | ------------------ | ------- |
@@ -175,21 +175,21 @@
| Post-launch | Follow-ups | #C2E0C6 |
| Maintenance | BAU fixes | #9198A1 |
-* **Defaults:** Pre-launch
-* **Do:** Flip to Staging/UAT during RC; Post-launch for follow-ups.
-* **Don’t:** Replace **Status** with Phase.
-* **Examples:** Release notes → Post-launch
-* **Related fields:** Release type, Status
+- **Defaults:** Pre-launch
+- **Do:** Flip to Staging/UAT during RC; Post-launch for follow-ups.
+- **Don’t:** Replace **Status** with Phase.
+- **Examples:** Release notes → Post-launch
+- **Related fields:** Release type, Status
## Environment
-* **Field:** Environment
-* **Purpose:** Target runtime for validation.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** On first PR
-* **Who sets:** Engineer/QA
-* **Options & colours:**
+- **Field:** Environment
+- **Purpose:** Target runtime for validation.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** On first PR
+- **Who sets:** Engineer/QA
+- **Options & colours:**
| Fields | description | colour |
| --------- | ------------- | ------- |
@@ -197,21 +197,21 @@
| Staging | RC/UAT | #BFD4F2 |
| Live | Production | #0E8A16 |
-* **Defaults:** Prototype/Staging (per flow)
-* **Do:** Keep current; Live only for prod changes.
-* **Don’t:** Use as readiness proxy.
-* **Examples:** RC smoke test → Staging
-* **Related fields:** Phase
+- **Defaults:** Prototype/Staging (per flow)
+- **Do:** Keep current; Live only for prod changes.
+- **Don’t:** Use as readiness proxy.
+- **Examples:** RC smoke test → Staging
+- **Related fields:** Phase
## Status
-* **Field:** Status
-* **Purpose:** Execution state (automation-friendly).
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Auto + manual
-* **Who sets:** Automation + team
-* **Options & colours:**
+- **Field:** Status
+- **Purpose:** Execution state (automation-friendly).
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Auto + manual
+- **Who sets:** Automation + team
+- **Options & colours:**
| Fields | description | colour |
| ----------- | ---------------------- | ------- |
@@ -222,21 +222,21 @@
| In QA | Testing/validation | #FBCA04 |
| Done | Complete/merged | #E1E4E8 |
-* **Defaults:** Backlog
-* **Do:** Drive via PR/labels; keep lanes tidy.
-* **Don’t:** Encode release gates here.
-* **Examples:** PR merged → Done
-* **Related fields:** Phase
+- **Defaults:** Backlog
+- **Do:** Drive via PR/labels; keep lanes tidy.
+- **Don’t:** Encode release gates here.
+- **Examples:** PR merged → Done
+- **Related fields:** Phase
## Issue Type
-* **Field:** Issue Type
-* **Purpose:** Nature of work for product engineering.
-* **Type:** Single-select
-* **Applies to:** Both
-* **When to set:** Creation
-* **Who sets:** Creator; PM confirms
-* **Options & colours:**
+- **Field:** Issue Type
+- **Purpose:** Nature of work for product engineering.
+- **Type:** Single-select
+- **Applies to:** Both
+- **When to set:** Creation
+- **Who sets:** Creator; PM confirms
+- **Options & colours:**
| Fields | description | colour |
| -------- | -------------------------- | ------- |
@@ -249,74 +249,74 @@
| Design | UI/UX design output | #AB7DF8 |
| Research | Investigation/spike | #9198A1 |
-* **Defaults:** Task
-* **Do:** Use Feature for net-new; Refactor for internal.
-* **Don’t:** File performance work as Feature—use Task + Theme *Performance*.
-* **Examples:** Add Block Bindings variant → Feature
-* **Related fields:** Theme, Severity
+- **Defaults:** Task
+- **Do:** Use Feature for net-new; Refactor for internal.
+- **Don’t:** File performance work as Feature—use Task + Theme _Performance_.
+- **Examples:** Add Block Bindings variant → Feature
+- **Related fields:** Theme, Severity
## Milestone
-* **Field:** Milestone
-* **Purpose:** Version anchor for the train.
-* **Type:** Iteration
-* **Applies to:** Both (Epics preferred)
-* **When to set:** Planning
-* **Who sets:** PM/Release Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use strict `vX.Y.Z`; maintain rolling future iterations.
-* **Don’t:** Mix unrelated changes into the milestone.
-* **Examples:** v2.1.0 epic & PRs → v2.1.0
-* **Related fields:** Release type, Phase
-* **Iteration schedule (example):**
-
-| Iteration name | Start (YYYY-MM-DD) | End (YYYY-MM-DD) | Notes |
-| --------------- | ------------------ | ---------------- | --------------------- |
-| v2.1.0 | 2025-11-03 | 2025-11-17 | 2‑week release window |
-| v2.1.1 (patch) | 2025-11-18 | 2025-11-22 | Patch window |
+- **Field:** Milestone
+- **Purpose:** Version anchor for the train.
+- **Type:** Iteration
+- **Applies to:** Both (Epics preferred)
+- **When to set:** Planning
+- **Who sets:** PM/Release Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use strict `vX.Y.Z`; maintain rolling future iterations.
+- **Don’t:** Mix unrelated changes into the milestone.
+- **Examples:** v2.1.0 epic & PRs → v2.1.0
+- **Related fields:** Release type, Phase
+- **Iteration schedule (example):**
+
+| Iteration name | Start (YYYY-MM-DD) | End (YYYY-MM-DD) | Notes |
+| -------------- | ------------------ | ---------------- | --------------------- |
+| v2.1.0 | 2025-11-03 | 2025-11-17 | 2‑week release window |
+| v2.1.1 (patch) | 2025-11-18 | 2025-11-22 | Patch window |
## Estimate
-* **Field:** Estimate
-* **Purpose:** Numeric estimate for planning (hours).
-* **Type:** Number
-* **Applies to:** Both
-* **When to set:** Creation/triage; updated in refinement
-* **Who sets:** Engineer/Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use whole hours; show **Field sum** in board/table groups.
-* **Don’t:** Mix hours and points in the same project.
-* **Examples:** “Block Bindings feature” → 40
-* **Related fields:** Size, Deadline
+- **Field:** Estimate
+- **Purpose:** Numeric estimate for planning (hours).
+- **Type:** Number
+- **Applies to:** Both
+- **When to set:** Creation/triage; updated in refinement
+- **Who sets:** Engineer/Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use whole hours; show **Field sum** in board/table groups.
+- **Don’t:** Mix hours and points in the same project.
+- **Examples:** “Block Bindings feature” → 40
+- **Related fields:** Size, Deadline
## Start Date
-* **Field:** Start Date
-* **Purpose:** When work is expected to begin (roadmap).
-* **Type:** Date
-* **Applies to:** Both
-* **When to set:** When scheduled
-* **Who sets:** PM/Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use **YYYY-MM-DD**; use roadmap layout with **Start/Deadline** as axes.
-* **Don’t:** Backfill without comment.
-* **Examples:** v2.1.0 development → 2025-11-03
-* **Related fields:** Deadline, Milestone
+- **Field:** Start Date
+- **Purpose:** When work is expected to begin (roadmap).
+- **Type:** Date
+- **Applies to:** Both
+- **When to set:** When scheduled
+- **Who sets:** PM/Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use **YYYY-MM-DD**; use roadmap layout with **Start/Deadline** as axes.
+- **Don’t:** Backfill without comment.
+- **Examples:** v2.1.0 development → 2025-11-03
+- **Related fields:** Deadline, Milestone
## Deadline
-* **Field:** Deadline
-* **Purpose:** Target completion date.
-* **Type:** Date
-* **Applies to:** Both
-* **When to set:** When scheduled or at freeze
-* **Who sets:** PM/Lead
-* **Options & colours:** N/A
-* **Defaults:** None
-* **Do:** Use **YYYY-MM-DD**; protect with scope control; surface in views.
-* **Don’t:** Treat as SLA for spikes.
-* **Examples:** v2.1.0 tag → 2025-11-17
-* **Related fields:** Start Date, Priority
+- **Field:** Deadline
+- **Purpose:** Target completion date.
+- **Type:** Date
+- **Applies to:** Both
+- **When to set:** When scheduled or at freeze
+- **Who sets:** PM/Lead
+- **Options & colours:** N/A
+- **Defaults:** None
+- **Do:** Use **YYYY-MM-DD**; protect with scope control; surface in views.
+- **Don’t:** Treat as SLA for spikes.
+- **Examples:** v2.1.0 tag → 2025-11-17
+- **Related fields:** Start Date, Priority
diff --git a/docs/update-projects/product-development-project-template-v1-6.md b/docs/update-projects/product-development-project-template-v1-6.md
index ff79610..da667a1 100644
--- a/docs/update-projects/product-development-project-template-v1-6.md
+++ b/docs/update-projects/product-development-project-template-v1-6.md
@@ -25,55 +25,55 @@ Backlog → Ready → In progress → In review → In QA → Done
### Views
-- **Board (by Assignee)** — *board*
+- **Board (by Assignee)** — _board_
Group by **Assignee** · Sort **Priority desc** · **Field sum:** Estimate
-- **Release Gate — vX.Y.Z** — *table*
+- **Release Gate — vX.Y.Z** — _table_
Filter **Milestone matches `^v\d+\.\d+\.\d+$`** (current release) · Group by **Issue Type** · Sort **Priority desc, Size asc** · **Field sum:** Estimate
-- **Backlog (Priority)** — *table*
- Filter **Status = Backlog** · Sort **Priority desc, Size asc** *(Size uses numeric prefixes to enforce order)*
+- **Backlog (Priority)** — _table_
+ Filter **Status = Backlog** · Sort **Priority desc, Size asc** _(Size uses numeric prefixes to enforce order)_
-- **Hotfix Lane** — *table* *(optional to pin)*
+- **Hotfix Lane** — _table_ _(optional to pin)_
Filter **Release type = Hotfix** OR **Severity ∈ {S0, S1}** · Sort **Severity desc, Priority desc**
-- **QA Gate** — *table*
+- **QA Gate** — _table_
Filter **Status = In QA** · Sort **Severity desc, Priority desc**
-- **Epics — Tracking (Table)** — *table*
+- **Epics — Tracking (Table)** — _table_
Filter **Issue Type = Epic** · Group by **Milestone/Release** · Sort **Priority desc**
-- **Roadmap (Dates)** — *roadmap*
+- **Roadmap (Dates)** — _roadmap_
Start field = **Start Date** · Target field = **Deadline** · Group by **Theme**
-- **Tech Debt** — *table*
+- **Tech Debt** — _table_
Filter **Label = tech-debt** OR **Issue Type = Refactor**
### Automations
-- On item added → **Status = Backlog**
-- On assignee set → **Status = In progress**
-- On PR opened → **Status = In review**
-- On label `status:needs-qa` → **Status = In QA**
-- On PR merged / issue closed → **Status = Done**
-- *(Optional rule)* If **Issue Type = Bug** AND **Environment = Live** AND **Severity ∈ {S0, S1}** → **Priority = High**
+- On item added → **Status = Backlog**
+- On assignee set → **Status = In progress**
+- On PR opened → **Status = In review**
+- On label `status:needs-qa` → **Status = In QA**
+- On PR merged / issue closed → **Status = Done**
+- _(Optional rule)_ If **Issue Type = Bug** AND **Environment = Live** AND **Severity ∈ {S0, S1}** → **Priority = High**
### Cadence
-- Weekly planning (select **Release Gate — vX.Y.Z** scope)
-- Daily stand-up (focus **Hotfix Lane** + blockers)
-- **Monthly Minor** releases; **Patches as needed**; short freeze window before release
+- Weekly planning (select **Release Gate — vX.Y.Z** scope)
+- Daily stand-up (focus **Hotfix Lane** + blockers)
+- **Monthly Minor** releases; **Patches as needed**; short freeze window before release
- Release notes on merge to `main`; tag **vX.Y.Z**
### Field defaults
-- **Priority:** **Medium** (default)
-- **Phase:** **Pre-launch** (default)
-- **Release type:** **Minor** (default; set to **Patch**/**Hotfix** as needed)
-- **Environment:** **Prototype/Staging** (default; per flow)
-- **Size:** **0 – Unknown** (default)
-- **Theme, Area:** set at triage (choose exactly **one** Theme per item)
-- **Milestone (Iteration):** required for all in-scope release items (**vX.Y.Z**)
+- **Priority:** **Medium** (default)
+- **Phase:** **Pre-launch** (default)
+- **Release type:** **Minor** (default; set to **Patch**/**Hotfix** as needed)
+- **Environment:** **Prototype/Staging** (default; per flow)
+- **Size:** **0 – Unknown** (default)
+- **Theme, Area:** set at triage (choose exactly **one** Theme per item)
+- **Milestone (Iteration):** required for all in-scope release items (**vX.Y.Z**)
- **Estimate/Start Date/Deadline:** set when scheduled
### Definition of Ready (DoR) — Checklist
diff --git a/docs/update-projects/product-development-views-v1-1.md b/docs/update-projects/product-development-views-v1-1.md
index 3e6a413..5b5506f 100644
--- a/docs/update-projects/product-development-views-v1-1.md
+++ b/docs/update-projects/product-development-views-v1-1.md
@@ -6,16 +6,16 @@
## Summary table
-| View name | Type | Filter | Group by | Sort | Extras |
-|-----------------------------|---------|------------------------------------------------------------------------|----------------|--------------------------------|---------------------------|
-| Board (by Assignee) | Board | — | Assignee | Priority ↓ | **Field sum:** Estimate |
-| Release Gate — vX.Y.Z | Table | `Milestone MATCHES ^v\d+\.\d+\.\d+$` | Issue Type | Priority ↓, Size ↑ | **Field sum:** Estimate |
-| Backlog (Priority) | Table | `Status = Backlog` | — | Priority ↓, Size ↑ | — |
-| Hotfix Lane | Table | `Release type = Hotfix OR Severity IN {S0, S1}` | — | Severity ↓, Priority ↓ | — |
-| QA Gate | Table | `Status = In QA` | — | Severity ↓, Priority ↓ | — |
-| Epics — Tracking (Table) | Table | `Issue Type = Epic` | Milestone | Priority ↓ | — |
-| Roadmap (Dates) | Roadmap | — | Theme | — | Start = **Start Date** · Target = **Deadline** |
-| Tech Debt | Table | `label = tech-debt OR Issue Type = Refactor` | — | Priority ↓ | — |
+| View name | Type | Filter | Group by | Sort | Extras |
+| ------------------------ | ------- | ----------------------------------------------- | ---------- | ---------------------- | ---------------------------------------------- |
+| Board (by Assignee) | Board | — | Assignee | Priority ↓ | **Field sum:** Estimate |
+| Release Gate — vX.Y.Z | Table | `Milestone MATCHES ^v\d+\.\d+\.\d+$` | Issue Type | Priority ↓, Size ↑ | **Field sum:** Estimate |
+| Backlog (Priority) | Table | `Status = Backlog` | — | Priority ↓, Size ↑ | — |
+| Hotfix Lane | Table | `Release type = Hotfix OR Severity IN {S0, S1}` | — | Severity ↓, Priority ↓ | — |
+| QA Gate | Table | `Status = In QA` | — | Severity ↓, Priority ↓ | — |
+| Epics — Tracking (Table) | Table | `Issue Type = Epic` | Milestone | Priority ↓ | — |
+| Roadmap (Dates) | Roadmap | — | Theme | — | Start = **Start Date** · Target = **Deadline** |
+| Tech Debt | Table | `label = tech-debt OR Issue Type = Refactor` | — | Priority ↓ | — |
> **Tip (Size ordering):** Use numeric prefixes in Size values (e.g., `1 – XS`, `2 – S`, … `6 – XXL`) so **Sort by Size ↑** follows the intended order.
@@ -31,31 +31,31 @@ Default columns: **Title, Assignee, Priority, Size, Severity, Environment, Relea
## How to create
-1) Open your Project → **Views** → **+ New view**.
-2) Choose **Table / Board / Roadmap**.
-3) Apply the **Filter**, **Group**, **Sort**, and **Columns** from the table above.
-4) Rename the view exactly as listed.
-5) For **Field sum**, click the column menu on **Estimate** → **Show sum**.
+1. Open your Project → **Views** → **+ New view**.
+2. Choose **Table / Board / Roadmap**.
+3. Apply the **Filter**, **Group**, **Sort**, and **Columns** from the table above.
+4. Rename the view exactly as listed.
+5. For **Field sum**, click the column menu on **Estimate** → **Show sum**.
---
## Reference — Definition of Ready (DoR)
-- [ ] Problem, rationale, and success metric stated
-- [ ] Acceptance criteria (Given/When/Then)
-- [ ] Design/spec attached (where needed)
-- [ ] Dependencies mapped; rollout/flags planned
-- [ ] Test approach and risk noted
-- [ ] Estimate added (Size and/or hours)
-- [ ] Milestone/Iteration assigned (vX.Y.Z in scope)
-- [ ] Fields set: Issue Type, Priority, Size, Theme, Area, Environment
+- [ ] Problem, rationale, and success metric stated
+- [ ] Acceptance criteria (Given/When/Then)
+- [ ] Design/spec attached (where needed)
+- [ ] Dependencies mapped; rollout/flags planned
+- [ ] Test approach and risk noted
+- [ ] Estimate added (Size and/or hours)
+- [ ] Milestone/Iteration assigned (vX.Y.Z in scope)
+- [ ] Fields set: Issue Type, Priority, Size, Theme, Area, Environment
## Reference — Definition of Done (DoD)
-- [ ] All acceptance criteria met
-- [ ] Tests added/updated; CI green
-- [ ] A11y, performance, and security checks
-- [ ] Docs and changelog updated
-- [ ] Version bump (where required)
-- [ ] QA pass on staging
-- [ ] Release notes drafted; monitors/alerts set
+- [ ] All acceptance criteria met
+- [ ] Tests added/updated; CI green
+- [ ] A11y, performance, and security checks
+- [ ] Docs and changelog updated
+- [ ] Version bump (where required)
+- [ ] QA pass on staging
+- [ ] Release notes drafted; monitors/alerts set
diff --git a/eslint.config.js b/eslint.config.js
index 0df64ff..efc33e5 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -3,20 +3,65 @@
import js from '@eslint/js';
import prettier from 'eslint-config-prettier';
+import tsPlugin from '@typescript-eslint/eslint-plugin';
+import tsParser from '@typescript-eslint/parser';
export default [
+ {
+ ignores: [
+ 'node_modules/**',
+ 'dist/**',
+ 'build/**',
+ 'coverage/**',
+ 'playwright-report/**',
+ 'test-results/**',
+ 'eslint.config.js',
+ ],
+ },
js.configs.recommended,
prettier,
{
- files: ['**/*.{js,ts}'],
+ files: ['**/*.js'],
languageOptions: {
ecmaVersion: 'latest',
- sourceType: 'module',
+ sourceType: 'commonjs',
+ globals: {
+ require: 'readonly',
+ module: 'readonly',
+ process: 'readonly',
+ console: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ global: 'readonly',
+ Buffer: 'readonly',
+ },
},
rules: {
'no-unused-vars': 'warn',
'no-console': 'off',
- 'prettier/prettier': 'error',
+ },
+ },
+ {
+ files: ['**/*.ts'],
+ languageOptions: {
+ parser: tsParser,
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ globals: {
+ console: 'readonly',
+ process: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ },
+ },
+ plugins: {
+ '@typescript-eslint': tsPlugin,
+ },
+ rules: {
+ ...tsPlugin.configs.recommended.rules,
+ 'no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars': 'warn',
+ 'no-console': 'off',
},
},
];
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 7b9a0be..fbb50d9 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -8,39 +8,39 @@ import tseslint from '@typescript-eslint/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
export default [
- js.configs.recommended,
- prettierConfig,
- {
- plugins: {
- prettier: prettierPlugin,
- '@typescript-eslint': tseslint,
+ js.configs.recommended,
+ prettierConfig,
+ {
+ plugins: {
+ prettier: prettierPlugin,
+ '@typescript-eslint': tseslint,
+ },
+ files: ['**/*.ts'],
+ languageOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ parser: tsParser,
+ },
+ rules: {
+ 'no-unused-vars': 'warn',
+ 'no-console': 'off',
+ 'prettier/prettier': 'error',
+ '@typescript-eslint/no-unused-vars': 'warn',
+ },
},
- files: ['**/*.ts'],
- languageOptions: {
- ecmaVersion: 'latest',
- sourceType: 'module',
- parser: tsParser,
+ {
+ plugins: {
+ prettier: prettierPlugin,
+ },
+ files: ['**/*.js'],
+ languageOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ },
+ rules: {
+ 'no-unused-vars': 'warn',
+ 'no-console': 'off',
+ 'prettier/prettier': 'error',
+ },
},
- rules: {
- 'no-unused-vars': 'warn',
- 'no-console': 'off',
- 'prettier/prettier': 'error',
- '@typescript-eslint/no-unused-vars': 'warn',
- },
- },
- {
- plugins: {
- prettier: prettierPlugin,
- },
- files: ['**/*.js'],
- languageOptions: {
- ecmaVersion: 'latest',
- sourceType: 'module',
- },
- rules: {
- 'no-unused-vars': 'warn',
- 'no-console': 'off',
- 'prettier/prettier': 'error',
- },
- },
];
diff --git a/package-lock.json b/package-lock.json
index 4a9c0ce..8c3c82c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,37 +1,27 @@
{
- "name": "scripts",
- "version": "1.0.0",
+ "name": "lightspeedwp-scripts",
+ "version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "scripts",
- "version": "1.0.0",
- "license": "ISC",
+ "name": "lightspeedwp-scripts",
+ "version": "0.1.0",
+ "license": "MIT",
"devDependencies": {
"@eslint/js": "^9.37.0",
"@playwright/test": "^1.56.0",
"@typescript-eslint/eslint-plugin": "^8.46.0",
"@typescript-eslint/parser": "^8.46.0",
"all-contributors-cli": "^3.1.1",
+ "auto-changelog": "^2.4.0",
"eslint": "^9.37.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
+ "markdown-toc": "^1.2.0",
"markdownlint-cli": "^0.45.0",
"playwright": "^1.56.0",
- "prettier": "^3.6.2",
- "shellcheck": "^4.1.0"
- }
- },
- "node_modules/@borewit/text-codec": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz",
- "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "prettier": "^3.6.2"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -214,22 +204,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@felipecrs/decompress-tarxz": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@felipecrs/decompress-tarxz/-/decompress-tarxz-5.0.4.tgz",
- "integrity": "sha512-a+nAnDsiUA84Sy/a+FKYJtjOjFvNtW8Jcbi3NwE8kJKPpYAxINFLYsC9mev9/wngiNEBA3jfHn0qNFwICeZNJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@xhmikosr/decompress-tar": "^8.1.0",
- "file-type": "^20.5.0",
- "is-stream": "^2.0.1",
- "xz-decompress": "^0.2.3"
- },
- "engines": {
- "node": ">=20"
- }
- },
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -390,32 +364,6 @@
"node": ">=18"
}
},
- "node_modules/@tokenizer/inflate": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz",
- "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "fflate": "^0.8.2",
- "token-types": "^6.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/@tokenizer/token": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
- "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -709,36 +657,6 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@xhmikosr/decompress-tar": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tar/-/decompress-tar-8.1.0.tgz",
- "integrity": "sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "file-type": "^20.5.0",
- "is-stream": "^2.0.1",
- "tar-stream": "^3.1.7"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@xhmikosr/decompress-unzip": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-7.1.0.tgz",
- "integrity": "sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "file-type": "^20.5.0",
- "get-stream": "^6.0.1",
- "yauzl": "^3.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
@@ -806,6 +724,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-wrap": "0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ansi-regex": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
@@ -832,6 +763,16 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -876,20 +817,45 @@
"dev": true,
"license": "MIT"
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "node_modules/auto-changelog": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.5.0.tgz",
+ "integrity": "sha512-UTnLjT7I9U2U/xkCUH5buDlp8C7g0SGChfib+iDrJkamcj5kaMqNKHNfbKJw1kthJUq8sUo3i3q2S6FzO/l/wA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "possible-typed-array-names": "^1.0.0"
+ "commander": "^7.2.0",
+ "handlebars": "^4.7.7",
+ "import-cwd": "^3.0.0",
+ "node-fetch": "^2.6.1",
+ "parse-github-url": "^1.0.3",
+ "semver": "^7.3.5"
},
- "engines": {
- "node": ">= 0.4"
+ "bin": {
+ "auto-changelog": "src/index.js"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8.3"
+ }
+ },
+ "node_modules/auto-changelog/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/autolinker": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz",
+ "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "gulp-header": "^1.7.1"
}
},
"node_modules/aws-sign2": {
@@ -909,21 +875,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/b4a": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
- "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
- "dev": true,
- "license": "Apache-2.0",
- "peerDependencies": {
- "react-native-b4a": "*"
- },
- "peerDependenciesMeta": {
- "react-native-b4a": {
- "optional": true
- }
- }
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -931,42 +882,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/bare-events": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz",
- "integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==",
- "dev": true,
- "license": "Apache-2.0",
- "peerDependencies": {
- "bare-abort-controller": "*"
- },
- "peerDependenciesMeta": {
- "bare-abort-controller": {
- "optional": true
- }
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -977,25 +892,6 @@
"tweetnacl": "^0.14.3"
}
},
- "node_modules/bl": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
- "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "^2.3.5",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/boolean": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
- "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "license": "MIT"
- },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -1020,116 +916,13 @@
"node": ">=8"
}
},
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
- }
- },
- "node_modules/buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT"
},
- "node_modules/call-bind": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
- "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.0",
- "es-define-property": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -1357,6 +1150,21 @@
"node": ">=0.10.0"
}
},
+ "node_modules/coffee-script": {
+ "version": "1.12.7",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
+ "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cake": "bin/cake",
+ "coffee": "bin/coffee"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1407,6 +1215,32 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1484,284 +1318,44 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/decompress": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
- "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "decompress-tar": "^4.0.0",
- "decompress-tarbz2": "^4.0.0",
- "decompress-targz": "^4.0.0",
- "decompress-unzip": "^4.0.1",
- "graceful-fs": "^4.1.10",
- "make-dir": "^1.0.0",
- "pify": "^2.3.0",
- "strip-dirs": "^2.0.0"
- },
"engines": {
- "node": ">=4"
+ "node": ">=4.0.0"
}
},
- "node_modules/decompress-tar": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
- "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "file-type": "^5.2.0",
- "is-stream": "^1.1.0",
- "tar-stream": "^1.5.2"
- },
"engines": {
- "node": ">=4"
+ "node": ">=0.4.0"
}
},
- "node_modules/decompress-tar/node_modules/file-type": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
- "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=6"
}
},
- "node_modules/decompress-tar/node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decompress-tar/node_modules/tar-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
- "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bl": "^1.0.0",
- "buffer-alloc": "^1.2.0",
- "end-of-stream": "^1.0.0",
- "fs-constants": "^1.0.0",
- "readable-stream": "^2.3.0",
- "to-buffer": "^1.1.1",
- "xtend": "^4.0.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/decompress-tarbz2": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
- "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "decompress-tar": "^4.1.0",
- "file-type": "^6.1.0",
- "is-stream": "^1.1.0",
- "seek-bzip": "^1.0.5",
- "unbzip2-stream": "^1.0.9"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/decompress-tarbz2/node_modules/file-type": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
- "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/decompress-tarbz2/node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decompress-targz": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
- "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "decompress-tar": "^4.1.1",
- "file-type": "^5.2.0",
- "is-stream": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/decompress-targz/node_modules/file-type": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
- "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/decompress-targz/node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decompress-unzip": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
- "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "file-type": "^3.8.0",
- "get-stream": "^2.2.0",
- "pify": "^2.3.0",
- "yauzl": "^2.4.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/decompress-unzip/node_modules/file-type": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
- "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decompress-unzip/node_modules/get-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
- "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object-assign": "^4.0.1",
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decompress-unzip/node_modules/yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/devlop": {
+ "node_modules/devlop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
"integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
@@ -1775,19 +1369,14 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "node_modules/diacritics-map": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz",
+ "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.8.0"
}
},
"node_modules/eastasianwidth": {
@@ -1815,16 +1404,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/end-of-stream": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -1838,19 +1417,6 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/envalid": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/envalid/-/envalid-8.1.0.tgz",
- "integrity": "sha512-OT6+qVhKVyCidaGoXflb2iK1tC8pd0OV2Q+v9n33wNhUJ+lus+rJobUj4vJaQBPxPZ0vYrPGuxdrenyCAIJcow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "2.8.1"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/error-ex": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
@@ -1861,46 +1427,6 @@
"is-arrayish": "^0.2.1"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -2166,6 +1692,20 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/esquery": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
@@ -2212,16 +1752,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/events-universal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
- "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.7.0"
- }
- },
"node_modules/exit-hook": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
@@ -2232,6 +1762,62 @@
"node": ">=0.10.0"
}
},
+ "node_modules/expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range/node_modules/fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range/node_modules/is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range/node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -2239,6 +1825,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -2263,13 +1862,6 @@
"dev": true,
"license": "Apache-2.0"
},
- "node_modules/fast-fifo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
@@ -2324,23 +1916,6 @@
"reusify": "^1.0.4"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
- "node_modules/fflate": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
- "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/figures": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
@@ -2378,25 +1953,6 @@
"node": ">=16.0.0"
}
},
- "node_modules/file-type": {
- "version": "20.5.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.5.0.tgz",
- "integrity": "sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tokenizer/inflate": "^0.2.6",
- "strtok3": "^10.2.0",
- "token-types": "^6.0.0",
- "uint8array-extras": "^1.4.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
- }
- },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -2445,20 +2001,14 @@
"dev": true,
"license": "ISC"
},
- "node_modules/for-each": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
- "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "is-callable": "^1.2.7"
- },
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.10.0"
}
},
"node_modules/foreground-child": {
@@ -2503,13 +2053,6 @@
"node": ">= 0.12"
}
},
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -2542,58 +2085,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -2641,24 +2132,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/global-agent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
- "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "boolean": "^3.0.1",
- "es6-error": "^4.1.1",
- "matcher": "^3.0.0",
- "roarr": "^2.15.3",
- "semver": "^7.3.2",
- "serialize-error": "^7.0.1"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
"node_modules/globals": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
@@ -2672,49 +2145,102 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/globalthis": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/gray-matter": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
+ "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
+ "ansi-red": "^0.1.1",
+ "coffee-script": "^1.12.4",
+ "extend-shallow": "^2.0.1",
+ "js-yaml": "^3.8.1",
+ "toml": "^2.3.2"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.10.0"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "node_modules/gray-matter/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/gray-matter/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "node_modules/gray-matter/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true,
- "license": "ISC"
+ "license": "BSD-3-Clause"
},
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "node_modules/gulp-header": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+ "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+ "deprecated": "Removed event-stream from gulp-header",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "concat-with-sourcemaps": "*",
+ "lodash.template": "^4.4.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
},
"node_modules/har-schema": {
"version": "2.0.0",
@@ -2750,70 +2276,28 @@
"dependencies": {
"ansi-regex": "^2.0.0"
},
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-ansi/node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.10.0"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
"node_modules/hasown": {
@@ -2852,27 +2336,6 @@
"npm": ">=1.3.7"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
"node_modules/ignore": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
@@ -2883,6 +2346,19 @@
"node": ">= 4"
}
},
+ "node_modules/import-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+ "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "import-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/import-fresh": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -2900,6 +2376,29 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/import-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+ "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-from/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -3043,18 +2542,12 @@
"dev": true,
"license": "MIT"
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT"
},
"node_modules/is-core-module": {
"version": "2.16.1",
@@ -3083,6 +2576,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3127,13 +2630,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/is-natural-number": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
- "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -3144,33 +2640,17 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
"license": "MIT",
"dependencies": {
- "which-typed-array": "^1.1.16"
+ "isobject": "^3.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.10.0"
}
},
"node_modules/is-typedarray": {
@@ -3201,6 +2681,16 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -3349,6 +2839,32 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "set-getter": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/lcid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
@@ -3386,6 +2902,35 @@
"uc.micro": "^2.0.0"
}
},
+ "node_modules/list-item": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz",
+ "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expand-range": "^1.8.1",
+ "extend-shallow": "^2.0.1",
+ "is-number": "^2.1.0",
+ "repeat-string": "^1.5.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/list-item/node_modules/is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
@@ -3426,6 +2971,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
@@ -3440,37 +2992,36 @@
"dev": true,
"license": "MIT"
},
- "node_modules/lru-cache": {
- "version": "11.2.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
- "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
+ "node_modules/lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": "20 || >=22"
+ "license": "MIT",
+ "dependencies": {
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.templatesettings": "^4.0.0"
}
},
- "node_modules/make-dir": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "node_modules/lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "pify": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
+ "lodash._reinterpolate": "^3.0.0"
}
},
- "node_modules/make-dir/node_modules/pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "node_modules/lru-cache": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"engines": {
- "node": ">=4"
+ "node": "20 || >=22"
}
},
"node_modules/markdown-it": {
@@ -3491,6 +3042,43 @@
"markdown-it": "bin/markdown-it.mjs"
}
},
+ "node_modules/markdown-link": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz",
+ "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/markdown-toc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz",
+ "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "concat-stream": "^1.5.2",
+ "diacritics-map": "^0.1.0",
+ "gray-matter": "^2.1.0",
+ "lazy-cache": "^2.0.2",
+ "list-item": "^1.1.1",
+ "markdown-link": "^0.1.1",
+ "minimist": "^1.2.0",
+ "mixin-deep": "^1.1.3",
+ "object.pick": "^1.2.0",
+ "remarkable": "^1.7.1",
+ "repeat-string": "^1.6.1",
+ "strip-color": "^0.1.0"
+ },
+ "bin": {
+ "markdown-toc": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/markdownlint": {
"version": "0.38.0",
"resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz",
@@ -3540,28 +3128,12 @@
"node": ">=20"
}
},
- "node_modules/matcher": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
- "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "node_modules/math-random": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
+ "license": "MIT"
},
"node_modules/mdurl": {
"version": "2.0.0",
@@ -4189,6 +3761,33 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-deep/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -4210,6 +3809,34 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
"node_modules/normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -4263,14 +3890,17 @@
"node": ">=0.10.0"
}
},
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
}
},
"node_modules/once": {
@@ -4391,9 +4021,22 @@
"is-decimal": "^2.0.0",
"is-hexadecimal": "^2.0.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-github-url": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz",
+ "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "parse-github-url": "cli.js"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
"node_modules/parse-json": {
@@ -4471,13 +4114,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -4563,16 +4199,6 @@
"node": ">=18"
}
},
- "node_modules/possible-typed-array-names": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
- "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -4683,6 +4309,41 @@
],
"license": "MIT"
},
+ "node_modules/randomatic": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+ "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/randomatic/node_modules/is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/randomatic/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -4760,6 +4421,60 @@
"node": ">=0.10.0"
}
},
+ "node_modules/remarkable": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz",
+ "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.10",
+ "autolinker": "~0.28.0"
+ },
+ "bin": {
+ "remarkable": "bin/remarkable.js"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/remarkable/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/remarkable/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/repeat-element": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -4866,24 +4581,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/roarr": {
- "version": "2.15.4",
- "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
- "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "boolean": "^3.0.1",
- "detect-node": "^2.0.4",
- "globalthis": "^1.0.1",
- "json-stringify-safe": "^5.0.1",
- "semver-compare": "^1.0.0",
- "sprintf-js": "^1.1.2"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
"node_modules/run-async": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
@@ -4968,27 +4665,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/seek-bzip": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
- "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "commander": "^2.8.1"
- },
- "bin": {
- "seek-bunzip": "bin/seek-bunzip",
- "seek-table": "bin/seek-bzip-table"
- }
- },
- "node_modules/seek-bzip/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@@ -5002,29 +4678,6 @@
"node": ">=10"
}
},
- "node_modules/semver-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/serialize-error": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.13.1"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -5032,22 +4685,17 @@
"dev": true,
"license": "ISC"
},
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "node_modules/set-getter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
+ "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
+ "to-object-path": "^0.3.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
}
},
"node_modules/shebang-command": {
@@ -5073,26 +4721,6 @@
"node": ">=8"
}
},
- "node_modules/shellcheck": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/shellcheck/-/shellcheck-4.1.0.tgz",
- "integrity": "sha512-8143z6YGO4+Puwp9Ghn/g7+QxllSKlXaZSm3HXfvQXUfRXhM5P8TPORRHBBlyobl9BnniVne+d1Ff6RgNiccsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@felipecrs/decompress-tarxz": "5.0.4",
- "@xhmikosr/decompress-unzip": "7.1.0",
- "decompress": "4.2.1",
- "envalid": "8.1.0",
- "global-agent": "3.0.0"
- },
- "bin": {
- "shellcheck": "bin/shellcheck.js"
- },
- "engines": {
- "node": ">=20.9.0"
- }
- },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -5119,6 +4747,16 @@
"url": "https://github.com/sponsors/cyyynthia"
}
},
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/spdx-correct": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
@@ -5155,13 +4793,6 @@
"dev": true,
"license": "CC0-1.0"
},
- "node_modules/sprintf-js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
"node_modules/sshpk": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
@@ -5188,18 +4819,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/streamx": {
- "version": "2.23.0",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
- "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "events-universal": "^1.0.0",
- "fast-fifo": "^1.3.2",
- "text-decoder": "^1.1.0"
- }
- },
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -5334,14 +4953,14 @@
"node": ">=0.10.0"
}
},
- "node_modules/strip-dirs": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
- "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
+ "node_modules/strip-color": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz",
+ "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "is-natural-number": "^4.0.1"
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/strip-json-comments": {
@@ -5357,23 +4976,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/strtok3": {
- "version": "10.3.4",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz",
- "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tokenizer/token": "^0.3.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
"node_modules/supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -5413,28 +5015,6 @@
"url": "https://opencollective.com/synckit"
}
},
- "node_modules/tar-stream": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
- "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "b4a": "^1.6.4",
- "fast-fifo": "^1.2.0",
- "streamx": "^2.15.0"
- }
- },
- "node_modules/text-decoder": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
- "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "b4a": "^1.6.4"
- }
- },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -5442,28 +5022,30 @@
"dev": true,
"license": "MIT"
},
- "node_modules/to-buffer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz",
- "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==",
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "isarray": "^2.0.5",
- "safe-buffer": "^5.2.1",
- "typed-array-buffer": "^1.0.3"
+ "kind-of": "^3.0.2"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
}
},
- "node_modules/to-buffer/node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -5477,24 +5059,12 @@
"node": ">=8.0"
}
},
- "node_modules/token-types": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz",
- "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==",
+ "node_modules/toml": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+ "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@borewit/text-codec": "^0.1.0",
- "@tokenizer/token": "^0.3.0",
- "ieee754": "^1.2.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
+ "license": "MIT"
},
"node_modules/tough-cookie": {
"version": "2.5.0",
@@ -5510,6 +5080,13 @@
"node": ">=0.8"
}
},
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -5523,13 +5100,6 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD"
- },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -5563,33 +5133,12 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typed-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- }
+ "license": "MIT"
},
"node_modules/typescript": {
"version": "5.9.3",
@@ -5613,28 +5162,18 @@
"dev": true,
"license": "MIT"
},
- "node_modules/uint8array-extras": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
- "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/unbzip2-stream": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
- "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer": "^5.2.1",
- "through": "^2.3.8"
+ "engines": {
+ "node": ">=0.8.0"
}
},
"node_modules/uri-js": {
@@ -5698,6 +5237,24 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -5721,28 +5278,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/which-typed-array": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
- "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "for-each": "^0.3.5",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/window-size": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
@@ -5766,6 +5301,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -5881,16 +5423,6 @@
"node": ">=0.4"
}
},
- "node_modules/xz-decompress": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/xz-decompress/-/xz-decompress-0.2.3.tgz",
- "integrity": "sha512-O8v6HG8T0PrKBcpyWA13GkSYWFvncwzuzcLx5A7++l3HsE3atmoetXjIxrZ/JV/nbvSZ7WS4+3XvREZuVn+rEA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/y18n": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
@@ -5983,20 +5515,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/yauzl": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz",
- "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-crc32": "~0.2.3",
- "pend": "~1.2.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 1853af5..234658f 100644
--- a/package.json
+++ b/package.json
@@ -1,52 +1,58 @@
{
- "name": "lightspeedwp-scripts",
- "version": "0.1.0",
- "description": "LightSpeed WordPress automation scripts and workflows",
- "main": "index.js",
- "scripts": {
- "test": "bats tests/test-*.bats",
- "test:dry-run": "find tests/ -name 'dry-run-*.sh' -exec {} \\;",
- "lint:md": "markdownlint '**/*.md'",
- "lint:sh": "shellcheck scripts/*.sh",
- "lint:js": "eslint .",
- "format": "prettier --write .",
- "lint": "npm run lint:md && npm run lint:sh && npm run lint:js",
- "validate": "npm run lint && npm run test"
- },
- "directories": {
- "doc": "docs",
- "test": "tests"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/lightspeedwp/scripts.git"
- },
- "keywords": [
- "wordpress",
- "automation",
- "github-actions",
- "deployment",
- "scripts"
- ],
- "author": "LightSpeed WP",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/lightspeedwp/scripts/issues"
- },
- "homepage": "https://github.com/lightspeedwp/scripts#readme",
- "devDependencies": {
- "@eslint/js": "^9.37.0",
- "@playwright/test": "^1.56.0",
- "@typescript-eslint/eslint-plugin": "^8.46.0",
- "@typescript-eslint/parser": "^8.46.0",
- "all-contributors-cli": "^3.1.1",
- "auto-changelog": "^2.4.0",
- "eslint": "^9.37.0",
- "eslint-config-prettier": "^10.1.8",
- "eslint-plugin-prettier": "^5.5.4",
- "markdownlint-cli": "^0.45.0",
- "playwright": "^1.56.0",
- "prettier": "^3.6.2",
- "shellcheck": "^4.1.0"
- }
-}
\ No newline at end of file
+ "name": "lightspeedwp-scripts",
+ "version": "0.1.0",
+ "type": "module",
+ "description": "LightSpeed WordPress automation scripts and workflows",
+ "main": "index.js",
+ "scripts": {
+ "test": "bats tests/test-*.bats || echo 'Note: Install bats-core to run shell script tests'",
+ "test:playwright": "npx playwright test",
+ "test:dry-run": "find tests/ -name 'dry-run-*.sh' -exec {} \\; || echo 'Note: No dry-run tests found'",
+ "lint:md": "npx markdownlint '**/*.md'",
+ "lint:sh": "find scripts -name '*.sh' -exec shellcheck {} \\;",
+ "lint:js": "npx eslint .",
+ "format": "npx prettier --write .",
+ "lint": "npm run lint:md && npm run lint:sh && npm run lint:js",
+ "validate": "npm run lint && npm run test",
+ "update:toc": "npx markdown-toc -i README.md",
+ "update:changelog": "npx auto-changelog -p --commit-limit 20 --output CHANGELOG.md",
+ "update:contributors": "npx all-contributors generate",
+ "maintenance": "npm run update:toc && npm run update:contributors && npm run update:changelog"
+ },
+ "directories": {
+ "doc": "docs",
+ "test": "tests"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/lightspeedwp/scripts.git"
+ },
+ "keywords": [
+ "wordpress",
+ "automation",
+ "github-actions",
+ "deployment",
+ "scripts"
+ ],
+ "author": "LightSpeed WP",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/lightspeedwp/scripts/issues"
+ },
+ "homepage": "https://github.com/lightspeedwp/scripts#readme",
+ "devDependencies": {
+ "@eslint/js": "^9.37.0",
+ "@playwright/test": "^1.56.0",
+ "@typescript-eslint/eslint-plugin": "^8.46.0",
+ "@typescript-eslint/parser": "^8.46.0",
+ "all-contributors-cli": "^3.1.1",
+ "auto-changelog": "^2.4.0",
+ "eslint": "^9.37.0",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-prettier": "^5.5.4",
+ "markdown-toc": "^1.2.0",
+ "markdownlint-cli": "^0.45.0",
+ "playwright": "^1.56.0",
+ "prettier": "^3.6.2"
+ }
+}
diff --git a/scripts/README.md b/scripts/README.md
index d5d4d2e..dc194d3 100644
--- a/scripts/README.md
+++ b/scripts/README.md
@@ -1,37 +1,34 @@
-
-
# Scripts Directory Structure
-
This directory contains all automation scripts for LightSpeed WP, organized by function for clarity and maintainability. **All scripts are now located in their respective subfolders; no executable scripts remain in the root.**
## Subfolder Organization
Scripts are grouped as follows:
-| Subfolder | Purpose |
-|---------------|--------------------------------------------------------------|
+| Subfolder | Purpose |
+| -------------- | --------------------------------------------------------------------------------------------- |
| `deployment/` | Deployment automation scripts (e.g., client delivery, dry-run validation, example deployment) |
-| `project/` | Project management and update scripts (e.g., product/project setup, field updates) |
-| `maintenance/` | Maintenance and label management scripts (e.g., prune/update/sync labels) |
-| `testing/` | Test harnesses, validation scripts, Playwright/Bats tests, test runners |
-| `utility/` | Utility functions and server startup scripts (shared helpers, MCP server) |
-| `dry-run/` | Dry-run scripts for safe validation of deployment/configuration |
-| `packages/` | Package management and related resources |
+| `project/` | Project management and update scripts (e.g., product/project setup, field updates) |
+| `maintenance/` | Maintenance and label management scripts (e.g., prune/update/sync labels) |
+| `testing/` | Test harnesses, validation scripts, Playwright/Bats tests, test runners |
+| `utility/` | Utility functions and server startup scripts (shared helpers, MCP server) |
+| `dry-run/` | Dry-run scripts for safe validation of deployment/configuration |
+| `packages/` | Package management and related resources |
Refer to each subfolder for specific scripts and usage instructions. The root README provides an overview and links to documentation, standards, and contribution guidelines.
## Subfolders Overview
-| Subfolder | Purpose |
-|---------------|--------------------------------------------------------------|
-| `deployment/` | Deployment automation scripts (e.g., client delivery, dry-run validation) |
+| Subfolder | Purpose |
+| -------------- | -------------------------------------------------------------------------- |
+| `deployment/` | Deployment automation scripts (e.g., client delivery, dry-run validation) |
| `project/` | Project management and update scripts (e.g., project setup, field updates) |
-| `maintenance/` | Maintenance and label management scripts (e.g., prune/update labels) |
-| `testing/` | Test harnesses, validation scripts, and Playwright/Bats tests |
-| `utility/` | Utility functions and server startup scripts (shared helpers) |
-| `dry-run/` | Dry-run scripts for safe validation of deployment/configuration |
-| `packages/` | Package management and related resources |
+| `maintenance/` | Maintenance and label management scripts (e.g., prune/update labels) |
+| `testing/` | Test harnesses, validation scripts, and Playwright/Bats tests |
+| `utility/` | Utility functions and server startup scripts (shared helpers) |
+| `dry-run/` | Dry-run scripts for safe validation of deployment/configuration |
+| `packages/` | Package management and related resources |
## How to Use
@@ -49,18 +46,17 @@ Refer to each subfolder for specific scripts and usage instructions. The root RE
- **Dry-run**: Safe validation scripts
- **Packages**: Package management
-
## Playwright MCP Server Automation
This repo includes automation to ensure Playwright MCP and GitHub MCP servers are always running for reliable testing and automation. Key features:
- **Copilot instructions** for Playwright and MCP server management in `.github/instructions/playwright-copilot.md`.
- **Server startup and health scripts** in `scripts/utility/`:
- - `start-mcp-server.sh`: Starts MCP server if not running
- - `check-mcp-server-health.sh`: Checks health and restarts MCP server if needed
+ - `start-mcp-server.sh`: Starts MCP server if not running
+ - `check-mcp-server-health.sh`: Checks health and restarts MCP server if needed
- **GitHub Actions workflow** in `.github/workflows/playwright-mcp-server.yml`:
- - Starts MCP server, runs health check, and executes Playwright tests
- - Auto-restarts MCP server if stopped
+ - Starts MCP server, runs health check, and executes Playwright tests
+ - Auto-restarts MCP server if stopped
- **Playwright tests** in `scripts/testing/playwright-mcp-server.spec.ts` validate MCP server health endpoint
### Setup & Integration
@@ -97,8 +93,8 @@ See the automation workflow and utility scripts for usage details and integratio
For update-projects.sh usage, flags, testing, and code comment standards, see [update-projects/README.update-projects.md](../update-projects/README.update-projects.md).
-
## Advanced Project Automation Scripts
+
`product_dev_project.sh` and related scripts automate GitHub ProjectV2 provisioning, field management, item/issue linking, and governance. Features include:
- Create/update projects, fields, items, and status
@@ -107,7 +103,6 @@ For update-projects.sh usage, flags, testing, and code comment standards, see [u
- Full alignment with org-wide meta/template files and governance standards
- Bats test coverage and error handling
-
See usage examples in this README and [LIGHTSPEED_AUTOMATION_HANDBOOK.md](../LIGHTSPEED_AUTOMATION_HANDBOOK.md).
This repository integrates advanced GitHub Project automation, issue/PR labeling, and workflow strategies. All automation scripts, workflows, and label conventions are aligned with the organization-wide standards described in:
@@ -157,7 +152,6 @@ This repository integrates advanced GitHub Project automation, issue/PR labeling
#### Extending Automation
-
You can extend the script to automate:
- Project updates (`updateProjectV2`)
@@ -170,17 +164,17 @@ Refer to the [GitHub GraphQL API documentation for mutation details](https://doc
#### Example Workflow
1. Create a new project:
- `./product_dev_project.sh lightspeedwp "Internal Automation & Docs"`
+ `./product_dev_project.sh lightspeedwp "Internal Automation & Docs"`
2. Add a draft issue:
- `./product_dev_project.sh add-draft-issue "Initial Planning" "Kickoff meeting and requirements gathering."`
+ `./product_dev_project.sh add-draft-issue "Initial Planning" "Kickoff meeting and requirements gathering."`
3. Link a repository:
- `./product_dev_project.sh link-repo lightspeedwp scripts`
+ `./product_dev_project.sh link-repo lightspeedwp scripts`
4. Link a team:
- `./product_dev_project.sh link-team lightspeedwp devops`
+ `./product_dev_project.sh link-team lightspeedwp devops`
5. Update a label for a project item:
- `./product_dev_project.sh update-label `
+ `./product_dev_project.sh update-label `
6. Update issue type for a project item:
- `./product_dev_project.sh update-issue-type `
+ `./product_dev_project.sh update-issue-type `
---
diff --git a/scripts/project/README.client-delivery-project.md b/scripts/project/README.client-delivery-project.md
index 46b0c3f..ea9b1e6 100644
--- a/scripts/project/README.client-delivery-project.md
+++ b/scripts/project/README.client-delivery-project.md
@@ -1,4 +1,3 @@
-
# client-delivery-project.sh
Provision and manage a GitHub ProjectV2 for client delivery engagements using Scrumban-style statuses and standardized fields.
@@ -47,25 +46,25 @@ This script automates the creation and update of a GitHub Project for client del
## Standard Fields Created
-| Field Name | Type | Options/Notes |
-|-----------------|--------------|------------------------------------------------|
-| Theme | Single-select| Design System, Platform, ... |
-| Area | Single-select| Frontend, Backend, ... |
-| Priority | Single-select| High, Medium, Low |
-| Severity | Single-select| Blocker, Critical, Major, Minor, Trivial |
-| Size | Single-select| XS, S, M, L, XL |
-| Phase | Single-select| Discovery, Build, QA, Launch, ... |
-| Release type | Single-select| Major, Minor, Patch |
-| Environment | Single-select| Production, Staging, QA, ... |
-| Status | Single-select| Todo, In Progress, Done, Blocked, ... |
-| Issue Type | Single-select| Bug, Feature, Chore, ... |
-| Milestone | Single-select| (custom per project) |
-| Story Points | Number | (for estimation) |
-| Estimate | Number | (for time/cost) |
-| Due Date | Date | (deadline) |
-| Start Date | Date | (kickoff) |
-| Deadline | Date | (final deadline) |
-| Assignee | Text | (person responsible) |
+| Field Name | Type | Options/Notes |
+| ------------ | ------------- | ---------------------------------------- |
+| Theme | Single-select | Design System, Platform, ... |
+| Area | Single-select | Frontend, Backend, ... |
+| Priority | Single-select | High, Medium, Low |
+| Severity | Single-select | Blocker, Critical, Major, Minor, Trivial |
+| Size | Single-select | XS, S, M, L, XL |
+| Phase | Single-select | Discovery, Build, QA, Launch, ... |
+| Release type | Single-select | Major, Minor, Patch |
+| Environment | Single-select | Production, Staging, QA, ... |
+| Status | Single-select | Todo, In Progress, Done, Blocked, ... |
+| Issue Type | Single-select | Bug, Feature, Chore, ... |
+| Milestone | Single-select | (custom per project) |
+| Story Points | Number | (for estimation) |
+| Estimate | Number | (for time/cost) |
+| Due Date | Date | (deadline) |
+| Start Date | Date | (kickoff) |
+| Deadline | Date | (final deadline) |
+| Assignee | Text | (person responsible) |
See [field spec doc](../docs/update-projects/client-delivery-field-specs-v1-1.md) for authoritative options, descriptions, and colors.
diff --git a/scripts/project/README.product-dev-project.md b/scripts/project/README.product-dev-project.md
index 56d84ff..fa5116f 100644
--- a/scripts/project/README.product-dev-project.md
+++ b/scripts/project/README.product-dev-project.md
@@ -1,4 +1,3 @@
-
# product-dev-project.sh
Provision and manage a GitHub ProjectV2 for internal product development, supporting all automatable ProjectV2 actions and standardized fields.
@@ -47,25 +46,25 @@ This script automates the creation and update of a GitHub Project for product de
## Standard Fields Created
-| Field Name | Type | Options/Notes |
-|-----------------|--------------|------------------------------------------------|
-| Theme | Single-select| Design System, Platform, ... |
-| Area | Single-select| Frontend, Backend, ... |
-| Priority | Single-select| High, Medium, Low |
-| Severity | Single-select| Blocker, Critical, Major, Minor, Trivial |
-| Size | Single-select| XS, S, M, L, XL |
-| Phase | Single-select| Discovery, Build, QA, Launch, ... |
-| Release type | Single-select| Major, Minor, Patch |
-| Environment | Single-select| Production, Staging, QA, ... |
-| Status | Single-select| Todo, In Progress, Done, Blocked, ... |
-| Issue Type | Single-select| Bug, Feature, Chore, ... |
-| Milestone | Single-select| (custom per project) |
-| Story Points | Number | (for estimation) |
-| Estimate | Number | (for time/cost) |
-| Due Date | Date | (deadline) |
-| Start Date | Date | (kickoff) |
-| Deadline | Date | (final deadline) |
-| Assignee | Text | (person responsible) |
+| Field Name | Type | Options/Notes |
+| ------------ | ------------- | ---------------------------------------- |
+| Theme | Single-select | Design System, Platform, ... |
+| Area | Single-select | Frontend, Backend, ... |
+| Priority | Single-select | High, Medium, Low |
+| Severity | Single-select | Blocker, Critical, Major, Minor, Trivial |
+| Size | Single-select | XS, S, M, L, XL |
+| Phase | Single-select | Discovery, Build, QA, Launch, ... |
+| Release type | Single-select | Major, Minor, Patch |
+| Environment | Single-select | Production, Staging, QA, ... |
+| Status | Single-select | Todo, In Progress, Done, Blocked, ... |
+| Issue Type | Single-select | Bug, Feature, Chore, ... |
+| Milestone | Single-select | (custom per project) |
+| Story Points | Number | (for estimation) |
+| Estimate | Number | (for time/cost) |
+| Due Date | Date | (deadline) |
+| Start Date | Date | (kickoff) |
+| Deadline | Date | (final deadline) |
+| Assignee | Text | (person responsible) |
See [field spec doc](../docs/update-projects/product-development-field-specs-v1-1.md) for authoritative options, descriptions, and colors.
diff --git a/scripts/project/README.update-projects.md b/scripts/project/README.update-projects.md
index 78a1225..15c5ead 100644
--- a/scripts/project/README.update-projects.md
+++ b/scripts/project/README.update-projects.md
@@ -1,5 +1,3 @@
-
-
# update-projects.sh
This script automates the creation, update, and deletion of GitHub Project fields for LightSpeed WP projects using the GitHub CLI (`gh`). It supports both interactive and non-interactive usage, CSV-driven field management, dry-run mode, and advanced authentication options.
@@ -11,30 +9,30 @@ This script automates the creation, update, and deletion of GitHub Project field
- Enables strict error handling (`set -euo pipefail`).
- Defines colorized logging functions for clear output.
-2.**Argument Parsing**
+ 2.**Argument Parsing**
- Parses command-line options to determine project owner, project number, field CSV file, dry-run mode, and other behaviors.
- Example: `--fields-file ` specifies a CSV of fields to create or delete.
-3.**Authentication & Scopes**
+ 3.**Authentication & Scopes**
- Checks for the GitHub CLI and verifies authentication.
- Supports GitHub App authentication via environment variables.
- Validates required scopes (`repo`, `project`, `read:org`, `read:user`) and can auto-refresh them interactively if needed.
-4.**Project Detection**
+ 4.**Project Detection**
- Auto-detects project owner and number from environment variables, git remote, or authenticated user.
- Can parse these from `LS_PROJECT_URL` if set.
-5.**Field Management**
+ 5.**Field Management**
- Reads field definitions from a CSV file (see format below).
- For each field, either creates or deletes (archives) it using the GitHub CLI.
- Supports single-select, number, date, and text field types.
- In dry-run mode, prints the commands instead of executing them.
-6.**Execution Flow**
+ 6.**Execution Flow**
- Runs all checks and processes fields as specified.
- If no CSV is provided, creates example fields for demonstration.
@@ -82,15 +80,15 @@ gh auth refresh -s repo,project,read:org,read:user
## Flags & Options
-| Option | Description |
-|-----------------------|-----------------------------------------------------------------------------|
-| `--project-owner ` | Override project owner (default: auto-detect from repo or LS_PROJECT_URL) |
-| `--project-number ` | Override project number (default: auto-detect from LS_PROJECT_URL) |
-| `--fields-file ` | CSV file of fields to create (see format below) |
-| `--delete-fields` | Delete (archive) fields listed in CSV instead of creating them |
-| `--auto-refresh` | Interactively refresh GitHub CLI scopes if needed |
-| `--dry-run` | Print commands instead of executing them |
-| `--help` | Show this help message |
+| Option | Description |
+| ------------------------ | ------------------------------------------------------------------------- |
+| `--project-owner ` | Override project owner (default: auto-detect from repo or LS_PROJECT_URL) |
+| `--project-number ` | Override project number (default: auto-detect from LS_PROJECT_URL) |
+| `--fields-file ` | CSV file of fields to create (see format below) |
+| `--delete-fields` | Delete (archive) fields listed in CSV instead of creating them |
+| `--auto-refresh` | Interactively refresh GitHub CLI scopes if needed |
+| `--dry-run` | Print commands instead of executing them |
+| `--help` | Show this help message |
## CSV Format for Field Creation
@@ -219,15 +217,15 @@ gh auth refresh -s repo,project,read:org,read:user
## Flags & Options
-| Option | Description |
-|-----------------------|-----------------------------------------------------------------------------|
-| `--project-owner ` | Override project owner (default: auto-detect from repo or LS_PROJECT_URL) |
-| `--project-number ` | Override project number (default: auto-detect from LS_PROJECT_URL) |
-| `--fields-file ` | CSV file of fields to create (see format below) |
-| `--delete-fields` | Delete (archive) fields listed in CSV instead of creating them |
-| `--auto-refresh` | Interactively refresh GitHub CLI scopes if needed |
-| `--dry-run` | Print commands instead of executing them |
-| `--help` | Show this help message |
+| Option | Description |
+| ------------------------ | ------------------------------------------------------------------------- |
+| `--project-owner ` | Override project owner (default: auto-detect from repo or LS_PROJECT_URL) |
+| `--project-number ` | Override project number (default: auto-detect from LS_PROJECT_URL) |
+| `--fields-file ` | CSV file of fields to create (see format below) |
+| `--delete-fields` | Delete (archive) fields listed in CSV instead of creating them |
+| `--auto-refresh` | Interactively refresh GitHub CLI scopes if needed |
+| `--dry-run` | Print commands instead of executing them |
+| `--help` | Show this help message |
## CSV Format for Field Creation
@@ -242,6 +240,7 @@ Assignee,text,
Due Date,date,
Story Points,number,
```
+
- Lines starting with `#` are ignored.
- For single-select fields, list options separated by commas after the type.
- For number, date, or text fields, leave the options column empty.
diff --git a/scripts/testing/playwright-mcp-server-automation.md b/scripts/testing/playwright-mcp-server-automation.md
index 7018a4b..5fe56d5 100644
--- a/scripts/testing/playwright-mcp-server-automation.md
+++ b/scripts/testing/playwright-mcp-server-automation.md
@@ -3,6 +3,7 @@
This document describes the automation strategy for Playwright Copilot and MCP server integration in the LightSpeed WP scripts repository.
## Goals
+
- Ensure Playwright MCP and GitHub MCP servers are always running for reliable automation and testing.
- Automate server startup, restart, and health checks via workflow steps or process manager.
- Provide Copilot instructions for Playwright automation and MCP server management.
@@ -11,43 +12,49 @@ This document describes the automation strategy for Playwright Copilot and MCP s
## Implementation Overview
### 1. Playwright-Specific Copilot Instructions
+
- Add Copilot instructions for Playwright automation in `.github/instructions/playwright-copilot.md`.
- Include patterns for MCP server auto-activation, restart, and health checks.
- Document integration points with workflows and scripts.
### 2. MCP Server Automation Workflow
+
- Create a GitHub Actions workflow (`.github/workflows/playwright-mcp-server.yml`) to:
- - Start MCP server before Playwright tests.
- - Restart MCP server if not healthy.
- - Run Playwright tests against MCP endpoints.
- - Document workflow steps and error handling.
+ - Start MCP server before Playwright tests.
+ - Restart MCP server if not healthy.
+ - Run Playwright tests against MCP endpoints.
+ - Document workflow steps and error handling.
### 3. Server Startup & Health Scripts
+
- Add shell scripts to `scripts/utility/` for MCP server startup, restart, and health checks.
- Ensure scripts are idempotent and log status.
- Integrate with workflow and Copilot instructions.
### 4. Documentation
+
- Update `scripts/README.md` and workflow README to explain MCP server automation, setup, and integration.
- Include troubleshooting, restart logic, and workflow usage examples.
## Example Workflow Snippet
+
```yaml
jobs:
- mcp-server:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
- - name: Start MCP server
- run: ./scripts/utility/start-mcp-server.sh
- - name: Health check MCP server
- run: ./scripts/utility/check-mcp-server-health.sh
- - name: Run Playwright tests
- run: npx playwright test
+ mcp-server:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Start MCP server
+ run: ./scripts/utility/start-mcp-server.sh
+ - name: Health check MCP server
+ run: ./scripts/utility/check-mcp-server-health.sh
+ - name: Run Playwright tests
+ run: npx playwright test
```
## Next Steps
+
- Implement and test automation scripts and workflow.
- Expand Copilot instructions for Playwright/MCP integration.
- Document all changes and update test coverage.
diff --git a/tests/README.md b/tests/README.md
index 3d4e9af..ae6ab5c 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -1,15 +1,15 @@
-
# Tests Directory
This directory contains test harnesses using Bats (Bash Automated Testing System) and dry-run scripts for validation.
- [](https://opensource.org/licenses/ISC)
- [](https://github.com/lightspeedwp/scripts/actions/workflows/run-tests.yml)
- [](https://github.com/lightspeedwp/scripts/actions/workflows/playwright.yml)
- [](https://github.com/lightspeedwp/scripts/actions/workflows/lint.yml)
+[](https://opensource.org/licenses/ISC)
+[](https://github.com/lightspeedwp/scripts/actions/workflows/run-tests.yml)
+[](https://github.com/lightspeedwp/scripts/actions/workflows/playwright.yml)
+[](https://github.com/lightspeedwp/scripts/actions/workflows/lint.yml)
## CodeRabbit Review Automation
All tests in this directory are reviewed automatically by CodeRabbit for:
+
- Comprehensive coverage of scripts and automation features
- Error handling and edge case testing
- Integration with CI workflows and status checks
@@ -102,8 +102,8 @@ Playwright tests use the `@playwright/test` framework:
import { test, expect } from '@playwright/test';
test('homepage loads', async ({ page }) => {
- await page.goto('https://example.com');
- await expect(page).toHaveTitle(/Example Domain/);
+ await page.goto('https://example.com');
+ await expect(page).toHaveTitle(/Example Domain/);
});
```
@@ -154,6 +154,7 @@ Dry-run tests that validate configuration and setup without making changes.
Common testing utilities are available in `test-helper.bash` for reuse across test files.
## Release Automation & Changelog Management
+
\n## Changelog Automation & Governance
Changelog entries are required for all PRs and are enforced by CodeRabbit and CI workflows. Automated release processes generate and update changelogs from commit history, with manual fallback as needed.
@@ -177,15 +178,19 @@ See `.github/workflows/release.yml` for details.
```md
### Added
+
- Short description of new features or scripts
### Changed
+
- Short description of changes or improvements
### Fixed
+
- Short description of bug fixes
### Security
+
- Short description of security updates
```
diff --git a/tests/TEST_COVERAGE_SUMMARY.md b/tests/TEST_COVERAGE_SUMMARY.md
index 6743bc5..501f2a8 100644
--- a/tests/TEST_COVERAGE_SUMMARY.md
+++ b/tests/TEST_COVERAGE_SUMMARY.md
@@ -5,15 +5,18 @@ This document summarizes the comprehensive unit tests that were added to the Lig
## Test Files Created/Expanded
### 1. **tests/test-utility-functions.bats** (370+ tests)
+
Comprehensive test suite for `scripts/utility-functions.sh` covering:
#### Basic Validation (4 tests)
+
- Script structure and safety features
- Shebang and pipefail configuration
- Sourcing capability
- Constants definition
#### Logging Functions (16 tests)
+
- `log_info()`, `log_error()`, `log_warn()`, `log_success()`, `log_debug()`
- Color output verification
- Log level filtering
@@ -21,6 +24,7 @@ Comprehensive test suite for `scripts/utility-functions.sh` covering:
- Multi-line message support
#### Utility Functions (35+ tests)
+
- `command_exists()` - Command availability checking
- `check_dependencies()` - Dependency validation
- `confirm()` - Interactive confirmation
@@ -32,31 +36,37 @@ Comprehensive test suite for `scripts/utility-functions.sh` covering:
- `timestamp()` - Timestamp generation
#### Edge Cases & Integration (8 tests)
+
- Concurrent function calls
- Multiple sourcing
- Pipeline compatibility
- Error handling without exit
### 2. **tests/test-prune-labels.bats** (120+ tests)
+
Comprehensive test suite for `scripts/maintenance/prune-labels.bats` covering:
#### Script Validation (3 tests)
+
- Shebang and safety features
- Header documentation
#### Configuration (8 tests)
+
- Environment variables (ORG, CANON_REPO, LABELS_PATH)
- DRY_RUN and STRICT_PRUNE modes
- PROTECT_REGEX support
- ONLY variable for selective repos
#### Dependencies (4 tests)
+
- GitHub CLI (gh)
- jq for JSON processing
- yq for YAML processing
- base64 for content decoding
#### Core Functionality (11 tests)
+
- Temporary directory creation
- Cleanup trap
- Canonical label fetching
@@ -65,49 +75,58 @@ Comprehensive test suite for `scripts/maintenance/prune-labels.bats` covering:
- Label synchronization (create/update/delete)
#### Safety Features (5 tests)
+
- URI encoding
- Dry-run mode
- Protected labels
- Special character handling
#### Label Logic (5 tests)
+
- Existence checking
- Canonical label skipping
- Field processing (name, color, description)
- Array processing with mapfile
#### API Interaction (4 tests)
+
- REST API usage
- Rate limiting
- HTTP methods
- Field passing
#### Advanced Features (8 tests)
+
- Conservative pruning
- Pattern protection
- Batch processing
- Empty repository handling
#### Data Processing (3 tests)
+
- Property extraction
- Case-sensitive comparison
- Special name handling
#### Integration (2 tests)
+
- Workflow ordering
- Update before delete
#### Security (3 tests)
+
- Token safety
- Variable quoting
- Input validation
#### Documentation (3 tests)
+
- Usage information
- Environment variable docs
- Example invocations
#### Edge Cases (5 tests)
+
- Empty labels
- Empty descriptions
- Network failures
@@ -115,295 +134,357 @@ Comprehensive test suite for `scripts/maintenance/prune-labels.bats` covering:
- Special characters
#### Performance (3 tests)
+
- Pagination
- API call minimization
- Label caching
#### Maintainability (3 tests)
+
- Variable naming
- Consistent formatting
- Operation grouping
### 3. **tests/test-sync-org-labels.bats** (140+ tests)
+
Comprehensive test suite for `scripts/maintenance/sync-org-labels.sh` covering:
#### Basic Validation (3 tests)
+
- Script structure validation
- Safety features
- Documentation
#### Configuration (9 tests)
+
- All environment variables
- Default values
- Override capability
#### Dependencies (5 tests)
+
- Required tools verification
- GitHub CLI
- jq, yq, base64, mktemp
#### Core Functionality (12 tests)
+
- Complete workflow coverage
- API operations
- Repository management
#### Label Synchronization (7 tests)
+
- Create/update logic
- Existence checking
- Property handling
#### Pruning (5 tests)
+
- Optional pruning
- Pattern protection
- Canonical identification
#### Dry-Run (5 tests)
+
- Mode implementation
- Preview messages
- Execution control
#### Output (6 tests)
+
- Progress indicators
- Status reporting
- Completion messages
#### Repository Selection (4 tests)
+
- Selective targeting
- Array processing
- Iteration logic
#### API Interaction (5 tests)
+
- GitHub API usage
- HTTP methods
- Field passing
#### Error Handling (4 tests)
+
- Missing files
- Empty repos
- API failures
- Cleanup
#### Label Format (5 tests)
+
- Array format
- Property extraction
- Special characters
#### Comparison (3 tests)
+
- Case sensitivity
- Array printing
- Exact matching
#### Configuration Validation (3 tests)
+
- Organization setting
- Repository setting
- Path configuration
#### Label Patterns (6 tests)
+
- Protection patterns (cpt:, tax:, vendor:, release:, type:)
- Regex matching
#### Integration (2 tests)
+
- Workflow order
- Sync before prune
#### Security (3 tests)
+
- Token safety
- Variable quoting
- Input validation
#### Documentation (2 tests)
+
- Configuration docs
- Usage examples
#### Edge Cases (4 tests)
+
- Empty variables
- Empty values
- Network issues
- Malformed data
#### Performance (4 tests)
+
- Pagination
- Caching
- Batch processing
- API efficiency
#### Code Quality (4 tests)
+
- Variable naming
- Formatting
- Section organization
- Local variables
#### Robustness (4 tests)
+
- Special characters
- Large datasets
- Rate limiting
#### Maintainability (2 tests)
+
- Comments
- Consistent style
### 4. **tests/test-validate-release.bats** (80+ tests)
+
New comprehensive test suite for `scripts/validate-release.sh` covering:
#### Basic Validation (3 tests)
+
- Script structure
- Safety features
- Documentation
#### Help & Usage (5 tests)
+
- Help function
- Flag support (--help, -h)
- Usage examples
- Option descriptions
#### Configuration (6 tests)
+
- Required variables
- Default values
- Version settings
#### Logging (5 tests)
+
- All log functions
- Icon/emoji usage
#### Version Validation (4 tests)
+
- Format validation
- File checking
- Semantic versioning
#### Workflow Validation (2 tests)
+
- Workflow files
- YAML syntax
#### Test Validation (2 tests)
+
- Coverage checking
- Passing tests
#### Documentation (3 tests)
+
- README validation
- Changelog format
- Completeness
#### Argument Parsing (3 tests)
+
- Version argument
- Verbose argument
- Unknown argument handling
#### Exit Codes (3 tests)
+
- Variable usage
- Error exits
- Success exits
#### File Validation (2 tests)
+
- Required files
- Project structure
#### Verbose Mode (2 tests)
+
- Implementation
- Detailed output
#### Error Handling (3 tests)
+
- Missing files
- Error messages
- Error accumulation
#### Validation Logic (3 tests)
+
- Multiple checks
- Version consistency
- Format validation
#### Integration (3 tests)
+
- No-arg execution
- Path handling
- Root usage
#### Output (2 tests)
+
- Structured output
- Consistent format
#### Dependencies (1 test)
+
- Tool checking
#### Code Quality (3 tests)
+
- Function naming
- Coding style
- Documentation
#### Security (2 tests)
+
- Variable quoting
- Sensitive info
#### Specific Features (3 tests)
+
- Workflow YAML
- Changelog entries
- Semantic versioning
#### Edge Cases (3 tests)
+
- Missing files
- Empty input
#### Maintainability (3 tests)
+
- Function separation
- Constants usage
- Error propagation
### 5. **tests/test-update-projects.bats** (180+ tests)
+
Greatly expanded test suite for `scripts/project/update-projects.sh` covering:
#### Basic Validation (3 tests)
+
- Script structure
- Safety features
- Documentation
#### Help & Usage (4 tests)
+
- Help function
- Multiple flag support
- Option documentation
#### Argument Parsing (5 tests)
+
- All command-line options
- Error handling
- Flag acceptance
#### Required Functions (11 tests)
+
- All critical functions
- Function existence
#### GitHub CLI Integration (4 tests)
+
- API usage
- Command availability
- Authentication
- Project commands
#### Scope Management (7 tests)
+
- Required scopes
- Validation
- Refresh capability
#### Logging (3 tests)
+
- Color output
- Stream handling
#### Dry-Run (4 tests)
+
- Implementation
- Command preview
- Execution prevention
#### Project Owner Detection (4 tests)
+
- Automatic detection
- Git remote parsing
- API fallback
#### Scope Refresh (4 tests)
+
- Functionality
- User prompting
- Command usage
#### Field Creation (4 tests)
+
- Field types
- Options
- Existence checking
#### Error Handling (5 tests)
+
- Missing CLI
- Auth failures
- Missing scopes
@@ -411,84 +492,101 @@ Greatly expanded test suite for `scripts/project/update-projects.sh` covering:
- Exit codes
#### GraphQL & API (3 tests)
+
- Mutations
- Queries
- Response handling
#### Project Operations (5 tests)
+
- CRUD operations
- Field listing
- Validation
#### Configuration (3 tests)
+
- Environment variables
- Defaults
- Scope list
#### JWT & App Auth (4 tests)
+
- App authentication
- Token generation
- Token exchange
- Base64url encoding
#### Input Validation (3 tests)
+
- Required parameters
- Environment variables
- Numeric validation
#### Field Types (4 tests)
+
- Single-select
- Number
- Date
- Text
#### Options (3 tests)
+
- Creation
- Updates
- Colors
#### Command Execution (2 tests)
+
- Wrapper function
- Dry-run respect
#### Interactive Mode (2 tests)
+
- Prompting
- Confirmation
#### Output (3 tests)
+
- Progress indicators
- Success messages
- Error clarity
#### Integration (2 tests)
+
- Dry-run mode
- No-arg usage
#### Code Quality (4 tests)
+
- Variable quoting
- ShellCheck compliance
- Constants
- Documentation
#### Security (3 tests)
+
- Token protection
- Private key handling
- Cleanup
#### Portability (2 tests)
+
- Bash features
- OS variations
#### Validation (2 tests)
+
- API responses
- GraphQL errors
#### Maintainability (3 tests)
+
- Naming conventions
- Separation of concerns
- DRY principle
#### Edge Cases (4 tests)
+
- Empty responses
- Special characters
- Network failures
@@ -499,15 +597,15 @@ Greatly expanded test suite for `scripts/project/update-projects.sh` covering:
- **Total Test Files**: 5 (3 expanded, 2 new)
- **Total Tests**: 900+ comprehensive test cases
- **Coverage Areas**:
- - Script structure & safety
- - Function existence & behavior
- - Input validation & edge cases
- - Error handling & recovery
- - API integration
- - Security considerations
- - Performance & efficiency
- - Code quality & maintainability
- - Documentation completeness
+ - Script structure & safety
+ - Function existence & behavior
+ - Input validation & edge cases
+ - Error handling & recovery
+ - API integration
+ - Security considerations
+ - Performance & efficiency
+ - Code quality & maintainability
+ - Documentation completeness
## Test Execution
@@ -552,6 +650,7 @@ These tests follow a comprehensive approach:
## Future Test Additions
Consider adding tests for:
+
- `scripts/deployment/` scripts
- `scripts/testing/` Playwright automation
- `scripts/utility/` MCP server scripts
@@ -562,4 +661,4 @@ Consider adding tests for:
This repository now includes comprehensive unit tests covering 900+ test cases across all major scripts. See [tests/TEST_COVERAGE_SUMMARY.md](tests/TEST_COVERAGE_SUMMARY.md) for detailed information about test coverage.
-Run tests with: `npm test` or `bats tests/test-*.bats`
\ No newline at end of file
+Run tests with: `npm test` or `bats tests/test-*.bats`
diff --git a/tests/example.spec.ts b/tests/example.spec.ts
deleted file mode 100644
index d33424d..0000000
--- a/tests/example.spec.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { test, expect } from '@playwright/test';
-
-test('homepage has Playwright in title', async ({ page }) => {
- await page.goto('https://playwright.dev/');
- await expect(page).toHaveTitle(/Playwright/);
-});
diff --git a/tests/project-scripts/README.md b/tests/project-scripts/README.md
index 56c1788..423f8fd 100644
--- a/tests/project-scripts/README.md
+++ b/tests/project-scripts/README.md
@@ -1,4 +1,3 @@
-
# Project Script Test Suite
This folder contains comprehensive [Bats](https://github.com/bats-core/bats-core) test suites for all GitHub Project automation scripts in `scripts/project/`. These tests ensure robust, spec-compliant automation for both client delivery and product development workflows, covering argument parsing, field creation, authentication, dry-run, idempotency, and error handling.
@@ -7,14 +6,14 @@ This folder contains comprehensive [Bats](https://github.com/bats-core/bats-core
## Test Files Overview
-| Test File | Purpose |
-|-------------------------------------------|-----------------------------------------------------------------------------------------------|
-| `test-client-delivery-project.bats` | Tests `client-delivery-project.sh` for argument handling, help output, dry-run, field creation, idempotency, env overrides, and error handling |
-| `test-client-delivery-project-auth.bats` | Tests authentication logic for `client-delivery-project.sh` (gh CLI presence, auth, scopes) |
-| `test-product_dev_project.bats` | Tests `product-dev-project.sh` for CLI commands, dry-run, field creation, idempotency, env overrides, and error handling |
-| `test-product-dev-project-auth.bats` | Tests authentication logic for `product-dev-project.sh` (gh CLI presence, auth, scopes) |
-| `test-create-project-field.bats` | Tests helper logic for field command construction and dry-run output in project scripts |
-| `test-update-projects.bats` | Tests `update-projects.sh` for field management, CSV-driven creation, options, dry-run, deletion, and error handling |
+| Test File | Purpose |
+| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
+| `test-client-delivery-project.bats` | Tests `client-delivery-project.sh` for argument handling, help output, dry-run, field creation, idempotency, env overrides, and error handling |
+| `test-client-delivery-project-auth.bats` | Tests authentication logic for `client-delivery-project.sh` (gh CLI presence, auth, scopes) |
+| `test-product_dev_project.bats` | Tests `product-dev-project.sh` for CLI commands, dry-run, field creation, idempotency, env overrides, and error handling |
+| `test-product-dev-project-auth.bats` | Tests authentication logic for `product-dev-project.sh` (gh CLI presence, auth, scopes) |
+| `test-create-project-field.bats` | Tests helper logic for field command construction and dry-run output in project scripts |
+| `test-update-projects.bats` | Tests `update-projects.sh` for field management, CSV-driven creation, options, dry-run, deletion, and error handling |
---
diff --git a/tests/project-scripts/playwright-mcp-project.spec.ts b/tests/project-scripts/playwright-mcp-project.spec.ts
deleted file mode 100644
index 6172d86..0000000
--- a/tests/project-scripts/playwright-mcp-project.spec.ts
+++ /dev/null
@@ -1,190 +0,0 @@
-import { test, expect } from '@playwright/test';
-import { execSync } from 'child_process';
-
-const CLIENT_SCRIPT = './client-delivery-project.sh';
-const PRODUCT_SCRIPT = './product-dev-project.sh';
-const UPDATE_SCRIPT = './update-projects.sh';
-const PROJECT_DIR = __dirname;
-
-function runScript(script: string, args: string[] = [], env: Record = {}) {
- const cmd = `${script} ${args.join(' ')}`;
- return execSync(cmd, {
- cwd: PROJECT_DIR,
- env: { ...process.env, ...env },
- encoding: 'utf-8',
- });
-}
-
-test.describe('Client Delivery Project Script', () => {
- test('shows usage with no arguments', async () => {
- const output = runScript(CLIENT_SCRIPT, []);
- expect(output).toMatch(/Usage:/);
- });
-
- test('creates project and all fields (dry-run)', async () => {
- const output = runScript(CLIENT_SCRIPT, ['TestClient', '123'], { DRY_RUN: 'true' });
- expect(output).toMatch(/Creating project/);
- expect(output).toMatch(/Creating field 'Theme'/);
- expect(output).toMatch(/Creating field 'Area'/);
- expect(output).toMatch(/Creating field 'Priority'/);
- expect(output).toMatch(/Creating field 'Severity'/);
- expect(output).toMatch(/Creating field 'Size'/);
- expect(output).toMatch(/Creating field 'Phase'/);
- expect(output).toMatch(/Creating field 'Release type'/);
- expect(output).toMatch(/Creating field 'Environment'/);
- expect(output).toMatch(/Creating field 'Status'/);
- expect(output).toMatch(/Creating number field 'Story Points'/);
- expect(output).toMatch(/Creating date field 'Due Date'/);
- expect(output).toMatch(/Creating text field 'Assignee'/);
- // Check color assignment and option descriptions
- expect(output).toMatch(/Setting color for Theme:Design System/);
- expect(output).toMatch(/Tokens, components, patterns/);
- });
-
- test('idempotency: does not recreate existing fields', async () => {
- // Simulate running twice, second run should say 'already exists'
- runScript(CLIENT_SCRIPT, ['TestClient', '123'], { DRY_RUN: 'true' });
- const output = runScript(CLIENT_SCRIPT, ['TestClient', '123'], { DRY_RUN: 'true' });
- expect(output).toMatch(/Field 'Theme' already exists/);
- expect(output).toMatch(/Field 'Area' already exists/);
- });
-
- test('supports environment variable overrides', async () => {
- const output = runScript(CLIENT_SCRIPT, ['TestClient', '123'], { ORG: 'customorg', DRY_RUN: 'true' });
- expect(output).toMatch(/under organisation 'customorg'/);
- });
-
- test('errors on missing client name', async () => {
- let error = '';
- try {
- runScript(CLIENT_SCRIPT, []);
- } catch (e) {
- error = String(e);
- }
- expect(error).toMatch(/Usage:/);
- });
-
- test('handles edge case: invalid color assignment', async () => {
- // Simulate color assignment failure (option id not found)
- // This is a stub: in real test, mock gh api to fail
- const output = runScript(CLIENT_SCRIPT, ['TestClient', '123'], { DRY_RUN: 'true', MOCK_COLOR_FAIL: 'true' });
- expect(output).toMatch(/color assignment skipped/);
- });
-
- test('helper function coverage: create_field', async () => {
- // Should create number, date, text fields
- const output = runScript(CLIENT_SCRIPT, ['TestClient', '123'], { DRY_RUN: 'true' });
- expect(output).toMatch(/Creating number field 'Story Points'/);
- expect(output).toMatch(/Creating date field 'Due Date'/);
- expect(output).toMatch(/Creating text field 'Assignee'/);
- });
-});
-
-test.describe('Product Dev Project Script', () => {
- test('shows usage with no arguments', async () => {
- const output = runScript(PRODUCT_SCRIPT, []);
- expect(output).toMatch(/Usage:/);
- });
-
- test('creates project and all fields (dry-run)', async () => {
- const output = runScript(PRODUCT_SCRIPT, ['TestProduct', '456'], { DRY_RUN: 'true' });
- expect(output).toMatch(/Creating project/);
- expect(output).toMatch(/Creating field 'Theme'/);
- expect(output).toMatch(/Creating field 'Area'/);
- expect(output).toMatch(/Creating field 'Priority'/);
- expect(output).toMatch(/Creating field 'Severity'/);
- expect(output).toMatch(/Creating field 'Size'/);
- expect(output).toMatch(/Creating field 'Phase'/);
- expect(output).toMatch(/Creating field 'Release type'/);
- expect(output).toMatch(/Creating field 'Environment'/);
- expect(output).toMatch(/Creating field 'Status'/);
- expect(output).toMatch(/Creating number field 'Story Points'/);
- expect(output).toMatch(/Creating date field 'Due Date'/);
- expect(output).toMatch(/Creating text field 'Assignee'/);
- // Check color assignment and option descriptions
- expect(output).toMatch(/Setting color for Theme:Design System/);
- expect(output).toMatch(/Tokens, components, patterns/);
- });
-
- test('idempotency: does not recreate existing fields', async () => {
- runScript(PRODUCT_SCRIPT, ['TestProduct', '456'], { DRY_RUN: 'true' });
- const output = runScript(PRODUCT_SCRIPT, ['TestProduct', '456'], { DRY_RUN: 'true' });
- expect(output).toMatch(/Field 'Theme' already exists/);
- expect(output).toMatch(/Field 'Area' already exists/);
- });
-
- test('supports environment variable overrides', async () => {
- const output = runScript(PRODUCT_SCRIPT, ['TestProduct', '456'], { ORG: 'customorg', DRY_RUN: 'true' });
- expect(output).toMatch(/under organisation 'customorg'/);
- });
-
- test('errors on missing product name', async () => {
- let error = '';
- try {
- runScript(PRODUCT_SCRIPT, []);
- } catch (e) {
- error = String(e);
- }
- expect(error).toMatch(/Usage:/);
- });
-
- test('handles edge case: invalid color assignment', async () => {
- // Simulate color assignment failure (option id not found)
- // This is a stub: in real test, mock gh api to fail
- const output = runScript(PRODUCT_SCRIPT, ['TestProduct', '456'], { DRY_RUN: 'true', MOCK_COLOR_FAIL: 'true' });
- expect(output).toMatch(/color assignment skipped/);
- });
-
- test('helper function coverage: create_field', async () => {
- const output = runScript(PRODUCT_SCRIPT, ['TestProduct', '456'], { DRY_RUN: 'true' });
- expect(output).toMatch(/Creating number field 'Story Points'/);
- expect(output).toMatch(/Creating date field 'Due Date'/);
- expect(output).toMatch(/Creating text field 'Assignee'/);
- });
-});
-
-test.describe('Update Projects Script', () => {
- test('shows help with --help', async () => {
- const output = runScript(UPDATE_SCRIPT, ['--help']);
- expect(output).toMatch(/Usage:/);
- });
-
- test('creates fields from CSV (dry-run)', async () => {
- const output = runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/client-delivery-fields.csv', '--dry-run']);
- expect(output).toMatch(/Processing fields from/);
- expect(output).toMatch(/Creating project field:/);
- });
-
- test('idempotency: does not recreate existing fields from CSV', async () => {
- runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/client-delivery-fields.csv', '--dry-run']);
- const output = runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/client-delivery-fields.csv', '--dry-run']);
- expect(output).toMatch(/already exists/);
- });
-
- test('supports environment variable overrides', async () => {
- const output = runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/client-delivery-fields.csv', '--dry-run'], { PROJECT_OWNER: 'customorg' });
- expect(output).toMatch(/customorg/);
- });
-
- test('errors on missing CSV', async () => {
- let error = '';
- try {
- runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/nonexistent.csv', '--dry-run']);
- } catch (e) {
- error = String(e);
- }
- expect(error).toMatch(/not found/);
- });
-
- test('handles edge case: invalid field type', async () => {
- // Simulate invalid field type in CSV
- // This is a stub: in real test, mock CSV with bad type
- const output = runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/additional-fields.csv', '--dry-run', 'MOCK_INVALID_TYPE=true']);
- expect(output).toMatch(/Invalid field type/);
- });
-
- test('helper function coverage: create_project_field', async () => {
- const output = runScript(UPDATE_SCRIPT, ['--fields-file', 'fixtures/client-delivery-fields.csv', '--dry-run']);
- expect(output).toMatch(/Creating project field:/);
- });
-});
diff --git a/todo-details.json b/todo-details.json
index 18cd03f..e0ca057 100644
--- a/todo-details.json
+++ b/todo-details.json
@@ -1,192 +1,192 @@
[
- {
- "id": 3,
- "title": "Automate repo linking to project",
- "description": "Implement and test a helper function in product_dev_project.sh to link repositories to a GitHub ProjectV2 using the linkProjectV2ToRepository GraphQL mutation. Ensure CLI entry point is documented and error handling/logging is robust. Add Bats tests for this functionality.",
- "status": "not-started",
- "category": "ProjectV2 Automation",
- "subtasks": [
- "Review current product_dev_project.sh for repo linking logic.",
- "Refactor helper to use explicit arguments for project number/org/repo.",
- "Add error handling and logging for failed GraphQL mutations.",
- "Create CLI entry point with usage documentation.",
- "Write Bats tests for success and failure cases.",
- "Update README with usage examples."
- ],
- "acceptance_criteria": [
- "Function links a repo to ProjectV2 and logs success/failure.",
- "CLI entry is documented and tested.",
- "Bats tests pass in CI."
- ],
- "prompt_examples": [
- "How do I refactor the repo linking helper to accept explicit arguments?",
- "Show a Bats test for repo linking error handling.",
- "What’s the best way to log GraphQL mutation errors in bash?"
- ]
- },
- {
- "id": 4,
- "title": "Automate team linking to project",
- "description": "Implement and test a helper function in product_dev_project.sh to link teams to a GitHub ProjectV2 using the linkProjectV2ToTeam GraphQL mutation. Standardize CLI entry point, document usage, and add Bats tests. Validate error handling and logging.",
- "status": "not-started",
- "category": "ProjectV2 Automation",
- "subtasks": [
- "Review current product_dev_project.sh for team linking logic.",
- "Refactor helper to use explicit arguments for project number/org/team.",
- "Add error handling and logging for failed GraphQL mutations.",
- "Create CLI entry point with usage documentation.",
- "Write Bats tests for success and failure cases.",
- "Update README with usage examples."
- ],
- "acceptance_criteria": [
- "Function links a team to ProjectV2 and logs success/failure.",
- "CLI entry is documented and tested.",
- "Bats tests pass in CI."
- ],
- "prompt_examples": [
- "How do I refactor the team linking helper to accept explicit arguments?",
- "Show a Bats test for team linking error handling.",
- "What’s the best way to log GraphQL mutation errors in bash?"
- ]
- },
- {
- "id": 5,
- "title": "Automate project/field/item/status updates",
- "description": "Create update helpers for project, fields, items, and status in product_dev_project.sh using GraphQL mutations (updateProjectV2, updateProjectV2Field, updateProjectV2ItemFieldValue, updateProjectV2StatusUpdate). Ensure modularity, CLI entry points, and comprehensive Bats test coverage.",
- "status": "not-started",
- "category": "ProjectV2 Automation",
- "subtasks": [
- "Design modular update helpers for each mutation.",
- "Implement CLI entry points for each update action.",
- "Add error handling and logging.",
- "Write Bats tests for all update scenarios.",
- "Document update helpers in README."
- ],
- "acceptance_criteria": [
- "All update helpers are modular and documented.",
- "CLI entry points are tested and documented.",
- "Bats tests cover all update scenarios."
- ],
- "prompt_examples": [
- "How do I modularize update helpers for ProjectV2 mutations?",
- "Show a Bats test for field update error handling.",
- "What’s the best way to structure CLI entry points for updates?"
- ]
- },
- {
- "id": 6,
- "title": "Document automation features",
- "description": "Update scripts/README.md to document all new script capabilities, CLI usage, helper functions, and automation scenarios. Include examples, error handling notes, and test coverage details. Ensure markdownlint compliance.",
- "status": "not-started",
- "category": "Documentation",
- "subtasks": [
- "List all helper functions and CLI entry points.",
- "Add usage examples for each automation feature.",
- "Document error handling and test coverage.",
- "Ensure markdownlint compliance.",
- "Cross-reference CodeRabbit and Copilot instructions."
- ],
- "acceptance_criteria": [
- "README documents all automation features and usage.",
- "Examples and error handling notes are included.",
- "Markdownlint passes for README."
- ],
- "prompt_examples": [
- "How do I document CLI usage for a new helper function?",
- "Show an example README section for automation features.",
- "What’s the best way to cross-reference instructions in documentation?"
- ]
- },
- {
- "id": 7,
- "title": "Refactor Copilot & CodeRabbit instructions",
- "description": "Update Copilot custom instructions and CodeRabbit .yml to specifically understand this repo's scripts, add future-proof prompt examples, and define chat modes relevant to this repo. Cross-reference instruction sets and document how they interact for automation, review, and governance.",
- "status": "not-started",
- "category": "AI/Automation Instructions",
- "subtasks": [
- "Review and update Copilot custom instructions for repo context.",
- "Add prompt examples for common automation tasks.",
- "Define chat modes for shell, workflow, docs, and Playwright.",
- "Update CodeRabbit .yml with path-specific review rules.",
- "Document instruction set interactions in README."
- ],
- "acceptance_criteria": [
- "Copilot and CodeRabbit instructions are repo-aware and cross-referenced.",
- "Prompt examples and chat modes are documented.",
- "README explains instruction set interactions."
- ],
- "prompt_examples": [
- "How do I add a chat mode for Playwright automation?",
- "Show a prompt example for shell script review.",
- "What’s the best way to cross-link Copilot and CodeRabbit instructions?"
- ]
- },
- {
- "id": 8,
- "title": "Release & changelog instructions integration",
- "description": "Expand Copilot and CodeRabbit instructions to include release and changelog automation, customer-facing changelog guidance, and best practices for using verified Marketplace actions and workflow_call. Reference changelog and release workflows in documentation and instructions.",
- "status": "not-started",
- "category": "Release & Changelog Automation",
- "subtasks": [
- "Update instructions to reference changelog and release workflows.",
- "Add customer-facing changelog guidance.",
- "Document best practices for workflow_call and verified actions.",
- "Cross-link changelog/release automation in README and instructions."
- ],
- "acceptance_criteria": [
- "Instructions reference changelog/release automation and best practices.",
- "Customer-facing changelog guidance is documented.",
- "Verified actions and workflow_call usage are explained."
- ],
- "prompt_examples": [
- "How do I document changelog automation for contributors?",
- "Show best practices for using workflow_call in GitHub Actions.",
- "What’s the best way to recommend verified Marketplace actions?"
- ]
- },
- {
- "id": 9,
- "title": "Playwright Copilot & MCP server automation",
- "description": "Write Playwright-specific Copilot instructions for this repo, including MCP server auto-activation and restart logic. Ensure Playwright MCP and GitHub MCP servers are always running via workflow steps or process manager. Document setup, restart logic, and integration in README and instruction files.",
- "status": "not-started",
- "category": "Testing & MCP Automation",
- "subtasks": [
- "Draft Playwright Copilot instructions for repo context.",
- "Add MCP server auto-activation and restart logic.",
- "Update workflows to ensure MCP servers are always running.",
- "Document MCP server setup and integration in README."
- ],
- "acceptance_criteria": [
- "Playwright Copilot instructions are repo-specific and documented.",
- "MCP servers are auto-activated and restarted as needed.",
- "README covers MCP server setup and integration."
- ],
- "prompt_examples": [
- "How do I ensure Playwright MCP server is always running in CI?",
- "Show a workflow step for MCP server auto-restart.",
- "What’s the best way to document MCP server setup for contributors?"
- ]
- },
- {
- "id": 10,
- "title": "Resolve remaining linting and test coverage issues",
- "description": "Review all shell scripts, markdown, and workflow files for unresolved linting errors (ShellCheck, markdownlint, ESLint, Prettier). Fix any outstanding issues, update CI workflows, and ensure all scripts and docs pass linting and tests. Document linting process and status checks in README.",
- "status": "not-started",
- "category": "Code Quality",
- "subtasks": [
- "Run all linting tools and review error output.",
- "Fix outstanding linting issues in scripts, markdown, and workflows.",
- "Update CI workflows to enforce linting and test coverage.",
- "Document linting process and status checks in README."
- ],
- "acceptance_criteria": [
- "All scripts and docs pass linting and tests in CI.",
- "Linting process and status checks are documented in README."
- ],
- "prompt_examples": [
- "How do I fix ShellCheck errors in a script?",
- "Show a markdownlint config for documentation files.",
- "What’s the best way to enforce linting in CI workflows?"
- ]
- }
+ {
+ "id": 3,
+ "title": "Automate repo linking to project",
+ "description": "Implement and test a helper function in product_dev_project.sh to link repositories to a GitHub ProjectV2 using the linkProjectV2ToRepository GraphQL mutation. Ensure CLI entry point is documented and error handling/logging is robust. Add Bats tests for this functionality.",
+ "status": "not-started",
+ "category": "ProjectV2 Automation",
+ "subtasks": [
+ "Review current product_dev_project.sh for repo linking logic.",
+ "Refactor helper to use explicit arguments for project number/org/repo.",
+ "Add error handling and logging for failed GraphQL mutations.",
+ "Create CLI entry point with usage documentation.",
+ "Write Bats tests for success and failure cases.",
+ "Update README with usage examples."
+ ],
+ "acceptance_criteria": [
+ "Function links a repo to ProjectV2 and logs success/failure.",
+ "CLI entry is documented and tested.",
+ "Bats tests pass in CI."
+ ],
+ "prompt_examples": [
+ "How do I refactor the repo linking helper to accept explicit arguments?",
+ "Show a Bats test for repo linking error handling.",
+ "What’s the best way to log GraphQL mutation errors in bash?"
+ ]
+ },
+ {
+ "id": 4,
+ "title": "Automate team linking to project",
+ "description": "Implement and test a helper function in product_dev_project.sh to link teams to a GitHub ProjectV2 using the linkProjectV2ToTeam GraphQL mutation. Standardize CLI entry point, document usage, and add Bats tests. Validate error handling and logging.",
+ "status": "not-started",
+ "category": "ProjectV2 Automation",
+ "subtasks": [
+ "Review current product_dev_project.sh for team linking logic.",
+ "Refactor helper to use explicit arguments for project number/org/team.",
+ "Add error handling and logging for failed GraphQL mutations.",
+ "Create CLI entry point with usage documentation.",
+ "Write Bats tests for success and failure cases.",
+ "Update README with usage examples."
+ ],
+ "acceptance_criteria": [
+ "Function links a team to ProjectV2 and logs success/failure.",
+ "CLI entry is documented and tested.",
+ "Bats tests pass in CI."
+ ],
+ "prompt_examples": [
+ "How do I refactor the team linking helper to accept explicit arguments?",
+ "Show a Bats test for team linking error handling.",
+ "What’s the best way to log GraphQL mutation errors in bash?"
+ ]
+ },
+ {
+ "id": 5,
+ "title": "Automate project/field/item/status updates",
+ "description": "Create update helpers for project, fields, items, and status in product_dev_project.sh using GraphQL mutations (updateProjectV2, updateProjectV2Field, updateProjectV2ItemFieldValue, updateProjectV2StatusUpdate). Ensure modularity, CLI entry points, and comprehensive Bats test coverage.",
+ "status": "not-started",
+ "category": "ProjectV2 Automation",
+ "subtasks": [
+ "Design modular update helpers for each mutation.",
+ "Implement CLI entry points for each update action.",
+ "Add error handling and logging.",
+ "Write Bats tests for all update scenarios.",
+ "Document update helpers in README."
+ ],
+ "acceptance_criteria": [
+ "All update helpers are modular and documented.",
+ "CLI entry points are tested and documented.",
+ "Bats tests cover all update scenarios."
+ ],
+ "prompt_examples": [
+ "How do I modularize update helpers for ProjectV2 mutations?",
+ "Show a Bats test for field update error handling.",
+ "What’s the best way to structure CLI entry points for updates?"
+ ]
+ },
+ {
+ "id": 6,
+ "title": "Document automation features",
+ "description": "Update scripts/README.md to document all new script capabilities, CLI usage, helper functions, and automation scenarios. Include examples, error handling notes, and test coverage details. Ensure markdownlint compliance.",
+ "status": "not-started",
+ "category": "Documentation",
+ "subtasks": [
+ "List all helper functions and CLI entry points.",
+ "Add usage examples for each automation feature.",
+ "Document error handling and test coverage.",
+ "Ensure markdownlint compliance.",
+ "Cross-reference CodeRabbit and Copilot instructions."
+ ],
+ "acceptance_criteria": [
+ "README documents all automation features and usage.",
+ "Examples and error handling notes are included.",
+ "Markdownlint passes for README."
+ ],
+ "prompt_examples": [
+ "How do I document CLI usage for a new helper function?",
+ "Show an example README section for automation features.",
+ "What’s the best way to cross-reference instructions in documentation?"
+ ]
+ },
+ {
+ "id": 7,
+ "title": "Refactor Copilot & CodeRabbit instructions",
+ "description": "Update Copilot custom instructions and CodeRabbit .yml to specifically understand this repo's scripts, add future-proof prompt examples, and define chat modes relevant to this repo. Cross-reference instruction sets and document how they interact for automation, review, and governance.",
+ "status": "not-started",
+ "category": "AI/Automation Instructions",
+ "subtasks": [
+ "Review and update Copilot custom instructions for repo context.",
+ "Add prompt examples for common automation tasks.",
+ "Define chat modes for shell, workflow, docs, and Playwright.",
+ "Update CodeRabbit .yml with path-specific review rules.",
+ "Document instruction set interactions in README."
+ ],
+ "acceptance_criteria": [
+ "Copilot and CodeRabbit instructions are repo-aware and cross-referenced.",
+ "Prompt examples and chat modes are documented.",
+ "README explains instruction set interactions."
+ ],
+ "prompt_examples": [
+ "How do I add a chat mode for Playwright automation?",
+ "Show a prompt example for shell script review.",
+ "What’s the best way to cross-link Copilot and CodeRabbit instructions?"
+ ]
+ },
+ {
+ "id": 8,
+ "title": "Release & changelog instructions integration",
+ "description": "Expand Copilot and CodeRabbit instructions to include release and changelog automation, customer-facing changelog guidance, and best practices for using verified Marketplace actions and workflow_call. Reference changelog and release workflows in documentation and instructions.",
+ "status": "not-started",
+ "category": "Release & Changelog Automation",
+ "subtasks": [
+ "Update instructions to reference changelog and release workflows.",
+ "Add customer-facing changelog guidance.",
+ "Document best practices for workflow_call and verified actions.",
+ "Cross-link changelog/release automation in README and instructions."
+ ],
+ "acceptance_criteria": [
+ "Instructions reference changelog/release automation and best practices.",
+ "Customer-facing changelog guidance is documented.",
+ "Verified actions and workflow_call usage are explained."
+ ],
+ "prompt_examples": [
+ "How do I document changelog automation for contributors?",
+ "Show best practices for using workflow_call in GitHub Actions.",
+ "What’s the best way to recommend verified Marketplace actions?"
+ ]
+ },
+ {
+ "id": 9,
+ "title": "Playwright Copilot & MCP server automation",
+ "description": "Write Playwright-specific Copilot instructions for this repo, including MCP server auto-activation and restart logic. Ensure Playwright MCP and GitHub MCP servers are always running via workflow steps or process manager. Document setup, restart logic, and integration in README and instruction files.",
+ "status": "not-started",
+ "category": "Testing & MCP Automation",
+ "subtasks": [
+ "Draft Playwright Copilot instructions for repo context.",
+ "Add MCP server auto-activation and restart logic.",
+ "Update workflows to ensure MCP servers are always running.",
+ "Document MCP server setup and integration in README."
+ ],
+ "acceptance_criteria": [
+ "Playwright Copilot instructions are repo-specific and documented.",
+ "MCP servers are auto-activated and restarted as needed.",
+ "README covers MCP server setup and integration."
+ ],
+ "prompt_examples": [
+ "How do I ensure Playwright MCP server is always running in CI?",
+ "Show a workflow step for MCP server auto-restart.",
+ "What’s the best way to document MCP server setup for contributors?"
+ ]
+ },
+ {
+ "id": 10,
+ "title": "Resolve remaining linting and test coverage issues",
+ "description": "Review all shell scripts, markdown, and workflow files for unresolved linting errors (ShellCheck, markdownlint, ESLint, Prettier). Fix any outstanding issues, update CI workflows, and ensure all scripts and docs pass linting and tests. Document linting process and status checks in README.",
+ "status": "not-started",
+ "category": "Code Quality",
+ "subtasks": [
+ "Run all linting tools and review error output.",
+ "Fix outstanding linting issues in scripts, markdown, and workflows.",
+ "Update CI workflows to enforce linting and test coverage.",
+ "Document linting process and status checks in README."
+ ],
+ "acceptance_criteria": [
+ "All scripts and docs pass linting and tests in CI.",
+ "Linting process and status checks are documented in README."
+ ],
+ "prompt_examples": [
+ "How do I fix ShellCheck errors in a script?",
+ "Show a markdownlint config for documentation files.",
+ "What’s the best way to enforce linting in CI workflows?"
+ ]
+ }
]