Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions .github/scripts/check-module-submodules.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/usr/bin/env bash
set -euo pipefail

active_modules=(
"AtlassianPS.Configuration"
"ConfluencePS"
"JiraAgilePS"
"JiraPS"
)

# Modules without tags can still have an explicit documentation baseline.
no_tag_baselines=(
"JiraAgilePS"
)

# Keep docs-only exceptions narrow and remove them after the next module release.
docs_only_exceptions=(
"AtlassianPS.Configuration:555e8a3300a12e03b1d9c494a874fe21fe9bbccf"
)

has_no_tag_baseline() {
local module="$1"

for baseline in "${no_tag_baselines[@]}"; do
if [[ "$baseline" == "$module" ]]; then
return 0
fi
done

return 1
}

has_docs_only_exception() {
local module="$1"
local commit="$2"

for exception in "${docs_only_exceptions[@]}"; do
if [[ "$exception" == "$module:$commit" ]]; then
return 0
fi
done

return 1
}

errors=0

for module in "${active_modules[@]}"; do
path="modules/$module"

if [[ ! -d "$path/.git" && ! -f "$path/.git" ]]; then
printf '::error file=.gitmodules::%s submodule is not initialized at %s\n' "$module" "$path"
errors=$((errors + 1))
continue
fi

git -C "$path" fetch --tags --quiet origin

if tag=$(git -C "$path" describe --tags --exact-match HEAD 2>/dev/null); then
printf '%s is release-aligned at %s.\n' "$module" "$tag"
continue
fi

tag_count=$(git -C "$path" tag | wc -l | tr -d ' ')
commit=$(git -C "$path" rev-parse HEAD)
short_commit=$(git -C "$path" rev-parse --short HEAD)

if [[ "$tag_count" == "0" ]] && has_no_tag_baseline "$module"; then
printf '::notice file=.gitmodules::%s has no tags; treating %s as the documented baseline.\n' "$module" "$short_commit"
continue
fi

if has_docs_only_exception "$module" "$commit"; then
printf '::notice file=.gitmodules::%s points at docs-only exception %s. Move back to a release tag after the next module release.\n' "$module" "$short_commit"
continue
fi

if [[ "$tag_count" == "0" ]]; then
printf '::error file=.gitmodules::%s is untagged and has no no-tags baseline exception.\n' "$module"
else
printf '::error file=.gitmodules::%s points at %s, which is not an exact release tag. Use a release tag or add a narrow docs-only exception in this script.\n' "$module" "$short_commit"
fi

errors=$((errors + 1))
done

exit "$errors"
3 changes: 3 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ jobs:
- name: Setup Pages
uses: actions/configure-pages@v5

- name: Check module submodules
run: bash .github/scripts/check-module-submodules.sh

- name: Build Jekyll
run: bundle exec jekyll build --baseurl ""
env:
Expand Down
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ source 'https://rubygems.org'
gem 'github-pages', group: :jekyll_plugins

