pm-presets 2026.5.28
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/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +163 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/bug-triage/index.d.ts +40 -0
- package/dist/presets/bug-triage/index.d.ts.map +1 -0
- package/dist/presets/bug-triage/index.js +172 -0
- package/dist/presets/bug-triage/index.js.map +1 -0
- package/dist/presets/indie-dev/index.d.ts +24 -0
- package/dist/presets/indie-dev/index.d.ts.map +1 -0
- package/dist/presets/indie-dev/index.js +113 -0
- package/dist/presets/indie-dev/index.js.map +1 -0
- package/dist/presets/open-source/index.d.ts +43 -0
- package/dist/presets/open-source/index.d.ts.map +1 -0
- package/dist/presets/open-source/index.js +147 -0
- package/dist/presets/open-source/index.js.map +1 -0
- package/dist/presets/software-sprint/index.d.ts +24 -0
- package/dist/presets/software-sprint/index.d.ts.map +1 -0
- package/dist/presets/software-sprint/index.js +165 -0
- package/dist/presets/software-sprint/index.js.map +1 -0
- package/dist/presets/startup-roadmap/index.d.ts +43 -0
- package/dist/presets/startup-roadmap/index.d.ts.map +1 -0
- package/dist/presets/startup-roadmap/index.js +172 -0
- package/dist/presets/startup-roadmap/index.js.map +1 -0
- package/dist/registry.d.ts +29 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +59 -0
- package/dist/registry.js.map +1 -0
- package/manifest.json +62 -0
- package/package.json +112 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2026.5.28
|
|
4
|
+
|
|
5
|
+
Initial release. Consolidates the 5 individual `pm-preset-*` packages into a
|
|
6
|
+
single `pm-presets` package:
|
|
7
|
+
|
|
8
|
+
- **bug-triage** (`pm triage-setup`) — strict governance for production incidents, hotfixes, and root-cause tracking
|
|
9
|
+
- **indie-dev** (`pm indie-setup`) — minimal-ceremony workspace for solo developers
|
|
10
|
+
- **open-source** (`pm oss-setup`) — issue triage and contributor-friendly templates for OSS maintainers
|
|
11
|
+
- **software-sprint** (`pm sprint-setup`) — sprint-based team workflow with epics, features, tasks, and bugs
|
|
12
|
+
- **startup-roadmap** (`pm roadmap-setup`) — investor-grade milestones and quarterly planning for startups
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 unbraind
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# pm-presets
|
|
2
|
+
|
|
3
|
+
All 5 official [pm-cli](https://github.com/unbraind/pm-cli) workspace presets in one package.
|
|
4
|
+
|
|
5
|
+
Install once, get all preset setup commands:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pm install github.com/unbraind/pm-presets --project
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Available Presets
|
|
12
|
+
|
|
13
|
+
| Preset | Command | Governance | Best For |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| **bug-triage** | `pm triage-setup` | strict | Incident response, triage teams |
|
|
16
|
+
| **indie-dev** | `pm indie-setup` | minimal | Solo developers, personal projects |
|
|
17
|
+
| **open-source** | `pm oss-setup` | standard | OSS maintainers with community contributors |
|
|
18
|
+
| **software-sprint** | `pm sprint-setup` | standard | Engineering teams running sprints |
|
|
19
|
+
| **startup-roadmap** | `pm roadmap-setup` | standard | Startups with investor-facing roadmaps |
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
1. Initialize a pm workspace in your project:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
pm init
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
2. Apply a preset:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pm triage-setup # strict bug triage
|
|
33
|
+
pm indie-setup # minimal solo dev
|
|
34
|
+
pm oss-setup # open-source project
|
|
35
|
+
pm sprint-setup # software sprint
|
|
36
|
+
pm roadmap-setup # startup roadmap
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
All commands share the same flags:
|
|
40
|
+
|
|
41
|
+
| Flag | Short | Description |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `--force` | `-f` | Overwrite existing settings.json and templates |
|
|
44
|
+
| `--dry-run` | `-n` | Preview changes without writing any files |
|
|
45
|
+
| `--prefix` | `-p` | Override the id_prefix in settings.json |
|
|
46
|
+
|
|
47
|
+
## Presets in Detail
|
|
48
|
+
|
|
49
|
+
### bug-triage
|
|
50
|
+
|
|
51
|
+
**Governance:** strict — ownership and root-cause metadata required to close items.
|
|
52
|
+
|
|
53
|
+
**Templates:** `incident`, `hotfix-task`, `regression`
|
|
54
|
+
|
|
55
|
+
**Default id_prefix:** `bug-`
|
|
56
|
+
|
|
57
|
+
Best for on-call teams and incident response workflows that need full audit trails.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pm triage-setup
|
|
61
|
+
pm create --template incident
|
|
62
|
+
pm create --template hotfix-task
|
|
63
|
+
pm create --template regression
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### indie-dev
|
|
67
|
+
|
|
68
|
+
**Governance:** minimal — no required fields, no ownership enforcement.
|
|
69
|
+
|
|
70
|
+
**Templates:** `idea`, `task`
|
|
71
|
+
|
|
72
|
+
**Default id_prefix:** `indie-`
|
|
73
|
+
|
|
74
|
+
Best for solo developers who want lightweight task tracking with zero ceremony.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pm indie-setup
|
|
78
|
+
pm create --template idea
|
|
79
|
+
pm create --template task
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### open-source
|
|
83
|
+
|
|
84
|
+
**Governance:** standard — structured without blocking community contributors.
|
|
85
|
+
|
|
86
|
+
**Templates:** `bug-report`, `feature-request`, `good-first-issue`
|
|
87
|
+
|
|
88
|
+
**Default id_prefix:** `oss-`
|
|
89
|
+
|
|
90
|
+
Best for open-source maintainers handling community submissions and milestone releases.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
pm oss-setup
|
|
94
|
+
pm create --template bug-report
|
|
95
|
+
pm create --template feature-request
|
|
96
|
+
pm create --template good-first-issue
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### software-sprint
|
|
100
|
+
|
|
101
|
+
**Governance:** standard — sprint format validated, ownership warned.
|
|
102
|
+
|
|
103
|
+
**Templates:** `epic`, `feature`, `task`, `bug`
|
|
104
|
+
|
|
105
|
+
**Default id_prefix:** `sprint-`
|
|
106
|
+
|
|
107
|
+
Best for engineering teams running two-week sprints with epics and features.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
pm sprint-setup
|
|
111
|
+
pm create --template epic
|
|
112
|
+
pm create --template feature
|
|
113
|
+
pm create --template task
|
|
114
|
+
pm create --template bug
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### startup-roadmap
|
|
118
|
+
|
|
119
|
+
**Governance:** standard with rich metadata — captures business value and strategic context.
|
|
120
|
+
|
|
121
|
+
**Templates:** `initiative`, `feature`, `milestone`
|
|
122
|
+
|
|
123
|
+
**Default id_prefix:** `road-`
|
|
124
|
+
|
|
125
|
+
Best for startups building investor-facing roadmaps with quarterly planning.
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
pm roadmap-setup
|
|
129
|
+
pm create --template initiative
|
|
130
|
+
pm create --template feature
|
|
131
|
+
pm create --template milestone
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Migration from pm-preset-* packages
|
|
135
|
+
|
|
136
|
+
If you previously installed individual `pm-preset-*` packages, uninstall them
|
|
137
|
+
and install `pm-presets` instead:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
pm uninstall pm-preset-bug-triage
|
|
141
|
+
pm uninstall pm-preset-indie-dev
|
|
142
|
+
pm uninstall pm-preset-open-source
|
|
143
|
+
pm uninstall pm-preset-software-sprint
|
|
144
|
+
pm uninstall pm-preset-startup-roadmap
|
|
145
|
+
|
|
146
|
+
pm install github.com/unbraind/pm-presets --project
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The preset commands are identical — only the package name changed.
|
|
150
|
+
|
|
151
|
+
## Programmatic API
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import { PRESET_REGISTRY } from "pm-presets/registry";
|
|
155
|
+
|
|
156
|
+
for (const preset of PRESET_REGISTRY) {
|
|
157
|
+
console.log(preset.id, preset.command, preset.governance);
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## License
|
|
162
|
+
|
|
163
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pm-presets — all 5 official pm-cli workspace presets in one package.
|
|
3
|
+
*
|
|
4
|
+
* Each preset registers a setup command with the pm CLI extension API.
|
|
5
|
+
* Install this package once and get all presets:
|
|
6
|
+
*
|
|
7
|
+
* pm install github.com/unbraind/pm-presets --project
|
|
8
|
+
*
|
|
9
|
+
* Available commands after installation:
|
|
10
|
+
* pm triage-setup # bug-triage preset
|
|
11
|
+
* pm indie-setup # indie-dev preset
|
|
12
|
+
* pm oss-setup # open-source preset
|
|
13
|
+
* pm sprint-setup # software-sprint preset
|
|
14
|
+
* pm roadmap-setup # startup-roadmap preset
|
|
15
|
+
*/
|
|
16
|
+
declare const _default: {
|
|
17
|
+
activate(api: import("@unbrained/pm-cli/sdk").ExtensionApi): void;
|
|
18
|
+
};
|
|
19
|
+
export default _default;
|
|
20
|
+
export { PRESET_REGISTRY } from "./registry.js";
|
|
21
|
+
export type { PresetDescriptor } from "./registry.js";
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;;;AAiCH,wBA+CG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pm-presets — all 5 official pm-cli workspace presets in one package.
|
|
3
|
+
*
|
|
4
|
+
* Each preset registers a setup command with the pm CLI extension API.
|
|
5
|
+
* Install this package once and get all presets:
|
|
6
|
+
*
|
|
7
|
+
* pm install github.com/unbraind/pm-presets --project
|
|
8
|
+
*
|
|
9
|
+
* Available commands after installation:
|
|
10
|
+
* pm triage-setup # bug-triage preset
|
|
11
|
+
* pm indie-setup # indie-dev preset
|
|
12
|
+
* pm oss-setup # open-source preset
|
|
13
|
+
* pm sprint-setup # software-sprint preset
|
|
14
|
+
* pm roadmap-setup # startup-roadmap preset
|
|
15
|
+
*/
|
|
16
|
+
import { runBugTriageSetup } from "./presets/bug-triage/index.js";
|
|
17
|
+
import { runIndieDevSetup } from "./presets/indie-dev/index.js";
|
|
18
|
+
import { runOpenSourceSetup } from "./presets/open-source/index.js";
|
|
19
|
+
import { runSoftwareSprintSetup } from "./presets/software-sprint/index.js";
|
|
20
|
+
import { runStartupRoadmapSetup } from "./presets/startup-roadmap/index.js";
|
|
21
|
+
const defineExtension = ((extension) => extension);
|
|
22
|
+
const COMMON_FLAGS = [
|
|
23
|
+
{
|
|
24
|
+
long: "force",
|
|
25
|
+
short: "f",
|
|
26
|
+
type: "boolean",
|
|
27
|
+
description: "Overwrite existing settings.json and template files without prompting.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
long: "dry-run",
|
|
31
|
+
short: "n",
|
|
32
|
+
type: "boolean",
|
|
33
|
+
description: "Preview what would be written without making any changes.",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
long: "prefix",
|
|
37
|
+
short: "p",
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Override the id_prefix written to settings.json.",
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
export default defineExtension({
|
|
43
|
+
activate(api) {
|
|
44
|
+
// ── bug-triage ──────────────────────────────────────────────────────────
|
|
45
|
+
api.registerCommand({
|
|
46
|
+
name: "triage-setup",
|
|
47
|
+
description: "Apply the bug-triage preset: strict governance for production incidents, hotfixes, and root-cause tracking.",
|
|
48
|
+
flags: COMMON_FLAGS,
|
|
49
|
+
run: runBugTriageSetup,
|
|
50
|
+
});
|
|
51
|
+
// ── indie-dev ───────────────────────────────────────────────────────────
|
|
52
|
+
api.registerCommand({
|
|
53
|
+
name: "indie-setup",
|
|
54
|
+
description: "Apply the indie-dev preset: minimal-ceremony workspace for solo developers and personal projects.",
|
|
55
|
+
flags: COMMON_FLAGS,
|
|
56
|
+
run: runIndieDevSetup,
|
|
57
|
+
});
|
|
58
|
+
// ── open-source ─────────────────────────────────────────────────────────
|
|
59
|
+
api.registerCommand({
|
|
60
|
+
name: "oss-setup",
|
|
61
|
+
description: "Apply the open-source preset: issue triage, milestone releases, and contributor-friendly templates.",
|
|
62
|
+
flags: COMMON_FLAGS,
|
|
63
|
+
run: runOpenSourceSetup,
|
|
64
|
+
});
|
|
65
|
+
// ── software-sprint ─────────────────────────────────────────────────────
|
|
66
|
+
api.registerCommand({
|
|
67
|
+
name: "sprint-setup",
|
|
68
|
+
description: "Apply the software-sprint preset: sprint-based workflow with epics, features, tasks, and bugs.",
|
|
69
|
+
flags: COMMON_FLAGS,
|
|
70
|
+
run: runSoftwareSprintSetup,
|
|
71
|
+
});
|
|
72
|
+
// ── startup-roadmap ─────────────────────────────────────────────────────
|
|
73
|
+
api.registerCommand({
|
|
74
|
+
name: "roadmap-setup",
|
|
75
|
+
description: "Apply the startup-roadmap preset: investor-grade milestones, strategic initiatives, and quarterly planning.",
|
|
76
|
+
flags: COMMON_FLAGS,
|
|
77
|
+
run: runStartupRoadmapSetup,
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
// Re-export public API
|
|
82
|
+
export { PRESET_REGISTRY } from "./registry.js";
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,MAAM,eAAe,GAA+B,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,SAAS,CAAQ,CAAC;AAE3F,MAAM,YAAY,GAAG;IACnB;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAkB;QACxB,WAAW,EAAE,wEAAwE;KACtF;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAkB;QACxB,WAAW,EAAE,2DAA2D;KACzE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,kDAAkD;KAChE;CACF,CAAC;AAEF,eAAe,eAAe,CAAC;IAC7B,QAAQ,CAAC,GAAG;QACV,2EAA2E;QAC3E,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,6GAA6G;YAC/G,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,iBAAiB;SACvB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,aAAa;YACnB,WAAW,EACT,mGAAmG;YACrG,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,gBAAgB;SACtB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,qGAAqG;YACvG,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,kBAAkB;SACxB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,gGAAgG;YAClG,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,sBAAsB;SAC5B,CAAC,CAAC;QAEH,2EAA2E;QAC3E,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,eAAe;YACrB,WAAW,EACT,6GAA6G;YAC/G,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,sBAAsB;SAC5B,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CommandHandlerContext } from "@unbrained/pm-cli/sdk";
|
|
2
|
+
export declare const SETTINGS: {
|
|
3
|
+
readonly id_prefix: "bug-";
|
|
4
|
+
readonly governance: {
|
|
5
|
+
readonly preset: "strict";
|
|
6
|
+
readonly ownership_enforcement: "strict";
|
|
7
|
+
readonly create_mode_default: "strict";
|
|
8
|
+
readonly close_validation_default: "strict";
|
|
9
|
+
readonly metadata_profile: "strict";
|
|
10
|
+
};
|
|
11
|
+
readonly validation: {
|
|
12
|
+
readonly sprint_release_format: "strict_error";
|
|
13
|
+
readonly parent_reference: "warn";
|
|
14
|
+
};
|
|
15
|
+
readonly item_types: {
|
|
16
|
+
readonly definitions: readonly [{
|
|
17
|
+
readonly name: "Issue";
|
|
18
|
+
readonly description: "A defect, incident, or regression requiring investigation and resolution";
|
|
19
|
+
}, {
|
|
20
|
+
readonly name: "Task";
|
|
21
|
+
readonly description: "A remediation, hotfix, or follow-up task linked to an incident";
|
|
22
|
+
}];
|
|
23
|
+
};
|
|
24
|
+
readonly testing: {
|
|
25
|
+
readonly record_results_to_items: true;
|
|
26
|
+
};
|
|
27
|
+
readonly search: {
|
|
28
|
+
readonly mode: "keyword";
|
|
29
|
+
};
|
|
30
|
+
readonly calendar: {
|
|
31
|
+
readonly default_view: "agenda";
|
|
32
|
+
readonly first_day_of_week: 1;
|
|
33
|
+
};
|
|
34
|
+
readonly telemetry: {
|
|
35
|
+
readonly enabled: false;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export declare const TEMPLATES: Record<string, unknown>;
|
|
39
|
+
export declare function runBugTriageSetup(context: CommandHandlerContext): void;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presets/bug-triage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAMnE,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BX,CAAC;AA+DX,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAI7C,CAAC;AAIF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CA6FtE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
// ─── Settings ────────────────────────────────────────────────────────────────
|
|
4
|
+
export const SETTINGS = {
|
|
5
|
+
id_prefix: "bug-",
|
|
6
|
+
governance: {
|
|
7
|
+
preset: "strict",
|
|
8
|
+
ownership_enforcement: "strict",
|
|
9
|
+
create_mode_default: "strict",
|
|
10
|
+
close_validation_default: "strict",
|
|
11
|
+
metadata_profile: "strict",
|
|
12
|
+
},
|
|
13
|
+
validation: {
|
|
14
|
+
sprint_release_format: "strict_error",
|
|
15
|
+
parent_reference: "warn",
|
|
16
|
+
},
|
|
17
|
+
item_types: {
|
|
18
|
+
definitions: [
|
|
19
|
+
{
|
|
20
|
+
name: "Issue",
|
|
21
|
+
description: "A defect, incident, or regression requiring investigation and resolution",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "Task",
|
|
25
|
+
description: "A remediation, hotfix, or follow-up task linked to an incident",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
testing: { record_results_to_items: true },
|
|
30
|
+
search: { mode: "keyword" },
|
|
31
|
+
calendar: { default_view: "agenda", first_day_of_week: 1 },
|
|
32
|
+
telemetry: { enabled: false },
|
|
33
|
+
};
|
|
34
|
+
// ─── Templates ───────────────────────────────────────────────────────────────
|
|
35
|
+
const TEMPLATE_INCIDENT = {
|
|
36
|
+
type: "Issue",
|
|
37
|
+
priority: "1",
|
|
38
|
+
tags: ["incident"],
|
|
39
|
+
meta: {
|
|
40
|
+
severity: "sev2",
|
|
41
|
+
environment: "production",
|
|
42
|
+
detected_at: "",
|
|
43
|
+
reported_by: "",
|
|
44
|
+
owner: "",
|
|
45
|
+
affected_systems: "",
|
|
46
|
+
affected_users: "",
|
|
47
|
+
steps_to_reproduce: "",
|
|
48
|
+
root_cause: "",
|
|
49
|
+
mitigation_applied: "",
|
|
50
|
+
resolution: "",
|
|
51
|
+
postmortem_url: "",
|
|
52
|
+
linked_hotfix: "",
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const TEMPLATE_HOTFIX_TASK = {
|
|
56
|
+
type: "Task",
|
|
57
|
+
priority: "1",
|
|
58
|
+
tags: ["hotfix"],
|
|
59
|
+
meta: {
|
|
60
|
+
linked_incident: "",
|
|
61
|
+
assignee: "",
|
|
62
|
+
fix_description: "",
|
|
63
|
+
pr_link: "",
|
|
64
|
+
target_branch: "main",
|
|
65
|
+
deploy_target: "production",
|
|
66
|
+
rollback_plan: "",
|
|
67
|
+
reviewed_by: "",
|
|
68
|
+
deployed_at: "",
|
|
69
|
+
verified_by: "",
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
const TEMPLATE_REGRESSION = {
|
|
73
|
+
type: "Issue",
|
|
74
|
+
priority: "2",
|
|
75
|
+
tags: ["regression"],
|
|
76
|
+
meta: {
|
|
77
|
+
severity: "sev3",
|
|
78
|
+
environment: "",
|
|
79
|
+
introduced_in: "",
|
|
80
|
+
last_known_good_version: "",
|
|
81
|
+
steps_to_reproduce: "",
|
|
82
|
+
expected_behavior: "",
|
|
83
|
+
actual_behavior: "",
|
|
84
|
+
owner: "",
|
|
85
|
+
affected_tests: "",
|
|
86
|
+
root_cause: "",
|
|
87
|
+
fix_pr: "",
|
|
88
|
+
verified_fixed_in: "",
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
export const TEMPLATES = {
|
|
92
|
+
"incident.json": TEMPLATE_INCIDENT,
|
|
93
|
+
"hotfix-task.json": TEMPLATE_HOTFIX_TASK,
|
|
94
|
+
"regression.json": TEMPLATE_REGRESSION,
|
|
95
|
+
};
|
|
96
|
+
// ─── Command Handler ──────────────────────────────────────────────────────────
|
|
97
|
+
export function runBugTriageSetup(context) {
|
|
98
|
+
const { options, pm_root } = context;
|
|
99
|
+
const cwd = pm_root ?? process.cwd();
|
|
100
|
+
const pmDir = path.resolve(cwd, ".agents/pm");
|
|
101
|
+
const settingsPath = path.join(pmDir, "settings.json");
|
|
102
|
+
const templatesDir = path.join(pmDir, "templates");
|
|
103
|
+
const isDryRun = Boolean(options["dry-run"]);
|
|
104
|
+
const isForce = Boolean(options["force"]);
|
|
105
|
+
const prefixOverride = options["prefix"];
|
|
106
|
+
// 1. Check .agents/pm/ exists
|
|
107
|
+
if (!fs.existsSync(pmDir)) {
|
|
108
|
+
console.error(`pm workspace not found. Expected directory: ${pmDir}\n` +
|
|
109
|
+
`Run "pm init" first to initialise a pm workspace in this project.`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// 2. Build settings (optionally override prefix)
|
|
113
|
+
const settings = prefixOverride !== undefined
|
|
114
|
+
? { ...SETTINGS, id_prefix: prefixOverride }
|
|
115
|
+
: SETTINGS;
|
|
116
|
+
if (isDryRun) {
|
|
117
|
+
console.log("[dry-run] Would write settings.json:");
|
|
118
|
+
console.log(JSON.stringify(settings, null, 2));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
if (fs.existsSync(settingsPath) && !isForce) {
|
|
122
|
+
console.warn(`settings.json already exists at ${settingsPath}. ` +
|
|
123
|
+
`Use --force to overwrite.`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
if (fs.existsSync(settingsPath) && isForce) {
|
|
127
|
+
console.warn(`Overwriting existing settings.json (--force)`);
|
|
128
|
+
}
|
|
129
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf8");
|
|
130
|
+
console.log(`Wrote settings.json → ${settingsPath}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 3. Create templates directory and write template files
|
|
134
|
+
if (isDryRun) {
|
|
135
|
+
console.log(`[dry-run] Would create directory: ${templatesDir}`);
|
|
136
|
+
for (const [filename, template] of Object.entries(TEMPLATES)) {
|
|
137
|
+
console.log(`[dry-run] Would write template: ${path.join(templatesDir, filename)}`);
|
|
138
|
+
console.log(JSON.stringify(template, null, 2));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (!fs.existsSync(templatesDir)) {
|
|
143
|
+
fs.mkdirSync(templatesDir, { recursive: true });
|
|
144
|
+
console.log(`Created templates directory → ${templatesDir}`);
|
|
145
|
+
}
|
|
146
|
+
for (const [filename, template] of Object.entries(TEMPLATES)) {
|
|
147
|
+
const templatePath = path.join(templatesDir, filename);
|
|
148
|
+
fs.writeFileSync(templatePath, JSON.stringify(template, null, 2) + "\n", "utf8");
|
|
149
|
+
console.log(`Wrote template → ${templatePath}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// 4. Print next steps
|
|
153
|
+
console.log("");
|
|
154
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
155
|
+
console.log(" Bug triage preset applied. Next steps:");
|
|
156
|
+
console.log("");
|
|
157
|
+
console.log(" Create a new production incident:");
|
|
158
|
+
console.log(" pm create --template incident");
|
|
159
|
+
console.log("");
|
|
160
|
+
console.log(" Create a hotfix task (linked to an incident):");
|
|
161
|
+
console.log(" pm create --template hotfix-task");
|
|
162
|
+
console.log("");
|
|
163
|
+
console.log(" Track a regression:");
|
|
164
|
+
console.log(" pm create --template regression");
|
|
165
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
166
|
+
console.log("");
|
|
167
|
+
// 5. Strict governance warning
|
|
168
|
+
console.warn("STRICT GOVERNANCE ACTIVE: All close operations require " +
|
|
169
|
+
"'root_cause' and 'resolution' metadata fields to be set. " +
|
|
170
|
+
"Items cannot be closed without this information.");
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/presets/bug-triage/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CommandHandlerContext } from "@unbrained/pm-cli/sdk";
|
|
2
|
+
export declare const SETTINGS: {
|
|
3
|
+
readonly id_prefix: "indie-";
|
|
4
|
+
readonly governance: {
|
|
5
|
+
readonly preset: "minimal";
|
|
6
|
+
readonly ownership_enforcement: "off";
|
|
7
|
+
readonly create_mode_default: "progressive";
|
|
8
|
+
readonly close_validation_default: "off";
|
|
9
|
+
readonly metadata_profile: "core";
|
|
10
|
+
};
|
|
11
|
+
readonly validation: {
|
|
12
|
+
readonly sprint_release_format: "off";
|
|
13
|
+
readonly parent_reference: "off";
|
|
14
|
+
};
|
|
15
|
+
readonly testing: {
|
|
16
|
+
readonly record_results_to_items: false;
|
|
17
|
+
};
|
|
18
|
+
readonly telemetry: {
|
|
19
|
+
readonly enabled: false;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export declare const TEMPLATES: Record<string, object>;
|
|
23
|
+
export declare function runIndieDevSetup(context: CommandHandlerContext): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presets/indie-dev/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAMnE,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;CAmBX,CAAC;AAIX,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuB5C,CAAC;AAIF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEpF"}
|