@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.
@@ -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
- gap: 10px;
75
- padding: 4px 8px 18px;
76
- border-bottom: 1px solid var(--line);
77
- margin-bottom: 14px;
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, 320px);
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: 17ch;
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: 0;
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: grid;
942
- grid-template-columns: max-content 1fr;
943
- gap: 0 16px;
1024
+ display: flex;
1025
+ flex-direction: column;
1026
+ gap: 0;
944
1027
  }
945
1028
  .dl dt {
946
- padding: 8px 14px;
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: 8px 14px;
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 { position: static; }
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
  }
@@ -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
- # Delano
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
+ &middot;
12
+ <a href="#delano-cli">CLI</a>
13
+ &middot;
14
+ <a href="#local-viewer">Viewer</a>
15
+ &middot;
16
+ <a href="docs/delano-brandbook.html">Brand book</a>
17
+ &middot;
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
- Delano is an agent-agnostic delivery runtime. It keeps planning, execution, and evidence on disk so teams can work with different coding agents without changing the operating model every time.
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.7`
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 /path/to/repo --yes
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 /path/to/repo --yes
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 /path/to/repo
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
- 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. 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.
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."E:\\path\\to\\repo"]
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",