@plainconceptsplatform/workflows 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +40 -11
  2. package/dist/catalog-installation.d.ts +11 -2
  3. package/dist/catalog-installation.js +53 -9
  4. package/dist/catalog-installation.test.js +198 -16
  5. package/dist/catalog-listing.d.ts +13 -0
  6. package/dist/catalog-listing.js +68 -0
  7. package/dist/catalog-listing.test.d.ts +1 -0
  8. package/dist/catalog-listing.test.js +137 -0
  9. package/dist/index.js +76 -12
  10. package/dist/index.test.d.ts +1 -0
  11. package/dist/index.test.js +112 -0
  12. package/dist/repository-inspection.test.d.ts +1 -0
  13. package/dist/repository-inspection.test.js +77 -0
  14. package/dist/tui.d.ts +25 -0
  15. package/dist/tui.js +254 -0
  16. package/dist/tui.test.d.ts +1 -0
  17. package/dist/tui.test.js +246 -0
  18. package/dist/workflow-catalog.d.ts +15 -8
  19. package/dist/workflow-catalog.js +25 -15
  20. package/dist/workflow-catalog.test.js +18 -3
  21. package/loops/actions/add-issue-labels/action.yml +30 -29
  22. package/loops/actions/agent-output.cjs +1 -0
  23. package/loops/actions/apply-agent-bundle/action.yml +24 -23
  24. package/loops/actions/apply-agent-bundle/apply-bundle.sh +1 -0
  25. package/loops/actions/apply-agent-comments/action.yml +42 -41
  26. package/loops/actions/apply-agent-labels/action.yml +55 -54
  27. package/loops/actions/apply-agent-output/action.yml +108 -107
  28. package/loops/actions/audit-close/action.yml +104 -103
  29. package/loops/actions/classify-route/action.yml +91 -90
  30. package/loops/actions/classify-route/classify-route.sh +1 -0
  31. package/loops/actions/cleanup-artifacts/action.yml +65 -64
  32. package/loops/actions/close-agent-issues/action.yml +43 -42
  33. package/loops/actions/create-agent-issues/action.yml +52 -51
  34. package/loops/actions/create-issue-comment/action.yml +29 -28
  35. package/loops/actions/download-agent-output/action.yml +53 -52
  36. package/loops/actions/identify-gate-subject/action.yml +97 -96
  37. package/loops/actions/link-pr-to-issue/action.yml +40 -39
  38. package/loops/actions/list-open-issues/action.yml +33 -32
  39. package/loops/actions/load-issue-context/action.yml +43 -42
  40. package/loops/actions/merge-agent-pr/action.yml +36 -35
  41. package/loops/actions/push-agent-branch/action.yml +45 -44
  42. package/loops/actions/remove-issue-labels/action.yml +35 -34
  43. package/loops/actions/stale-recovery/action.yml +288 -287
  44. package/loops/actions/update-agent-issues/action.yml +58 -57
  45. package/loops/actions/validate-refine-output/action.yml +44 -43
  46. package/loops/actions/validate-refine-output/validate-refine-output.sh +1 -0
  47. package/loops/actions/verify-composite-actions/action.yml +9 -8
  48. package/loops/actions/verify-composite-actions/verify-composite-actions.sh +1 -0
  49. package/loops/actions/verify-refine-output/action.yml +9 -8
  50. package/loops/actions/verify-refine-output/verify-refine-output.sh +1 -0
  51. package/loops/actions/verify-route-matrix/action.yml +9 -8
  52. package/loops/actions/verify-route-matrix/verify-route-matrix.sh +1 -0
  53. package/loops/scripts/compile-agent-workflows.mjs +29 -13
  54. package/loops/templates/agentics/agentics-checks.yml +86 -0
  55. package/loops/templates/agentics/agentics-maintenance.yml +121 -0
  56. package/loops/templates/ci/app-ci-dotnet-next.yml +167 -0
  57. package/loops/templates/ci/app-ci-node-monorepo.yml +178 -0
  58. package/loops/templates/opencode/opencode.ci.json +46 -0
  59. package/loops/templates/opencode/opencode.ci.json.md +41 -0
  60. package/loops/workflows/agent-apply-review.md +9 -10
  61. package/loops/workflows/agent-audit.md +6 -7
  62. package/loops/workflows/agent-direct.md +7 -8
  63. package/loops/workflows/agent-implement.md +7 -8
  64. package/loops/workflows/agent-merge-gate.md +9 -10
  65. package/loops/workflows/agent-propose.md +7 -8
  66. package/loops/workflows/agent-refine.md +5 -7
  67. package/loops/workflows/shared/opencode-ci.md +105 -1
  68. package/loops/workflows/shared/platform-defaults.md +1 -0
  69. package/loops/workflows/work-router.yml +1 -0
  70. package/package.json +2 -2
  71. package/loops/aw/repo-config.md +0 -12
