light-plan 0.1.0 → 0.1.1
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 +114 -53
- package/assets/README.md +3 -1
- package/assets/hcm/light-plan/mcp/light-plan.json +4 -0
- package/assets/hcm/light-plan.yml +4 -2
- package/dist/cli/commands/hcm/bundle.d.ts +5 -5
- package/dist/cli/commands/hcm/bundle.js +32 -14
- package/dist/cli/commands/hcm/bundle.js.map +1 -1
- package/dist/cli/commands/hcm/index.js +14 -12
- package/dist/cli/commands/hcm/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,6 +4,94 @@ A lightweight, file-based issue tracker. Your Agile board lives in your repo as
|
|
|
4
4
|
folders and markdown files, versioned with git — no server, no database, no
|
|
5
5
|
account.
|
|
6
6
|
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Requires Node 20+. The package is `light-plan` and the command it installs is
|
|
10
|
+
`lpm`:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g light-plan
|
|
14
|
+
lpm init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Or run it without installing anything:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx light-plan init
|
|
21
|
+
npx light-plan ui
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
To get started:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd my-project
|
|
28
|
+
lpm init # create the board in .lpm/
|
|
29
|
+
lpm ui # open it in your browser
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`lpm init` writes the board into `.lpm/` in the current folder. It uses the
|
|
33
|
+
Scrum template (`--template kanban` or `--template blank` for the others) and
|
|
34
|
+
takes the issue-id prefix from the folder name (`--prefix LP` to choose your
|
|
35
|
+
own). It also makes `.lpm` a git repository of its own and adds it to your
|
|
36
|
+
project's `.gitignore`, so the board keeps its own history (`--no-git` skips
|
|
37
|
+
that).
|
|
38
|
+
|
|
39
|
+
`lpm ui` starts a local server on `http://localhost:4571` and opens the editor
|
|
40
|
+
in your browser. What you change there is held as a draft until you press
|
|
41
|
+
**Push**, which writes it to `.lpm/`. Stop the server with Ctrl-C. To build a
|
|
42
|
+
board from the command line instead, see [Quick start](#quick-start).
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
The experimental features — [`lpm queue agent`](#draining-the-queue-with-an-agent-lpm-queue-agent) and
|
|
46
|
+
[Jira sync](docs/remote-jira.md) — need packages a standard install leaves out;
|
|
47
|
+
their sections say what to add.
|
|
48
|
+
|
|
49
|
+
### Agent configuration with hcm
|
|
50
|
+
|
|
51
|
+
light-plan ships agents (a developer and a planner), skills and an MCP server
|
|
52
|
+
for AI coding hosts. If you manage agent configuration with
|
|
53
|
+
[hcm](https://github.com/fleskovar/harness_config_manager)
|
|
54
|
+
(harness-config-manager), register the light-plan bundle once, then install it
|
|
55
|
+
into any project:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install -g harness-config-manager # hcm itself, once per machine
|
|
59
|
+
lpm hcm init # register the bundle; again after each light-plan upgrade
|
|
60
|
+
|
|
61
|
+
# then, in each project
|
|
62
|
+
hcm install light-plan -t claude-code # developer and planner
|
|
63
|
+
hcm install light-plan -t copilot --flavor developer # the developer agent only
|
|
64
|
+
hcm update light-plan # after re-running lpm hcm init
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`-t` names the harness (`hcm targets` lists them) and `--flavor` picks a role
|
|
68
|
+
(`developer` or `pm`). The MCP server starts as `lpm mcp`, so agents need `lpm`
|
|
69
|
+
on their PATH: install light-plan globally, not only through npx. Without hcm,
|
|
70
|
+
[`lpm agent`](#working-with-agents) installs the same files straight into a
|
|
71
|
+
project. The details are in
|
|
72
|
+
[The same assets as an hcm bundle](#the-same-assets-as-an-hcm-bundle) and
|
|
73
|
+
[docs/hcm.md](docs/hcm.md).
|
|
74
|
+
|
|
75
|
+
### From a checkout
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
make setup # installs, builds, and puts `lpm` on your PATH
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Requires GNU Make. Without Make:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm install
|
|
85
|
+
npm run build
|
|
86
|
+
npm link # puts `lpm` on your PATH
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`make doctor` checks your machine before you start, and `make` on its own lists
|
|
90
|
+
every target. See [Development](#development).
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
## How a board is laid out
|
|
94
|
+
|
|
7
95
|
```
|
|
8
96
|
.lpm/
|
|
9
97
|
├── config.yml
|
|
@@ -55,49 +143,6 @@ any resource via its `assignee:` field.
|
|
|
55
143
|
walks: the layouts `lpm instructions` renders a [working brief](#working-briefs-the-context-to-actually-do-it)
|
|
56
144
|
with, so a team decides what a developer is handed when they pick an issue up.
|
|
57
145
|
|
|
58
|
-
## Install
|
|
59
|
-
|
|
60
|
-
Requires Node 20+. The package is `light-plan` and the command it installs is
|
|
61
|
-
`lpm`:
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
npm install -g light-plan
|
|
65
|
-
lpm init
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Or run it without installing anything:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
npx light-plan init
|
|
72
|
-
npx light-plan ui
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
Spell it `npx light-plan`, never `npx lpm` — `lpm` on npm is an unrelated
|
|
76
|
-
package. `lpm mcp setup` and `lpm agent` notice when they were started through
|
|
77
|
-
npx and write a host config that starts the server with `npx -y light-plan mcp`,
|
|
78
|
-
so nothing points into npm's cache.
|
|
79
|
-
|
|
80
|
-
The experimental features — [`lpm queue agent`](#draining-the-queue-with-an-agent-lpm-queue-agent) and
|
|
81
|
-
[Jira sync](docs/remote-jira.md) — need packages a standard install leaves out;
|
|
82
|
-
their sections say what to add.
|
|
83
|
-
|
|
84
|
-
### From a checkout
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
make setup # installs, builds, and puts `lpm` on your PATH
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Requires GNU Make. Without Make:
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
npm install
|
|
94
|
-
npm run build
|
|
95
|
-
npm link # puts `lpm` on your PATH
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
`make doctor` checks your machine before you start, and `make` on its own lists
|
|
99
|
-
every target. See [Development](#development).
|
|
100
|
-
|
|
101
146
|
## Quick start
|
|
102
147
|
|
|
103
148
|
```bash
|
|
@@ -3141,19 +3186,35 @@ mistake worth catching before publishing. Install the result anywhere with
|
|
|
3141
3186
|
`npm install -g ./release/light-plan-<version>.tgz` (the `./` matters — without
|
|
3142
3187
|
it npm reads the path as a GitHub repository).
|
|
3143
3188
|
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
runs `make verify` (typecheck, build, assets, both test suites) and `make dist`,
|
|
3147
|
-
and publishes only if both pass. A bare `npm publish` from the repository root is
|
|
3148
|
-
refused by `prepublishOnly`, because it would skip the build and the contents
|
|
3149
|
-
check. A release, start to finish:
|
|
3189
|
+
**A release is a pushed version tag.** The
|
|
3190
|
+
[Publish workflow](.github/workflows/publish.yml) takes it from there:
|
|
3150
3191
|
|
|
3151
3192
|
```bash
|
|
3152
|
-
npm login # once per machine
|
|
3153
3193
|
make version-patch # or -minor / -major: bumps, commits, tags
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3194
|
+
git push --follow-tags # the workflow verifies, packs and publishes
|
|
3195
|
+
```
|
|
3196
|
+
|
|
3197
|
+
It runs the same targets a release from a laptop does — `make ci` (lockfile
|
|
3198
|
+
install, typecheck, build, assets, both test suites), then `make dist` — and
|
|
3199
|
+
publishes the tarball `make dist` checked. Before any of that it refuses a tag
|
|
3200
|
+
that does not match the version in `package.json`, and a version npm already
|
|
3201
|
+
has. Starting it by hand (Actions → Publish → Run workflow) is a dry run:
|
|
3202
|
+
everything happens except the upload.
|
|
3203
|
+
|
|
3204
|
+
It authenticates with npm **trusted publishing**, so no npm token is stored in
|
|
3205
|
+
GitHub. That needs one setting on npmjs.com, made once: in the package's
|
|
3206
|
+
settings, add a trusted publisher for GitHub Actions with owner `fleskovar`,
|
|
3207
|
+
repository `light_plan_manager` and workflow filename `publish.yml`. The filename has to
|
|
3208
|
+
match exactly; renaming the workflow breaks publishing until the setting is
|
|
3209
|
+
changed too. Builds published this way carry
|
|
3210
|
+
[provenance](https://docs.npmjs.com/generating-provenance-statements), which
|
|
3211
|
+
npm shows on the package page.
|
|
3212
|
+
|
|
3213
|
+
To publish from a laptop instead, `make publish CONFIRM=yes` does the same
|
|
3214
|
+
steps locally (after `npm login`); the flag is required so it cannot happen by a
|
|
3215
|
+
mistyped target, and it is checked before anything runs. A bare `npm publish`
|
|
3216
|
+
from the repository root is refused by `prepublishOnly`, because it would skip
|
|
3217
|
+
the build and the contents check.
|
|
3157
3218
|
|
|
3158
3219
|
## Scope
|
|
3159
3220
|
|
package/assets/README.md
CHANGED
|
@@ -18,7 +18,9 @@ patterns. **Adding an asset is a file; adding a harness is a file.**
|
|
|
18
18
|
|
|
19
19
|
Three names are reserved and never copied: `harnesses/`, `hcm/` and this
|
|
20
20
|
`README.md`. A file in `hcm/` is a bundle mapping — the same copy rules, plus
|
|
21
|
-
the hcm manifest fields
|
|
21
|
+
the hcm manifest fields — and a folder beside it (`hcm/light-plan/`) holds the
|
|
22
|
+
files only that bundle carries, such as its MCP server file, copied as they are;
|
|
23
|
+
see [`docs/hcm.md`](../docs/hcm.md).
|
|
22
24
|
|
|
23
25
|
## Adding an asset
|
|
24
26
|
|
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
# Written by the code, not here, because they are not choices:
|
|
10
10
|
# version the package's own version, so the two cannot drift
|
|
11
11
|
# author, homepage from package.json
|
|
12
|
-
# mcp/<mcp>.json how to start `lpm mcp` on this machine
|
|
13
12
|
# context/<context>.md the pointer block `lpm agent` writes for Copilot,
|
|
14
13
|
# listing what every flavor installs
|
|
14
|
+
#
|
|
15
|
+
# Copied byte for byte from the folder of the same name, light-plan/, because
|
|
16
|
+
# they belong to this bundle and to no harness:
|
|
17
|
+
# mcp/light-plan.json the light-plan MCP server, started as `lpm mcp`
|
|
15
18
|
|
|
16
19
|
name: light-plan
|
|
17
20
|
description: >-
|
|
@@ -28,7 +31,6 @@ flavors:
|
|
|
28
31
|
Write epics, features and stories, sequence them and set the board up.
|
|
29
32
|
|
|
30
33
|
context: 10-light-plan
|
|
31
|
-
mcp: light-plan
|
|
32
34
|
|
|
33
35
|
files:
|
|
34
36
|
- from: agents/*.md
|
|
@@ -9,6 +9,10 @@ import { z } from 'zod';
|
|
|
9
9
|
* a choice is filled in here: the version is the package's, so a bundle can
|
|
10
10
|
* never claim to be a release it is not.
|
|
11
11
|
*
|
|
12
|
+
* What belongs to one bundle and to no harness — its MCP server file — ships in
|
|
13
|
+
* `assets/hcm/<name>/` and is copied into the bundle byte for byte, so the
|
|
14
|
+
* package carries as a file what hcm reads as a file.
|
|
15
|
+
*
|
|
12
16
|
* The bundles land in a folder this tool owns (`defaultBundleDir`), never in
|
|
13
17
|
* the package itself: `hcm update` reads the registered folder again, and a
|
|
14
18
|
* package run through `npx` lives in a cache npm clears whenever it likes.
|
|
@@ -19,7 +23,6 @@ declare const bundleSchema: z.ZodObject<{
|
|
|
19
23
|
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
20
24
|
flavors: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
21
25
|
context: z.ZodOptional<z.ZodString>;
|
|
22
|
-
mcp: z.ZodOptional<z.ZodString>;
|
|
23
26
|
files: z.ZodArray<z.ZodObject<{
|
|
24
27
|
from: z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>, z.ZodTransform<string[], string | string[]>>;
|
|
25
28
|
to: z.ZodString;
|
|
@@ -52,9 +55,6 @@ export interface Rendered {
|
|
|
52
55
|
/**
|
|
53
56
|
* Render every bundle into `dir`, which becomes an hcm *collection*: one
|
|
54
57
|
* `hcm registry add <dir>` registers each bundle in it under its own name.
|
|
55
|
-
* `onPath` decides how the MCP entry starts `lpm` (see `launchCommand`).
|
|
56
58
|
*/
|
|
57
|
-
export declare function renderBundles(dir: string
|
|
58
|
-
onPath: boolean;
|
|
59
|
-
}): Rendered[];
|
|
59
|
+
export declare function renderBundles(dir: string): Rendered[];
|
|
60
60
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync, } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import YAML from 'yaml';
|
|
@@ -7,7 +7,6 @@ import { BoardError } from '../../../core/index.js';
|
|
|
7
7
|
import { ROLES, assetsDir, loadAssetFiles } from '../agent/assets.js';
|
|
8
8
|
import { installFile, pointerBlock } from '../agent/install.js';
|
|
9
9
|
import { placementsFor, ruleSchema } from '../agent/mapping.js';
|
|
10
|
-
import { launchCommand } from '../mcp/config.js';
|
|
11
10
|
/**
|
|
12
11
|
* hcm bundles, rendered from `assets/` rather than kept beside it.
|
|
13
12
|
*
|
|
@@ -18,6 +17,10 @@ import { launchCommand } from '../mcp/config.js';
|
|
|
18
17
|
* a choice is filled in here: the version is the package's, so a bundle can
|
|
19
18
|
* never claim to be a release it is not.
|
|
20
19
|
*
|
|
20
|
+
* What belongs to one bundle and to no harness — its MCP server file — ships in
|
|
21
|
+
* `assets/hcm/<name>/` and is copied into the bundle byte for byte, so the
|
|
22
|
+
* package carries as a file what hcm reads as a file.
|
|
23
|
+
*
|
|
21
24
|
* The bundles land in a folder this tool owns (`defaultBundleDir`), never in
|
|
22
25
|
* the package itself: `hcm update` reads the registered folder again, and a
|
|
23
26
|
* package run through `npx` lives in a cache npm clears whenever it likes.
|
|
@@ -31,8 +34,6 @@ const bundleSchema = z
|
|
|
31
34
|
flavors: z.record(z.string(), z.string()).default({}),
|
|
32
35
|
/** Write the pointer block as `context/<name>.md`. */
|
|
33
36
|
context: z.string().regex(/^\d\d-[a-z0-9-]+$/, 'must look like 10-name').optional(),
|
|
34
|
-
/** Write the `lpm mcp` entry as `mcp/<name>.json`. */
|
|
35
|
-
mcp: z.string().regex(/^[a-z][a-z0-9-]*$/, 'must be lower-kebab-case').optional(),
|
|
36
37
|
files: z.array(ruleSchema).min(1),
|
|
37
38
|
})
|
|
38
39
|
.strict();
|
|
@@ -105,15 +106,38 @@ function inEveryRole(asset) {
|
|
|
105
106
|
* there so a file deleted from `assets/` leaves the bundle too. A folder that
|
|
106
107
|
* holds something other than a bundle is refused rather than emptied.
|
|
107
108
|
*/
|
|
108
|
-
|
|
109
|
+
/** Every file under `dir`, relative to it, with forward slashes. */
|
|
110
|
+
function filesUnder(dir) {
|
|
111
|
+
if (!existsSync(dir))
|
|
112
|
+
return [];
|
|
113
|
+
return readdirSync(dir, { recursive: true, encoding: 'utf8' })
|
|
114
|
+
.filter((entry) => statSync(path.join(dir, entry)).isFile())
|
|
115
|
+
.map((entry) => entry.split(path.sep).join('/'))
|
|
116
|
+
.sort();
|
|
117
|
+
}
|
|
118
|
+
/** What the render writes itself, so a bundle's own folder may not ship it. */
|
|
119
|
+
function generatedPaths(bundle) {
|
|
120
|
+
return ['hcm.yaml', ...(bundle.context ? [`context/${bundle.context}.md`] : [])];
|
|
121
|
+
}
|
|
122
|
+
function renderBundle(bundle, dir, assets) {
|
|
109
123
|
const target = path.join(dir, bundle.name);
|
|
110
124
|
if (existsSync(target) && readdirSync(target).length && !existsSync(path.join(target, 'hcm.yaml'))) {
|
|
111
125
|
throw new BoardError(`${target} is not empty and holds no hcm bundle`, [
|
|
112
126
|
'Pass --dir with a folder light-plan may write its bundles into.',
|
|
113
127
|
]);
|
|
114
128
|
}
|
|
129
|
+
const own = path.join(bundlesDir(), bundle.name);
|
|
130
|
+
const shipped = filesUnder(own);
|
|
131
|
+
const clash = shipped.filter((file) => generatedPaths(bundle).includes(file));
|
|
132
|
+
if (clash.length) {
|
|
133
|
+
throw new BoardError(`assets/hcm/${bundle.name}/ ships a file the render writes itself`, [
|
|
134
|
+
...clash.map((file) => `${file}: remove it; it is generated`),
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
115
137
|
rmSync(target, { recursive: true, force: true });
|
|
116
138
|
mkdirSync(target, { recursive: true });
|
|
139
|
+
if (shipped.length)
|
|
140
|
+
cpSync(own, target, { recursive: true });
|
|
117
141
|
const placing = {
|
|
118
142
|
harness: { name: `hcm/${bundle.name}`, files: bundle.files },
|
|
119
143
|
scope: 'project',
|
|
@@ -140,27 +164,21 @@ function renderBundle(bundle, dir, assets, onPath) {
|
|
|
140
164
|
const header = '# Rendered by `lpm hcm init` from the light-plan package. Do not edit:\n' +
|
|
141
165
|
"# change the package's assets/ and run the command again.\n";
|
|
142
166
|
writeFileSync(path.join(target, 'hcm.yaml'), header + YAML.stringify(manifest, { lineWidth: 0 }));
|
|
143
|
-
let files = placements.length + 1;
|
|
167
|
+
let files = shipped.length + placements.length + 1;
|
|
144
168
|
if (bundle.context) {
|
|
145
169
|
const shared = placements.map((placement) => placement.asset).filter(inEveryRole);
|
|
146
170
|
mkdirSync(path.join(target, 'context'), { recursive: true });
|
|
147
171
|
writeFileSync(path.join(target, 'context', `${bundle.context}.md`), `${pointerBlock(shared)}\n`);
|
|
148
172
|
files += 1;
|
|
149
173
|
}
|
|
150
|
-
if (bundle.mcp) {
|
|
151
|
-
mkdirSync(path.join(target, 'mcp'), { recursive: true });
|
|
152
|
-
writeFileSync(path.join(target, 'mcp', `${bundle.mcp}.json`), `${JSON.stringify(launchCommand(onPath), null, 2)}\n`);
|
|
153
|
-
files += 1;
|
|
154
|
-
}
|
|
155
174
|
return { name: bundle.name, version: pkg.version, dir: target, files };
|
|
156
175
|
}
|
|
157
176
|
/**
|
|
158
177
|
* Render every bundle into `dir`, which becomes an hcm *collection*: one
|
|
159
178
|
* `hcm registry add <dir>` registers each bundle in it under its own name.
|
|
160
|
-
* `onPath` decides how the MCP entry starts `lpm` (see `launchCommand`).
|
|
161
179
|
*/
|
|
162
|
-
export function renderBundles(dir
|
|
180
|
+
export function renderBundles(dir) {
|
|
163
181
|
const assets = loadAssetFiles();
|
|
164
|
-
return loadBundles().map((bundle) => renderBundle(bundle, dir, assets
|
|
182
|
+
return loadBundles().map((bundle) => renderBundle(bundle, dir, assets));
|
|
165
183
|
}
|
|
166
184
|
//# sourceMappingURL=bundle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../../../src/cli/commands/hcm/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../../../src/cli/commands/hcm/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { parseArgs } from 'node:util';
|
|
|
4
4
|
import { BoardError } from '../../../core/index.js';
|
|
5
5
|
import { bold, cyan, dim, err, green, out, yellow } from '../../ui.js';
|
|
6
6
|
import { assetsDir } from '../agent/assets.js';
|
|
7
|
-
import {
|
|
7
|
+
import { lpmOnPath } from '../mcp/config.js';
|
|
8
8
|
import { defaultBundleDir, loadBundles, renderBundles } from './bundle.js';
|
|
9
9
|
/**
|
|
10
10
|
* `lpm hcm` hands light-plan's agents and skills to hcm
|
|
@@ -37,13 +37,15 @@ Options
|
|
|
37
37
|
it without a version bump
|
|
38
38
|
|
|
39
39
|
The bundles are rendered from the agents and skills \`lpm agent\` installs
|
|
40
|
-
(assets/hcm/*.yml says which go where), at this package's version, with
|
|
41
|
-
MCP
|
|
42
|
-
at the skills. Run init again after
|
|
40
|
+
(assets/hcm/*.yml says which go where), at this package's version, with the
|
|
41
|
+
MCP server file assets/hcm/<bundle>/ ships (it starts \`lpm mcp\`) and a
|
|
42
|
+
CLAUDE.md / AGENTS.md section pointing at the skills. Run init again after
|
|
43
|
+
upgrading light-plan, then \`hcm update\`.
|
|
43
44
|
|
|
44
45
|
Without a global install, run it from the package:
|
|
45
46
|
npx light-plan hcm init from anywhere
|
|
46
47
|
npx --no lpm hcm init in a project that depends on light-plan
|
|
48
|
+
The MCP server is still started as \`lpm\`, so agents need it on their PATH.
|
|
47
49
|
|
|
48
50
|
Then, in any project
|
|
49
51
|
hcm install light-plan -t claude-code
|
|
@@ -78,9 +80,7 @@ function report(rendered) {
|
|
|
78
80
|
function runBuild(dir) {
|
|
79
81
|
if (!dir)
|
|
80
82
|
throw new BoardError('Pass --dir', ['`lpm hcm build` writes the bundles there.']);
|
|
81
|
-
|
|
82
|
-
// rather than wherever this one happens to keep it.
|
|
83
|
-
const rendered = renderBundles(path.resolve(dir), { onPath: true });
|
|
83
|
+
const rendered = renderBundles(path.resolve(dir));
|
|
84
84
|
out(bold('Rendered'));
|
|
85
85
|
report(rendered);
|
|
86
86
|
out();
|
|
@@ -94,8 +94,7 @@ function runInit(dir, dev) {
|
|
|
94
94
|
'edits to your checkout will not reach it. Run `npm link` in the checkout.');
|
|
95
95
|
}
|
|
96
96
|
const target = path.resolve(dir ?? defaultBundleDir());
|
|
97
|
-
const
|
|
98
|
-
const rendered = renderBundles(target, { onPath });
|
|
97
|
+
const rendered = renderBundles(target);
|
|
99
98
|
out(bold('Rendered'));
|
|
100
99
|
report(rendered);
|
|
101
100
|
out();
|
|
@@ -117,10 +116,13 @@ function runInit(dir, dev) {
|
|
|
117
116
|
out(` ${cyan(`hcm install ${bundle.name} -t <harness>`)}`);
|
|
118
117
|
out(dim('Projects that already have them: hcm update'));
|
|
119
118
|
}
|
|
120
|
-
|
|
119
|
+
// The bundle's MCP file starts the server as `lpm mcp`, by name, so it works
|
|
120
|
+
// on any machine that has light-plan installed — and on this one only if
|
|
121
|
+
// this one does. Running init through npx is exactly how that goes unnoticed.
|
|
122
|
+
if (!lpmOnPath()) {
|
|
121
123
|
out();
|
|
122
|
-
out(
|
|
123
|
-
out(dim('
|
|
124
|
+
out(`${yellow('warn')} lpm is not on your PATH, so the light-plan MCP server will not start.`);
|
|
125
|
+
out(dim(' Install it where your agents run: npm install -g light-plan'));
|
|
124
126
|
}
|
|
125
127
|
return 0;
|
|
126
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/hcm/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/hcm/index.ts"],"names":[],"mappings":"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"}
|