goalbuddy 0.3.6 → 0.3.8
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/CHANGELOG.md +61 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +27 -10
- package/{RELEASE-0.3.5.md → docs/releases/0.3.5.md} +4 -4
- package/docs/releases/0.3.7.md +129 -0
- package/docs/releases/0.3.8.md +40 -0
- package/docs/releases/README.md +83 -0
- package/goalbuddy/SKILL.md +21 -10
- package/goalbuddy/scripts/check-goal-state.mjs +53 -0
- package/goalbuddy/scripts/render-task-prompt.mjs +39 -4
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/README.md +7 -9
- package/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/state.yaml +5 -5
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/examples/subgoal-parent/state.yaml +3 -3
- package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/state.yaml +3 -3
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/scripts/lib/goal-board.mjs +17 -13
- package/goalbuddy/{extend → surfaces}/local-goal-board/scripts/local-goal-board.mjs +27 -6
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/test/local-goal-board.test.mjs +63 -12
- package/goalbuddy/templates/goal.md +9 -0
- package/goalbuddy/templates/state.yaml +7 -6
- package/internal/assets/goalbuddy-v0.3.7-release.png +0 -0
- package/internal/cli/goal-maker.mjs +177 -717
- package/package.json +7 -8
- package/plugins/goalbuddy/.claude-plugin/plugin.json +3 -4
- package/plugins/goalbuddy/.codex-plugin/plugin.json +5 -6
- package/plugins/goalbuddy/README.md +4 -3
- package/plugins/goalbuddy/skills/goalbuddy/SKILL.md +21 -10
- package/plugins/goalbuddy/skills/goalbuddy/scripts/check-goal-state.mjs +53 -0
- package/plugins/goalbuddy/skills/goalbuddy/scripts/render-task-prompt.mjs +39 -4
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/README.md +7 -9
- package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/state.yaml +5 -5
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/examples/subgoal-parent/state.yaml +3 -3
- package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/state.yaml +3 -3
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/scripts/lib/goal-board.mjs +2 -2
- package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/scripts/local-goal-board.mjs +27 -6
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/test/local-goal-board.test.mjs +35 -8
- package/plugins/goalbuddy/skills/goalbuddy/templates/goal.md +9 -0
- package/plugins/goalbuddy/skills/goalbuddy/templates/state.yaml +7 -6
- package/examples/extend-catalog-workflow/goal.md +0 -53
- package/examples/extend-catalog-workflow/notes/T001-extension-model-map.md +0 -47
- package/examples/extend-catalog-workflow/notes/T002-architecture-decision.md +0 -48
- package/examples/extend-catalog-workflow/notes/T003-implementation-summary.md +0 -43
- package/examples/extend-catalog-workflow/notes/T004-root-extend-folder.md +0 -24
- package/examples/extend-catalog-workflow/notes/T005-layout-cleanup.md +0 -46
- package/examples/extend-catalog-workflow/notes/T006-catalog-location.md +0 -50
- package/examples/extend-catalog-workflow/notes/T999-completion-audit.md +0 -36
- package/examples/extend-catalog-workflow/state.yaml +0 -327
- package/examples/github-pr-workflow-extension/pr-handoff.md +0 -46
- package/examples/improve-goal-maker/goal.md +0 -51
- package/examples/improve-goal-maker/notes/T001-repo-map.md +0 -59
- package/examples/improve-goal-maker/notes/T002-risk-map.md +0 -37
- package/examples/improve-goal-maker/state.yaml +0 -224
- package/goalbuddy/extend/github-projects/README.md +0 -105
- package/goalbuddy/extend/github-projects/examples/goal-board-sync/state.yaml +0 -63
- package/goalbuddy/extend/github-projects/extension.yaml +0 -43
- package/goalbuddy/extend/github-projects/scripts/lib/github-projects.mjs +0 -728
- package/goalbuddy/extend/github-projects/scripts/lib/goal-state.mjs +0 -362
- package/goalbuddy/extend/github-projects/scripts/sync-github-project.mjs +0 -193
- package/goalbuddy/extend/github-projects/test/github-projects.test.mjs +0 -267
- package/goalbuddy/extend/local-goal-board/extension.yaml +0 -39
- package/internal/assets/extend-release.png +0 -0
- package/internal/assets/extend-release.svg +0 -83
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/README.md +0 -105
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/examples/goal-board-sync/state.yaml +0 -63
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/extension.yaml +0 -43
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/scripts/lib/github-projects.mjs +0 -728
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/scripts/lib/goal-state.mjs +0 -362
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/scripts/sync-github-project.mjs +0 -193
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/test/github-projects.test.mjs +0 -267
- package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/extension.yaml +0 -39
- /package/goalbuddy/{extend → surfaces}/local-goal-board/assets/goalbuddy-mark.png +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/notes/T001-scout.md +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/goal.md +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/notes/.gitkeep +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/goal.md +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/notes/.gitkeep +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/assets/goalbuddy-mark.png +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/notes/T001-scout.md +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/goal.md +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/notes/.gitkeep +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/goal.md +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/notes/.gitkeep +0 -0
|
@@ -8,9 +8,9 @@ import { createBoardPayload, writeBoardApp } from "../scripts/lib/goal-board.mjs
|
|
|
8
8
|
import { parseArgs, startBoardServer } from "../scripts/local-goal-board.mjs";
|
|
9
9
|
|
|
10
10
|
test("normalizes a dense goal into local board columns", () => {
|
|
11
|
-
const payload = createBoardPayload(resolve("
|
|
11
|
+
const payload = createBoardPayload(resolve("goalbuddy/surfaces/local-goal-board/examples/sample-goal"));
|
|
12
12
|
|
|
13
|
-
assert.equal(payload.goal.title, "Local
|
|
13
|
+
assert.equal(payload.goal.title, "Local Goal Board Surface");
|
|
14
14
|
assert.equal(payload.goal.activeTask, "");
|
|
15
15
|
assert.equal(payload.counts.total, 14);
|
|
16
16
|
assert.equal(payload.counts.todo, 0);
|
|
@@ -24,7 +24,7 @@ test("normalizes a dense goal into local board columns", () => {
|
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
test("loads depth-1 subgoal boards into parent task payloads", () => {
|
|
27
|
-
const payload = createBoardPayload(resolve("goalbuddy/
|
|
27
|
+
const payload = createBoardPayload(resolve("goalbuddy/surfaces/local-goal-board/examples/subgoal-parent"));
|
|
28
28
|
const parentTask = payload.tasks.find((task) => task.id === "T004");
|
|
29
29
|
|
|
30
30
|
assert.equal(parentTask.subgoal.status, "active");
|
|
@@ -229,7 +229,7 @@ tasks:
|
|
|
229
229
|
});
|
|
230
230
|
|
|
231
231
|
test("writes a minimal GoalBuddy web app into the goal directory", () => {
|
|
232
|
-
const appDir = writeBoardApp(resolve("
|
|
232
|
+
const appDir = writeBoardApp(resolve("goalbuddy/surfaces/local-goal-board/examples/sample-goal"));
|
|
233
233
|
const html = readFileSync(join(appDir, "index.html"), "utf8");
|
|
234
234
|
const css = readFileSync(join(appDir, "styles.css"), "utf8");
|
|
235
235
|
const js = readFileSync(join(appDir, "app.js"), "utf8");
|
|
@@ -393,20 +393,20 @@ test("advertises goalbuddy.localhost while binding to loopback", async () => {
|
|
|
393
393
|
test("runs when installed under a symlinked temp path", () => {
|
|
394
394
|
const root = mkdtempSync(join(tmpdir(), "goalbuddy-local-board-direct-"));
|
|
395
395
|
try {
|
|
396
|
-
cpSync("
|
|
397
|
-
cpSync("
|
|
396
|
+
cpSync("goalbuddy/surfaces/local-goal-board/scripts", join(root, "scripts"), { recursive: true });
|
|
397
|
+
cpSync("goalbuddy/surfaces/local-goal-board/assets", join(root, "assets"), { recursive: true });
|
|
398
398
|
|
|
399
399
|
const result = spawnSync(process.execPath, [
|
|
400
400
|
join(root, "scripts", "local-goal-board.mjs"),
|
|
401
401
|
"--goal",
|
|
402
|
-
resolve("
|
|
402
|
+
resolve("goalbuddy/surfaces/local-goal-board/examples/sample-goal"),
|
|
403
403
|
"--once",
|
|
404
404
|
"--json",
|
|
405
405
|
], { encoding: "utf8" });
|
|
406
406
|
|
|
407
407
|
assert.equal(result.status, 0, result.stderr || result.stdout);
|
|
408
408
|
const report = JSON.parse(result.stdout);
|
|
409
|
-
assert.equal(report.board.goal.title, "Local
|
|
409
|
+
assert.equal(report.board.goal.title, "Local Goal Board Surface");
|
|
410
410
|
} finally {
|
|
411
411
|
rmSync(root, { recursive: true, force: true });
|
|
412
412
|
}
|
|
@@ -558,6 +558,33 @@ test("serves multiple local boards from one shared hub URL", async () => {
|
|
|
558
558
|
}
|
|
559
559
|
});
|
|
560
560
|
|
|
561
|
+
test("unregistered board paths explain hub reuse instead of stale-port cleanup", async () => {
|
|
562
|
+
const root = mkdtempSync(join(tmpdir(), "goalbuddy-local-board-unregistered-"));
|
|
563
|
+
const goalDir = join(root, "first-goal");
|
|
564
|
+
try {
|
|
565
|
+
mkdirSync(join(goalDir, "notes"), { recursive: true });
|
|
566
|
+
writeFileSync(join(goalDir, "state.yaml"), stateYaml("active", { title: "First Goal", slug: "first-goal" }));
|
|
567
|
+
|
|
568
|
+
const server = await startBoardServer({ goalDir, host: "127.0.0.1", port: 0 });
|
|
569
|
+
try {
|
|
570
|
+
const baseUrl = new URL(server.url).origin;
|
|
571
|
+
const missingResponse = await fetch(`${baseUrl}/rinova-client-revision-redesign/`);
|
|
572
|
+
assert.equal(missingResponse.status, 404);
|
|
573
|
+
const message = await missingResponse.text();
|
|
574
|
+
assert.match(message, /board path is not registered/i);
|
|
575
|
+
assert.match(message, /multi-board hub/i);
|
|
576
|
+
assert.match(message, /Do not stop it just because a \/<slug>\/ board URL returned 404/);
|
|
577
|
+
assert.match(message, /npx goalbuddy board <goal-dir>/);
|
|
578
|
+
assert.match(message, /First Goal/);
|
|
579
|
+
assert.match(message, /\/api\/boards/);
|
|
580
|
+
} finally {
|
|
581
|
+
await server.close();
|
|
582
|
+
}
|
|
583
|
+
} finally {
|
|
584
|
+
rmSync(root, { recursive: true, force: true });
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
|
|
561
588
|
async function readUntil(reader, pattern) {
|
|
562
589
|
const decoder = new TextDecoder();
|
|
563
590
|
let text = "";
|
|
@@ -15,10 +15,19 @@
|
|
|
15
15
|
- Authority: `requested | approved | inferred | needs_approval | blocked`
|
|
16
16
|
- Proof type: `test | demo | artifact | metric | review | source_backed_answer | decision`
|
|
17
17
|
- Completion proof: <observable signal that closes the full original outcome>
|
|
18
|
+
- Goal oracle: <live check, walkthrough, artifact, metric, source-backed answer, or decision that keeps pressure on the goal>
|
|
18
19
|
- Likely misfire: <how GoalBuddy could succeed at the wrong thing>
|
|
19
20
|
- Blind spots considered: <risks, unstated choices, or success dimensions surfaced during diagnostic intake>
|
|
20
21
|
- Existing plan facts: <user-provided steps/files/constraints/sequencing to preserve and validate, or none>
|
|
21
22
|
|
|
23
|
+
## Goal Oracle
|
|
24
|
+
|
|
25
|
+
The oracle for this goal is:
|
|
26
|
+
|
|
27
|
+
`<specific observable signal>`
|
|
28
|
+
|
|
29
|
+
The PM must keep comparing task receipts to this oracle. Planning, discovery, a passing tiny slice, or a clean-looking board is not enough. The goal finishes only when a final Judge/PM audit maps receipts and verification back to this oracle and records `full_outcome_complete: true`.
|
|
30
|
+
|
|
22
31
|
## Goal Kind
|
|
23
32
|
|
|
24
33
|
`specific | open_ended | existing_plan | recovery | audit`
|
|
@@ -9,6 +9,10 @@ goal:
|
|
|
9
9
|
kind: open_ended # specific | open_ended | existing_plan | recovery | audit
|
|
10
10
|
tranche: "<continuous execution: complete successive safe verified slices until the full original outcome is complete>"
|
|
11
11
|
status: active # active | blocked | done
|
|
12
|
+
oracle:
|
|
13
|
+
signal: "<live check, walkthrough, artifact, metric, source-backed answer, or decision that proves the owner outcome>"
|
|
14
|
+
cadence: "after each Worker package and at final audit"
|
|
15
|
+
final_proof: "<receipt-backed evidence required before full_outcome_complete: true>"
|
|
12
16
|
intake:
|
|
13
17
|
original_request: "<shortest faithful user request>"
|
|
14
18
|
interpreted_outcome: "<one sentence>"
|
|
@@ -33,6 +37,8 @@ rules:
|
|
|
33
37
|
missing_input_or_credentials_do_not_stop_goal: true
|
|
34
38
|
preserve_and_validate_existing_plan: true
|
|
35
39
|
intake_misfire_must_be_audited: true
|
|
40
|
+
goal_pressure_requires_oracle: true
|
|
41
|
+
no_completion_on_weak_proof: true
|
|
36
42
|
slice_policy:
|
|
37
43
|
max_consecutive_tiny_tasks: 2
|
|
38
44
|
prefer_vertical_slices: true
|
|
@@ -47,17 +53,12 @@ agents:
|
|
|
47
53
|
judge: unknown
|
|
48
54
|
|
|
49
55
|
visual_board:
|
|
50
|
-
# none | local |
|
|
56
|
+
# none | local | unknown
|
|
51
57
|
selected: unknown
|
|
52
58
|
local:
|
|
53
59
|
status: not_requested # not_requested | starting | live | generated | blocked
|
|
54
60
|
url: null
|
|
55
61
|
command: "npx goalbuddy board docs/goals/<goal-slug>"
|
|
56
|
-
github_projects:
|
|
57
|
-
status: not_requested # not_requested | needs_approval | dry_run_ready | synced | blocked
|
|
58
|
-
url: null
|
|
59
|
-
command: "npx goalbuddy extend github-projects"
|
|
60
|
-
missing: []
|
|
61
62
|
|
|
62
63
|
active_task: T001
|
|
63
64
|
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# Extend Catalog Workflow
|
|
2
|
-
|
|
3
|
-
## Objective
|
|
4
|
-
|
|
5
|
-
Design and implement Goal Maker's extension catalog workflow so optional features can move through GitHub-hosted extension metadata without requiring frequent npm package releases.
|
|
6
|
-
|
|
7
|
-
## Goal Kind
|
|
8
|
-
|
|
9
|
-
`open_ended`
|
|
10
|
-
|
|
11
|
-
## Current Tranche
|
|
12
|
-
|
|
13
|
-
Decide the product language and architecture for optional extensions, implement the first catalog-backed `extend` CLI workflow, add a visible root `extend/` surface, clean the skill/package layout, and leave a reviewable completion audit.
|
|
14
|
-
|
|
15
|
-
## Non-Negotiable Constraints
|
|
16
|
-
|
|
17
|
-
- `state.yaml` remains the only board truth.
|
|
18
|
-
- Extensions are optional support surfaces, not the control plane.
|
|
19
|
-
- Use `extend` as the repo surface and `extensions` as the item name.
|
|
20
|
-
- Avoid implying bidirectional sync with external services.
|
|
21
|
-
- Keep npm as the stable core; catalog entries should be updateable from GitHub.
|
|
22
|
-
- Keep package-only infrastructure out of the installable skill payload.
|
|
23
|
-
- Do not require provider credentials for discovery or dry-run installation.
|
|
24
|
-
|
|
25
|
-
## Stop Rule
|
|
26
|
-
|
|
27
|
-
Stop when the extension/catalog UX is implemented, the repo layout reflects the skill/package boundary, verification passes, and the final audit maps the shipped changes to receipts and commits.
|
|
28
|
-
|
|
29
|
-
## Canonical Board
|
|
30
|
-
|
|
31
|
-
Machine truth lives at:
|
|
32
|
-
|
|
33
|
-
`examples/extend-catalog-workflow/state.yaml`
|
|
34
|
-
|
|
35
|
-
If this charter and `state.yaml` disagree, `state.yaml` wins for task status, active task, receipts, verification freshness, and completion truth.
|
|
36
|
-
|
|
37
|
-
## Run Command
|
|
38
|
-
|
|
39
|
-
```text
|
|
40
|
-
/goal Follow examples/extend-catalog-workflow/goal.md
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## PM Loop
|
|
44
|
-
|
|
45
|
-
On every `/goal` continuation:
|
|
46
|
-
|
|
47
|
-
1. Read this charter.
|
|
48
|
-
2. Read `state.yaml`.
|
|
49
|
-
3. Work only on the active board task.
|
|
50
|
-
4. Assign Scout, Judge, Worker, or PM according to the task.
|
|
51
|
-
5. Write a compact task receipt.
|
|
52
|
-
6. Update the board.
|
|
53
|
-
7. Select the next active task or finish with a Judge/PM audit receipt.
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# T001: Extension Model Map
|
|
2
|
-
|
|
3
|
-
Task: `T001`
|
|
4
|
-
Kind: `scout`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Summary
|
|
8
|
-
|
|
9
|
-
The scalable frame is `extend`: optional extension folders live at the repo root under `extend/`, and catalog metadata lives at `extend/catalog.json`. The npm CLI should read the GitHub-hosted catalog so extension discovery can change without publishing a new npm version.
|
|
10
|
-
|
|
11
|
-
Board publishing is the first likely extension family, but the extension surface should also support unrelated add-ons such as role guidance, reports, intake tools, and external channel publishing.
|
|
12
|
-
|
|
13
|
-
## Recommended Vocabulary
|
|
14
|
-
|
|
15
|
-
- Repo surface: `extend/`
|
|
16
|
-
- Items inside `extend/`: extensions
|
|
17
|
-
- Catalog file: `extend/catalog.json`
|
|
18
|
-
- Public action for external surfaces: publish
|
|
19
|
-
- Avoid umbrella words: export, sync, capabilities
|
|
20
|
-
|
|
21
|
-
## Architecture Notes
|
|
22
|
-
|
|
23
|
-
Core should own:
|
|
24
|
-
|
|
25
|
-
- skill installation;
|
|
26
|
-
- agent installation;
|
|
27
|
-
- board checker scripts;
|
|
28
|
-
- extension catalog discovery;
|
|
29
|
-
- checksum-verified extension installation;
|
|
30
|
-
- extension doctor checks.
|
|
31
|
-
|
|
32
|
-
Extensions should own:
|
|
33
|
-
|
|
34
|
-
- provider-specific behavior;
|
|
35
|
-
- provider docs;
|
|
36
|
-
- auth requirements;
|
|
37
|
-
- fixtures and tests;
|
|
38
|
-
- optional role or reporting guidance.
|
|
39
|
-
|
|
40
|
-
No extension may define a second meaning of `state.yaml`.
|
|
41
|
-
|
|
42
|
-
## Candidate Tasks
|
|
43
|
-
|
|
44
|
-
- Add a catalog-backed `goal-maker extend` command.
|
|
45
|
-
- Add root `extend/` documentation.
|
|
46
|
-
- Keep package-only CLI/tests out of the installable skill folder.
|
|
47
|
-
- Add repo agent guidance so future improvements consider docs, skill instructions, CLI, tests, examples, and extensions together.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# T002: Architecture Decision
|
|
2
|
-
|
|
3
|
-
Task: `T002`
|
|
4
|
-
Kind: `judge`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Decision
|
|
8
|
-
|
|
9
|
-
Use `extend` as the high-level optional surface and call each item an extension. Keep the default catalog GitHub-hosted at:
|
|
10
|
-
|
|
11
|
-
```text
|
|
12
|
-
https://raw.githubusercontent.com/tolibear/goal-maker/main/extend/catalog.json
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
The npm package should contain the stable core and CLI. The catalog can change on GitHub without requiring users to update npm for every optional integration.
|
|
16
|
-
|
|
17
|
-
## CLI Shape
|
|
18
|
-
|
|
19
|
-
Use one top-level extension command instead of separate browse/list/show verbs:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
goal-maker extend
|
|
23
|
-
goal-maker extend <extension-id>
|
|
24
|
-
goal-maker extend install <extension-id>
|
|
25
|
-
goal-maker extend doctor [extension-id]
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
This keeps the UX simple:
|
|
29
|
-
|
|
30
|
-
- no argument means "show the catalog";
|
|
31
|
-
- an id means "show this extension";
|
|
32
|
-
- `install` copies checksum-verified files into the local Goal Maker install;
|
|
33
|
-
- `doctor` verifies installed extension files and required environment.
|
|
34
|
-
|
|
35
|
-
## Repo Shape
|
|
36
|
-
|
|
37
|
-
Keep the root relatively clean:
|
|
38
|
-
|
|
39
|
-
```text
|
|
40
|
-
goal-maker/ # installable skill payload
|
|
41
|
-
internal/ # package/dev infrastructure
|
|
42
|
-
extend/ # optional extension folders
|
|
43
|
-
examples/ # completed sample runs
|
|
44
|
-
extend/catalog.json # GitHub-hosted extension catalog
|
|
45
|
-
AGENTS.md # repo-specific agent guidance
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
`goal-maker/scripts/` stays inside the skill because installed skill docs call those scripts directly.
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# T003: Catalog CLI Implementation
|
|
2
|
-
|
|
3
|
-
Task: `T003`
|
|
4
|
-
Kind: `worker`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Summary
|
|
8
|
-
|
|
9
|
-
Implemented the first catalog-backed `goal-maker extend` workflow.
|
|
10
|
-
|
|
11
|
-
Commit:
|
|
12
|
-
|
|
13
|
-
- `105850e Add extension catalog workflow`
|
|
14
|
-
|
|
15
|
-
## Shipped Behavior
|
|
16
|
-
|
|
17
|
-
- `goal-maker extend` reads the GitHub-hosted catalog and reports available/install/configuration state.
|
|
18
|
-
- `goal-maker extend <id>` shows extension details.
|
|
19
|
-
- `goal-maker extend install <id>` installs checksum-verified extension files.
|
|
20
|
-
- `goal-maker extend doctor [id]` validates installed extension files and required environment.
|
|
21
|
-
- Root `catalog.json` provides an initially empty GitHub-hosted catalog.
|
|
22
|
-
- README documents the extension discovery/install flow.
|
|
23
|
-
|
|
24
|
-
## Files Touched
|
|
25
|
-
|
|
26
|
-
At this point in the run, the CLI still lived under `goal-maker/bin/`. A later cleanup task moved it to `internal/cli/`.
|
|
27
|
-
|
|
28
|
-
- `README.md`
|
|
29
|
-
- `catalog.json`
|
|
30
|
-
- `goal-maker/bin/goal-maker.mjs`
|
|
31
|
-
- `goal-maker/test/goal-maker-cli.test.mjs`
|
|
32
|
-
- `package.json`
|
|
33
|
-
|
|
34
|
-
## Verification
|
|
35
|
-
|
|
36
|
-
Commands passed:
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npm run check
|
|
40
|
-
git diff --check
|
|
41
|
-
node goal-maker/bin/goal-maker.mjs extend --catalog-url catalog.json --json
|
|
42
|
-
npm publish --dry-run --json
|
|
43
|
-
```
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# T004: Root Extend Folder
|
|
2
|
-
|
|
3
|
-
Task: `T004`
|
|
4
|
-
Kind: `pm`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Summary
|
|
8
|
-
|
|
9
|
-
Added a visible root `extend/` folder with documentation so GitHub shows the extension surface even before real extensions exist.
|
|
10
|
-
|
|
11
|
-
Commit:
|
|
12
|
-
|
|
13
|
-
- `17c65c9 Document extension folder`
|
|
14
|
-
|
|
15
|
-
## Files Touched
|
|
16
|
-
|
|
17
|
-
- `README.md`
|
|
18
|
-
- `extend/README.md`
|
|
19
|
-
|
|
20
|
-
## Receipt Notes
|
|
21
|
-
|
|
22
|
-
The folder intentionally contains only documentation for now. Git cannot track an empty directory, and the product decision was to avoid bundling sample extensions until a real extension is ready.
|
|
23
|
-
|
|
24
|
-
The README now says extensions live under `extend/` and move through the GitHub-hosted `extend/catalog.json`.
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# T005: Skill Package Layout Cleanup
|
|
2
|
-
|
|
3
|
-
Task: `T005`
|
|
4
|
-
Kind: `worker`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Summary
|
|
8
|
-
|
|
9
|
-
Separated package-only infrastructure from the installable skill payload while keeping the repo root clean.
|
|
10
|
-
|
|
11
|
-
Commit:
|
|
12
|
-
|
|
13
|
-
- `6faa5de Clean skill package layout`
|
|
14
|
-
|
|
15
|
-
## Files Touched
|
|
16
|
-
|
|
17
|
-
- `AGENTS.md`
|
|
18
|
-
- `CONTRIBUTING.md`
|
|
19
|
-
- `README.md`
|
|
20
|
-
- `extend/README.md`
|
|
21
|
-
- `goal-maker/SKILL.md`
|
|
22
|
-
- `goal-maker/bin/goal-maker.mjs` -> `internal/cli/goal-maker.mjs`
|
|
23
|
-
- `goal-maker/test/*.test.mjs` -> `internal/test/*.test.mjs`
|
|
24
|
-
- `package.json`
|
|
25
|
-
|
|
26
|
-
## Result
|
|
27
|
-
|
|
28
|
-
The installable skill payload is now focused:
|
|
29
|
-
|
|
30
|
-
```text
|
|
31
|
-
goal-maker/
|
|
32
|
-
SKILL.md
|
|
33
|
-
agents/
|
|
34
|
-
scripts/
|
|
35
|
-
templates/
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Package/dev infrastructure is grouped under:
|
|
39
|
-
|
|
40
|
-
```text
|
|
41
|
-
internal/
|
|
42
|
-
cli/
|
|
43
|
-
test/
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Root `AGENTS.md` now tells future agents to consider README, SKILL.md, templates, checker behavior, CLI UX, examples, package contents, and extension catalog design when improving this repo.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# T006: Catalog Location
|
|
2
|
-
|
|
3
|
-
Task: `T006`
|
|
4
|
-
Kind: `worker`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Summary
|
|
8
|
-
|
|
9
|
-
Moved the hosted catalog from the repo root to `extend/catalog.json`.
|
|
10
|
-
|
|
11
|
-
Commit:
|
|
12
|
-
|
|
13
|
-
- This example/catalog-location commit.
|
|
14
|
-
|
|
15
|
-
## Why
|
|
16
|
-
|
|
17
|
-
The repo root should stay relatively clean, and `catalog.json` is part of the extension surface. Keeping it under `extend/` makes the shape easier to understand:
|
|
18
|
-
|
|
19
|
-
```text
|
|
20
|
-
extend/
|
|
21
|
-
README.md
|
|
22
|
-
catalog.json
|
|
23
|
-
<extension-id>/
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
The npm CLI still reads the catalog from GitHub raw, now at:
|
|
27
|
-
|
|
28
|
-
```text
|
|
29
|
-
https://raw.githubusercontent.com/tolibear/goal-maker/main/extend/catalog.json
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Files Touched
|
|
33
|
-
|
|
34
|
-
- `catalog.json` -> `extend/catalog.json`
|
|
35
|
-
- `internal/cli/goal-maker.mjs`
|
|
36
|
-
- `README.md`
|
|
37
|
-
- `AGENTS.md`
|
|
38
|
-
- `extend/README.md`
|
|
39
|
-
- `examples/extend-catalog-workflow/`
|
|
40
|
-
|
|
41
|
-
## Verification
|
|
42
|
-
|
|
43
|
-
Commands to verify this task:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
npm run check
|
|
47
|
-
git diff --check
|
|
48
|
-
node internal/cli/goal-maker.mjs extend --catalog-url extend/catalog.json --json
|
|
49
|
-
npm publish --dry-run --json
|
|
50
|
-
```
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# T999: Completion Audit
|
|
2
|
-
|
|
3
|
-
Task: `T999`
|
|
4
|
-
Kind: `judge`
|
|
5
|
-
Status: `done`
|
|
6
|
-
|
|
7
|
-
## Decision
|
|
8
|
-
|
|
9
|
-
Complete.
|
|
10
|
-
|
|
11
|
-
## Audit
|
|
12
|
-
|
|
13
|
-
| Requirement | Evidence | Status |
|
|
14
|
-
|---|---|---|
|
|
15
|
-
| Use `extend` as the high-level surface | `extend/README.md`, `README.md`, `AGENTS.md` | Complete |
|
|
16
|
-
| Items inside `extend` are extensions | `extend/README.md`, `README.md`, catalog terminology | Complete |
|
|
17
|
-
| Avoid frequent npm releases for catalog updates | `extend/catalog.json` and default raw GitHub catalog URL | Complete |
|
|
18
|
-
| Keep extension discovery credential-free | `goal-maker extend` and `goal-maker extend <id>` inspect catalog metadata only | Complete |
|
|
19
|
-
| Verify installed extensions safely | checksum validation and `.installed.json` manifest in CLI implementation | Complete |
|
|
20
|
-
| Keep root reasonably clean | package/dev files grouped under `internal/` | Complete |
|
|
21
|
-
| Keep skill payload clean | `goal-maker/` contains skill, agents, scripts, and templates only | Complete |
|
|
22
|
-
| Teach future agents about improvement surfaces | root `AGENTS.md` and SKILL.md note | Complete |
|
|
23
|
-
|
|
24
|
-
## Verification
|
|
25
|
-
|
|
26
|
-
Commands passed during the implementation tranche:
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npm run check
|
|
30
|
-
git diff --check
|
|
31
|
-
node internal/cli/goal-maker.mjs extend --catalog-url extend/catalog.json --json
|
|
32
|
-
npm publish --dry-run --json
|
|
33
|
-
node goal-maker/scripts/check-goal-state.mjs examples/extend-catalog-workflow/state.yaml
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
The final state is reviewable and maps to actual commits rather than simulated history.
|