gem "webrick", "~> 1.8"
gem "logger", "~> 1.6"
3 changes: 0 additions & 3 deletions _data/index/modules.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
# projects section data
# - name: BitbucketPS
- name: ConfluencePS
# - name: HipChatPS
- name: JiraAgilePS
- name: JiraPS
- name: AtlassianPS.Configuration
27 changes: 19 additions & 8 deletions _data/modules.yml
Original file line number Diff line number Diff line change
@@ -1,24 +1,35 @@
# - name: BitbucketPS
# description: ToDo
# github: https://github.com/AtlassianPS/BitbucketPS
# path: /module/BitbucketPS
- name: ConfluencePS
description: A PowerShell module that interacts with Atlassian's Confluence wiki product.
github: https://github.com/AtlassianPS/ConfluencePS
path: /module/ConfluencePS
# - name: HipChatPS
# description: ToDo
# github: https://github.com/AtlassianPS/HipChatPS
# path: /module/HipChatPS
status: active
- name: JiraAgilePS
description: PowerShell module to interact with Jira's Agile plugin
github: https://github.com/AtlassianPS/JiraAgilePS
path: /module/JiraAgilePS
status: active
- name: JiraPS
description: PowerShell module to interact with Atlassian JIRA
github: https://github.com/AtlassianPS/JiraPS
path: /module/JiraPS
status: active
- name: AtlassianPS.Configuration
description: A module for AtlassianPS modules to use for managing connections
github: https://github.com/AtlassianPS/AtlassianPS.Configuration
path: /module/AtlassianPS.Configuration
status: active
- name: AtlassianPS
description: Legacy metapackage; not an active documentation target.
github: https://github.com/AtlassianPS/AtlassianPS
path: /module/AtlassianPS
status: legacy
- name: BitbucketPS
description: Legacy Bitbucket module; not an active documentation target.
github: https://github.com/AtlassianPS/BitbucketPS
path: /module/BitbucketPS
status: legacy
- name: HipChatPS
description: Legacy HipChat module; not an active documentation target.
github: https://github.com/AtlassianPS/HipChatPS
path: /module/HipChatPS
status: legacy
4 changes: 3 additions & 1 deletion _data/navigation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@
- Classes
- name: JiraAgilePS
path: docs/JiraAgilePS
listChilds: true
groups:
- About
- Commands
# - name: HipChatPS
# path: docs/HipChatPS
- name: JiraPS
Expand Down
7 changes: 6 additions & 1 deletion _includes/sidenav.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,13 @@
{% if module.groups %}
{% for group in module.groups %}
{% capture groupPath %}/{{ module.path }}/{{ group | downcase }}{% endcapture%}
{% if group == "About" %}
{% capture groupLink %}/{{ module.path }}{% endcapture %}
{% else %}
{% capture groupLink %}{{ groupPath }}{% endcapture %}
{% endif %}
<div class="bd-toc-item{% if page.url contains groupName %} active{% endif %}">
<a class="bd-toc-link" href="{{ groupPath }}">{{group}}</a>
<a class="bd-toc-link" href="{{ groupLink }}">{{group}}</a>

<ul class="nav bd-sidenav">

Expand Down
6 changes: 5 additions & 1 deletion _layouts/documentation.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,11 @@
<a href="#" class="btn btn-default hide" data-algolia="lvl0">All Modules</a>
{% endif %}
{% if bc_groupName %}
<a href="/docs/{{ bc_moduleName }}/{{ cl_groupName }}" class="btn btn-default" data-algolia="lvl1">{{ bc_groupName }}</a>
{% if bc_groupName == "About" %}
<a href="/docs/{{ bc_moduleName }}" class="btn btn-default" data-algolia="lvl1">{{ bc_groupName }}</a>
{% else %}
<a href="/docs/{{ bc_moduleName }}/{{ cl_groupName }}" class="btn btn-default" data-algolia="lvl1">{{ bc_groupName }}</a>
{% endif %}
{% else %}
<a href="#" class="btn btn-default hide" data-algolia="lvl1">Common</a>
{% endif %}
Expand Down
14 changes: 10 additions & 4 deletions docs/Contributing/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ Each of our projects has an _issue tracker_ where you can report your findings.