@@ -1,51 +1,52 @@
1
- name: Create agent issues
2
- description: Create every create_issue item from agent_output.json.
3
- inputs:
4
- output-file:
5
- description: Path to agent_output.json.
6
- required: true
7
- token:
8
- description: GitHub token with issues:write.
9
- required: true
10
- outputs:
11
- created-count:
12
- description: Number of issues created.
13
- value: ${{ steps.create.outputs.created-count }}
14
- first-issue-number:
15
- description: Issue number of the first issue created, or empty.
16
- value: ${{ steps.create.outputs.first-issue-number }}
17
- runs:
18
- using: composite
19
- steps:
20
- - name: Create issues
21
- id: create
22
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
23
- env:
24
- AGENT_OUTPUT_LIB: ${{ github.action_path }}/../agent-output.cjs
25
- OUTPUT_FILE: ${{ inputs.output-file }}
26
- with:
27
- github-token: ${{ inputs.token }}
28
- script: |
29
- const { readAgentItems } = require(process.env.AGENT_OUTPUT_LIB);
30
- const items = readAgentItems(process.env.OUTPUT_FILE, 'create_issue');
31
-
32
- const created = [];
33
-
34
- for (const item of items) {
35
- if (!item.title) {
36
- core.warning(`create_issue item has no title, skipping: ${JSON.stringify(item)}`);
37
- continue;
38
- }
39
-
40
- const { data } = await github.rest.issues.create({
41
- ...context.repo,
42
- title: item.title,
43
- body: item.body ?? '',
44
- });
45
-
46
- created.push(data.number);
47
- core.info(`Created #${data.number}: ${item.title}`);
48
- }
49
-
50
- core.setOutput('created-count', String(created.length));
51
- core.setOutput('first-issue-number', created.length > 0 ? String(created[0]) : '');
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/actions/create-agent-issues/action.yml. Update with workflows update --force; consumer edits may be overwritten.
2
+ name: Create agent issues
3
+ description: Create every create_issue item from agent_output.json.
4
+ inputs:
5
+ output-file:
6
+ description: Path to agent_output.json.
7
+ required: true
8
+ token:
9
+ description: GitHub token with issues:write.
10
+ required: true
11
+ outputs:
12
+ created-count:
13
+ description: Number of issues created.
14
+ value: ${{ steps.create.outputs.created-count }}
15
+ first-issue-number:
16
+ description: Issue number of the first issue created, or empty.
17
+ value: ${{ steps.create.outputs.first-issue-number }}
18
+ runs:
19
+ using: composite
20
+ steps:
21
+ - name: Create issues
22
+ id: create
23
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
24
+ env:
25
+ AGENT_OUTPUT_LIB: ${{ github.action_path }}/../agent-output.cjs
26
+ OUTPUT_FILE: ${{ inputs.output-file }}
27
+ with:
28
+ github-token: ${{ inputs.token }}
29
+ script: |
30
+ const { readAgentItems } = require(process.env.AGENT_OUTPUT_LIB);
31
+ const items = readAgentItems(process.env.OUTPUT_FILE, 'create_issue');
32
+
33
+ const created = [];
34
+
35
+ for (const item of items) {
36
+ if (!item.title) {
37
+ core.warning(`create_issue item has no title, skipping: ${JSON.stringify(item)}`);
38
+ continue;
39
+ }
40
+
41
+ const { data } = await github.rest.issues.create({
42
+ ...context.repo,
43
+ title: item.title,
44
+ body: item.body ?? '',
45
+ });
46
+
47
+ created.push(data.number);
48
+ core.info(`Created #${data.number}: ${item.title}`);
49
+ }
50
+
51
+ core.setOutput('created-count', String(created.length));
52
+ core.setOutput('first-issue-number', created.length > 0 ? String(created[0]) : '');
@@ -1,28 +1,29 @@
1
- name: Create issue comment
2
- description: Create a comment on an issue or pull request.
3
- inputs:
4
- token:
5
- description: GitHub token used by github-script.
6
- required: true
7
- issue-number:
8
- description: Issue or pull request number.
9
- required: true
10
- body:
11
- description: Complete Markdown comment body.
12
- required: true
13
- runs:
14
- using: composite
15
- steps:
16
- - name: Create comment
17
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
18
- env:
19
- ISSUE_NUMBER: ${{ inputs.issue-number }}
20
- BODY: ${{ inputs.body }}
21
- with:
22
- github-token: ${{ inputs.token }}
23
- script: |
24
- await github.rest.issues.createComment({
25
- ...context.repo,
26
- issue_number: Number(process.env.ISSUE_NUMBER),
27
- body: process.env.BODY,
28
- });
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/actions/create-issue-comment/action.yml. Update with workflows update --force; consumer edits may be overwritten.
2
+ name: Create issue comment
3
+ description: Create a comment on an issue or pull request.
4
+ inputs:
5
+ token:
6
+ description: GitHub token used by github-script.
7
+ required: true
8
+ issue-number:
9
+ description: Issue or pull request number.
10
+ required: true
11
+ body:
12
+ description: Complete Markdown comment body.
13
+ required: true
14
+ runs:
15
+ using: composite
16
+ steps:
17
+ - name: Create comment
18
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
19
+ env:
20
+ ISSUE_NUMBER: ${{ inputs.issue-number }}
21
+ BODY: ${{ inputs.body }}
22
+ with:
23
+ github-token: ${{ inputs.token }}
24
+ script: |
25
+ await github.rest.issues.createComment({
26
+ ...context.repo,
27
+ issue_number: Number(process.env.ISSUE_NUMBER),
28
+ body: process.env.BODY,
29
+ });
@@ -1,52 +1,53 @@
1
- name: Download agent output
2
- description: Download the agent artifact and expose the output JSON and bundle paths.
3
- inputs:
4
- artifact-name:
5
- description: >-
6
- Artifact name to download. gh-aw prefixes it with the value it derives from the
7
- workflow's inputs, so a workflow_call worker must pass the activation job's
8
- artifact_prefix output followed by "agent", not the bare name.
9
- required: true
10
- outputs:
11
- output-file:
12
- description: Path to agent_output.json, or empty if not found.
13
- value: ${{ steps.download.outputs.output-file }}
14
- bundle-file:
15
- description: Path to the git bundle, or empty if not found.
16
- value: ${{ steps.download.outputs.bundle-file }}
17
- item-count:
18
- description: Number of items in the agent output.
19
- value: ${{ steps.download.outputs.item-count }}
20
- runs:
21
- using: composite
22
- steps:
23
- - name: Download agent artifact
24
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
25
- with:
26
- name: ${{ inputs.artifact-name }}
27
- path: agent-artifact
28
- - name: Locate output and bundle
29
- id: download
30
- shell: bash
31
- env:
32
- ARTIFACT_NAME: ${{ inputs.artifact-name }}
33
- run: |
34
- set -euo pipefail
35
- OUTPUT_FILE=""
36
- BUNDLE_FILE=""
37
- ITEM_COUNT="0"
38
-
39
- if [ -f "agent-artifact/agent_output.json" ]; then
40
- OUTPUT_FILE="agent-artifact/agent_output.json"
41
- ITEM_COUNT=$(jq '.items | length' "$OUTPUT_FILE")
42
- BUNDLE_FILE=$(ls agent-artifact/aw-*.bundle 2>/dev/null | head -1 || true)
43
- else
44
- echo "::error::Artifact '$ARTIFACT_NAME' contained no agent_output.json. Nothing the agent proposed will be applied."
45
- exit 1
46
- fi
47
-
48
- echo "Artifact '$ARTIFACT_NAME' carries $ITEM_COUNT item(s)."
49
-
50
- echo "output-file=$OUTPUT_FILE" >> "$GITHUB_OUTPUT"
51
- echo "bundle-file=$BUNDLE_FILE" >> "$GITHUB_OUTPUT"
52
- echo "item-count=$ITEM_COUNT" >> "$GITHUB_OUTPUT"
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/actions/download-agent-output/action.yml. Update with workflows update --force; consumer edits may be overwritten.
2
+ name: Download agent output
3
+ description: Download the agent artifact and expose the output JSON and bundle paths.
4
+ inputs:
5
+ artifact-name:
6
+ description: >-
7
+ Artifact name to download. gh-aw prefixes it with the value it derives from the
8
+ workflow's inputs, so a workflow_call worker must pass the activation job's
9
+ artifact_prefix output followed by "agent", not the bare name.
10
+ required: true
11
+ outputs:
12
+ output-file:
13
+ description: Path to agent_output.json, or empty if not found.
14
+ value: ${{ steps.download.outputs.output-file }}
15
+ bundle-file:
16
+ description: Path to the git bundle, or empty if not found.
17
+ value: ${{ steps.download.outputs.bundle-file }}
18
+ item-count:
19
+ description: Number of items in the agent output.
20
+ value: ${{ steps.download.outputs.item-count }}
21
+ runs:
22
+ using: composite
23
+ steps:
24
+ - name: Download agent artifact
25
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
26
+ with:
27
+ name: ${{ inputs.artifact-name }}
28
+ path: agent-artifact
29
+ - name: Locate output and bundle
30
+ id: download
31
+ shell: bash
32
+ env:
33
+ ARTIFACT_NAME: ${{ inputs.artifact-name }}
34
+ run: |
35
+ set -euo pipefail
36
+ OUTPUT_FILE=""
37
+ BUNDLE_FILE=""
38
+ ITEM_COUNT="0"
39
+
40
+ if [ -f "agent-artifact/agent_output.json" ]; then
41
+ OUTPUT_FILE="agent-artifact/agent_output.json"
42
+ ITEM_COUNT=$(jq '.items | length' "$OUTPUT_FILE")
43
+ BUNDLE_FILE=$(ls agent-artifact/aw-*.bundle 2>/dev/null | head -1 || true)
44
+ else
45
+ echo "::error::Artifact '$ARTIFACT_NAME' contained no agent_output.json. Nothing the agent proposed will be applied."
46
+ exit 1
47
+ fi
48
+
49
+ echo "Artifact '$ARTIFACT_NAME' carries $ITEM_COUNT item(s)."
50
+
51
+ echo "output-file=$OUTPUT_FILE" >> "$GITHUB_OUTPUT"
52
+ echo "bundle-file=$BUNDLE_FILE" >> "$GITHUB_OUTPUT"
53
+ echo "item-count=$ITEM_COUNT" >> "$GITHUB_OUTPUT"
@@ -1,96 +1,97 @@
1
- name: Identify gate subject
2
- description: Confirm the pull request is one we authored, resolve the issue it closes, and check that issue carries the required label.
3
- inputs:
4
- token:
5
- description: GitHub token with issues and pull-requests read access.
6
- required: true
7
- pr-number:
8
- description: Pull request number to gate.
9
- required: true
10
- ci-conclusion:
11
- description: Conclusion reported by the CI run that triggered this gate.
12
- required: true
13
- linked-issue:
14
- description: Issue the pull request closes, when the router already resolved it.
15
- required: false
16
- default: ''
17
- require-label:
18
- description: Label the closing issue must carry. Empty disables the check.
19
- required: false
20
- default: ''
21
- outputs:
22
- found:
23
- description: Whether a valid gate subject was found.
24
- value: ${{ steps.identify.outputs.found }}
25
- pr:
26
- description: Pull request number.
27
- value: ${{ steps.identify.outputs.pr }}
28
- issue:
29
- description: Issue number the pull request closes.
30
- value: ${{ steps.identify.outputs.issue }}
31
- conclusion:
32
- description: CI conclusion, passed through unchanged.
33
- value: ${{ steps.identify.outputs.conclusion }}
34
- runs:
35
- using: composite
36
- steps:
37
- - name: Identify pull request and closing issue
38
- id: identify
39
- shell: bash
40
- env:
41
- GH_TOKEN: ${{ inputs.token }}
42
- REPO: ${{ github.repository }}
43
- PR_NUMBER: ${{ inputs.pr-number }}
44
- CONCLUSION: ${{ inputs.ci-conclusion }}
45
- LINKED_ISSUE: ${{ inputs.linked-issue }}
46
- REQUIRE_LABEL: ${{ inputs.require-label }}
47
- run: |
48
- set -euo pipefail
49
-
50
- none() {
51
- echo "found=false" >> "$GITHUB_OUTPUT"
52
- echo "$1"
53
- exit 0
54
- }
55
-
56
- pr="$(gh pr view "$PR_NUMBER" --repo "$REPO" \
57
- --json state,author,closingIssuesReferences,body)"
58
-
59
- [ "$(jq -r '.state' <<<"$pr")" = "OPEN" ] || none "PR #$PR_NUMBER is not open"
60
-
61
- # Use GitHub's bot flag because App login formats differ across APIs.
62
- if [ "$(jq -r '.author.is_bot' <<<"$pr")" != "true" ]; then
63
- none "PR #$PR_NUMBER was authored by $(jq -r '.author.login' <<<"$pr"), a human."
64
- fi
65
-
66
- issue="$LINKED_ISSUE"
67
-
68
- if [ -z "$issue" ]; then
69
- issue="$(jq -r '.closingIssuesReferences[0].number // empty' <<<"$pr")"
70
- fi
71
-
72
- if [ -z "$issue" ]; then
73
- issue="$(jq -r '.body // ""' <<<"$pr" |
74
- grep -oiE '(close[sd]?|fixe?[sd]?|resolve[sd]?) +#[0-9]+' |
75
- grep -oE '[0-9]+' | head -n 1 || true)"
76
- fi
77
-
78
- [ -n "$issue" ] || none "PR #$PR_NUMBER does not close a numbered issue"
79
-
80
- if [ -n "$REQUIRE_LABEL" ]; then
81
- labels="$(gh issue view "$issue" --repo "$REPO" --json labels \
82
- --jq '[.labels[].name]')"
83
-
84
- if ! jq -e --arg name "$REQUIRE_LABEL" 'index($name)' >/dev/null <<<"$labels"; then
85
- none "issue #$issue does not carry $REQUIRE_LABEL (has: $(jq -r 'join(", ")' <<<"$labels"))"
86
- fi
87
- fi
88
-
89
- {
90
- echo "found=true"
91
- echo "pr=$PR_NUMBER"
92
- echo "issue=$issue"
93
- echo "conclusion=$CONCLUSION"
94
- } >> "$GITHUB_OUTPUT"
95
-
96
- echo "PR #$PR_NUMBER closes #$issue; CI concluded $CONCLUSION"
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/actions/identify-gate-subject/action.yml. Update with workflows update --force; consumer edits may be overwritten.
2
+ name: Identify gate subject
3
+ description: Confirm the pull request is one we authored, resolve the issue it closes, and check that issue carries the required label.
4
+ inputs:
5
+ token:
6
+ description: GitHub token with issues and pull-requests read access.
7
+ required: true
8
+ pr-number:
9
+ description: Pull request number to gate.
10
+ required: true
11
+ ci-conclusion:
12
+ description: Conclusion reported by the CI run that triggered this gate.
13
+ required: true
14
+ linked-issue:
15
+ description: Issue the pull request closes, when the router already resolved it.
16
+ required: false
17
+ default: ''
18
+ require-label:
19
+ description: Label the closing issue must carry. Empty disables the check.
20
+ required: false
21
+ default: ''
22
+ outputs:
23
+ found:
24
+ description: Whether a valid gate subject was found.
25
+ value: ${{ steps.identify.outputs.found }}
26
+ pr:
27
+ description: Pull request number.
28
+ value: ${{ steps.identify.outputs.pr }}
29
+ issue:
30
+ description: Issue number the pull request closes.
31
+ value: ${{ steps.identify.outputs.issue }}
32
+ conclusion:
33
+ description: CI conclusion, passed through unchanged.
34
+ value: ${{ steps.identify.outputs.conclusion }}
35
+ runs:
36
+ using: composite
37
+ steps:
38
+ - name: Identify pull request and closing issue
39
+ id: identify
40
+ shell: bash
41
+ env:
42
+ GH_TOKEN: ${{ inputs.token }}
43
+ REPO: ${{ github.repository }}
44
+ PR_NUMBER: ${{ inputs.pr-number }}
45
+ CONCLUSION: ${{ inputs.ci-conclusion }}
46
+ LINKED_ISSUE: ${{ inputs.linked-issue }}
47
+ REQUIRE_LABEL: ${{ inputs.require-label }}
48
+ run: |
49
+ set -euo pipefail
50
+
51
+ none() {
52
+ echo "found=false" >> "$GITHUB_OUTPUT"
53
+ echo "$1"
54
+ exit 0
55
+ }
56
+
57
+ pr="$(gh pr view "$PR_NUMBER" --repo "$REPO" \
58
+ --json state,author,closingIssuesReferences,body)"
59
+
60
+ [ "$(jq -r '.state' <<<"$pr")" = "OPEN" ] || none "PR #$PR_NUMBER is not open"
61
+
62
+ # Use GitHub's bot flag because App login formats differ across APIs.
63
+ if [ "$(jq -r '.author.is_bot' <<<"$pr")" != "true" ]; then
64
+ none "PR #$PR_NUMBER was authored by $(jq -r '.author.login' <<<"$pr"), a human."
65
+ fi
66
+
67
+ issue="$LINKED_ISSUE"
68
+
69
+ if [ -z "$issue" ]; then
70
+ issue="$(jq -r '.closingIssuesReferences[0].number // empty' <<<"$pr")"
71
+ fi
72
+
73
+ if [ -z "$issue" ]; then
74
+ issue="$(jq -r '.body // ""' <<<"$pr" |
75
+ grep -oiE '(close[sd]?|fixe?[sd]?|resolve[sd]?) +#[0-9]+' |
76
+ grep -oE '[0-9]+' | head -n 1 || true)"
77
+ fi
78
+
79
+ [ -n "$issue" ] || none "PR #$PR_NUMBER does not close a numbered issue"
80
+
81
+ if [ -n "$REQUIRE_LABEL" ]; then
82
+ labels="$(gh issue view "$issue" --repo "$REPO" --json labels \
83
+ --jq '[.labels[].name]')"
84
+
85
+ if ! jq -e --arg name "$REQUIRE_LABEL" 'index($name)' >/dev/null <<<"$labels"; then
86
+ none "issue #$issue does not carry $REQUIRE_LABEL (has: $(jq -r 'join(", ")' <<<"$labels"))"
87
+ fi
88
+ fi
89
+
90
+ {
91
+ echo "found=true"
92
+ echo "pr=$PR_NUMBER"
93
+ echo "issue=$issue"
94
+ echo "conclusion=$CONCLUSION"
95
+ } >> "$GITHUB_OUTPUT"
96
+
97
+ echo "PR #$PR_NUMBER closes #$issue; CI concluded $CONCLUSION"
@@ -1,39 +1,40 @@
1
- name: Link pull request to issue
2
- description: Ensure the pull request body carries a closing reference to its source issue.
3
- inputs:
4
- token:
5
- description: GitHub token with pull-requests write access.
6
- required: true
7
- pr-number:
8
- description: Pull request number.
9
- required: true
10
- issue-number:
11
- description: Issue number the pull request should close.
12
- required: true
13
- runs:
14
- using: composite
15
- steps:
16
- - name: Ensure a closing reference
17
- shell: bash
18
- env:
19
- GH_TOKEN: ${{ inputs.token }}
20
- REPO: ${{ github.repository }}
21
- PR_NUMBER: ${{ inputs.pr-number }}
22
- ISSUE_NUMBER: ${{ inputs.issue-number }}
23
- run: |
24
- set -euo pipefail
25
-
26
- pr="$(gh pr view "$PR_NUMBER" --repo "$REPO" --json closingIssuesReferences,body)"
27
-
28
- if [ "$(jq '.closingIssuesReferences | length' <<<"$pr")" -gt 0 ]; then
29
- echo "PR #$PR_NUMBER already closes an issue."
30
- exit 0
31
- fi
32
-
33
- # A closing reference can only be created from the pull request body; there is no
34
- # REST or GraphQL mutation for it.
35
- body="$(jq -r '.body // ""' <<<"$pr")"
36
- printf '%s\n\nCloses #%s\n' "$body" "$ISSUE_NUMBER" > /tmp/pr-body.md
37
-
38
- gh pr edit "$PR_NUMBER" --repo "$REPO" --body-file /tmp/pr-body.md
39
- echo "Added 'Closes #$ISSUE_NUMBER' to PR #$PR_NUMBER."
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/actions/link-pr-to-issue/action.yml. Update with workflows update --force; consumer edits may be overwritten.
2
+ name: Link pull request to issue
3
+ description: Ensure the pull request body carries a closing reference to its source issue.
4
+ inputs:
5
+ token:
6
+ description: GitHub token with pull-requests write access.
7
+ required: true
8
+ pr-number:
9
+ description: Pull request number.
10
+ required: true
11
+ issue-number:
12
+ description: Issue number the pull request should close.
13
+ required: true
14
+ runs:
15
+ using: composite
16
+ steps:
17
+ - name: Ensure a closing reference
18
+ shell: bash
19
+ env:
20
+ GH_TOKEN: ${{ inputs.token }}
21
+ REPO: ${{ github.repository }}
22
+ PR_NUMBER: ${{ inputs.pr-number }}
23
+ ISSUE_NUMBER: ${{ inputs.issue-number }}
24
+ run: |
25
+ set -euo pipefail
26
+
27
+ pr="$(gh pr view "$PR_NUMBER" --repo "$REPO" --json closingIssuesReferences,body)"
28
+
29
+ if [ "$(jq '.closingIssuesReferences | length' <<<"$pr")" -gt 0 ]; then
30
+ echo "PR #$PR_NUMBER already closes an issue."
31
+ exit 0
32
+ fi
33
+
34
+ # A closing reference can only be created from the pull request body; there is no
35
+ # REST or GraphQL mutation for it.
36
+ body="$(jq -r '.body // ""' <<<"$pr")"
37
+ printf '%s\n\nCloses #%s\n' "$body" "$ISSUE_NUMBER" > /tmp/pr-body.md
38
+
39
+ gh pr edit "$PR_NUMBER" --repo "$REPO" --body-file /tmp/pr-body.md
40
+ echo "Added 'Closes #$ISSUE_NUMBER' to PR #$PR_NUMBER."
@@ -1,32 +1,33 @@
1
- name: List open issues
2
- description: |
3
- Writes all open issues (number, title, labels) to `/tmp/gh-aw/agent/open-issues.json`
4
- so the agent can check for semantic duplicates without spending turns discovering them.
5
- inputs:
6
- token:
7
- description: GitHub token with issues:read permission.
8
- required: true
9
- repo:
10
- description: Repository in `owner/name` format.
11
- required: true
12
- output-path:
13
- description: Path to write the JSON output.
14
- required: false
15
- default: /tmp/gh-aw/agent/open-issues.json
16
- runs:
17
- using: composite
18
- steps:
19
- - name: List open issues
20
- shell: bash
21
- env:
22
- GH_TOKEN: ${{ inputs.token }}
23
- REPO: ${{ inputs.repo }}
24
- OUTPUT_PATH: ${{ inputs.output-path }}
25
- run: |
26
- set -euo pipefail
27
- mkdir -p "$(dirname "$OUTPUT_PATH")"
28
- gh issue list --repo "$REPO" --state open --limit 500 \
29
- --json number,title,labels \
30
- --jq '[.[] | {number, title, labels: [.labels[].name]}]' \
31
- > "$OUTPUT_PATH"
32
- echo "Wrote $(jq 'length' "$OUTPUT_PATH") open issues to $OUTPUT_PATH"
1
+ # Managed by @plainconceptsplatform/workflows. Source: loops/actions/list-open-issues/action.yml. Update with workflows update --force; consumer edits may be overwritten.
2
+ name: List open issues
3
+ description: |
4
+ Writes all open issues (number, title, labels) to `/tmp/gh-aw/agent/open-issues.json`
5
+ so the agent can check for semantic duplicates without spending turns discovering them.
6
+ inputs:
7
+ token:
8
+ description: GitHub token with issues:read permission.
9
+ required: true
10
+ repo:
11
+ description: Repository in `owner/name` format.
12
+ required: true
13
+ output-path:
14
+ description: Path to write the JSON output.
15
+ required: false
16
+ default: /tmp/gh-aw/agent/open-issues.json
17
+ runs:
18
+ using: composite
19
+ steps:
20
+ - name: List open issues
21
+ shell: bash
22
+ env:
23
+ GH_TOKEN: ${{ inputs.token }}
24
+ REPO: ${{ inputs.repo }}
25
+ OUTPUT_PATH: ${{ inputs.output-path }}
26
+ run: |
27
+ set -euo pipefail
28
+ mkdir -p "$(dirname "$OUTPUT_PATH")"
29
+ gh issue list --repo "$REPO" --state open --limit 500 \
30
+ --json number,title,labels \
31
+ --jq '[.[] | {number, title, labels: [.labels[].name]}]' \
32
+ > "$OUTPUT_PATH"
33
+ echo "Wrote $(jq 'length' "$OUTPUT_PATH") open issues to $OUTPUT_PATH"