mdboard 2.1.4 → 2.1.6
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/bin.js +5 -17
- package/package.json +1 -1
- package/src/cli/init.js +70 -14
package/bin.js
CHANGED
|
@@ -40,34 +40,22 @@ if (command === '--help' || command === '-h' || command === 'help') {
|
|
|
40
40
|
process.exit(0);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
// ---
|
|
43
|
+
// --- Command dispatch ---
|
|
44
44
|
if (command === 'init') {
|
|
45
45
|
require('./src/cli/init');
|
|
46
46
|
// init.js manages its own process.exit via async readline callbacks
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// --- Cache ---
|
|
50
|
-
if (command === 'cache') {
|
|
47
|
+
} else if (command === 'cache') {
|
|
51
48
|
handleCache();
|
|
52
49
|
process.exit(0);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// --- History ---
|
|
56
|
-
if (command === 'history') {
|
|
50
|
+
} else if (command === 'history') {
|
|
57
51
|
handleHistory();
|
|
58
52
|
process.exit(0);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// --- Status ---
|
|
62
|
-
if (command === 'status') {
|
|
53
|
+
} else if (command === 'status') {
|
|
63
54
|
const { resolveProjectDir } = require('./src/cli/cli');
|
|
64
55
|
const { generateStatus } = require('./src/cli/status');
|
|
65
56
|
generateStatus(resolveProjectDir(args));
|
|
66
57
|
process.exit(0);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// --- CRUD: create, update, delete ---
|
|
70
|
-
if (command === 'create') {
|
|
58
|
+
} else if (command === 'create') {
|
|
71
59
|
const { resolveProjectDir, handleCreate } = require('./src/cli/cli');
|
|
72
60
|
handleCreate(resolveProjectDir(args), args.slice(1));
|
|
73
61
|
} else if (command === 'update') {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mdboard",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "Git-based project management dashboard. Reads markdown files with YAML frontmatter and serves a visual kanban board, table, milestones, and metrics views.",
|
|
5
5
|
"main": "./src/server/server.js",
|
|
6
6
|
"bin": {
|
package/src/cli/init.js
CHANGED
|
@@ -22,9 +22,7 @@ const today = new Date().toISOString().split('T')[0];
|
|
|
22
22
|
const args = process.argv.slice(2).filter(a => a !== 'init');
|
|
23
23
|
|
|
24
24
|
// Parse flags
|
|
25
|
-
const
|
|
26
|
-
const nameArg = args.filter(a => !a.startsWith('--'))[0] || '';
|
|
27
|
-
|
|
25
|
+
const presetFlag = process.env.MDBOARD_PRESET || parseFlag('preset');
|
|
28
26
|
function parseFlag(flag) {
|
|
29
27
|
for (let i = 0; i < args.length; i++) {
|
|
30
28
|
if (args[i] === '--' + flag && args[i + 1]) return args[i + 1];
|
|
@@ -32,6 +30,21 @@ function parseFlag(flag) {
|
|
|
32
30
|
return null;
|
|
33
31
|
}
|
|
34
32
|
|
|
33
|
+
// Collect positional args (skip flag values)
|
|
34
|
+
function getPositionalArgs() {
|
|
35
|
+
const positional = [];
|
|
36
|
+
for (let i = 0; i < args.length; i++) {
|
|
37
|
+
if (args[i].startsWith('--')) {
|
|
38
|
+
i++; // skip the flag's value
|
|
39
|
+
} else {
|
|
40
|
+
positional.push(args[i]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return positional;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const nameArg = getPositionalArgs()[0] || '';
|
|
47
|
+
|
|
35
48
|
// Check if project already exists
|
|
36
49
|
if (fs.existsSync(projectPath)) {
|
|
37
50
|
console.log('\n project/ already exists at ' + projectPath);
|
|
@@ -39,14 +52,15 @@ if (fs.existsSync(projectPath)) {
|
|
|
39
52
|
process.exit(0);
|
|
40
53
|
}
|
|
41
54
|
|
|
42
|
-
//
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
console.error('
|
|
55
|
+
// List available presets
|
|
56
|
+
const availablePresets = fs.readdirSync(configEngine.PRESETS_DIR).filter(function (d) {
|
|
57
|
+
return fs.statSync(path.join(configEngine.PRESETS_DIR, d)).isDirectory();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Validate preset flag if provided
|
|
61
|
+
if (presetFlag && !availablePresets.includes(presetFlag)) {
|
|
62
|
+
console.error('\n Error: unknown preset "' + presetFlag + '"');
|
|
63
|
+
console.error(' Available presets: ' + availablePresets.join(', ') + '\n');
|
|
50
64
|
process.exit(1);
|
|
51
65
|
}
|
|
52
66
|
|
|
@@ -54,13 +68,52 @@ if (!fs.existsSync(presetDir)) {
|
|
|
54
68
|
const agentsFlag = parseFlag('agents');
|
|
55
69
|
|
|
56
70
|
if (nameArg) {
|
|
57
|
-
|
|
71
|
+
resolvePreset(function (selectedPreset) {
|
|
72
|
+
resolveAgentTargets(function (targets) { scaffold(nameArg, selectedPreset, targets); });
|
|
73
|
+
});
|
|
58
74
|
} else {
|
|
59
75
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
60
76
|
rl.question(' Workspace name: ', function (answer) {
|
|
61
77
|
rl.close();
|
|
62
78
|
const name = answer.trim() || path.basename(cwd);
|
|
63
|
-
|
|
79
|
+
resolvePreset(function (selectedPreset) {
|
|
80
|
+
resolveAgentTargets(function (targets) { scaffold(name, selectedPreset, targets); });
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Resolve preset from --preset flag or interactive prompt.
|
|
87
|
+
*/
|
|
88
|
+
function resolvePreset(cb) {
|
|
89
|
+
if (presetFlag) return cb(presetFlag);
|
|
90
|
+
askPreset(cb);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Prompt user to select a methodology preset.
|
|
95
|
+
* @param {function} cb - Callback receiving the preset name string
|
|
96
|
+
*/
|
|
97
|
+
function askPreset(cb) {
|
|
98
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
99
|
+
const defaultIdx = availablePresets.indexOf(configEngine.DEFAULT_PRESET);
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log(' Methodology preset:');
|
|
102
|
+
availablePresets.forEach(function (p, i) {
|
|
103
|
+
const num = i + 1;
|
|
104
|
+
const marker = p === configEngine.DEFAULT_PRESET ? ' (default)' : '';
|
|
105
|
+
console.log(' ' + num + '. ' + p + marker);
|
|
106
|
+
});
|
|
107
|
+
rl.question(' Choice [' + (defaultIdx + 1) + ']: ', function (answer) {
|
|
108
|
+
rl.close();
|
|
109
|
+
const choice = (answer || '').trim();
|
|
110
|
+
if (!choice) return cb(configEngine.DEFAULT_PRESET);
|
|
111
|
+
const idx = parseInt(choice, 10);
|
|
112
|
+
if (idx >= 1 && idx <= availablePresets.length) return cb(availablePresets[idx - 1]);
|
|
113
|
+
// Allow typing the preset name directly
|
|
114
|
+
if (availablePresets.includes(choice)) return cb(choice);
|
|
115
|
+
console.error(' Invalid choice, using default: ' + configEngine.DEFAULT_PRESET);
|
|
116
|
+
return cb(configEngine.DEFAULT_PRESET);
|
|
64
117
|
});
|
|
65
118
|
}
|
|
66
119
|
|
|
@@ -100,7 +153,10 @@ function askAgentTargets(cb) {
|
|
|
100
153
|
});
|
|
101
154
|
}
|
|
102
155
|
|
|
103
|
-
function scaffold(name, agentTargets) {
|
|
156
|
+
function scaffold(name, preset, agentTargets) {
|
|
157
|
+
// Set env so configEngine picks up the selected preset
|
|
158
|
+
process.env.MDBOARD_PRESET = preset;
|
|
159
|
+
|
|
104
160
|
// Load preset config
|
|
105
161
|
const cfg = configEngine.loadConfig(null);
|
|
106
162
|
const structure = cfg.structure || {};
|