| Project | Link | # of open issues |
| ----------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **AtlassianPS** | <https://github.com/AtlassianPS/AtlassianPS/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/AtlassianPS.svg?maxAge=2592000)](https://github.com/AtlassianPS/AtlassianPS/issues) |
| **AtlassianPS.Configuration** | <https://github.com/AtlassianPS/AtlassianPS.Configuration/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/AtlassianPS.Configuration.svg?maxAge=2592000)](https://github.com/AtlassianPS/AtlassianPS.Configuration/issues) |
| **AtlassianPS.github.io** | <https://github.com/AtlassianPS/AtlassianPS.github.io/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/AtlassianPS.github.io.svg?maxAge=2592000)](https://github.com/AtlassianPS/AtlassianPS.github.io/issues) |
| **BitbucketPS** | <https://github.com/AtlassianPS/BitbucketPS/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/BitbucketPS.svg?maxAge=2592000)](https://github.com/AtlassianPS/BitbucketPS/issues) |
| **ConfluencePS** | <https://github.com/AtlassianPS/ConfluencePS/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/ConfluencePS.svg?maxAge=2592000)](https://github.com/AtlassianPS/ConfluencePS/issues) |
| **HipchatPS** | <https://github.com/AtlassianPS/HipchatPS/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/HipchatPS.svg?maxAge=2592000)](https://github.com/AtlassianPS/HipchatPS/issues) |
| **JiraAgilePS** | <https://github.com/AtlassianPS/JiraAgilePS/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/JiraAgilePS.svg?maxAge=2592000)](https://github.com/AtlassianPS/JiraAgilePS/issues) |
| **JiraPS** | <https://github.com/AtlassianPS/JiraPS/issues/new> | [![Open Issues](https://img.shields.io/github/issues-raw/AtlassianPS/JiraPS.svg?maxAge=2592000)](https://github.com/AtlassianPS/JiraPS/issues) |

Legacy modules such as `AtlassianPS`, `BitbucketPS`, and `HipChatPS` are not active documentation targets on this website.
Use their GitHub repositories directly if you need historical source or issue context.

Before creating a new issue, please search open issues first.
If a similar issue already exists, add your details there.

Expand Down Expand Up @@ -74,7 +74,6 @@ clone the source code into a container volume, and spin up a dev container for u
- [AtlassianPS](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/atlassianps)
- [AtlassianPS.Configuration](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/atlassianps.configuration)
- [AtlassianPS.github.io](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/atlassianps.github.io)
- [BitbucketPS](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/bitbucketps)
- [ConfluencePS](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/confluenceps)
- [JiraAgilePS](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/jiraagileps)
- [JiraPS](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/atlassianps/jiraps)
Expand All @@ -91,6 +90,13 @@ or by using the "Code" button in the repository itself, as shown below.

Please follow [Our Guidelines](our-guidelines.html) when contributing code or docs.

## 📚 Module Documentation Publishing

The website publishes module documentation from Git submodules.
The main `/docs/<Module>/` pages should match the latest released module package, not unreleased branch content.

See [Module Documentation Publishing](module-documentation.html) for the submodule policy and docs-only exception rules.

## 📚 Useful Material

- GitHub's guide on [Contributing to Open Source](https://guides.github.com/activities/contributing-to-open-source/#pull-request)
Expand Down
46 changes: 46 additions & 0 deletions docs/Contributing/module-documentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
layout: documentation
---
# Module Documentation Publishing

The public documentation under `/docs/<Module>/` should describe the module version users can install from the PowerShell Gallery.

## Release-aligned documentation

The website consumes module documentation through Git submodules in `modules/`.
For normal updates, each module submodule should point at the latest released module tag.

This keeps cmdlet documentation, examples, parameters, and behavior notes aligned with the package users get from `Install-Module`.
The website must not publish documentation from a module branch that contains unreleased or breaking changes as the main module documentation.

Some legacy modules do not have release tags.
Do not treat an untagged submodule as release-aligned unless the module has no tags and the submodule commit is the explicit published documentation baseline for that module.

## Docs-only exceptions

A module submodule may point at a non-release commit only when the commit is compatible with the latest released package and changes documentation quality only.
Examples include typo fixes, formatting cleanup, broken-link fixes, and clarification of behavior that already exists in the released package.

Do not use a docs-only exception for changes that describe new cmdlets, new parameters, changed outputs, changed compatibility behavior, or unreleased breaking changes.
Those changes require a module release before they appear under `/docs/<Module>/`.

When opening a website pull request for a docs-only submodule update, call this out in the title or body.
The next module release should include those documentation commits and move the website submodule back to a release tag.

