mdboard 1.2.0 → 2.0.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.
Files changed (40) hide show
  1. package/bin.js +130 -44
  2. package/index.html +3321 -1195
  3. package/package.json +10 -11
  4. package/presets/kanban/api.json +91 -0
  5. package/presets/kanban/cli.json +69 -0
  6. package/presets/kanban/docs.json +29 -0
  7. package/presets/kanban/entities.json +128 -0
  8. package/presets/kanban/structure.json +15 -0
  9. package/presets/kanban/ui.json +86 -0
  10. package/presets/scrum/api.json +98 -0
  11. package/presets/scrum/cli.json +120 -0
  12. package/presets/scrum/docs.json +43 -0
  13. package/presets/scrum/entities.json +268 -0
  14. package/presets/scrum/structure.json +32 -0
  15. package/presets/scrum/ui.json +201 -0
  16. package/presets/shape-up/api.json +40 -0
  17. package/presets/shape-up/cli.json +44 -0
  18. package/presets/shape-up/docs.json +32 -0
  19. package/presets/shape-up/entities.json +140 -0
  20. package/presets/shape-up/structure.json +28 -0
  21. package/presets/shape-up/ui.json +114 -0
  22. package/src/cli/cli.js +338 -0
  23. package/src/cli/config.js +234 -0
  24. package/src/cli/init.js +175 -0
  25. package/src/cli/preset.js +849 -0
  26. package/src/cli/skill.js +417 -0
  27. package/src/cli/status.js +180 -0
  28. package/src/core/config.js +551 -0
  29. package/src/core/history.js +146 -0
  30. package/src/core/scanner.js +521 -0
  31. package/{workspace.js → src/core/workspace.js} +0 -15
  32. package/{yaml.js → src/core/yaml.js} +5 -1
  33. package/src/server/api.js +616 -0
  34. package/{server.js → src/server/server.js} +180 -132
  35. package/{watcher.js → src/server/watcher.js} +40 -9
  36. package/api.js +0 -752
  37. package/config.js +0 -73
  38. package/defaults.json +0 -43
  39. package/init.js +0 -109
  40. package/scanner.js +0 -491
