@bvdm/delano 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -46,6 +46,42 @@ delano --yes
46
46
  delano --target /path/to/repo --yes
47
47
  ```
48
48
 
49
+ ## Global CLI install
50
+
51
+ If you want `delano` available in every repository you work in, install it globally:
52
+
53
+ ```bash
54
+ npm install -g @bvdm/delano
55
+ ```
56
+
57
+ Typical flow in a repository:
58
+
59
+ ```bash
60
+ cd /path/to/repo
61
+ delano install --yes
62
+ delano validate
63
+ delano init <slug> "<Project Name>" [owner] [lead]
64
+ ```
65
+
66
+ Command intent:
67
+
68
+ - `delano install` bootstraps the Delano runtime into the current repository
69
+ - `delano validate` checks whether the runtime and required assets are in place
70
+ - `delano init` creates a delivery project inside a repository that already has Delano installed
71
+
72
+ `delano init` usage:
73
+
74
+ ```bash
75
+ delano init <slug> "<Project Name>" [owner] [lead]
76
+ ```
77
+
78
+ Notes:
79
+
80
+ - use kebab-case for `<slug>`
81
+ - `owner` defaults to `team`
82
+ - `lead` defaults to `owner`
83
+ - this is the right command for an agent to scaffold a new delivery project after `delano install`
84
+
49
85
  ## How to use Delano after install
50
86
 
51
87
  If you bootstrap with one-shot `npx`, keep using `npx` for wrapper commands:
@@ -62,7 +98,7 @@ If the package is installed locally or globally, run these inside the target rep
62
98
  delano validate
63
99
  delano status
64
100
  delano next -- --all
65
- delano init <slug> "<Project Name>" <owner> <lead>
101
+ delano init <slug> "<Project Name>" [owner] [lead]
66
102
  ```
67
103
 
68
104
  The wrapper commands call the existing PM scripts under `.agents/scripts/pm/`. You can also run those scripts directly:
@@ -93,9 +129,31 @@ The CLI does not bundle its own shell or Python runtime.
93
129
  - it reports each conflict as file, directory, or symlink
94
130
  - it only overwrites approved allowlist paths when `--force` is used
95
131
  - it does not touch unrelated files outside the allowlist
132
+ - it does not install or overwrite repo-root Git config files such as `.gitignore` or `.gitattributes`
96
133
 
97
134
  The base install payload intentionally excludes top-level adapter entry docs such as `AGENTS.md`, `CLAUDE.md`, `CODEX.md`, `OPENCODE.md`, and `PI.md`. Those remain opt-in only.
98
135
 
136
+ ## Optional AGENTS.md / CLAUDE.md snippet
137
+
138
+ If you want explicit Delano instructions in a repo-root `AGENTS.md` or `CLAUDE.md`, copy and paste this yourself:
139
+
140
+ ```md
141
+ ## Delano
142
+
143
+ This repository uses Delano.
144
+
145
+ Canonical process and contracts live in `HANDBOOK.md`.
146
+ Delivery state lives in `.project/`.
147
+ Shared runtime lives in `.agents/`.
148
+ `.claude/` is a compatibility mirror of `.agents/`, not a second runtime.
149
+
150
+ When working in this repository:
151
+ - treat `.project/` as the source of truth
152
+ - use the Delano status model and evidence discipline from `HANDBOOK.md`
153
+ - keep sync and quality gates aligned with the handbook
154
+ - use `delano init <slug> "<Project Name>" [owner] [lead]` to scaffold a new delivery project when needed
155
+ ```
156
+
99
157
  ## v1.1 boundaries
100
158
 
101
159
  This package is deliberately narrow:
@@ -75,8 +75,6 @@
75
75
  ".agents/skills/sync-skill/templates/conflict-resolution-actions.md",
76
76
  ".agents/skills/sync-skill/templates/drift-report.md",
77
77
  ".delano/README.md",
78
- ".gitattributes",
79
- ".gitignore",
80
78
  ".project/context/gui-testing.md",
81
79
  ".project/context/product-context.md",
82
80
  ".project/context/progress.md",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bvdm/delano",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Thin npm CLI for the Delano delivery runtime.",
5
5
  "license": "UNLICENSED",
6
6
  "bin": {
@@ -11,7 +11,6 @@ const path = require("node:path");
11
11
  const readline = require("node:readline/promises");
12
12
  const { stdin, stdout } = require("node:process");
13
13
 
14
- const { getPackagedAssetRelativePath } = require("./asset-paths");
15
14
  const { CliError } = require("./errors");
16
15
  const { getPackageRoot, getPathType } = require("./runtime");
17
16
 
@@ -123,7 +122,7 @@ function parseInstallArgs(args) {
123
122
  function buildInstallPlan(options) {
124
123
  const { manifest, payloadRoot } = readInstallManifest();
125
124
  const items = manifest.paths.map((relativePath) => {
126
- const sourcePath = path.join(payloadRoot, getPackagedAssetRelativePath(relativePath));
125
+ const sourcePath = path.join(payloadRoot, relativePath);
127
126
  if (!existsSync(sourcePath)) {
128
127
  throw new CliError(getMissingPackagedAssetMessage(relativePath), 1);
129
128
  }
@@ -1,14 +0,0 @@
1
- *.sh text eol=lf
2
- *.bash text eol=lf
3
- *.zsh text eol=lf
4
-
5
- *.md text eol=lf
6
- *.yml text eol=lf
7
- *.yaml text eol=lf
8
- *.json text eol=lf
9
- *.jsonc text eol=lf
10
- *.ts text eol=lf
11
- *.tsx text eol=lf
12
- *.js text eol=lf
13
- *.mjs text eol=lf
14
- *.py text eol=lf
@@ -1,20 +0,0 @@
1
- # Runtime local artifacts
2
- .claude/logs/*.jsonl
3
- .claude/logs/tests/
4
- .agents/logs/*.jsonl
5
- .agents/logs/tests/
6
-
7
- # Keep structural markers and docs
8
- !.claude/logs/.gitkeep
9
- !.claude/logs/schema.md
10
- !.agents/logs/.gitkeep
11
- !.agents/logs/schema.md
12
-
13
- # Local Claude overrides
14
- .claude/settings.local.json
15
- .agents/settings.local.json
16
-
17
- # Node/npm local artifacts
18
- node_modules/
19
- assets/payload/
20
- *.tgz
@@ -1,21 +0,0 @@
1
- const path = require("node:path");
2
-
3
- const PACKAGED_BASENAME_MAP = new Map([
4
- [".gitignore", "__dot_gitignore__"]
5
- ]);
6
-
7
- function getPackagedAssetRelativePath(relativePath) {
8
- const normalizedPath = relativePath.split(/[\\/]/).join("/");
9
- const parsedPath = path.posix.parse(normalizedPath);
10
- const packagedBasename = PACKAGED_BASENAME_MAP.get(parsedPath.base);
11
-
12
- if (!packagedBasename) {
13
- return normalizedPath;
14
- }
15
-
16
- return parsedPath.dir ? `${parsedPath.dir}/${packagedBasename}` : packagedBasename;
17
- }
18
-
19
- module.exports = {
20
- getPackagedAssetRelativePath
21
- };