halfcycle 0.3.7

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.
Files changed (78) hide show
  1. package/.claude-plugin/plugin.json +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +187 -0
  4. package/bin/bin.bundle.mjs +16771 -0
  5. package/commands/agent-teams-orchestration.md +11 -0
  6. package/commands/consistency-check.md +11 -0
  7. package/commands/context-update.md +11 -0
  8. package/commands/halfcycle-design.md +11 -0
  9. package/commands/halfcycle-setup.md +11 -0
  10. package/commands/stack-assembly-worker.md +11 -0
  11. package/commands/task-execution.md +11 -0
  12. package/commands/task-graph.md +11 -0
  13. package/commands/write-spec.md +11 -0
  14. package/dist/account-credential.d.ts +94 -0
  15. package/dist/account-credential.d.ts.map +1 -0
  16. package/dist/bin.d.ts +34 -0
  17. package/dist/bin.d.ts.map +1 -0
  18. package/dist/bin.js +3156 -0
  19. package/dist/bin.js.map +6 -0
  20. package/dist/build-record/assemble.d.ts +37 -0
  21. package/dist/build-record/assemble.d.ts.map +1 -0
  22. package/dist/build-record/index.d.ts +39 -0
  23. package/dist/build-record/index.d.ts.map +1 -0
  24. package/dist/build-record/sources.d.ts +80 -0
  25. package/dist/build-record/sources.d.ts.map +1 -0
  26. package/dist/build-record/template.d.ts +18 -0
  27. package/dist/build-record/template.d.ts.map +1 -0
  28. package/dist/build-record/types.d.ts +163 -0
  29. package/dist/build-record/types.d.ts.map +1 -0
  30. package/dist/build-record/write.d.ts +26 -0
  31. package/dist/build-record/write.d.ts.map +1 -0
  32. package/dist/cli-contract.d.ts +120 -0
  33. package/dist/cli-contract.d.ts.map +1 -0
  34. package/dist/close-phase.d.ts +114 -0
  35. package/dist/close-phase.d.ts.map +1 -0
  36. package/dist/create-engagement.d.ts +248 -0
  37. package/dist/create-engagement.d.ts.map +1 -0
  38. package/dist/device-signin.d.ts +255 -0
  39. package/dist/device-signin.d.ts.map +1 -0
  40. package/dist/engagement-credential.d.ts +267 -0
  41. package/dist/engagement-credential.d.ts.map +1 -0
  42. package/dist/identity.d.ts +76 -0
  43. package/dist/identity.d.ts.map +1 -0
  44. package/dist/index.d.ts +25 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +2083 -0
  47. package/dist/index.js.map +6 -0
  48. package/dist/install.d.ts +355 -0
  49. package/dist/install.d.ts.map +1 -0
  50. package/dist/loopback-signin.d.ts +173 -0
  51. package/dist/loopback-signin.d.ts.map +1 -0
  52. package/dist/mcp-endpoint.d.ts +35 -0
  53. package/dist/mcp-endpoint.d.ts.map +1 -0
  54. package/dist/merge-settings.d.ts +57 -0
  55. package/dist/merge-settings.d.ts.map +1 -0
  56. package/dist/mint-board-code.d.ts +41 -0
  57. package/dist/mint-board-code.d.ts.map +1 -0
  58. package/dist/open-phase.d.ts +107 -0
  59. package/dist/open-phase.d.ts.map +1 -0
  60. package/dist/probe-mcp.d.ts +47 -0
  61. package/dist/probe-mcp.d.ts.map +1 -0
  62. package/dist/resolve-credential.d.ts +126 -0
  63. package/dist/resolve-credential.d.ts.map +1 -0
  64. package/dist/scan.d.ts +131 -0
  65. package/dist/scan.d.ts.map +1 -0
  66. package/dist/setup/discovery.d.ts +73 -0
  67. package/dist/setup/discovery.d.ts.map +1 -0
  68. package/dist/setup/engagement.d.ts +99 -0
  69. package/dist/setup/engagement.d.ts.map +1 -0
  70. package/dist/setup/index.d.ts +17 -0
  71. package/dist/setup/index.d.ts.map +1 -0
  72. package/dist/setup/manifest.d.ts +155 -0
  73. package/dist/setup/manifest.d.ts.map +1 -0
  74. package/dist/setup/rows.d.ts +57 -0
  75. package/dist/setup/rows.d.ts.map +1 -0
  76. package/package.json +55 -0
  77. package/scaffolding/test/fixtures/captured/.gitkeep +0 -0
  78. package/scaffolding/test/fixtures/captured/manifest.json +4 -0
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Take a plan that already exists and drive ALL of it through to done across several workers at once, rather than handing out the pieces one at a time
3
+ ---
4
+
5
+ Resolve `/agent-teams-orchestration` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/agent-teams-orchestration`. **Nothing has run.**
10
+ > Retry when you're back online — or coordinate the workers manually from
11
+ > the phase's approved task graph.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Check a drafted feature spec against the invariants and its adjacent specs, from a session that did not write it
3
+ ---
4
+
5
+ Resolve `/consistency-check` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/consistency-check`. **Nothing has run.**
10
+ > Retry when you're back online — or review the spec manually against
11
+ > `docs/invariants.md` and its adjacent specs.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Route recent changes into the repo's context surfaces
3
+ ---
4
+
5
+ Resolve `/context-update` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/context-update`. **Nothing has run.**
10
+ > Retry when you're back online — or update the context surfaces manually
11
+ > from this session's changes.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Work out what the product is — the design journey to a PRD and phases
3
+ ---
4
+
5
+ Resolve `/halfcycle-design` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/halfcycle-design`. **Nothing has run.**
10
+ > Retry when you're back online — or work the product definition out
11
+ > manually, starting from the problem and who has it.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Set up a repository for a Halfcycle engagement
3
+ ---
4
+
5
+ Resolve `/halfcycle-setup` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/halfcycle-setup`. **Nothing has run.**
10
+ > Retry when you're back online — or set the repository up manually from
11
+ > the engagement's onboarding notes.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Verify a phase's assembled stack comes up end to end
3
+ ---
4
+
5
+ Resolve `/stack-assembly-worker` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/stack-assembly-worker`. **Nothing has run.**
10
+ > Retry when you're back online — or verify the assembled stack manually
11
+ > against the phase's done-when criteria.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Do ONE piece of the planned work, on its own — not the whole plan
3
+ ---
4
+
5
+ Resolve `/task-execution` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/task-execution`. **Nothing has run.**
10
+ > Retry when you're back online — or execute the task manually from its
11
+ > row in the approved task graph.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Break the next chunk of work into ordered pieces that can be handed out — what has to happen before what, and who could take each
3
+ ---
4
+
5
+ Resolve `/task-graph` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/task-graph`. **Nothing has run.**
10
+ > Retry when you're back online — or plan the phase manually from the
11
+ > phase document's ready specs.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Draft a Layer 4 feature spec
3
+ ---
4
+
5
+ Resolve `/write-spec` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. Some steps of the method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
+
7
+ If resolution fails, report exactly this and stop:
8
+
9
+ > Couldn't reach Halfcycle to resolve `/write-spec`. **Nothing has run.**
10
+ > Retry when you're back online — or draft the spec manually from the
11
+ > template's required sections.
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The PER-USER account credential store — `~/.halfcycle/account.json` (T-08,
3
+ * feature `connect-signup-and-credential`).
4
+ *
5
+ * This is where the credential the browser handoff mints is kept between runs, so
6
+ * that *"an already-signed-in machine skips all of it"* is true. It is a store of
7
+ * ONE secret per control origin, and it lives OUTSIDE every repository.
8
+ *
9
+ * ---------------------------------------------------------------------------
10
+ * WHAT THIS IS NOT, because two credentials with adjacent homes is exactly how a
11
+ * later edit puts the wrong one in the wrong file.
12
+ *
13
+ * - It is NOT the engagement token. That credential authenticates a REPOSITORY,
14
+ * is minted once on create, and today lives in the target repo's `.env.local`
15
+ * (`install.ts`'s `writeDeviceCredential`). T-09 moves it to a machine-level
16
+ * per-engagement env file at `~/.halfcycle/engagements/<id>/env`, because two
17
+ * POSIX shell consumers must SOURCE it. This file is deliberately elsewhere in
18
+ * that layout and deliberately JSON: nothing sources it, only this CLI reads it.
19
+ * - It is NOT keyed on an engagement. An account credential is minted BEFORE any
20
+ * engagement exists — that is the whole reason the create route can require one.
21
+ * It is keyed on the CONTROL ORIGIN that minted it, because a developer pointed
22
+ * at a dev plane and a prod plane holds two different accounts, and a single
23
+ * unkeyed slot would silently hand one plane's secret to the other. That is not
24
+ * a leak (the wrong plane refuses it) but it is an un-debuggable 401.
25
+ *
26
+ * ---------------------------------------------------------------------------
27
+ * OWNER-ONLY, AND WHAT THAT MEANS WHERE IT MEANS NOTHING. The directory is created
28
+ * `0700` and the file written `0600`, matching the Studio layout
29
+ * (`docs/features/mac-workspace-provider.md:27`) this feature adopts. The mode is
30
+ * applied with an explicit `chmodSync` AFTER the write and not left to the `mode`
31
+ * option alone, because `writeFileSync`'s `mode` is honoured only when the file is
32
+ * CREATED — a store that already existed at `0644` would keep those bits forever,
33
+ * which is a permission bug with no symptom.
34
+ *
35
+ * On Windows the POSIX mode bits are meaningless and `chmod` is a near no-op. That
36
+ * is a KNOWN OPEN DECISION (phase decision 6, still open, and T-09's to close for
37
+ * the engagement credential), not something this file pretends to have solved: the
38
+ * call is skipped rather than issued-and-ignored, so nothing here reads as a
39
+ * protection that is not there.
40
+ *
41
+ * ---------------------------------------------------------------------------
42
+ * `expiresAt` IS INFORMATION, NEVER A GATE. Control extends the credential's
43
+ * lifetime silently on every use (`resolveAccountCredential`, the one home of the
44
+ * 30-day window) and no response tells this client the extended value — so the
45
+ * instant stored here is the ISSUE-time expiry and is already stale the first time
46
+ * the credential is used. This module therefore never refuses a credential for
47
+ * being past it, and no caller may: whether a credential is live is CONTROL's
48
+ * question, answered with a 401. A client that decided locally would log a
49
+ * developer out of a credential the server was perfectly happy with, and would be a
50
+ * second home for a lifetime nobody could then change in one place.
51
+ *
52
+ * INV-001: Node builtins only.
53
+ */
54
+ /** The per-user Halfcycle directory. One home for the path shape. */
55
+ export declare function halfcycleHome(home?: string): string;
56
+ /** The account-credential store's absolute path. */
57
+ export declare function accountStorePath(home?: string): string;
58
+ /** One stored credential — what the poll handed back, plus when it was stored. */
59
+ export interface StoredAccountCredential {
60
+ /** The account the credential speaks for, as control reported it. */
61
+ accountId: string;
62
+ /** The plaintext credential. Presented as `Authorization: Bearer`. */
63
+ credential: string;
64
+ /** Control's issue-time expiry, UTC ISO-8601. Information only — see the header. */
65
+ expiresAt: string;
66
+ /** When this machine stored it, UTC ISO-8601. For the human, not for a check. */
67
+ signedInAt: string;
68
+ }
69
+ /** The credential stored for a control origin, if this machine has signed in to it. */
70
+ export declare function readStoredCredential(serviceUrl: string, home?: string): StoredAccountCredential | undefined;
71
+ /**
72
+ * Store the credential for a control origin, replacing any previous one.
73
+ *
74
+ * REPLACES rather than accumulates, and that is not the eviction the additive-token
75
+ * work exists to prevent: control keeps every credential it issued (they are
76
+ * additive by design, `issueAccountCredential`), so a second machine signing in
77
+ * does not invalidate this one. What is replaced is only THIS machine's local copy
78
+ * for THIS origin, which is the newest one it was handed.
79
+ */
80
+ export declare function writeStoredCredential(serviceUrl: string, entry: Omit<StoredAccountCredential, 'signedInAt'> & {
81
+ signedInAt?: string;
82
+ }, home?: string): void;
83
+ /**
84
+ * Forget the credential for one origin. Returns true iff there was one.
85
+ *
86
+ * The one caller is the refusal path: a stored credential control answers 401 to is
87
+ * dead beyond recovery — there is no grace window on this credential class and
88
+ * nothing rotates it — so keeping it would mean every later run presenting a value
89
+ * that can only ever fail. Forgetting it is what makes the next run's browser
90
+ * handoff the automatic recovery rather than something the developer has to be told
91
+ * to trigger by deleting a file.
92
+ */
93
+ export declare function forgetStoredCredential(serviceUrl: string, home?: string): boolean;
94
+ //# sourceMappingURL=account-credential.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-credential.d.ts","sourceRoot":"","sources":["../src/account-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAMH,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAC;CACpB;AAsED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,uBAAuB,GAAG,SAAS,CAMrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,YAAY,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5E,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CASN;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAOjF"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `halfcycle` CLI entry point (published bin name; formerly `halfcycle-bundle`).
4
+ *
5
+ * The bare form installs into the CURRENT directory — `npx halfcycle` in a
6
+ * project folder is the primary distribution path (operator decision (an)).
7
+ *
8
+ * Subcommands:
9
+ * halfcycle [install] [target-repo] — install into target (default: cwd)
10
+ * halfcycle check-drift <target> — report bundle drift for the re-sync gate
11
+ * halfcycle build-record <phase> — assemble the phase Build Record (D1)
12
+ * halfcycle open-phase <phase> — open a phase, with its entry decision
13
+ * halfcycle close-phase <phase> — record a phase's acceptance and close it
14
+ *
15
+ * EVERY NON-INSTALL SUBCOMMAND MUST BE NAMED IN `bareTarget` BELOW. The bare form
16
+ * (`npx halfcycle` / `npx halfcycle ./repo`) treats the first positional as an
17
+ * install target, so a subcommand missing from that list is not "unknown command" —
18
+ * it is silently an install into a directory named after the verb.
19
+ *
20
+ * TWO GUARDS ON THAT SHAPE (W3-F-4, walk 4). The bare-form-installs behaviour is
21
+ * deliberate and stays — it is the primary distribution path — but walk 4 ran the
22
+ * bare form intending to print the verb list and installed into the Halfcycle
23
+ * monorepo, mutating tracked files. The person who does that is trying to DISCOVER
24
+ * the CLI, so:
25
+ * - `--help` / `-h` / `help` prints the verbs to stdout and exits 0. Before this
26
+ * there was no non-mutating way to ask: `--help` fell through to the
27
+ * unknown-command path (which does print the usage and exit 1, so discovery was
28
+ * possible — but it framed a reasonable question as an error), and the other
29
+ * thing a person tries is the bare form, which WRITES.
30
+ * - an install whose target is the Halfcycle monorepo is REFUSED before any write.
31
+ * Not a general install gate — the one target that is never legitimate.
32
+ */
33
+ export {};
34
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG"}