@codedrifters/configulator 0.0.188 → 0.0.190
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.
- package/lib/index.js +137 -2
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +137 -2
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -745,6 +745,129 @@ var baseBundle = {
|
|
|
745
745
|
].join("\n"),
|
|
746
746
|
tags: ["workflow"]
|
|
747
747
|
},
|
|
748
|
+
{
|
|
749
|
+
name: "issue-label-conventions",
|
|
750
|
+
description: "Priority and status label taxonomy, defaults, inference rules, and blocking rules for agent-created or updated issues",
|
|
751
|
+
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
752
|
+
content: [
|
|
753
|
+
"# Issue Label Conventions",
|
|
754
|
+
"",
|
|
755
|
+
"Every issue created or updated by an agent in **{{repository.owner}}/{{repository.name}}**",
|
|
756
|
+
"must carry exactly one `priority:*` label and exactly one `status:*` label.",
|
|
757
|
+
"These conventions apply to **all** agent bundles \u2014 do not redefine them",
|
|
758
|
+
"locally. The orchestrator and issue worker depend on this taxonomy.",
|
|
759
|
+
"",
|
|
760
|
+
"## Priority Labels",
|
|
761
|
+
"",
|
|
762
|
+
"Pick exactly one of the following:",
|
|
763
|
+
"",
|
|
764
|
+
"| Label | Criteria |",
|
|
765
|
+
"|-------|----------|",
|
|
766
|
+
"| `priority:critical` | Production is broken, blocked, or data at risk. Must start immediately. Use for outages, security incidents, regressions that block a release. |",
|
|
767
|
+
"| `priority:high` | Important work that should be next in the queue. Blocks other planned work, an epic's children, or a near-term deliverable. |",
|
|
768
|
+
"| `priority:medium` | Default for normal planned work. No immediate blocker but belongs in the current roadmap. |",
|
|
769
|
+
"| `priority:low` | Nice-to-have. Can be deferred without impact. Cleanups, minor polish, non-urgent refactors. |",
|
|
770
|
+
"| `priority:trivial` | Cosmetic or optional. Typos, formatting, stray comments. Safe to never pick up. |",
|
|
771
|
+
"",
|
|
772
|
+
"### Default Priority",
|
|
773
|
+
"",
|
|
774
|
+
"When the user has not indicated a priority and context provides no signal,",
|
|
775
|
+
"assign `priority:medium`.",
|
|
776
|
+
"",
|
|
777
|
+
"### Inference Heuristics",
|
|
778
|
+
"",
|
|
779
|
+
"Before defaulting to medium, scan the user's request and the issue context",
|
|
780
|
+
"for these signals:",
|
|
781
|
+
"",
|
|
782
|
+
"- **Urgency language** \u2014 words like *urgent*, *ASAP*, *immediately*, *now*,",
|
|
783
|
+
" *blocker*, *on fire* \u2192 `priority:critical`",
|
|
784
|
+
"- **Importance language** \u2014 words like *important*, *soon*, *need this*,",
|
|
785
|
+
" *next up*, *before launch* \u2192 `priority:high`",
|
|
786
|
+
"- **Deadlines** \u2014 an explicit due date within 7 days \u2192 `priority:high`;",
|
|
787
|
+
" within 24 hours or labeled as a release blocker \u2192 `priority:critical`",
|
|
788
|
+
"- **Blocker status** \u2014 the issue blocks another open issue, an epic child,",
|
|
789
|
+
" or a release \u2192 `priority:high` (or `priority:critical` if the blocked",
|
|
790
|
+
" work is itself critical)",
|
|
791
|
+
"- **Business impact** \u2014 revenue loss, customer-facing outage, security",
|
|
792
|
+
" exposure \u2192 `priority:critical`",
|
|
793
|
+
"- **Polish language** \u2014 *nice to have*, *minor*, *cleanup*, *whenever*,",
|
|
794
|
+
" *low priority* \u2192 `priority:low`",
|
|
795
|
+
"- **Cosmetic scope** \u2014 typo fixes, comment tweaks, formatting-only \u2192 `priority:trivial`",
|
|
796
|
+
"- **Meeting-note origin** \u2014 any issue created from reviewing meeting notes or",
|
|
797
|
+
" a meeting transcript \u2192 `priority:high` (meeting follow-ups are time-sensitive",
|
|
798
|
+
" and presumed important unless the note explicitly says otherwise)",
|
|
799
|
+
"",
|
|
800
|
+
"### Ask vs. Infer",
|
|
801
|
+
"",
|
|
802
|
+
"- **Infer** when the user's request contains at least one clear signal from",
|
|
803
|
+
" the heuristics above, or when the default (`priority:medium`) is clearly",
|
|
804
|
+
" appropriate (routine feature, refactor, or chore with no urgency cues).",
|
|
805
|
+
"- **Ask** before creating the issue when:",
|
|
806
|
+
' - The request mixes signals (e.g., "minor but blocks the release")',
|
|
807
|
+
" - The work would reasonably map to `priority:critical` \u2014 always confirm",
|
|
808
|
+
" before using the top tier",
|
|
809
|
+
" - The scope is ambiguous enough that medium vs. high is unclear **and**",
|
|
810
|
+
" the outcome would change how the orchestrator sequences work",
|
|
811
|
+
"- When asking, pose a single question with the candidate levels, e.g.",
|
|
812
|
+
' "Is this `priority:high` (next in queue) or `priority:medium` (normal)?"',
|
|
813
|
+
"",
|
|
814
|
+
"## Status Labels",
|
|
815
|
+
"",
|
|
816
|
+
"Pick exactly one of the following. Status reflects where the issue sits in",
|
|
817
|
+
"the workflow, not the nature of the work.",
|
|
818
|
+
"",
|
|
819
|
+
"| Label | Criteria |",
|
|
820
|
+
"|-------|----------|",
|
|
821
|
+
"| `status:ready` | The issue is fully specified, has no open blockers, and is available for a worker to pick up. |",
|
|
822
|
+
"| `status:blocked` | The issue cannot be started yet \u2014 either it declares `Depends on: #N` on an open issue, or it is an epic with one or more open children. |",
|
|
823
|
+
"| `status:in-progress` | A worker has claimed the issue and a branch exists. Set when the worker starts; cleared only on completion or failure. |",
|
|
824
|
+
"| `status:needs-attention` | Automated triage has flagged the issue for human review (stale, failed worker, or ambiguous state). Humans reset this label manually. |",
|
|
825
|
+
"| `status:done` | The change has shipped. Usually set when the PR merges and the issue closes. |",
|
|
826
|
+
"",
|
|
827
|
+
"### Blocking Rules",
|
|
828
|
+
"",
|
|
829
|
+
"Two rules force `status:blocked` \u2014 both are non-negotiable:",
|
|
830
|
+
"",
|
|
831
|
+
"1. **Epic-blocking rule.** Any issue of GitHub type *Epic* that has one or",
|
|
832
|
+
" more open child issues must carry `status:blocked`. Only flip it to",
|
|
833
|
+
" `status:ready` (or close it) once every child is resolved.",
|
|
834
|
+
"2. **Dependency-blocking rule.** Any issue whose body contains a",
|
|
835
|
+
" `Depends on: #N` line referencing an open issue must carry",
|
|
836
|
+
" `status:blocked` for as long as that dependency remains open.",
|
|
837
|
+
" When all referenced dependencies close, transition to `status:ready`.",
|
|
838
|
+
"",
|
|
839
|
+
"### Status Transitions",
|
|
840
|
+
"",
|
|
841
|
+
"Agents transition status labels at these well-defined points:",
|
|
842
|
+
"",
|
|
843
|
+
"- **Issue creation** \u2192 `status:ready` by default, or `status:blocked` if",
|
|
844
|
+
" either blocking rule applies.",
|
|
845
|
+
"- **Worker claims the issue** \u2192 remove `status:ready`, add",
|
|
846
|
+
" `status:in-progress`. A branch must exist before this transition.",
|
|
847
|
+
"- **Worker opens a PR** \u2192 leave `status:in-progress` in place until the",
|
|
848
|
+
" PR merges. Do not pre-flip to `status:done`.",
|
|
849
|
+
"- **PR merges / issue closes** \u2192 remove `status:in-progress`, add",
|
|
850
|
+
" `status:done`.",
|
|
851
|
+
"- **Dependency resolves** \u2192 if the issue was `status:blocked` solely because",
|
|
852
|
+
" of the dependency-blocking rule, remove `status:blocked` and add",
|
|
853
|
+
" `status:ready`.",
|
|
854
|
+
"- **Automated flag** \u2192 add `status:needs-attention` (do not remove existing",
|
|
855
|
+
" status). Never auto-reset a `status:needs-attention` issue back to ready;",
|
|
856
|
+
" a human must decide.",
|
|
857
|
+
"- **PR CI failure** \u2192 add `status:needs-attention` to the associated PR (and",
|
|
858
|
+
" its linked issue) when CI fails in a **permanent** state \u2014 i.e. the failure",
|
|
859
|
+
" persists after a rerun, or the failure is clearly not a flake (compile",
|
|
860
|
+
" errors, failing assertions, type errors, broken builds). Do **not** flag",
|
|
861
|
+
" when CI self-mutates the PR and the follow-up run passes \u2014 for example,",
|
|
862
|
+
" lint auto-fixes, formatter commits, or snapshot/lockfile updates pushed",
|
|
863
|
+
" by CI. Those are expected self-healing behaviors, not failures.",
|
|
864
|
+
"",
|
|
865
|
+
"An issue must always carry exactly one of `status:ready`, `status:blocked`,",
|
|
866
|
+
"`status:in-progress`, or `status:done`. The `status:needs-attention` label",
|
|
867
|
+
"is additive \u2014 it coexists with whichever of those four applies."
|
|
868
|
+
].join("\n"),
|
|
869
|
+
tags: ["workflow"]
|
|
870
|
+
},
|
|
748
871
|
{
|
|
749
872
|
name: "issue-conventions",
|
|
750
873
|
description: "Issue title prefixes, GitHub issue type mapping, prerequisite issues",
|
|
@@ -876,8 +999,20 @@ var githubWorkflowBundle = {
|
|
|
876
999
|
"6. **Create the issue** using `gh issue create`:",
|
|
877
1000
|
" - `--title '<type>: <description>'`",
|
|
878
1001
|
" - `--body '<issue body>'`",
|
|
879
|
-
" - `--type '<GitHub issue type>'` (Epic, Feature, Bug, or Task)",
|
|
880
1002
|
" - `--label '<type-label>' --label '<priority-label>' --label '<status-label>'`",
|
|
1003
|
+
"7. **Set the GitHub issue type** via the GraphQL `updateIssueIssueType` mutation:",
|
|
1004
|
+
" - Look up the issue's node ID: `gh issue view <issue-number> --json id -q .id`",
|
|
1005
|
+
" - Look up the repo's issue type node IDs (one-time, can be cached):",
|
|
1006
|
+
"",
|
|
1007
|
+
" ```sh",
|
|
1008
|
+
" gh api graphql -f query='query($owner:String!,$repo:String!){repository(owner:$owner,name:$repo){issueTypes(first:20){nodes{id name}}}}' -f owner=<owner> -f repo=<repo>",
|
|
1009
|
+
" ```",
|
|
1010
|
+
"",
|
|
1011
|
+
" - Apply the chosen type to the issue:",
|
|
1012
|
+
"",
|
|
1013
|
+
" ```sh",
|
|
1014
|
+
" gh api graphql -f query='mutation($issueId:ID!,$typeId:ID!){updateIssueIssueType(input:{issueId:$issueId,issueTypeId:$typeId}){issue{number issueType{name}}}}' -f issueId=<issue-node-id> -f typeId=<issue-type-node-id>",
|
|
1015
|
+
" ```",
|
|
881
1016
|
"",
|
|
882
1017
|
"### Issue Body Template",
|
|
883
1018
|
"",
|
|
@@ -898,7 +1033,7 @@ var githubWorkflowBundle = {
|
|
|
898
1033
|
"### Important",
|
|
899
1034
|
"",
|
|
900
1035
|
"- Always use the conventional prefix in the issue title",
|
|
901
|
-
"- Always assign the correct GitHub issue type",
|
|
1036
|
+
"- Always assign the correct GitHub issue type via the `updateIssueIssueType` GraphQL mutation (step 7) \u2014 never via `gh issue create --type`",
|
|
902
1037
|
"- Always include `type:*`, `priority:*`, and `status:*` labels",
|
|
903
1038
|
"- If the user does not specify a type, ask before creating the issue",
|
|
904
1039
|
"- If the priority cannot be inferred from the description, ask the user before creating the issue",
|