claude-autopm 3.23.0 → 3.23.2
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/.github/workflows/deploy-docs.yml +2 -2
- package/.github/workflows/npm-publish.yml +2 -2
- package/.github/workflows/plugin-publish.yml +2 -2
- package/README.md +3 -1
- package/autopm/.claude/commands/pm:epic-decompose.md +51 -33
- package/autopm/.claude/commands/pm:prd-new.md +41 -9
- package/autopm/.claude/docs/xml-prompts/README.md +3 -3
- package/autopm/.claude/docs/xml-prompts/creating-templates.md +2 -2
- package/autopm/.claude/docs/xml-prompts/templates-guide.md +1 -1
- package/autopm/.claude/rules/issue-structure.xml +12 -3
- package/autopm/.claude/scripts/pm/dashboard-serve.js +38 -3
- package/autopm/.claude/templates/issue.xml +33 -0
- package/install/install.js +22 -3
- package/install/post-install-check.js +29 -0
- package/package.json +6 -6
- package/packages/plugin-obsidian/LICENSE +21 -0
- package/packages/plugin-obsidian/README.md +129 -0
- package/packages/plugin-obsidian/claude-md/obsidian-section.md +30 -0
- package/packages/plugin-obsidian/commands/obsidian:doctor.md +63 -0
- package/packages/plugin-obsidian/commands/obsidian:setup.md +69 -0
- package/packages/plugin-obsidian/commands/obsidian:sync.md +105 -0
- package/packages/plugin-obsidian/package.json +51 -0
- package/packages/plugin-obsidian/plugin.json +73 -0
- package/packages/plugin-obsidian/scripts/obsidian/doctor.js +455 -0
- package/packages/plugin-obsidian/scripts/obsidian/setup.js +449 -0
- package/packages/plugin-obsidian/scripts/obsidian/sync-to-obsidian.js +584 -0
- package/packages/plugin-obsidian/scripts/obsidian/sync-to-obsidian.sh +533 -0
- package/packages/plugin-obsidian/templates/DASHBOARD.md.tmpl +63 -0
- package/packages/plugin-obsidian/templates/FRONTMATTER_SCHEMA.md +40 -0
- package/packages/plugin-obsidian/templates/MOC.md.tmpl +61 -0
- package/packages/plugin-obsidian/templates/_templates/epic.md +30 -0
- package/packages/plugin-obsidian/templates/_templates/issue.md +28 -0
- package/packages/plugin-obsidian/templates/_templates/prd.md +29 -0
- package/packages/plugin-obsidian/templates/diagrams/01-architecture.md +38 -0
- package/packages/plugin-obsidian/templates/diagrams/pizarra.excalidraw.md +29 -0
- package/packages/plugin-obsidian/tests/docs.test.js +97 -0
- package/packages/plugin-obsidian/tests/doctor.test.js +432 -0
- package/packages/plugin-obsidian/tests/installer-wiring.test.js +60 -0
- package/packages/plugin-obsidian/tests/setup.test.js +536 -0
- package/packages/plugin-obsidian/tests/sync-to-obsidian-node.test.js +458 -0
- package/packages/plugin-obsidian/tests/sync-to-obsidian.bats +266 -0
- package/packages/plugin-obsidian/tests/templates.test.js +125 -0
- package/packages/plugin-obsidian/tests/test-sync-basic.sh +121 -0
- package/packages/plugin-pm/plugin.json +9 -0
- package/packages/plugin-pm/rules/issue-structure.xml +56 -0
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
cache-dependency-path: docs-site/package-lock.json
|
|
36
36
|
|
|
37
37
|
- name: Setup Pages
|
|
38
|
-
uses: actions/configure-pages@
|
|
38
|
+
uses: actions/configure-pages@v6
|
|
39
39
|
|
|
40
40
|
- name: Install dependencies
|
|
41
41
|
run: npm ci
|
|
@@ -59,4 +59,4 @@ jobs:
|
|
|
59
59
|
steps:
|
|
60
60
|
- name: Deploy to GitHub Pages
|
|
61
61
|
id: deployment
|
|
62
|
-
uses: actions/deploy-pages@
|
|
62
|
+
uses: actions/deploy-pages@v5
|
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
steps:
|
|
13
13
|
- uses: actions/checkout@v4
|
|
14
|
-
- uses: actions/setup-node@
|
|
14
|
+
- uses: actions/setup-node@v6
|
|
15
15
|
with:
|
|
16
16
|
node-version: '20'
|
|
17
17
|
- run: npm ci --legacy-peer-deps
|
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
contents: read
|
|
25
25
|
steps:
|
|
26
26
|
- uses: actions/checkout@v4
|
|
27
|
-
- uses: actions/setup-node@
|
|
27
|
+
- uses: actions/setup-node@v6
|
|
28
28
|
with:
|
|
29
29
|
node-version: '20'
|
|
30
30
|
registry-url: 'https://registry.npmjs.org'
|
|
@@ -34,7 +34,7 @@ jobs:
|
|
|
34
34
|
- plugin-testing
|
|
35
35
|
steps:
|
|
36
36
|
- uses: actions/checkout@v4
|
|
37
|
-
- uses: actions/setup-node@
|
|
37
|
+
- uses: actions/setup-node@v6
|
|
38
38
|
with:
|
|
39
39
|
node-version: '20'
|
|
40
40
|
registry-url: 'https://registry.npmjs.org'
|
|
@@ -52,7 +52,7 @@ jobs:
|
|
|
52
52
|
id-token: write
|
|
53
53
|
steps:
|
|
54
54
|
- uses: actions/checkout@v4
|
|
55
|
-
- uses: actions/setup-node@
|
|
55
|
+
- uses: actions/setup-node@v6
|
|
56
56
|
with:
|
|
57
57
|
node-version: '20'
|
|
58
58
|
registry-url: 'https://registry.npmjs.org'
|
package/README.md
CHANGED
|
@@ -27,6 +27,7 @@ Choose your scenario during installation:
|
|
|
27
27
|
| **GitHub** | 12 | Core + languages for GitHub projects |
|
|
28
28
|
| **Azure** | 14 | Core + languages + Azure DevOps |
|
|
29
29
|
| **Docker** | 16 | Core + DevOps + containers |
|
|
30
|
+
| **Obsidian** | 12 | PM + Obsidian vault integration |
|
|
30
31
|
| **Full** | 44+ | All plugins, all agents |
|
|
31
32
|
| **Performance** | 44+ | Full + max parallelization |
|
|
32
33
|
|
|
@@ -134,10 +135,11 @@ All commands run inside Claude Code (not terminal):
|
|
|
134
135
|
|
|
135
136
|
## Features
|
|
136
137
|
|
|
137
|
-
###
|
|
138
|
+
### 14 Official Plugins
|
|
138
139
|
|
|
139
140
|
- **Core** — Context management, testing, configuration, MCP
|
|
140
141
|
- **PM System** — PRD, epics, issues, decomposition, git workflow
|
|
142
|
+
- **Obsidian** — Read-only vault sync, Dataview frontmatter, diagnostics
|
|
141
143
|
- **Azure DevOps** — Work items, boards, pipelines, sprints
|
|
142
144
|
- **GitHub** — Workflows, issues, PRs, automation
|
|
143
145
|
- **Languages** — Python, JavaScript, Node.js, Bash
|
|
@@ -321,66 +321,84 @@ Creating task 002 (Database schema):
|
|
|
321
321
|
✓ Created
|
|
322
322
|
```
|
|
323
323
|
|
|
324
|
-
### 4.
|
|
324
|
+
### 4. MANDATORY: Read Issue Template Before Creating Tasks
|
|
325
|
+
|
|
326
|
+
**CRITICAL**: Before creating ANY task, read the issue template:
|
|
327
|
+
```
|
|
328
|
+
Read .claude/templates/issue.xml
|
|
329
|
+
Read .claude/rules/issue-structure.xml
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Every task file MUST include ALL required sections from `issue.xml`. Missing sections = auto-reject.
|
|
333
|
+
|
|
334
|
+
### 5. Task File Format with Frontmatter
|
|
325
335
|
For each task, create a file with this exact structure:
|
|
326
336
|
|
|
327
337
|
```markdown
|
|
328
338
|
---
|
|
329
339
|
name: [Task Title]
|
|
330
340
|
status: open
|
|
341
|
+
priority: [critical/high/medium/low]
|
|
342
|
+
effort: [S/M/L/XL]
|
|
331
343
|
created: [Current ISO date/time]
|
|
332
344
|
updated: [Current ISO date/time]
|
|
333
|
-
assigned_agent: .claude/agents/{category}/{agent-name}.md
|
|
334
|
-
agent_context:
|
|
345
|
+
assigned_agent: .claude/agents/{category}/{agent-name}.md
|
|
346
|
+
agent_context:
|
|
335
347
|
framework: [framework_name]
|
|
336
348
|
language: [language_name]
|
|
337
|
-
approach: [implementation_approach]
|
|
338
349
|
github: [Will be updated when synced to GitHub]
|
|
339
|
-
depends_on: []
|
|
340
|
-
parallel: true
|
|
341
|
-
conflicts_with: []
|
|
350
|
+
depends_on: []
|
|
351
|
+
parallel: true
|
|
352
|
+
conflicts_with: []
|
|
342
353
|
---
|
|
343
354
|
|
|
344
355
|
# Task: [Task Title]
|
|
345
356
|
|
|
346
|
-
##
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
## ⚠️ TDD Requirements
|
|
350
|
-
**This project uses Test-Driven Development. You MUST:**
|
|
351
|
-
1. 🔴 RED: Write failing test first
|
|
352
|
-
2. 🟢 GREEN: Write minimal code to make test pass
|
|
353
|
-
3. 🔵 REFACTOR: Clean up code while keeping tests green
|
|
357
|
+
## Goal
|
|
358
|
+
[One sentence: WHAT this task delivers and WHY it matters]
|
|
354
359
|
|
|
355
|
-
|
|
360
|
+
## Context
|
|
361
|
+
[WHY this task exists — what triggered it, what currently works/doesn't,
|
|
362
|
+
what must be in place first. Include specific file paths, URLs, services.]
|
|
356
363
|
|
|
357
364
|
## Acceptance Criteria
|
|
358
|
-
- [ ] Specific criterion 1
|
|
359
|
-
- [ ] Specific criterion 2
|
|
360
|
-
- [ ] Specific criterion 3
|
|
365
|
+
- [ ] Specific, measurable criterion 1
|
|
366
|
+
- [ ] Specific, measurable criterion 2
|
|
367
|
+
- [ ] Specific, measurable criterion 3
|
|
361
368
|
|
|
362
|
-
##
|
|
363
|
-
-
|
|
364
|
-
-
|
|
365
|
-
- Code locations/files affected
|
|
369
|
+
## Affected Files
|
|
370
|
+
- `path/to/file.ts` — [what changes]
|
|
371
|
+
- `path/to/test.ts` — [new test file]
|
|
366
372
|
|
|
367
|
-
##
|
|
368
|
-
-
|
|
369
|
-
-
|
|
373
|
+
## Related Issues
|
|
374
|
+
- depends on #NNN — [why]
|
|
375
|
+
- blocks #NNN — [why]
|
|
376
|
+
- (or "None" if standalone)
|
|
370
377
|
|
|
371
|
-
##
|
|
372
|
-
|
|
373
|
-
-
|
|
374
|
-
-
|
|
378
|
+
## Verification Steps
|
|
379
|
+
[Concrete commands to verify this task is done:]
|
|
380
|
+
- `npm test -- --filter=feature` → all pass
|
|
381
|
+
- `curl http://localhost:3000/api/endpoint` → 200
|
|
382
|
+
- `kubectl get pods -n app` → Running
|
|
375
383
|
|
|
376
384
|
## Definition of Done
|
|
377
385
|
- [ ] Tests written FIRST (RED phase)
|
|
378
386
|
- [ ] Code implemented (GREEN phase)
|
|
379
387
|
- [ ] Code refactored (REFACTOR phase)
|
|
380
388
|
- [ ] All tests passing
|
|
381
|
-
- [ ]
|
|
382
|
-
- [ ]
|
|
383
|
-
|
|
389
|
+
- [ ] Verification steps confirmed
|
|
390
|
+
- [ ] PR approved and merged
|
|
391
|
+
|
|
392
|
+
## ⚠️ TDD Requirements
|
|
393
|
+
1. 🔴 RED: Write failing test first
|
|
394
|
+
2. 🟢 GREEN: Write minimal code to make test pass
|
|
395
|
+
3. 🔵 REFACTOR: Clean up code while keeping tests green
|
|
396
|
+
|
|
397
|
+
## Technical Constraints
|
|
398
|
+
[Stack, patterns, prohibitions — optional but recommended]
|
|
399
|
+
|
|
400
|
+
## Out of Scope
|
|
401
|
+
[What NOT to touch — prevents AI from "improving" neighbors]
|
|
384
402
|
```
|
|
385
403
|
|
|
386
404
|
### 3. Task Naming Convention
|
|
@@ -356,18 +356,50 @@ Parse the arguments to detect the mode:
|
|
|
356
356
|
- [Internal systems or components]
|
|
357
357
|
- [Third-party libraries or tools]
|
|
358
358
|
|
|
359
|
-
##
|
|
360
|
-
###
|
|
361
|
-
|
|
359
|
+
## Architecture Design
|
|
360
|
+
### Component Tree
|
|
361
|
+
[Map out the key new files/modules/components that will be created:]
|
|
362
|
+
```
|
|
363
|
+
src/
|
|
364
|
+
├── feature/
|
|
365
|
+
│ ├── Component.tsx
|
|
366
|
+
│ ├── hooks/useFeature.ts
|
|
367
|
+
│ └── utils/helpers.ts
|
|
368
|
+
```
|
|
362
369
|
|
|
363
|
-
###
|
|
364
|
-
|
|
370
|
+
### Data Flow
|
|
371
|
+
[How data moves through the system for this feature:]
|
|
372
|
+
- User action → API endpoint → Service → Database → Response
|
|
365
373
|
|
|
366
|
-
###
|
|
367
|
-
|
|
374
|
+
### State Management
|
|
375
|
+
[New state needed — stores, context, caching strategy]
|
|
368
376
|
|
|
369
|
-
|
|
370
|
-
|
|
377
|
+
## Implementation Plan
|
|
378
|
+
### Phase 1: Analyze (before writing code)
|
|
379
|
+
- [ ] Read existing codebase patterns
|
|
380
|
+
- [ ] Identify integration points
|
|
381
|
+
- [ ] Confirm architecture with stakeholder
|
|
382
|
+
|
|
383
|
+
### Phase 2: Foundation
|
|
384
|
+
- [ ] Database migrations / models
|
|
385
|
+
- [ ] Core API endpoints (backend)
|
|
386
|
+
- [ ] Base component scaffolding (frontend)
|
|
387
|
+
|
|
388
|
+
### Phase 3: Core Features
|
|
389
|
+
- [ ] [Main feature implementation]
|
|
390
|
+
- [ ] [Integration with existing systems]
|
|
391
|
+
|
|
392
|
+
### Phase 4: Polish & Release
|
|
393
|
+
- [ ] [Testing — unit, integration, e2e]
|
|
394
|
+
- [ ] [Documentation]
|
|
395
|
+
- [ ] [Deployment]
|
|
396
|
+
|
|
397
|
+
### Quick Win Path
|
|
398
|
+
[Minimum viable subset that works end-to-end in 1-3 days:]
|
|
399
|
+
- Day 1: [smallest vertical slice]
|
|
400
|
+
- Day 2: [connect to real data]
|
|
401
|
+
- Day 3: [basic UI showing results]
|
|
402
|
+
[This path gives a working demo before full implementation]
|
|
371
403
|
|
|
372
404
|
## Risks and Mitigation
|
|
373
405
|
### Technical Risks
|
|
@@ -435,7 +435,7 @@ Create templates tailored to your project:
|
|
|
435
435
|
--stage 2
|
|
436
436
|
|
|
437
437
|
# Edit template
|
|
438
|
-
vim
|
|
438
|
+
vim .claude/templates/xml-prompts/dev/microservice.xml
|
|
439
439
|
|
|
440
440
|
# Use custom template
|
|
441
441
|
/prompt:xml microservice \
|
|
@@ -522,5 +522,5 @@ Solution: Provide missing flag
|
|
|
522
522
|
- `.claude/commands/xml/prompt-xml.md`
|
|
523
523
|
- `.claude/commands/xml/template.md`
|
|
524
524
|
- **Utilities:**
|
|
525
|
-
-
|
|
526
|
-
-
|
|
525
|
+
- `.claude/lib/xml-prompt-builder.js`
|
|
526
|
+
- `.claude/lib/xml-validator.js`
|
|
@@ -111,7 +111,7 @@ This will prompt you for:
|
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
113
|
# Create file in appropriate category
|
|
114
|
-
vim
|
|
114
|
+
vim .claude/templates/xml-prompts/dev/my-template.xml
|
|
115
115
|
```
|
|
116
116
|
|
|
117
117
|
### Step 3: Define Template Content
|
|
@@ -558,7 +558,7 @@ cat test.xml | grep -q "<thinking>" && echo "✅ Has thinking" || echo "❌ Miss
|
|
|
558
558
|
Track template changes:
|
|
559
559
|
|
|
560
560
|
```bash
|
|
561
|
-
git add
|
|
561
|
+
git add .claude/templates/xml-prompts/dev/my-template.xml
|
|
562
562
|
git commit -m "Update microservice template with health check requirements"
|
|
563
563
|
```
|
|
564
564
|
|
|
@@ -462,7 +462,7 @@ done
|
|
|
462
462
|
/xml:template create microservice --category dev --stage 2
|
|
463
463
|
|
|
464
464
|
# Edit to add project-specific constraints
|
|
465
|
-
vim
|
|
465
|
+
vim .claude/templates/xml-prompts/dev/microservice.xml
|
|
466
466
|
|
|
467
467
|
# Add your patterns:
|
|
468
468
|
# - Service structure requirements
|
|
@@ -6,13 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
<template>
|
|
8
8
|
<section name="goal" required="true">One sentence: WHAT and WHY</section>
|
|
9
|
-
<section name="context" required="true">
|
|
9
|
+
<section name="context" required="true">
|
|
10
|
+
WHY this issue exists — problem background, current state, dependencies, environment.
|
|
11
|
+
Must answer: what triggered this, what works/doesn't, what must exist first.
|
|
12
|
+
</section>
|
|
10
13
|
<section name="acceptance-criteria" required="true">Measurable checkboxes, not prose</section>
|
|
11
|
-
<section name="technical-constraints" required="false">Stack, patterns, prohibitions</section>
|
|
12
14
|
<section name="affected-files" required="true">Exact file paths with change description</section>
|
|
15
|
+
<section name="related-issues" required="true">depends on / blocks / related to #NNN, or "None"</section>
|
|
16
|
+
<section name="verification" required="true">Concrete commands to verify (curl, kubectl, npm test, etc.)</section>
|
|
17
|
+
<section name="definition-of-done" required="true">Quality gate checkboxes — tests, deploy, PR merged</section>
|
|
18
|
+
<section name="constraints" required="false">Stack, patterns, prohibitions</section>
|
|
13
19
|
<section name="out-of-scope" required="false">What NOT to touch</section>
|
|
14
20
|
<section name="suggested-approach" required="false">Brief implementation strategy</section>
|
|
15
|
-
<section name="definition-of-done" required="false">Quality gates (tests, lint, coverage)</section>
|
|
16
21
|
</template>
|
|
17
22
|
|
|
18
23
|
<title-convention>
|
|
@@ -40,8 +45,12 @@
|
|
|
40
45
|
</key-principles>
|
|
41
46
|
|
|
42
47
|
<violations enforcement="auto-reject">
|
|
48
|
+
<violation>Creating issues without Context section (why it exists, current state)</violation>
|
|
43
49
|
<violation>Creating issues without Acceptance Criteria</violation>
|
|
44
50
|
<violation>Creating issues without Affected Files section</violation>
|
|
51
|
+
<violation>Creating issues without Verification Steps</violation>
|
|
52
|
+
<violation>Creating issues without Definition of Done</violation>
|
|
45
53
|
<violation>Vague goal without concrete deliverable</violation>
|
|
54
|
+
<violation>Missing Related Issues (must list links or "None")</violation>
|
|
46
55
|
</violations>
|
|
47
56
|
</rule>
|
|
@@ -400,7 +400,7 @@ function renderHTML() {
|
|
|
400
400
|
border: 1px solid #30363d; border-radius: 8px; overflow: hidden;
|
|
401
401
|
}
|
|
402
402
|
.diagram-split .code-pane {
|
|
403
|
-
|
|
403
|
+
width: 30%; display: flex; flex-direction: column; min-width: 150px; flex-shrink: 0;
|
|
404
404
|
}
|
|
405
405
|
.diagram-split .code-pane .pane-header {
|
|
406
406
|
background: #161b22; padding: 6px 12px; font-size: 11px; color: #8b949e;
|
|
@@ -411,8 +411,13 @@ function renderHTML() {
|
|
|
411
411
|
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; font-size: 13px;
|
|
412
412
|
line-height: 1.5; resize: none; outline: none; tab-size: 2;
|
|
413
413
|
}
|
|
414
|
+
.diagram-split .split-handle {
|
|
415
|
+
width: 5px; cursor: col-resize; background: #30363d; flex-shrink: 0;
|
|
416
|
+
transition: background 0.15s;
|
|
417
|
+
}
|
|
418
|
+
.diagram-split .split-handle:hover, .diagram-split .split-handle.dragging { background: #58a6ff; }
|
|
414
419
|
.diagram-split .preview-pane {
|
|
415
|
-
flex: 1; display: flex; flex-direction: column; background: #161b22; min-width:
|
|
420
|
+
flex: 1; display: flex; flex-direction: column; background: #161b22; min-width: 200px;
|
|
416
421
|
}
|
|
417
422
|
.diagram-split .preview-pane .pane-header {
|
|
418
423
|
background: #161b22; padding: 6px 12px; font-size: 11px; color: #8b949e;
|
|
@@ -618,10 +623,11 @@ function renderHTML() {
|
|
|
618
623
|
</div>
|
|
619
624
|
</div>
|
|
620
625
|
<div class="diagram-split" id="diagram-split">
|
|
621
|
-
<div class="code-pane">
|
|
626
|
+
<div class="code-pane" id="code-pane">
|
|
622
627
|
<div class="pane-header"><span>Mermaid Source</span></div>
|
|
623
628
|
<textarea id="diagram-code" spellcheck="false"></textarea>
|
|
624
629
|
</div>
|
|
630
|
+
<div class="split-handle" id="split-handle"></div>
|
|
625
631
|
<div class="preview-pane">
|
|
626
632
|
<div class="pane-header">
|
|
627
633
|
<span>Preview</span>
|
|
@@ -863,6 +869,35 @@ function resetPanZoom() {
|
|
|
863
869
|
}
|
|
864
870
|
}
|
|
865
871
|
|
|
872
|
+
// Resizable split handle
|
|
873
|
+
(function() {
|
|
874
|
+
const handle = document.getElementById('split-handle');
|
|
875
|
+
const codePane = document.getElementById('code-pane');
|
|
876
|
+
const split = document.getElementById('diagram-split');
|
|
877
|
+
if (!handle || !codePane || !split) return;
|
|
878
|
+
let dragging = false;
|
|
879
|
+
handle.addEventListener('mousedown', function(e) {
|
|
880
|
+
e.preventDefault();
|
|
881
|
+
dragging = true;
|
|
882
|
+
handle.classList.add('dragging');
|
|
883
|
+
document.body.style.cursor = 'col-resize';
|
|
884
|
+
document.body.style.userSelect = 'none';
|
|
885
|
+
});
|
|
886
|
+
document.addEventListener('mousemove', function(e) {
|
|
887
|
+
if (!dragging) return;
|
|
888
|
+
const rect = split.getBoundingClientRect();
|
|
889
|
+
const pct = Math.min(70, Math.max(10, ((e.clientX - rect.left) / rect.width) * 100));
|
|
890
|
+
codePane.style.width = pct + '%';
|
|
891
|
+
});
|
|
892
|
+
document.addEventListener('mouseup', function() {
|
|
893
|
+
if (!dragging) return;
|
|
894
|
+
dragging = false;
|
|
895
|
+
handle.classList.remove('dragging');
|
|
896
|
+
document.body.style.cursor = '';
|
|
897
|
+
document.body.style.userSelect = '';
|
|
898
|
+
});
|
|
899
|
+
})();
|
|
900
|
+
|
|
866
901
|
// Live preview on code change
|
|
867
902
|
document.addEventListener('DOMContentLoaded', function() {
|
|
868
903
|
const codeEl = document.getElementById('diagram-code');
|
|
@@ -7,14 +7,42 @@
|
|
|
7
7
|
<field name="assignee" type="string" default=""/>
|
|
8
8
|
<field name="created" type="datetime" auto="true"/>
|
|
9
9
|
<field name="updated" type="datetime" auto="true"/>
|
|
10
|
+
<field name="priority" type="enum" values="critical,high,medium,low" default="medium"/>
|
|
11
|
+
<field name="effort" type="enum" values="S,M,L,XL" default="M"/>
|
|
10
12
|
<field name="started" type="datetime"/>
|
|
11
13
|
<field name="completed" type="datetime"/>
|
|
12
14
|
</frontmatter>
|
|
13
15
|
|
|
14
16
|
<sections>
|
|
15
17
|
<section name="goal" heading="Goal" required="true">One sentence: WHAT and WHY</section>
|
|
18
|
+
<section name="context" heading="Context" required="true">
|
|
19
|
+
Why this issue exists. Include:
|
|
20
|
+
- Problem background — what triggered this (bug report, user request, architectural gap)
|
|
21
|
+
- Current state — what works now, what doesn't, relevant infrastructure/config
|
|
22
|
+
- Dependencies — what must exist first (images, services, DNS, other issues)
|
|
23
|
+
- Access/environment — how to reproduce, where to verify (cluster, URL, CI)
|
|
24
|
+
</section>
|
|
16
25
|
<section name="acceptance-criteria" heading="Acceptance Criteria" required="true">Measurable checkboxes</section>
|
|
17
26
|
<section name="affected-files" heading="Affected Files" required="true">Exact file paths with change description</section>
|
|
27
|
+
<section name="related-issues" heading="Related Issues" required="true">
|
|
28
|
+
Links to blocking/blocked/related issues:
|
|
29
|
+
- depends on #NNN — must be done first
|
|
30
|
+
- blocks #NNN — this unblocks other work
|
|
31
|
+
- related to #NNN — shares context
|
|
32
|
+
- Write "None" if truly standalone
|
|
33
|
+
</section>
|
|
34
|
+
<section name="verification" heading="Verification Steps" required="true">
|
|
35
|
+
Concrete commands to verify the work is done. Examples:
|
|
36
|
+
- curl https://app.example.com → 200
|
|
37
|
+
- kubectl get pods -n app → Running
|
|
38
|
+
- npm test -- --filter=feature → pass
|
|
39
|
+
</section>
|
|
40
|
+
<section name="definition-of-done" heading="Definition of Done" required="true">
|
|
41
|
+
Checklist of quality gates that MUST pass before closing:
|
|
42
|
+
- [ ] Tests pass (unit, integration)
|
|
43
|
+
- [ ] Deployed to staging/verified
|
|
44
|
+
- [ ] PR approved and merged
|
|
45
|
+
</section>
|
|
18
46
|
<section name="constraints" heading="Technical Constraints" required="false">Stack, patterns, prohibitions</section>
|
|
19
47
|
<section name="out-of-scope" heading="Out of Scope" required="false">What NOT to touch</section>
|
|
20
48
|
<section name="approach" heading="Suggested Approach" required="false">Brief implementation strategy</section>
|
|
@@ -22,6 +50,11 @@
|
|
|
22
50
|
|
|
23
51
|
<validation>
|
|
24
52
|
<rule>goal must be non-empty</rule>
|
|
53
|
+
<rule>context must be non-empty</rule>
|
|
54
|
+
<rule>acceptance-criteria must be non-empty</rule>
|
|
55
|
+
<rule>related-issues must be non-empty</rule>
|
|
56
|
+
<rule>verification must be non-empty</rule>
|
|
57
|
+
<rule>definition-of-done must be non-empty</rule>
|
|
25
58
|
<rule>at least 1 acceptance criterion checkbox (- [ ])</rule>
|
|
26
59
|
</validation>
|
|
27
60
|
</template>
|
package/install/install.js
CHANGED
|
@@ -556,6 +556,14 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
556
556
|
• Advanced users only
|
|
557
557
|
`);
|
|
558
558
|
|
|
559
|
+
// Option 7: Obsidian (always available)
|
|
560
|
+
console.log(`${this.colors.CYAN}7. Obsidian${this.colors.NC} - PM + Obsidian vault integration (rsync, Dataview, templates)
|
|
561
|
+
• Core + PM + Obsidian vault sync
|
|
562
|
+
• Unidirectional project → vault mirroring
|
|
563
|
+
• Best for: Knowledge management, documentation-heavy projects
|
|
564
|
+
${this.colors.DIM}• Plugins: core, pm, obsidian (3 plugins)${this.colors.NC}
|
|
565
|
+
`);
|
|
566
|
+
|
|
559
567
|
if (process.env.AUTOPM_TEST_MODE === '1') {
|
|
560
568
|
this.printMsg('CYAN', 'Auto-selecting option 0 (lite) for test mode');
|
|
561
569
|
return 'lite';
|
|
@@ -571,7 +579,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
571
579
|
|
|
572
580
|
return new Promise((resolve) => {
|
|
573
581
|
const askQuestion = () => {
|
|
574
|
-
rl.question(`${this.colors.CYAN}Enter your choice (0-
|
|
582
|
+
rl.question(`${this.colors.CYAN}Enter your choice (0-7) [${defaultChoice}]: ${this.colors.NC}`, (answer) => {
|
|
575
583
|
const choice = answer.trim() || defaultChoice;
|
|
576
584
|
const scenarios = {
|
|
577
585
|
'0': 'lite',
|
|
@@ -580,7 +588,8 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
580
588
|
'3': 'docker',
|
|
581
589
|
'4': 'full',
|
|
582
590
|
'5': 'performance',
|
|
583
|
-
'6': 'custom'
|
|
591
|
+
'6': 'custom',
|
|
592
|
+
'7': 'obsidian'
|
|
584
593
|
};
|
|
585
594
|
|
|
586
595
|
const selectedScenario = scenarios[choice];
|
|
@@ -608,7 +617,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
608
617
|
}
|
|
609
618
|
|
|
610
619
|
if (!selectedScenario) {
|
|
611
|
-
console.log(`${this.colors.RED}✗ Invalid choice. Please select 0-
|
|
620
|
+
console.log(`${this.colors.RED}✗ Invalid choice. Please select 0-7.${this.colors.NC}`);
|
|
612
621
|
askQuestion();
|
|
613
622
|
return;
|
|
614
623
|
}
|
|
@@ -703,6 +712,16 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
703
712
|
kubernetes: { enabled: true }
|
|
704
713
|
},
|
|
705
714
|
plugins: ['plugin-core', 'plugin-languages', 'plugin-frameworks', 'plugin-testing', 'plugin-devops', 'plugin-cloud', 'plugin-databases', 'plugin-data', 'plugin-pm', 'plugin-pm-github', 'plugin-ai', 'plugin-ml']
|
|
715
|
+
},
|
|
716
|
+
obsidian: {
|
|
717
|
+
version: version,
|
|
718
|
+
installed: new Date().toISOString(),
|
|
719
|
+
execution_strategy: 'sequential',
|
|
720
|
+
tools: {
|
|
721
|
+
docker: { enabled: false },
|
|
722
|
+
kubernetes: { enabled: false }
|
|
723
|
+
},
|
|
724
|
+
plugins: ['plugin-core', 'plugin-pm', 'plugin-obsidian']
|
|
706
725
|
}
|
|
707
726
|
};
|
|
708
727
|
|
|
@@ -37,6 +37,7 @@ class PostInstallChecker {
|
|
|
37
37
|
this.checkMCPConfiguration();
|
|
38
38
|
this.checkGitHooks();
|
|
39
39
|
this.checkNodeVersion();
|
|
40
|
+
this.checkObsidianVault();
|
|
40
41
|
|
|
41
42
|
// Display results
|
|
42
43
|
this.displayResults();
|
|
@@ -336,6 +337,34 @@ class PostInstallChecker {
|
|
|
336
337
|
}
|
|
337
338
|
}
|
|
338
339
|
|
|
340
|
+
/**
|
|
341
|
+
* Check Obsidian vault configuration
|
|
342
|
+
*/
|
|
343
|
+
checkObsidianVault() {
|
|
344
|
+
const configPath = path.join(this.projectRoot, '.claude', 'config.json');
|
|
345
|
+
let configured = false;
|
|
346
|
+
let message = 'Not configured — run: obsidian:setup';
|
|
347
|
+
|
|
348
|
+
if (fs.existsSync(configPath)) {
|
|
349
|
+
try {
|
|
350
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
351
|
+
const vaultPath = config.obsidian?.vault_path;
|
|
352
|
+
if (vaultPath) {
|
|
353
|
+
configured = true;
|
|
354
|
+
message = `Vault: ${vaultPath}`;
|
|
355
|
+
}
|
|
356
|
+
} catch (error) {
|
|
357
|
+
// config unreadable, leave as not configured
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
this.results.optional.push({
|
|
362
|
+
name: 'Obsidian vault',
|
|
363
|
+
status: configured,
|
|
364
|
+
message: message
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
339
368
|
/**
|
|
340
369
|
* Display check results
|
|
341
370
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-autopm",
|
|
3
|
-
"version": "3.23.
|
|
3
|
+
"version": "3.23.2",
|
|
4
4
|
"description": "Autonomous Project Management Framework for Claude Code - Advanced AI-powered development automation",
|
|
5
5
|
"main": "bin/autopm.js",
|
|
6
6
|
"workspaces": [
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"README.md"
|
|
126
126
|
],
|
|
127
127
|
"dependencies": {
|
|
128
|
-
"@anthropic-ai/sdk": "^0.
|
|
128
|
+
"@anthropic-ai/sdk": "^0.82.0",
|
|
129
129
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
130
130
|
"@octokit/rest": "^22.0.0",
|
|
131
131
|
"azure-devops-node-api": "^15.1.1",
|
|
@@ -135,10 +135,10 @@
|
|
|
135
135
|
"fast-glob": "^3.3.2",
|
|
136
136
|
"fs-extra": "^11.3.2",
|
|
137
137
|
"glob": "^11.0.3",
|
|
138
|
-
"inquirer": "^
|
|
138
|
+
"inquirer": "^13.3.2",
|
|
139
139
|
"js-yaml": "^4.1.0",
|
|
140
140
|
"markdown-it": "^14.1.0",
|
|
141
|
-
"marked": "^
|
|
141
|
+
"marked": "^17.0.6",
|
|
142
142
|
"moment": "^2.29.4",
|
|
143
143
|
"ora": "~5.4.1",
|
|
144
144
|
"simple-git": "^3.20.0",
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
"@jest/globals": "^30.1.2",
|
|
152
152
|
"@types/jest": "^30.0.0",
|
|
153
153
|
"axios": "^1.12.2",
|
|
154
|
-
"c8": "^
|
|
154
|
+
"c8": "^11.0.0",
|
|
155
155
|
"chai": "^6.0.1",
|
|
156
156
|
"jest": "^30.1.3",
|
|
157
157
|
"jest-diff": "^30.1.2",
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
"sinon": "^21.0.0"
|
|
167
167
|
},
|
|
168
168
|
"optionalDependencies": {
|
|
169
|
-
"@playwright/mcp": "^0.0.
|
|
169
|
+
"@playwright/mcp": "^0.0.70",
|
|
170
170
|
"@upstash/context7-mcp": "^2.1.6"
|
|
171
171
|
},
|
|
172
172
|
"publishConfig": {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Rafal Lagowski
|
|
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.
|