package/package.json CHANGED
@@ -1,23 +1,22 @@
1
1
  {
2
2
  "name": "mdboard",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
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
- "main": "./server.js",
5
+ "main": "./src/server/server.js",
6
6
  "bin": {
7
7
  "mdboard": "bin.js"
8
8
  },
9
+ "scripts": {
10
+ "build": "node build.js",
11
+ "test": "node --test test/cli.test.js test/api.test.js"
12
+ },
9
13
  "files": [
10
14
  "bin.js",
11
- "server.js",
12
15
  "index.html",
13
- "init.js",
14
- "config.js",
15
- "defaults.json",
16
- "scanner.js",
17
- "watcher.js",
18
- "api.js",
19
- "yaml.js",
20
- "workspace.js"
16
+ "src/cli/",
17
+ "src/core/",
18
+ "src/server/",
19
+ "presets/"
21
20
  ],
22
21
  "keywords": [
23
22
  "project-management",
@@ -0,0 +1,91 @@
1
+ {
2
+ "endpoints": {
3
+ "crud": {
4
+ "entities": [
5
+ "task",
6
+ "note"
7
+ ],
8
+ "operations": [
9
+ "list",
10
+ "get",
11
+ "create",
12
+ "update",
13
+ "delete"
14
+ ],
15
+ "pattern": "/api/:entity",
16
+ "sourceScoped": true,
17
+ "sourcePattern": "/api/sources/:source/:entity"
18
+ },
19
+ "queries": {
20
+ "active": {
21
+ "pattern": "/api/:entity/active",
22
+ "filter": {
23
+ "status": [
24
+ "active",
25
+ "in-progress",
26
+ "building"
27
+ ]
28
+ },
29
+ "entities": [
30
+ "task"
31
+ ]
32
+ },
33
+ "metrics": {
34
+ "pattern": "/api/metrics",
35
+ "computes": [
36
+ "status-breakdown",
37
+ "priority-distribution",
38
+ "progress-by-parent"
39
+ ]
40
+ },
41
+ "health": {
42
+ "pattern": "/api/health",
43
+ "computes": [
44
+ "total",
45
+ "completed",
46
+ "in-progress",
47
+ "velocity"
48
+ ]
49
+ }
50
+ },
51
+ "system": {
52
+ "config": {
53
+ "method": "GET",
54
+ "path": "/api/config"
55
+ },
56
+ "project": {
57
+ "method": "GET",
58
+ "path": "/api/project"
59
+ },
60
+ "sources": {
61
+ "method": "GET",
62
+ "path": "/api/sources"
63
+ },
64
+ "sync": {
65
+ "method": "POST",
66
+ "path": "/api/sources/sync"
67
+ },
68
+ "history": {
69
+ "method": "GET",
70
+ "path": "/api/history"
71
+ },
72
+ "switch": {
73
+ "method": "POST",
74
+ "path": "/api/history/switch"
75
+ },
76
+ "theme": {
77
+ "method": "POST",
78
+ "path": "/api/theme"
79
+ },
80
+ "events": {
81
+ "method": "GET",
82
+ "path": "/api/events",
83
+ "type": "sse"
84
+ }
85
+ }
86
+ },
87
+ "filtering": {
88
+ "strategy": "query-params",
89
+ "autoFilters": true
90
+ }
91
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "commands": {
3
+ "create": {
4
+ "entities": [
5
+ "task",
6
+ "note"
7
+ ],
8
+ "args": {
9
+ "positional": "title",
10
+ "flags": "auto"
11
+ }
12
+ },
13
+ "update": {
14
+ "entities": [
15
+ "task",
16
+ "note"
17
+ ],
18
+ "args": {
19
+ "positional": "id",
20
+ "flags": "auto"
21
+ }
22
+ },
23
+ "delete": {
24
+ "entities": [
25
+ "task",
26
+ "note"
27
+ ],
28
+ "action": "archive"
29
+ },
30
+ "status": {
31
+ "output": "status.md",
32
+ "sections": [
33
+ {
34
+ "type": "summary",
35
+ "metrics": []
36
+ }
37
+ ]
38
+ },
39
+ "sync": {
40
+ "checks": [
41
+ "dangling-refs",
42
+ "duplicate-ids",
43
+ "missing-parents",
44
+ "orphaned-tasks"
45
+ ],
46
+ "fix": true
47
+ },
48
+ "init": {
49
+ "presets": [
50
+ "shape-up",
51
+ "scrum",
52
+ "kanban"
53
+ ],
54
+ "default": "kanban"
55
+ },
56
+ "theme": {
57
+ "scope": [
58
+ "global",
59
+ "project"
60
+ ]
61
+ },
62
+ "cache": {
63
+ "subcommands": [
64
+ "list",
65
+ "clean"
66
+ ]
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "status": {
3
+ "output": "status.md",
4
+ "header": "Project Status: {{project.name}}",
5
+ "sections": [
6
+ {
7
+ "type": "summary",
8
+ "metrics": [
9
+ {
10
+ "label": "Tasks",
11
+ "compute": "count",
12
+ "entity": "task",
13
+ "detail": "done-ratio"
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "type": "entity-table",
19
+ "entity": "task",
20
+ "groupBy": "status",
21
+ "fields": [
22
+ "id",
23
+ "title",
24
+ "status"
25
+ ]
26
+ }
27
+ ]
28
+ }
29
+ }
@@ -0,0 +1,128 @@
1
+ {
2
+ "methodology": "kanban",
3
+ "entities": {
4
+ "task": {
5
+ "singular": "Task",
6
+ "plural": "Tasks",
7
+ "prefix": "TASK",
8
+ "file": "PREFIX-NNN.md",
9
+ "fields": {
10
+ "status": {
11
+ "type": "enum",
12
+ "values": [
13
+ {
14
+ "key": "backlog",
15
+ "label": "Backlog",
16
+ "color": "#8B8B93",
17
+ "icon": "circle"
18
+ },
19
+ {
20
+ "key": "todo",
21
+ "label": "Todo",
22
+ "color": "#06B6D4",
23
+ "icon": "dashed-circle"
24
+ },
25
+ {
26
+ "key": "in-progress",
27
+ "label": "In Progress",
28
+ "color": "#D4A72C",
29
+ "icon": "half-circle"
30
+ },
31
+ {
32
+ "key": "review",
33
+ "label": "Review",
34
+ "color": "#8B5CF6",
35
+ "icon": "three-quarter-circle"
36
+ },
37
+ {
38
+ "key": "done",
39
+ "label": "Done",
40
+ "color": "#2EA043",
41
+ "icon": "check-circle"
42
+ }
43
+ ],
44
+ "default": "backlog"
45
+ },
46
+ "priority": {
47
+ "type": "enum",
48
+ "values": [
49
+ {
50
+ "key": "urgent",
51
+ "label": "Urgent",
52
+ "color": "#DA3633"
53
+ },
54
+ {
55
+ "key": "high",
56
+ "label": "High",
57
+ "color": "#F97316"
58
+ },
59
+ {
60
+ "key": "medium",
61
+ "label": "Medium",
62
+ "color": "#D4A72C"
63
+ },
64
+ {
65
+ "key": "low",
66
+ "label": "Low",
67
+ "color": "#5B6EF5"
68
+ }
69
+ ],
70
+ "default": "medium"
71
+ },
72
+ "assigned": {
73
+ "type": "list",
74
+ "label": "Assigned"
75
+ },
76
+ "points": {
77
+ "type": "number",
78
+ "label": "Points"
79
+ },
80
+ "tags": {
81
+ "type": "list",
82
+ "label": "Tags"
83
+ }
84
+ }
85
+ },
86
+ "note": {
87
+ "singular": "Note",
88
+ "plural": "Notes",
89
+ "prefix": "NOTE",
90
+ "file": "PREFIX-NNN.md",
91
+ "fields": {
92
+ "updated": {
93
+ "type": "date",
94
+ "label": "Updated"
95
+ }
96
+ }
97
+ }
98
+ },
99
+ "priorities": [
100
+ {
101
+ "key": "urgent",
102
+ "label": "Urgent",
103
+ "color": "#DA3633",
104
+ "bars": 4
105
+ },
106
+ {
107
+ "key": "high",
108
+ "label": "High",
109
+ "color": "#F97316",
110
+ "bars": 3
111
+ },
112
+ {
113
+ "key": "medium",
114
+ "label": "Medium",
115
+ "color": "#D4A72C",
116
+ "bars": 2
117
+ },
118
+ {
119
+ "key": "low",
120
+ "label": "Low",
121
+ "color": "#5B6EF5",
122
+ "bars": 1
123
+ }
124
+ ],
125
+ "completedStatuses": [
126
+ "done"
127
+ ]
128
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "root": "project",
3
+ "hierarchy": {},
4
+ "standalone": {
5
+ "task": {
6
+ "dir": "tasks"
7
+ },
8
+ "note": {
9
+ "dir": "notes"
10
+ }
11
+ },
12
+ "archive": {
13
+ "dir": "archive"
14
+ }
15
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "tabs": [
3
+ {
4
+ "id": "tasks",
5
+ "label": "Tasks",
6
+ "description": "Tasks",
7
+ "icon": "check-square",
8
+ "entity": "task",
9
+ "layouts": [
10
+ "board",
11
+ "table",
12
+ "list"
13
+ ],
14
+ "defaultLayout": "board",
15
+ "board": {
16
+ "groupBy": "status",
17
+ "cardFields": [
18
+ "id",
19
+ "title",
20
+ "status"
21
+ ],
22
+ "dragAction": "update-status"
23
+ },
24
+ "table": {
25
+ "columns": [
26
+ "id",
27
+ "title",
28
+ "status",
29
+ "assigned"
30
+ ],
31
+ "sortable": true
32
+ },
33
+ "filters": "auto"
34
+ },
35
+ {
36
+ "id": "notes",
37
+ "label": "Notes",
38
+ "description": "Notes",
39
+ "icon": "file-text",
40
+ "entity": "note",
41
+ "layouts": [
42
+ "editor"
43
+ ],
44
+ "defaultLayout": "editor"
45
+ },
46
+ {
47
+ "id": "metrics",
48
+ "label": "Metrics",
49
+ "description": "Project progress and health overview",
50
+ "icon": "bar-chart",
51
+ "layouts": [
52
+ "metrics"
53
+ ],
54
+ "defaultLayout": "metrics",
55
+ "metrics": {
56
+ "cards": [
57
+ {
58
+ "title": "Status Breakdown",
59
+ "type": "status-breakdown",
60
+ "entity": "task"
61
+ },
62
+ {
63
+ "title": "Project Health",
64
+ "type": "health"
65
+ }
66
+ ]
67
+ }
68
+ }
69
+ ],
70
+ "panel": {
71
+ "enabled": true,
72
+ "position": "right",
73
+ "editableFields": "auto",
74
+ "sections": [
75
+ "properties",
76
+ "ai",
77
+ "content"
78
+ ]
79
+ },
80
+ "sourceRail": {
81
+ "enabled": true,
82
+ "position": "left",
83
+ "showHome": true,
84
+ "showHistory": true
85
+ }
86
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "endpoints": {
3
+ "crud": {
4
+ "entities": [
5
+ "sprint",
6
+ "story",
7
+ "task",
8
+ "epic",
9
+ "bug",
10
+ "note"
11
+ ],
12
+ "operations": [
13
+ "list",
14
+ "get",
15
+ "create",
16
+ "update",
17
+ "delete"
18
+ ],
19
+ "pattern": "/api/:entity",
20
+ "sourceScoped": true,
21
+ "sourcePattern": "/api/sources/:source/:entity"
22
+ },
23
+ "queries": {
24
+ "active": {
25
+ "pattern": "/api/:entity/active",
26
+ "filter": {
27
+ "status": [
28
+ "active",
29
+ "in-progress",
30
+ "building"
31
+ ]
32
+ },
33
+ "entities": [
34
+ "sprint",
35
+ "story",
36
+ "task",
37
+ "bug"
38
+ ]
39
+ },
40
+ "metrics": {
41
+ "pattern": "/api/metrics",
42
+ "computes": [
43
+ "status-breakdown",
44
+ "priority-distribution",
45
+ "progress-by-parent"
46
+ ]
47
+ },
48
+ "health": {
49
+ "pattern": "/api/health",
50
+ "computes": [
51
+ "total",
52
+ "completed",
53
+ "in-progress",
54
+ "velocity"
55
+ ]
56
+ }
57
+ },
58
+ "system": {
59
+ "config": {
60
+ "method": "GET",
61
+ "path": "/api/config"
62
+ },
63
+ "project": {
64
+ "method": "GET",
65
+ "path": "/api/project"
66
+ },
67
+ "sources": {
68
+ "method": "GET",
69
+ "path": "/api/sources"
70
+ },
71
+ "sync": {
72
+ "method": "POST",
73
+ "path": "/api/sources/sync"
74
+ },
75
+ "history": {
76
+ "method": "GET",
77
+ "path": "/api/history"
78
+ },
79
+ "switch": {
80
+ "method": "POST",
81
+ "path": "/api/history/switch"
82
+ },
83
+ "theme": {
84
+ "method": "POST",
85
+ "path": "/api/theme"
86
+ },
87
+ "events": {
88
+ "method": "GET",
89
+ "path": "/api/events",
90
+ "type": "sse"
91
+ }
92
+ }
93
+ },
94
+ "filtering": {
95
+ "strategy": "query-params",
96
+ "autoFilters": true
97
+ }
98
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "commands": {
3
+ "create": {
4
+ "entities": [
5
+ "sprint",
6
+ "story",
7
+ "task",
8
+ "epic",
9
+ "bug",
10
+ "note"
11
+ ],
12
+ "args": {
13
+ "positional": "title",
14
+ "flags": "auto"
15
+ }
16
+ },
17
+ "update": {
18
+ "entities": [
19
+ "sprint",
20
+ "story",
21
+ "task",
22
+ "epic",
23
+ "bug",
24
+ "note"
25
+ ],
26
+ "args": {
27
+ "positional": "id",
28
+ "flags": "auto"
29
+ }
30
+ },
31
+ "delete": {
32
+ "entities": [
33
+ "sprint",
34
+ "story",
35
+ "task",
36
+ "epic",
37
+ "bug",
38
+ "note"
39
+ ],
40
+ "action": "archive"
41
+ },
42
+ "status": {
43
+ "output": "status.md",
44
+ "sections": [
45
+ {
46
+ "type": "summary",
47
+ "metrics": [
48
+ {
49
+ "label": "Sprints",
50
+ "compute": "count",
51
+ "entity": "sprint"
52
+ },
53
+ {
54
+ "label": "Tasks",
55
+ "compute": "count",
56
+ "entity": "task",
57
+ "detail": "done-ratio"
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ "type": "entity-list",
63
+ "entity": "sprint",
64
+ "fields": [
65
+ "title",
66
+ "status",
67
+ "progress"
68
+ ],
69
+ "nest": {
70
+ "entity": "story",
71
+ "fields": [
72
+ "title",
73
+ "status"
74
+ ]
75
+ }
76
+ },
77
+ {
78
+ "type": "entity-table",
79
+ "entity": "task",
80
+ "groupBy": "status",
81
+ "fields": [
82
+ "id",
83
+ "title",
84
+ "status",
85
+ "points"
86
+ ]
87
+ }
88
+ ]
89
+ },
90
+ "sync": {
91
+ "checks": [
92
+ "dangling-refs",
93
+ "duplicate-ids",
94
+ "missing-parents",
95
+ "orphaned-tasks"
96
+ ],
97
+ "fix": true
98
+ },
99
+ "init": {
100
+ "presets": [
101
+ "shape-up",
102
+ "scrum",
103
+ "kanban"
104
+ ],
105
+ "default": "scrum"
106
+ },
107
+ "theme": {
108
+ "scope": [
109
+ "global",
110
+ "project"
111
+ ]
112
+ },
113
+ "cache": {
114
+ "subcommands": [
115
+ "list",
116
+ "clean"
117
+ ]
118
+ }
119
+ }
120
+ }