Project Entry Workflow
Use this skill when a GitHub issue was created from .github/ISSUE_TEMPLATE/project.yml and assigned to Copilot, or when the user explicitly asks to create or update a project directory entry.
Outcome
Produce a reviewable pull request that adds or updates one project content entry under astro/src/data/project. Do not publish directly to main, edit generated output, or change unrelated site behavior.
The committed project Markdown/MDX file is the website's source of truth. The issue is input; it is not a second project database.
First Read
Before editing, inspect only the local surfaces needed for the request:
- The complete source issue, including all form-generated field headings and answers.
.github/ISSUE_TEMPLATE/project.yml.
.github/copilot-instructions.md.
astro/src/content.config.ts.
astro/src/utils/project-validation.ts.
- Existing project entries under
astro/src/data/project.
astro/src/pages/projects/index.astro and astro/src/pages/projects/[slug]/index.astro when route behavior is relevant.
- Existing profile files when participant IDs need validation.
Check the current branch and worktree before editing. Preserve unrelated user changes.
Map Form Input
Map the issue form to frontmatter as follows:
project_title -> title
publish_date -> publishDate; use an explicit ISO date. Convert a supplied YYYY-MM-DD value to the repository's expected date format. If the field is absent or ambiguous, stop and request clarification; never invent a date.
status -> project.status; allowed values are mature, beta, lab, explore, and not-started.
excerpt -> excerpt
body_markdown -> the Markdown/MDX body after frontmatter. The form suggests headings, but the submitter may omit, reorder, or add headings; preserve all submitted content. When ai_rewrite_intent is Keep as is, preserve wording and heading structure, making only formatting or validity fixes. When it is Allow rewrite, improve spelling, grammar, and structure without changing factual meaning.
project_tags -> project.tags
publication_intent -> draft; publish now means false, keep as draft means true
image_path -> image; treat REQUEST: text as a request requiring a separate decision, not as a literal image path
slack_channel and slack_url -> project.slack
github_repositories -> project.github.repositories, one owner/name per line
references -> ordered project.references entries in name | url format
leads and contributors -> project.participants profile IDs
ai_rewrite_intent controls whether wording and structure may be edited. Do not infer permission to rewrite from the issue's assignment alone.
Only include optional nested objects when they have meaningful values. Preserve reference order and participant role separation.
Validation Rules
Validate before considering the work complete:
title and publishDate are present and valid.
project.status is one of the allowed enum values.
- Repository values use
owner/name format.
- Reference URLs are site-relative paths beginning with
/ or absolute http/https URLs. Reject unsafe schemes.
- Every lead and contributor ID exists in
astro/src/data/profile.
- No profile ID appears in both leads and contributors.
- Draft projects do not appear in public directory or profile reverse relations.
- The generated filename is stable, URL-safe, and does not overwrite another project unintentionally.
- Do not invent missing URLs, profile IDs, repositories, images, statuses, or tags. Stop and request clarification when a required value is missing or ambiguous.
Use the collection schema for shape and enum validation, and the existing project validation utilities rather than duplicating rules.
Static Astro Constraints
This repository is a static Astro site deployed to GitHub Pages:
- Preserve
output: 'static'.
- Do not add SSR, an Astro adapter, server endpoints, a database, or a client framework for a project entry.
- Use Astro content collections,
getStaticPaths, existing layouts, metadata, image, permalink, localization, and profile utilities.
- Query-string filtering must remain progressive enhancement over a complete usable static listing.
- Respect GitHub Pages
site and base build values. Do not hard-code a repository subpath.
- Follow the existing AstroWind visual language instead of introducing a parallel component or styling system.
Profile Relationships
Project participants are bidirectional relations:
- Project pages link leads and contributors to their profile pages.
- English and Danish profile pages list non-draft projects with
Lead or Contributor labels.
- Preserve existing post-to-profile relations and use the established relation types/utilities.
- Do not duplicate project relationships into profile frontmatter.
Pull Request Workflow
- Create or update only the project content file and the smallest supporting changes required by the issue.
- If the issue requests new behavior not already implemented, add focused tests and documentation alongside the implementation.
- Run the repository quality gates after making the change:
gh insitu run fix-all
gh insitu run trunk-worthy link-checker
Fix any remaining Markdownlint or cspell findings manually. Add only verified project terminology to .dict/repo.dictionary when appropriate.
- Review the diff for accidental metadata, generated-output, or unrelated changes.
- Open or update a pull request; do not commit directly to
main.
- In the pull request description, link the source issue and summarize any normalization, clarification request, validation result, or AI rewrite decision.
If validation fails because the issue input is incomplete, report the exact field and reason in the issue or pull request instead of guessing.
1---2name: project-entry3description: Use when implementing a GitHub Project directory issue assigned to Copilot, or when converting the project issue form into an Astro project content entry and pull request.4---56# Project Entry Workflow78Use this skill when a GitHub issue was created from `.github/ISSUE_TEMPLATE/project.yml` and assigned to Copilot, or when the user explicitly asks to create or update a project directory entry.910## Outcome1112Produce a reviewable pull request that adds or updates one project content entry under `astro/src/data/project`. Do not publish directly to `main`, edit generated output, or change unrelated site behavior.1314The committed project Markdown/MDX file is the website's source of truth. The issue is input; it is not a second project database.1516## First Read1718Before editing, inspect only the local surfaces needed for the request:1920- The complete source issue, including all form-generated field headings and answers.21- `.github/ISSUE_TEMPLATE/project.yml`.22- `.github/copilot-instructions.md`.23- `astro/src/content.config.ts`.24- `astro/src/utils/project-validation.ts`.25- Existing project entries under `astro/src/data/project`.26- `astro/src/pages/projects/index.astro` and `astro/src/pages/projects/[slug]/index.astro` when route behavior is relevant.27- Existing profile files when participant IDs need validation.2829Check the current branch and worktree before editing. Preserve unrelated user changes.3031## Map Form Input3233Map the issue form to frontmatter as follows:3435- `project_title` -> `title`36- `publish_date` -> `publishDate`; use an explicit ISO date. Convert a supplied `YYYY-MM-DD` value to the repository's expected date format. If the field is absent or ambiguous, stop and request clarification; never invent a date.37- `status` -> `project.status`; allowed values are `mature`, `beta`, `lab`, `explore`, and `not-started`.38- `excerpt` -> `excerpt`39- `body_markdown` -> the Markdown/MDX body after frontmatter. The form suggests headings, but the submitter may omit, reorder, or add headings; preserve all submitted content. When `ai_rewrite_intent` is `Keep as is`, preserve wording and heading structure, making only formatting or validity fixes. When it is `Allow rewrite`, improve spelling, grammar, and structure without changing factual meaning.40- `project_tags` -> `project.tags`41- `publication_intent` -> `draft`; publish now means `false`, keep as draft means `true`42- `image_path` -> `image`; treat `REQUEST:` text as a request requiring a separate decision, not as a literal image path43- `slack_channel` and `slack_url` -> `project.slack`44- `github_repositories` -> `project.github.repositories`, one `owner/name` per line45- `references` -> ordered `project.references` entries in `name | url` format46- `leads` and `contributors` -> `project.participants` profile IDs47- `ai_rewrite_intent` controls whether wording and structure may be edited. Do not infer permission to rewrite from the issue's assignment alone.4849Only include optional nested objects when they have meaningful values. Preserve reference order and participant role separation.5051## Validation Rules5253Validate before considering the work complete:5455- `title` and `publishDate` are present and valid.56- `project.status` is one of the allowed enum values.57- Repository values use `owner/name` format.58- Reference URLs are site-relative paths beginning with `/` or absolute `http`/`https` URLs. Reject unsafe schemes.59- Every lead and contributor ID exists in `astro/src/data/profile`.60- No profile ID appears in both leads and contributors.61- Draft projects do not appear in public directory or profile reverse relations.62- The generated filename is stable, URL-safe, and does not overwrite another project unintentionally.63- Do not invent missing URLs, profile IDs, repositories, images, statuses, or tags. Stop and request clarification when a required value is missing or ambiguous.6465Use the collection schema for shape and enum validation, and the existing project validation utilities rather than duplicating rules.6667## Static Astro Constraints6869This repository is a static Astro site deployed to GitHub Pages:7071- Preserve `output: 'static'`.72- Do not add SSR, an Astro adapter, server endpoints, a database, or a client framework for a project entry.73- Use Astro content collections, `getStaticPaths`, existing layouts, metadata, image, permalink, localization, and profile utilities.74- Query-string filtering must remain progressive enhancement over a complete usable static listing.75- Respect GitHub Pages `site` and `base` build values. Do not hard-code a repository subpath.76- Follow the existing AstroWind visual language instead of introducing a parallel component or styling system.7778## Profile Relationships7980Project participants are bidirectional relations:8182- Project pages link leads and contributors to their profile pages.83- English and Danish profile pages list non-draft projects with `Lead` or `Contributor` labels.84- Preserve existing post-to-profile relations and use the established relation types/utilities.85- Do not duplicate project relationships into profile frontmatter.8687## Pull Request Workflow88891. Create or update only the project content file and the smallest supporting changes required by the issue.902. If the issue requests new behavior not already implemented, add focused tests and documentation alongside the implementation.913. Run the repository quality gates after making the change:92 - `gh insitu run fix-all`93 - `gh insitu run trunk-worthy link-checker`94 Fix any remaining Markdownlint or cspell findings manually. Add only verified project terminology to `.dict/repo.dictionary` when appropriate.954. Review the diff for accidental metadata, generated-output, or unrelated changes.965. Open or update a pull request; do not commit directly to `main`.976. In the pull request description, link the source issue and summarize any normalization, clarification request, validation result, or AI rewrite decision.9899If validation fails because the issue input is incomplete, report the exact field and reason in the issue or pull request instead of guessing.