@bvdm/delano 0.2.7 → 0.2.9
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/.delano/viewer/public/app.jsx +202 -36
- package/.delano/viewer/public/delano-logo.svg +60 -0
- package/.delano/viewer/public/delano-mark.svg +53 -3
- package/.delano/viewer/public/favicon.png +0 -0
- package/.delano/viewer/public/index.html +3 -0
- package/.delano/viewer/public/styles.css +116 -13
- package/.delano/viewer/server.js +6 -0
- package/README.md +72 -9
- package/assets/install-manifest.json +3 -0
- package/assets/payload/.delano/viewer/public/app.jsx +2478 -0
- package/assets/payload/.delano/viewer/public/delano-logo.svg +60 -0
- package/assets/payload/.delano/viewer/public/favicon.png +0 -0
- package/assets/payload/.delano/viewer/public/index.html +3 -0
- package/assets/payload/.delano/viewer/public/styles.css +116 -13
- package/assets/payload/.delano/viewer/server.js +6 -0
- package/package.json +1 -1
|
@@ -47,6 +47,17 @@ body {
|
|
|
47
47
|
button { font-family: inherit; font-size: inherit; color: inherit; background: none; border: none; cursor: pointer; padding: 0; }
|
|
48
48
|
.mono { font-family: var(--font-mono); font-size: 12.5px; letter-spacing: -0.01em; }
|
|
49
49
|
.small { font-size: 12px; }
|
|
50
|
+
.sr-only {
|
|
51
|
+
position: absolute;
|
|
52
|
+
width: 1px;
|
|
53
|
+
height: 1px;
|
|
54
|
+
padding: 0;
|
|
55
|
+
margin: -1px;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
clip: rect(0, 0, 0, 0);
|
|
58
|
+
white-space: nowrap;
|
|
59
|
+
border: 0;
|
|
60
|
+
}
|
|
50
61
|
|
|
51
62
|
/* ---------- App shell ---------- */
|
|
52
63
|
.app {
|
|
@@ -71,10 +82,12 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
71
82
|
.brand {
|
|
72
83
|
display: flex;
|
|
73
84
|
align-items: center;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
85
|
+
padding: 0 10px
|
|
86
|
+
}
|
|
87
|
+
.brand-logo {
|
|
88
|
+
display: block;
|
|
89
|
+
width: min(110px, 100%);
|
|
90
|
+
height: auto;
|
|
78
91
|
}
|
|
79
92
|
.brand-mark {
|
|
80
93
|
width: 26px; height: 26px;
|
|
@@ -234,6 +247,31 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
234
247
|
background: var(--ink); color: var(--bg); border-color: var(--ink);
|
|
235
248
|
}
|
|
236
249
|
.btn-primary:hover { background: oklch(0.13 0.008 80); color: var(--bg); }
|
|
250
|
+
.copy-btn {
|
|
251
|
+
flex: none;
|
|
252
|
+
width: 22px;
|
|
253
|
+
height: 22px;
|
|
254
|
+
display: inline-grid;
|
|
255
|
+
place-items: center;
|
|
256
|
+
border: 1px solid transparent;
|
|
257
|
+
border-radius: var(--r-sm);
|
|
258
|
+
color: var(--ink-40);
|
|
259
|
+
text-decoration: none;
|
|
260
|
+
transition: background 90ms, border-color 90ms, color 90ms;
|
|
261
|
+
}
|
|
262
|
+
.copy-btn:hover,
|
|
263
|
+
.copy-btn:focus-visible {
|
|
264
|
+
background: var(--line-soft);
|
|
265
|
+
border-color: var(--line);
|
|
266
|
+
color: var(--ink);
|
|
267
|
+
outline: none;
|
|
268
|
+
}
|
|
269
|
+
.copy-btn.is-copied {
|
|
270
|
+
background: var(--ok-soft);
|
|
271
|
+
border-color: color-mix(in oklch, var(--ok) 30%, var(--line));
|
|
272
|
+
color: var(--ok);
|
|
273
|
+
}
|
|
274
|
+
.copy-btn svg { pointer-events: none; }
|
|
237
275
|
|
|
238
276
|
/* ---------- Page ---------- */
|
|
239
277
|
.content { padding: 36px 48px 64px; max-width: 1320px; width: 100%; align-self: center; }
|
|
@@ -453,7 +491,7 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
453
491
|
.summary-tight > .field:first-child { padding-left: 0; }
|
|
454
492
|
.doc-reader-page {
|
|
455
493
|
display: grid;
|
|
456
|
-
grid-template-columns: minmax(0, 1fr) minmax(260px,
|
|
494
|
+
grid-template-columns: minmax(0, 1fr) minmax(260px, 400px);
|
|
457
495
|
gap: 44px;
|
|
458
496
|
align-items: start;
|
|
459
497
|
}
|
|
@@ -470,7 +508,7 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
470
508
|
margin-bottom: 6px;
|
|
471
509
|
}
|
|
472
510
|
.content-reader-head-c .doc-reader-main .page-title {
|
|
473
|
-
max-width:
|
|
511
|
+
max-width: 100%;
|
|
474
512
|
}
|
|
475
513
|
.doc-meta-panel {
|
|
476
514
|
position: sticky;
|
|
@@ -481,7 +519,7 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
481
519
|
overflow: hidden;
|
|
482
520
|
}
|
|
483
521
|
.doc-side {
|
|
484
|
-
min-width:
|
|
522
|
+
min-width: 400px;
|
|
485
523
|
position: sticky;
|
|
486
524
|
top: 86px;
|
|
487
525
|
display: flex;
|
|
@@ -505,6 +543,10 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
505
543
|
.doc-meta-list dd {
|
|
506
544
|
overflow-wrap: anywhere;
|
|
507
545
|
}
|
|
546
|
+
.copy-value {
|
|
547
|
+
min-width: 0;
|
|
548
|
+
overflow-wrap: anywhere;
|
|
549
|
+
}
|
|
508
550
|
|
|
509
551
|
.field-label {
|
|
510
552
|
font-size: 11px;
|
|
@@ -515,6 +557,7 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
515
557
|
margin-bottom: 6px;
|
|
516
558
|
}
|
|
517
559
|
.field-value { font-size: 14px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
|
|
560
|
+
.field-id { color: var(--ink-50); }
|
|
518
561
|
|
|
519
562
|
/* health */
|
|
520
563
|
.health { display: flex; align-items: center; gap: 10px; }
|
|
@@ -600,6 +643,40 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
600
643
|
}
|
|
601
644
|
|
|
602
645
|
/* ---------- Workspace dashboard ---------- */
|
|
646
|
+
.project-filter {
|
|
647
|
+
display: inline-flex;
|
|
648
|
+
align-items: center;
|
|
649
|
+
gap: 2px;
|
|
650
|
+
padding: 2px;
|
|
651
|
+
border: 1px solid var(--line);
|
|
652
|
+
border-radius: var(--r-sm);
|
|
653
|
+
background: var(--surface);
|
|
654
|
+
}
|
|
655
|
+
.project-filter-option {
|
|
656
|
+
display: inline-flex;
|
|
657
|
+
align-items: center;
|
|
658
|
+
gap: 6px;
|
|
659
|
+
min-height: 26px;
|
|
660
|
+
padding: 4px 8px;
|
|
661
|
+
border-radius: 3px;
|
|
662
|
+
color: var(--ink-50);
|
|
663
|
+
font-size: 12.5px;
|
|
664
|
+
line-height: 1;
|
|
665
|
+
transition: background 90ms, color 90ms;
|
|
666
|
+
}
|
|
667
|
+
.project-filter-option:hover {
|
|
668
|
+
background: var(--line-soft);
|
|
669
|
+
color: var(--ink);
|
|
670
|
+
}
|
|
671
|
+
.project-filter-option.is-active {
|
|
672
|
+
background: var(--ink);
|
|
673
|
+
color: var(--bg);
|
|
674
|
+
}
|
|
675
|
+
.project-filter-option .mono {
|
|
676
|
+
font-size: 11px;
|
|
677
|
+
color: currentColor;
|
|
678
|
+
opacity: 0.72;
|
|
679
|
+
}
|
|
603
680
|
.project-grid {
|
|
604
681
|
display: grid;
|
|
605
682
|
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
|
|
@@ -867,6 +944,12 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
867
944
|
flex: none;
|
|
868
945
|
color: var(--ink-50);
|
|
869
946
|
}
|
|
947
|
+
.task-id-copy {
|
|
948
|
+
display: inline-flex;
|
|
949
|
+
align-items: center;
|
|
950
|
+
gap: 4px;
|
|
951
|
+
color: var(--ink-50);
|
|
952
|
+
}
|
|
870
953
|
|
|
871
954
|
.decisions { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; }
|
|
872
955
|
.decisions li {
|
|
@@ -938,26 +1021,42 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
938
1021
|
|
|
939
1022
|
.dl {
|
|
940
1023
|
margin: 0; padding: 8px 0;
|
|
941
|
-
display:
|
|
942
|
-
|
|
943
|
-
gap: 0
|
|
1024
|
+
display: flex;
|
|
1025
|
+
flex-direction: column;
|
|
1026
|
+
gap: 0;
|
|
944
1027
|
}
|
|
945
1028
|
.dl dt {
|
|
946
|
-
|
|
1029
|
+
width: 100%;
|
|
1030
|
+
padding: 8px 14px 0;
|
|
947
1031
|
font-size: 12px;
|
|
948
1032
|
color: var(--ink-50);
|
|
949
1033
|
text-transform: uppercase;
|
|
950
1034
|
letter-spacing: 0.06em;
|
|
951
1035
|
font-weight: 500;
|
|
1036
|
+
overflow: hidden;
|
|
1037
|
+
text-overflow: ellipsis;
|
|
1038
|
+
white-space: nowrap;
|
|
1039
|
+
flex: 1;
|
|
1040
|
+
display: flex;
|
|
1041
|
+
align-items: center;
|
|
1042
|
+
justify-content: space-between;
|
|
1043
|
+
gap: 8px;
|
|
1044
|
+
}
|
|
1045
|
+
.dl dt > span {
|
|
1046
|
+
min-width: 0;
|
|
1047
|
+
overflow: hidden;
|
|
1048
|
+
text-overflow: ellipsis;
|
|
952
1049
|
}
|
|
953
1050
|
.dl dd {
|
|
954
1051
|
margin: 0;
|
|
955
|
-
padding:
|
|
1052
|
+
padding: 4px 14px 8px;
|
|
956
1053
|
font-size: 13px;
|
|
957
1054
|
color: var(--ink);
|
|
958
1055
|
display: flex; align-items: center;
|
|
959
1056
|
gap: 6px;
|
|
960
1057
|
flex-wrap: wrap;
|
|
1058
|
+
flex: 1;
|
|
1059
|
+
min-width: 0;
|
|
961
1060
|
}
|
|
962
1061
|
|
|
963
1062
|
.side-list { margin: 0; padding: 0; list-style: none; }
|
|
@@ -1209,6 +1308,10 @@ button { font-family: inherit; font-size: inherit; color: inherit; background: n
|
|
|
1209
1308
|
.doc-reader-page,
|
|
1210
1309
|
.two-col { grid-template-columns: 1fr; }
|
|
1211
1310
|
.doc-side,
|
|
1212
|
-
.col-side {
|
|
1311
|
+
.col-side {
|
|
1312
|
+
min-width: 0;
|
|
1313
|
+
width: 100%;
|
|
1314
|
+
position: static;
|
|
1315
|
+
}
|
|
1213
1316
|
.outline-subitem { grid-template-columns: 1fr; gap: 5px; }
|
|
1214
1317
|
}
|
package/.delano/viewer/server.js
CHANGED
|
@@ -329,6 +329,12 @@ function openTarget(target, file) {
|
|
|
329
329
|
|
|
330
330
|
function sendStatic(res, pathname) {
|
|
331
331
|
if (pathname === '/favicon.ico') {
|
|
332
|
+
const faviconPath = path.join(publicRoot, 'favicon.png');
|
|
333
|
+
if (fs.existsSync(faviconPath)) {
|
|
334
|
+
res.writeHead(200, { 'content-type': 'image/png', 'cache-control': 'max-age=86400' });
|
|
335
|
+
res.end(fs.readFileSync(faviconPath));
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
332
338
|
res.writeHead(204, { 'cache-control': 'max-age=86400' });
|
|
333
339
|
res.end();
|
|
334
340
|
return;
|
package/README.md
CHANGED
|
@@ -1,6 +1,46 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/images/delano-logo.svg" alt="Delano" width="340">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>File-backed delivery contracts for coding agents and operators.</strong>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="#one-command-bootstrap">Install</a>
|
|
11
|
+
·
|
|
12
|
+
<a href="#delano-cli">CLI</a>
|
|
13
|
+
·
|
|
14
|
+
<a href="#local-viewer">Viewer</a>
|
|
15
|
+
·
|
|
16
|
+
<a href="docs/delano-brandbook.html">Brand book</a>
|
|
17
|
+
·
|
|
18
|
+
<a href="HANDBOOK.md">Handbook</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
Delano is an agent-agnostic delivery runtime. It keeps planning, execution, validation, and evidence on disk so maintainers, operators, and different coding agents can work from the same operating model without depending on one vendor workflow.
|
|
22
|
+
|
|
23
|
+
The product posture is a local dossier: warm paper, ledger ink, visible source paths, and quiet status signals. The interface and runtime both treat `.project/` as the source of truth.
|
|
24
|
+
|
|
25
|
+
## At a glance
|
|
26
|
+
|
|
27
|
+
| Surface | Role |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| `HANDBOOK.md` | Canonical operating model |
|
|
30
|
+
| `.project/` | File-backed delivery contracts: specs, plans, workstreams, tasks, decisions, updates, evidence |
|
|
31
|
+
| `.agents/` | Shared runtime: scripts, rules, hooks, skills, adapters |
|
|
32
|
+
| `.delano/` | Read-only local viewer for inspecting `.project` state |
|
|
33
|
+
| `docs/delano-brandbook.html` | Brand book for the Delano visual language |
|
|
34
|
+
|
|
35
|
+
## Quick start
|
|
2
36
|
|
|
3
|
-
|
|
37
|
+
```bash
|
|
38
|
+
npx -y @bvdm/delano@latest --yes
|
|
39
|
+
npx -y @bvdm/delano@latest viewer
|
|
40
|
+
npx -y @bvdm/delano@latest validate
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The viewer opens a localhost-only read surface for `.project` contracts. Validation checks that the runtime, contracts, package payload, and local gates still line up.
|
|
4
44
|
|
|
5
45
|
## What Delano is
|
|
6
46
|
|
|
@@ -12,12 +52,24 @@ Delano is an agent-agnostic delivery runtime. It keeps planning, execution, and
|
|
|
12
52
|
|
|
13
53
|
The npm package is intentionally thin. It distributes the approved runtime payload, includes the read-only viewer UI, and wraps the existing shell-based PM scripts. It does not replace the handbook, the file contracts, or the underlying bash/Python execution layer.
|
|
14
54
|
|
|
55
|
+
## Design language
|
|
56
|
+
|
|
57
|
+
Delano's visual system is intentionally quiet and document-like. The brand mark identifies the source; it does not decorate the interface.
|
|
58
|
+
|
|
59
|
+
- **Creative north star:** The Local Dossier.
|
|
60
|
+
- **Palette:** warm document ground, paper surface, ledger ink, hairline dividers, restrained slate selection, and forest identity through the logo assets.
|
|
61
|
+
- **Typography:** Inter for product and documentation text, JetBrains Mono for provenance and exact paths. Red Hat Display belongs only inside the supplied wordmark artwork.
|
|
62
|
+
- **Shape:** small 4px to 6px radii, 1px hairlines, open ledger rows instead of stacked cards.
|
|
63
|
+
- **Motion:** brief, functional feedback only.
|
|
64
|
+
|
|
65
|
+
See [DESIGN.md](DESIGN.md) and the [Delano Brand Book](docs/delano-brandbook.html) for the full system.
|
|
66
|
+
|
|
15
67
|
## Delano CLI
|
|
16
68
|
|
|
17
69
|
- Package: `@bvdm/delano`
|
|
18
|
-
- Current package version: `0.2.
|
|
70
|
+
- Current package version: `0.2.9`
|
|
19
71
|
- Binary: `delano`
|
|
20
|
-
- Commands: `onboarding`, `install`, `viewer`, `init`, `validate`, `status`, `next`
|
|
72
|
+
- Commands: `onboarding`, `install`, `viewer`, `project`, `workstream`, `task`, `update`, `init`, `import-spec-kit`, `research`, `validate`, `status`, `next`
|
|
21
73
|
- Primary goal: bootstrap a repo safely, expose local delivery state clearly, and keep runtime gates verifiable
|
|
22
74
|
|
|
23
75
|
## Recent main changes
|
|
@@ -46,14 +98,14 @@ npx -y @bvdm/delano@latest install --yes
|
|
|
46
98
|
To install into a different directory:
|
|
47
99
|
|
|
48
100
|
```bash
|
|
49
|
-
npx -y @bvdm/delano@latest --target
|
|
101
|
+
npx -y @bvdm/delano@latest --target <repo> --yes
|
|
50
102
|
```
|
|
51
103
|
|
|
52
104
|
If you already have the package installed locally, the same flow is:
|
|
53
105
|
|
|
54
106
|
```bash
|
|
55
107
|
delano --yes
|
|
56
|
-
delano --target
|
|
108
|
+
delano --target <repo> --yes
|
|
57
109
|
```
|
|
58
110
|
|
|
59
111
|
## Global CLI install
|
|
@@ -67,7 +119,7 @@ npm install -g @bvdm/delano
|
|
|
67
119
|
Typical flow in a repository:
|
|
68
120
|
|
|
69
121
|
```bash
|
|
70
|
-
cd
|
|
122
|
+
cd <repo>
|
|
71
123
|
delano install --yes
|
|
72
124
|
delano viewer
|
|
73
125
|
delano validate
|
|
@@ -171,7 +223,13 @@ bash .agents/scripts/pm/next.sh --all
|
|
|
171
223
|
bash .agents/scripts/pm/research.sh <project-slug> <research-slug> --title "Research title" --question "Primary question" --json
|
|
172
224
|
```
|
|
173
225
|
|
|
174
|
-
|
|
226
|
+
## Local viewer
|
|
227
|
+
|
|
228
|
+
The viewer is packaged with `@bvdm/delano` and serves the selected repository's `.project` files read-only. It defaults to `http://127.0.0.1:3977`; set `DELANO_VIEWER_PORT` or `PORT` to use another port.
|
|
229
|
+
|
|
230
|
+
It indexes `.project/context`, `.project/templates`, and `.project/projects`, then derives artifact roles, statuses, project outlines, task/workstream relationships, snippets, and rendered markdown for local inspection.
|
|
231
|
+
|
|
232
|
+
The viewer follows the same design language as the brand book: source paths stay visible, status is shown with labels and dots, and dense project state is separated with hairlines rather than decorative cards.
|
|
175
233
|
|
|
176
234
|
## Required dependencies
|
|
177
235
|
|
|
@@ -212,7 +270,7 @@ Codex hook activation is intentionally manual:
|
|
|
212
270
|
2. Start Codex in the repository and approve the project trust prompt for the repo-local `.codex/` layer. Codex records trusted projects in `~/.codex/config.toml`, for example:
|
|
213
271
|
|
|
214
272
|
```toml
|
|
215
|
-
[projects."
|
|
273
|
+
[projects."<repo>"]
|
|
216
274
|
trust_level = "trusted"
|
|
217
275
|
```
|
|
218
276
|
|
|
@@ -320,7 +378,12 @@ If npm publish fails after the package checks pass, verify that the npm trusted
|
|
|
320
378
|
|
|
321
379
|
## Read next
|
|
322
380
|
|
|
381
|
+
- `docs/README.md` for the user documentation index
|
|
323
382
|
- `docs/user-guide.md` for the practical user flow
|
|
383
|
+
- `docs/cli-reference.md` for the CLI command reference
|
|
384
|
+
- `docs/viewer-guide.md` for the read-only viewer workflow
|
|
385
|
+
- `docs/agent-operator-guide.md` for instructing agents
|
|
386
|
+
- `docs/spec-kit-and-research.md` for Spec Kit-style import and research intake
|
|
324
387
|
- `HANDBOOK.md` for the full operating model
|
|
325
388
|
- `.agents/scripts/README.md` for the runtime script inventory
|
|
326
389
|
- `AGENTS.md` for adapter-neutral instructions
|
|
@@ -169,7 +169,10 @@
|
|
|
169
169
|
".delano/viewer/README.md",
|
|
170
170
|
".delano/viewer/server.js",
|
|
171
171
|
".delano/viewer/public/app.js",
|
|
172
|
+
".delano/viewer/public/app.jsx",
|
|
173
|
+
".delano/viewer/public/delano-logo.svg",
|
|
172
174
|
".delano/viewer/public/explorer.svg",
|
|
175
|
+
".delano/viewer/public/favicon.png",
|
|
173
176
|
".delano/viewer/public/index.html",
|
|
174
177
|
".delano/viewer/public/markdown.svg",
|
|
175
178
|
".delano/viewer/public/vscode.svg",
|