claude-autopm 3.23.1 → 3.24.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.
- 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/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/bin/autopm.js +2 -0
- package/install/install.js +64 -3
- package/install/post-install-check.js +29 -0
- package/lib/cli/commands/obsidian.js +209 -0
- package/package.json +6 -6
- package/packages/plugin-obsidian/LICENSE +21 -0
- package/packages/plugin-obsidian/README.md +135 -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 +87 -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
|
@@ -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
|
|
@@ -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
|
package/bin/autopm.js
CHANGED
|
@@ -208,6 +208,8 @@ function main() {
|
|
|
208
208
|
.command(require('../lib/cli/commands/agent'))
|
|
209
209
|
// Context management command (STANDALONE)
|
|
210
210
|
.command(require('../lib/cli/commands/context'))
|
|
211
|
+
// Obsidian vault integration (STANDALONE)
|
|
212
|
+
.command(require('../lib/cli/commands/obsidian'))
|
|
211
213
|
// Validation command
|
|
212
214
|
.command('validate', 'Validate ClaudeAutoPM configuration and setup',
|
|
213
215
|
(yargs) => {
|
package/install/install.js
CHANGED
|
@@ -127,6 +127,44 @@ class Installer {
|
|
|
127
127
|
console.log(`${this.colors.RED}✗${this.colors.NC} ${msg}`);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
/**
|
|
131
|
+
* Print scenario-specific next steps after installation
|
|
132
|
+
*/
|
|
133
|
+
printScenarioNextSteps() {
|
|
134
|
+
const scenario = this.currentScenario;
|
|
135
|
+
if (!scenario) return;
|
|
136
|
+
|
|
137
|
+
console.log(`${this.colors.CYAN}📋 Next Steps for "${scenario}" scenario:${this.colors.NC}`);
|
|
138
|
+
console.log('');
|
|
139
|
+
|
|
140
|
+
if (scenario === 'obsidian') {
|
|
141
|
+
console.log(' 1. Configure your Obsidian vault:');
|
|
142
|
+
console.log(` ${this.colors.BOLD}autopm obsidian setup --vault-path "<your-vault-path>"${this.colors.NC}`);
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log(` ${this.colors.DIM}Use quotes around the path. Examples per platform:${this.colors.NC}`);
|
|
145
|
+
console.log(` ${this.colors.DIM} WSL: --vault-path "/mnt/c/Users/You/Documents/My Vault"${this.colors.NC}`);
|
|
146
|
+
console.log(` ${this.colors.DIM} macOS: --vault-path "/Users/you/Documents/My Vault"${this.colors.NC}`);
|
|
147
|
+
console.log(` ${this.colors.DIM} Linux: --vault-path "/home/you/Obsidian/My Vault"${this.colors.NC}`);
|
|
148
|
+
console.log('');
|
|
149
|
+
console.log(' 2. Open the vault folder in Obsidian and install recommended plugins');
|
|
150
|
+
console.log(` ${this.colors.DIM}(Dataview, Templater, Excalidraw, Mermaid Tools)${this.colors.NC}`);
|
|
151
|
+
console.log('');
|
|
152
|
+
console.log(' 3. For continuous sync:');
|
|
153
|
+
console.log(` ${this.colors.BOLD}autopm obsidian sync --watch${this.colors.NC}`);
|
|
154
|
+
console.log('');
|
|
155
|
+
console.log(` ${this.colors.DIM}Verify setup: autopm validate${this.colors.NC}`);
|
|
156
|
+
console.log(` ${this.colors.DIM}Troubleshooting: autopm obsidian doctor${this.colors.NC}`);
|
|
157
|
+
console.log('');
|
|
158
|
+
} else {
|
|
159
|
+
console.log(' 1. Open your project in Claude Code:');
|
|
160
|
+
console.log(` ${this.colors.BOLD}cd your-project && claude${this.colors.NC}`);
|
|
161
|
+
console.log('');
|
|
162
|
+
console.log(' 2. Start working! Slash commands are available inside Claude Code.');
|
|
163
|
+
console.log(` ${this.colors.DIM}Example: /pm:status, /pm:next, /pm:help${this.colors.NC}`);
|
|
164
|
+
console.log('');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
130
168
|
async confirm(prompt) {
|
|
131
169
|
// In test mode or auto-accept mode, auto-answer yes
|
|
132
170
|
if (process.env.AUTOPM_TEST_MODE === '1' || process.env.AUTOPM_AUTO_ACCEPT === '1') {
|
|
@@ -556,6 +594,15 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
556
594
|
• Advanced users only
|
|
557
595
|
`);
|
|
558
596
|
|
|
597
|
+
// Option 7: Obsidian (always available)
|
|
598
|
+
console.log(`${this.colors.CYAN}7. Obsidian${this.colors.NC} - PM + Obsidian vault integration (rsync, Dataview, templates)
|
|
599
|
+
• Core + PM + Obsidian vault sync
|
|
600
|
+
• Unidirectional project → vault mirroring
|
|
601
|
+
• Best for: Knowledge management, documentation-heavy projects
|
|
602
|
+
• After install, run: ${this.colors.BOLD}autopm obsidian setup --vault-path "<path>"${this.colors.NC}
|
|
603
|
+
${this.colors.DIM}• Plugins: core, pm, obsidian (3 plugins)${this.colors.NC}
|
|
604
|
+
`);
|
|
605
|
+
|
|
559
606
|
if (process.env.AUTOPM_TEST_MODE === '1') {
|
|
560
607
|
this.printMsg('CYAN', 'Auto-selecting option 0 (lite) for test mode');
|
|
561
608
|
return 'lite';
|
|
@@ -571,7 +618,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
571
618
|
|
|
572
619
|
return new Promise((resolve) => {
|
|
573
620
|
const askQuestion = () => {
|
|
574
|
-
rl.question(`${this.colors.CYAN}Enter your choice (0-
|
|
621
|
+
rl.question(`${this.colors.CYAN}Enter your choice (0-7) [${defaultChoice}]: ${this.colors.NC}`, (answer) => {
|
|
575
622
|
const choice = answer.trim() || defaultChoice;
|
|
576
623
|
const scenarios = {
|
|
577
624
|
'0': 'lite',
|
|
@@ -580,7 +627,8 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
580
627
|
'3': 'docker',
|
|
581
628
|
'4': 'full',
|
|
582
629
|
'5': 'performance',
|
|
583
|
-
'6': 'custom'
|
|
630
|
+
'6': 'custom',
|
|
631
|
+
'7': 'obsidian'
|
|
584
632
|
};
|
|
585
633
|
|
|
586
634
|
const selectedScenario = scenarios[choice];
|
|
@@ -608,7 +656,7 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
608
656
|
}
|
|
609
657
|
|
|
610
658
|
if (!selectedScenario) {
|
|
611
|
-
console.log(`${this.colors.RED}✗ Invalid choice. Please select 0-
|
|
659
|
+
console.log(`${this.colors.RED}✗ Invalid choice. Please select 0-7.${this.colors.NC}`);
|
|
612
660
|
askQuestion();
|
|
613
661
|
return;
|
|
614
662
|
}
|
|
@@ -703,6 +751,16 @@ ${this.colors.BOLD}Select installation scenario:${this.colors.NC}
|
|
|
703
751
|
kubernetes: { enabled: true }
|
|
704
752
|
},
|
|
705
753
|
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']
|
|
754
|
+
},
|
|
755
|
+
obsidian: {
|
|
756
|
+
version: version,
|
|
757
|
+
installed: new Date().toISOString(),
|
|
758
|
+
execution_strategy: 'sequential',
|
|
759
|
+
tools: {
|
|
760
|
+
docker: { enabled: false },
|
|
761
|
+
kubernetes: { enabled: false }
|
|
762
|
+
},
|
|
763
|
+
plugins: ['plugin-core', 'plugin-pm', 'plugin-obsidian']
|
|
706
764
|
}
|
|
707
765
|
};
|
|
708
766
|
|
|
@@ -1506,6 +1564,9 @@ See: https://github.com/rafeekpro/ClaudeAutoPM
|
|
|
1506
1564
|
this.printMsg('GREEN', '╚══════════════════════════════════════════╝');
|
|
1507
1565
|
console.log('');
|
|
1508
1566
|
|
|
1567
|
+
// Scenario-specific next steps
|
|
1568
|
+
this.printScenarioNextSteps();
|
|
1569
|
+
|
|
1509
1570
|
// Run post-installation configuration check
|
|
1510
1571
|
await this.runPostInstallCheck();
|
|
1511
1572
|
|
|
@@ -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: autopm obsidian setup --vault-path "<path>"';
|
|
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
|
*/
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Obsidian Commands
|
|
3
|
+
* Manage Obsidian vault integration — setup, sync, diagnostics
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { spawn } = require('child_process');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
|
|
10
|
+
const PLUGIN_DIR = 'packages/plugin-obsidian';
|
|
11
|
+
const SCRIPTS_DIR = path.join(PLUGIN_DIR, 'scripts', 'obsidian');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Find project root by walking up from cwd
|
|
15
|
+
*/
|
|
16
|
+
function findProjectRoot() {
|
|
17
|
+
let dir = process.cwd();
|
|
18
|
+
while (dir !== path.dirname(dir)) {
|
|
19
|
+
if (fs.existsSync(path.join(dir, '.claude', 'config.json')) ||
|
|
20
|
+
fs.existsSync(path.join(dir, 'CLAUDE.md'))) {
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
dir = path.dirname(dir);
|
|
24
|
+
}
|
|
25
|
+
return process.cwd();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Check if plugin-obsidian is installed
|
|
30
|
+
*/
|
|
31
|
+
function checkPlugin(root) {
|
|
32
|
+
const pluginJson = path.join(root, PLUGIN_DIR, 'plugin.json');
|
|
33
|
+
if (!fs.existsSync(pluginJson)) {
|
|
34
|
+
console.error('❌ plugin-obsidian not installed.');
|
|
35
|
+
console.error(' Run: autopm install --scenario=obsidian');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* autopm obsidian setup
|
|
42
|
+
*/
|
|
43
|
+
async function obsidianSetup(argv) {
|
|
44
|
+
const root = findProjectRoot();
|
|
45
|
+
checkPlugin(root);
|
|
46
|
+
|
|
47
|
+
const scriptPath = path.join(root, SCRIPTS_DIR, 'setup.js');
|
|
48
|
+
if (!fs.existsSync(scriptPath)) {
|
|
49
|
+
console.error('❌ Setup script not found:', scriptPath);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const args = [];
|
|
54
|
+
if (argv.vaultPath) args.push('--vault-path', argv.vaultPath);
|
|
55
|
+
if (argv.prefix) args.push('--prefix', argv.prefix);
|
|
56
|
+
if (argv.watch === true) args.push('--watch');
|
|
57
|
+
if (argv.watch === false) args.push('--no-watch');
|
|
58
|
+
args.push('--project-root', root);
|
|
59
|
+
|
|
60
|
+
const child = spawn('node', [scriptPath, ...args], {
|
|
61
|
+
stdio: 'inherit',
|
|
62
|
+
cwd: root
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
child.on('close', (code) => process.exit(code || 0));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* autopm obsidian sync
|
|
70
|
+
*/
|
|
71
|
+
async function obsidianSync(argv) {
|
|
72
|
+
const root = findProjectRoot();
|
|
73
|
+
checkPlugin(root);
|
|
74
|
+
|
|
75
|
+
// Prefer shell script, fall back to Node
|
|
76
|
+
const shPath = path.join(root, SCRIPTS_DIR, 'sync-to-obsidian.sh');
|
|
77
|
+
const jsPath = path.join(root, SCRIPTS_DIR, 'sync-to-obsidian.js');
|
|
78
|
+
|
|
79
|
+
const args = [];
|
|
80
|
+
if (argv.watch) args.push('--watch');
|
|
81
|
+
if (argv.check) args.push('--check');
|
|
82
|
+
if (argv.safeMode) args.push('--safe-mode');
|
|
83
|
+
args.push('--project-root', root);
|
|
84
|
+
|
|
85
|
+
let cmd, cmdArgs;
|
|
86
|
+
if (fs.existsSync(shPath)) {
|
|
87
|
+
cmd = 'bash';
|
|
88
|
+
cmdArgs = [shPath, ...args];
|
|
89
|
+
} else if (fs.existsSync(jsPath)) {
|
|
90
|
+
cmd = 'node';
|
|
91
|
+
cmdArgs = [jsPath, ...args];
|
|
92
|
+
} else {
|
|
93
|
+
console.error('❌ Sync script not found. Reinstall plugin-obsidian.');
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const child = spawn(cmd, cmdArgs, {
|
|
98
|
+
stdio: 'inherit',
|
|
99
|
+
cwd: root
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
child.on('close', (code) => process.exit(code || 0));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* autopm obsidian doctor
|
|
107
|
+
*/
|
|
108
|
+
async function obsidianDoctor(argv) {
|
|
109
|
+
const root = findProjectRoot();
|
|
110
|
+
checkPlugin(root);
|
|
111
|
+
|
|
112
|
+
const scriptPath = path.join(root, SCRIPTS_DIR, 'doctor.js');
|
|
113
|
+
if (!fs.existsSync(scriptPath)) {
|
|
114
|
+
console.error('❌ Doctor script not found:', scriptPath);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const args = ['--project-root', root];
|
|
119
|
+
|
|
120
|
+
const child = spawn('node', [scriptPath, ...args], {
|
|
121
|
+
stdio: 'inherit',
|
|
122
|
+
cwd: root
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
child.on('close', (code) => process.exit(code || 0));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Command builder — registers subcommands
|
|
130
|
+
*/
|
|
131
|
+
function builder(yargs) {
|
|
132
|
+
return yargs
|
|
133
|
+
.command(
|
|
134
|
+
'setup',
|
|
135
|
+
'Configure Obsidian vault integration',
|
|
136
|
+
(yargs) => {
|
|
137
|
+
return yargs
|
|
138
|
+
.option('vault-path', {
|
|
139
|
+
describe: 'Path to your Obsidian vault folder (use quotes if path has spaces)',
|
|
140
|
+
type: 'string',
|
|
141
|
+
demandOption: true
|
|
142
|
+
})
|
|
143
|
+
.option('prefix', {
|
|
144
|
+
describe: 'Subfolder name in vault (default: project directory name)',
|
|
145
|
+
type: 'string'
|
|
146
|
+
})
|
|
147
|
+
.option('watch', {
|
|
148
|
+
describe: 'Enable continuous sync after setup',
|
|
149
|
+
type: 'boolean'
|
|
150
|
+
})
|
|
151
|
+
.example('autopm obsidian setup --vault-path "/mnt/c/Users/You/My Vault"', 'WSL')
|
|
152
|
+
.example('autopm obsidian setup --vault-path "/Users/you/My Vault"', 'macOS')
|
|
153
|
+
.example('autopm obsidian setup --vault-path "/home/you/My Vault" --prefix my-project', 'Linux with prefix');
|
|
154
|
+
},
|
|
155
|
+
obsidianSetup
|
|
156
|
+
)
|
|
157
|
+
.command(
|
|
158
|
+
'sync',
|
|
159
|
+
'Sync project files to Obsidian vault',
|
|
160
|
+
(yargs) => {
|
|
161
|
+
return yargs
|
|
162
|
+
.option('watch', {
|
|
163
|
+
describe: 'Continuous sync on file changes',
|
|
164
|
+
type: 'boolean',
|
|
165
|
+
default: false
|
|
166
|
+
})
|
|
167
|
+
.option('check', {
|
|
168
|
+
describe: 'Dry-run: show what would be synced',
|
|
169
|
+
type: 'boolean',
|
|
170
|
+
default: false
|
|
171
|
+
})
|
|
172
|
+
.option('safe-mode', {
|
|
173
|
+
describe: 'Never delete vault files (omit --delete from rsync)',
|
|
174
|
+
type: 'boolean',
|
|
175
|
+
default: false
|
|
176
|
+
})
|
|
177
|
+
.example('autopm obsidian sync', 'One-shot sync')
|
|
178
|
+
.example('autopm obsidian sync --watch', 'Continuous sync')
|
|
179
|
+
.example('autopm obsidian sync --check', 'Dry-run');
|
|
180
|
+
},
|
|
181
|
+
obsidianSync
|
|
182
|
+
)
|
|
183
|
+
.command(
|
|
184
|
+
'doctor',
|
|
185
|
+
'Diagnose common Obsidian integration issues',
|
|
186
|
+
(yargs) => {
|
|
187
|
+
return yargs
|
|
188
|
+
.example('autopm obsidian doctor', 'Run all diagnostic checks');
|
|
189
|
+
},
|
|
190
|
+
obsidianDoctor
|
|
191
|
+
)
|
|
192
|
+
.demandCommand(1, 'You must specify an obsidian command')
|
|
193
|
+
.strictCommands()
|
|
194
|
+
.help();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
module.exports = {
|
|
198
|
+
command: 'obsidian',
|
|
199
|
+
describe: 'Manage Obsidian vault integration (setup, sync, diagnostics)',
|
|
200
|
+
builder,
|
|
201
|
+
handler: (argv) => {
|
|
202
|
+
console.log('\nUsage: autopm obsidian <command>\n');
|
|
203
|
+
console.log('Commands:');
|
|
204
|
+
console.log(' setup Configure Obsidian vault integration');
|
|
205
|
+
console.log(' sync Sync project files to Obsidian vault');
|
|
206
|
+
console.log(' doctor Diagnose common integration issues');
|
|
207
|
+
console.log('\nRun autopm obsidian <command> --help for details\n');
|
|
208
|
+
}
|
|
209
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-autopm",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.24.0",
|
|
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.
|