## Pull request checklist

- Identify every module submodule moved by the PR.
- For each moved active module, record the target tag or explain why no tag exists.
- If the target is not a tag, state whether it is a docs-only exception or a no-tags baseline.
- Confirm that the published docs do not describe unreleased behavior.
- Run `bash .github/scripts/check-module-submodules.sh` to verify active module submodules are release-aligned or explicitly excepted.
- Run the website build before requesting review.

The Pages workflow runs the same submodule check before building the site.
The check fails when an active module submodule points at an untagged commit unless that module has an explicit no-tags baseline exception.
For a docs-only exception, add a narrow commit-specific exception in `.github/scripts/check-module-submodules.sh` and explain it in the pull request body before requesting review.

## Preview documentation

If unreleased documentation is useful before a release, publish it under a clearly labeled preview location instead of the main `/docs/<Module>/` path.
Preview documentation must make clear that it may not match the latest PowerShell Gallery package.
4 changes: 1 addition & 3 deletions docs/Contributing/submitting-a-pr.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,14 @@ Use that flow as your baseline, then apply repo-specific setup and validation de

| Project | Guide |
| ----------------------------- | ------------------------------------------------------------------------------------------- |
| **AtlassianPS** | <https://github.com/AtlassianPS/AtlassianPS/blob/master/README.md> |
| **AtlassianPS.Configuration** | <https://github.com/AtlassianPS/AtlassianPS.Configuration/blob/master/README.md> |
| **AtlassianPS.github.io** | This docs section (you are here) |
| **BitbucketPS** | <https://github.com/AtlassianPS/BitbucketPS/blob/master/README.md> |
| **ConfluencePS** | <https://github.com/AtlassianPS/ConfluencePS/blob/master/README.md> |
| **HipChatPS** | <https://github.com/AtlassianPS/HipChatPS/blob/master/README.md> |
| **JiraAgilePS** | <https://github.com/AtlassianPS/JiraAgilePS/blob/master/README.md> |
| **JiraPS** ⭐ | <https://github.com/AtlassianPS/JiraPS/blob/master/CONTRIBUTING.md> |

As other modules adopt the JiraPS standard, their README links above will be replaced with `CONTRIBUTING.md`.
Legacy modules such as `AtlassianPS`, `BitbucketPS`, and `HipChatPS` are not active documentation targets on this website.

## 🧰 Setup

Expand Down
2 changes: 1 addition & 1 deletion modules/JiraAgilePS
Submodule JiraAgilePS updated 80 files
+27 −0 .cursor/rules/jiraagileps.mdc
+23 −4 .devcontainer/devcontainer.json
+4 −5 .editorconfig
+69 −0 .env.example
+2 −0 .github/ISSUE_TEMPLATE/bug_report.md
+2 −0 .github/ISSUE_TEMPLATE/feature_request.md
+16 −0 .github/PULL_REQUEST_TEMPLATE.md
+58 −0 .github/ai-context/powershell-rules.md
+23 −0 .github/copilot-instructions.md
+26 −0 .github/dependabot.yml
+20 −0 .github/instructions/jiraagile-api-compatibility.instructions.md
+157 −124 .github/workflows/ci.yml
+16 −16 .github/workflows/copilot-setup-steps.yml
+21 −0 .github/workflows/integration_tests.yml
+75 −82 .github/workflows/release.yml
+13 −3 .gitignore
+7 −5 .vscode/settings.json
+85 −0 AGENTS.md
+18 −1 CHANGELOG.md
+22 −0 CLAUDE.md
+22 −0 GEMINI.md
+259 −333 JiraAgilePS.build.ps1
+32 −0 JiraAgilePS/JiraAgilePS.Types.cs
+1 −0 JiraAgilePS/JiraAgilePS.psd1
+8 −0 JiraAgilePS/Private/ConvertTo-Board.ps1
+33 −0 JiraAgilePS/Private/ConvertTo-BoardConfiguration.ps1
+54 −0 JiraAgilePS/Private/ConvertTo-Epic.ps1
+32 −0 JiraAgilePS/Private/ConvertTo-Issue.ps1
+8 −0 JiraAgilePS/Private/ConvertTo-Sprint.ps1
+47 −0 JiraAgilePS/Private/Get-AgilePageItem.ps1
+9 −0 JiraAgilePS/Private/Write-DebugMessage.ps1
+1 −1 JiraAgilePS/Public/Add-IssueToSprint.ps1
+1 −1 JiraAgilePS/Public/Get-Board.ps1
+45 −0 JiraAgilePS/Public/Get-BoardConfiguration.ps1
+94 −0 JiraAgilePS/Public/Get-Epic.ps1
+165 −0 JiraAgilePS/Public/Get-Issue.ps1
+1 −1 JiraAgilePS/Public/Get-Sprint.ps1
+25 −3 README.md
+53 −0 Tests/Build.Tests.ps1
+45 −0 Tests/Functions/Private/ConvertTo-Board.Unit.Tests.ps1
+45 −0 Tests/Functions/Private/ConvertTo-BoardConfiguration.Unit.Tests.ps1
+57 −0 Tests/Functions/Private/ConvertTo-Epic.Unit.Tests.ps1
+45 −0 Tests/Functions/Private/ConvertTo-Issue.Unit.Tests.ps1
+58 −0 Tests/Functions/Private/ConvertTo-Sprint.Unit.Tests.ps1
+53 −0 Tests/Functions/Private/Get-AgilePageItem.Unit.Tests.ps1
+22 −0 Tests/Functions/Private/README.md
+92 −61 Tests/Functions/Public/Add-IssueToSprint.Unit.Tests.ps1
+83 −55 Tests/Functions/Public/Get-Board.Unit.Tests.ps1
+67 −0 Tests/Functions/Public/Get-BoardConfiguration.Unit.Tests.ps1
+163 −0 Tests/Functions/Public/Get-Epic.Unit.Tests.ps1
+200 −0 Tests/Functions/Public/Get-Issue.Unit.Tests.ps1
+110 −69 Tests/Functions/Public/Get-Sprint.Unit.Tests.ps1
+19 −0 Tests/Functions/Public/README.md
+356 −0 Tests/Help.Tests.ps1
+123 −0 Tests/Helpers/IntegrationTestTools.Tests.ps1
+524 −0 Tests/Helpers/IntegrationTestTools.ps1
+105 −0 Tests/Helpers/TestTools.ps1
+4 −0 Tests/Integration/.template.ps1
+46 −0 Tests/JiraAgilePS.Tests.ps1
+91 −0 Tests/Project.Tests.ps1
+51 −0 Tests/README.md
+114 −0 Tests/Style.Tests.ps1
+48 −0 Tests/TestTools.Tests.ps1
+2 −2 Tools/build.requirements.psd1
+2 −1 Tools/setup.ps1
+5 −1 Tools/update.dependencies.ps1
+0 −198 azure-pipelines.yml
+61 −0 docs/agile-api-coverage-matrix.md
+24 −0 docs/en-US/about_JiraAgilePS.md
+47 −0 docs/en-US/about_JiraAgilePS_Authentication.md
+50 −0 docs/en-US/about_JiraAgilePS_AutomationPatterns.md
+46 −0 docs/en-US/about_JiraAgilePS_BoardsAndSprints.md
+141 −0 docs/en-US/commands/Add-IssueToSprint.md
+187 −0 docs/en-US/commands/Get-Board.md
+97 −0 docs/en-US/commands/Get-BoardConfiguration.md
+195 −0 docs/en-US/commands/Get-Epic.md
+313 −0 docs/en-US/commands/Get-Issue.md
+236 −0 docs/en-US/commands/Get-Sprint.md
+15 −0 docs/en-US/commands/index.md
+0 −5 docs/en-US/index.md
Loading