strikethroo 3.15.0 → 3.16.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.
Files changed (78) hide show
  1. package/README.md +40 -28
  2. package/dist/cli.js +19 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/export-profile.d.ts +50 -0
  5. package/dist/export-profile.d.ts.map +1 -0
  6. package/dist/export-profile.js +321 -0
  7. package/dist/export-profile.js.map +1 -0
  8. package/dist/harnesses/registry.d.ts +4 -2
  9. package/dist/harnesses/registry.d.ts.map +1 -1
  10. package/dist/harnesses/registry.js +4 -2
  11. package/dist/harnesses/registry.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +110 -6
  14. package/dist/index.js.map +1 -1
  15. package/dist/profiles.d.ts +163 -0
  16. package/dist/profiles.d.ts.map +1 -0
  17. package/dist/profiles.js +561 -0
  18. package/dist/profiles.js.map +1 -0
  19. package/dist/types.d.ts +37 -0
  20. package/dist/types.d.ts.map +1 -1
  21. package/dist/types.js +15 -1
  22. package/dist/types.js.map +1 -1
  23. package/dist-web/assets/{arc-DXuQKY5O.js → arc-BdcMr5jd.js} +1 -1
  24. package/dist-web/assets/{architectureDiagram-3BPJPVTR-DaQd1Ie5.js → architectureDiagram-3BPJPVTR-BnAmTcHT.js} +1 -1
  25. package/dist-web/assets/{blockDiagram-GPEHLZMM-BTAxxxkx.js → blockDiagram-GPEHLZMM-BNFpMb7h.js} +1 -1
  26. package/dist-web/assets/{c4Diagram-AAUBKEIU-DHuDwl7F.js → c4Diagram-AAUBKEIU-a3uHdFFh.js} +1 -1
  27. package/dist-web/assets/channel-B1AegTsJ.js +1 -0
  28. package/dist-web/assets/{chunk-2J33WTMH-BD4uHGPG.js → chunk-2J33WTMH-Cb1rS3F_.js} +1 -1
  29. package/dist-web/assets/{chunk-4BX2VUAB-BqVSB0Q4.js → chunk-4BX2VUAB-Cbu2WwHh.js} +1 -1
  30. package/dist-web/assets/{chunk-55IACEB6-F-aB1oSz.js → chunk-55IACEB6-Btz8J4o3.js} +1 -1
  31. package/dist-web/assets/{chunk-727SXJPM-iIr2R3ax.js → chunk-727SXJPM-CFkPMGt0.js} +1 -1
  32. package/dist-web/assets/{chunk-AQP2D5EJ-UpIWfDiq.js → chunk-AQP2D5EJ-CVN80l_c.js} +1 -1
  33. package/dist-web/assets/{chunk-FMBD7UC4-DeG5uTRD.js → chunk-FMBD7UC4-Biqwowhe.js} +1 -1
  34. package/dist-web/assets/{chunk-ND2GUHAM-Tkl5amOh.js → chunk-ND2GUHAM-BzX9Ayzo.js} +1 -1
  35. package/dist-web/assets/{chunk-QZHKN3VN-B3Af5I7v.js → chunk-QZHKN3VN-AhpyT6S6.js} +1 -1
  36. package/dist-web/assets/classDiagram-4FO5ZUOK-DQTkBdho.js +1 -0
  37. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-DQTkBdho.js +1 -0
  38. package/dist-web/assets/{cose-bilkent-S5V4N54A-uuts3r-t.js → cose-bilkent-S5V4N54A-DFpifCy9.js} +1 -1
  39. package/dist-web/assets/{dagre-BM42HDAG-CHrjnY3X.js → dagre-BM42HDAG-CVsCTu6Q.js} +1 -1
  40. package/dist-web/assets/{diagram-2AECGRRQ-BjEnf2q8.js → diagram-2AECGRRQ-DxRAae6i.js} +1 -1
  41. package/dist-web/assets/{diagram-5GNKFQAL-BzvzvRAO.js → diagram-5GNKFQAL-uRxpU1aY.js} +1 -1
  42. package/dist-web/assets/{diagram-KO2AKTUF-DNx6lZaA.js → diagram-KO2AKTUF-yZmBTogp.js} +1 -1
  43. package/dist-web/assets/{diagram-LMA3HP47-BQUKKiM4.js → diagram-LMA3HP47-D5sBDJEs.js} +1 -1
  44. package/dist-web/assets/{diagram-OG6HWLK6-MgImJXDh.js → diagram-OG6HWLK6-CUrC2NsY.js} +1 -1
  45. package/dist-web/assets/{erDiagram-TEJ5UH35-D79fXG1m.js → erDiagram-TEJ5UH35-BPtVvm3D.js} +1 -1
  46. package/dist-web/assets/{flowDiagram-I6XJVG4X-DQDtqM9F.js → flowDiagram-I6XJVG4X-CTxAlXW_.js} +1 -1
  47. package/dist-web/assets/{ganttDiagram-6RSMTGT7-rbAdz41p.js → ganttDiagram-6RSMTGT7-CKZqAdrb.js} +1 -1
  48. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-C-ppoVQN.js → gitGraphDiagram-PVQCEYII-D_QUE2Yk.js} +1 -1
  49. package/dist-web/assets/{index-BpEA2dcR.js → index-BJHwJIE-.js} +1 -1
  50. package/dist-web/assets/{index-COfqZ5qw.js → index-C5QmAus-.js} +4 -4
  51. package/dist-web/assets/{index-D8Y-LZu5.js → index-CIPbYh7V.js} +1 -1
  52. package/dist-web/assets/{infoDiagram-5YYISTIA-DVx4rmpa.js → infoDiagram-5YYISTIA-DstwtY3_.js} +1 -1
  53. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-Bwo2Fe41.js → ishikawaDiagram-YF4QCWOH-DzWA_Z4E.js} +1 -1
  54. package/dist-web/assets/{journeyDiagram-JHISSGLW-Cpk1cbVU.js → journeyDiagram-JHISSGLW-Broa94s1.js} +1 -1
  55. package/dist-web/assets/{kanban-definition-UN3LZRKU-DT5hIyrL.js → kanban-definition-UN3LZRKU-iCGebECw.js} +1 -1
  56. package/dist-web/assets/{linear-BHILOJgo.js → linear-BbhEQio-.js} +1 -1
  57. package/dist-web/assets/{mermaid.core-BYlMWjDD.js → mermaid.core-Dktix7jr.js} +4 -4
  58. package/dist-web/assets/{mindmap-definition-RKZ34NQL-CjhPuIMr.js → mindmap-definition-RKZ34NQL-Dlt7B8sZ.js} +1 -1
  59. package/dist-web/assets/{pieDiagram-4H26LBE5-BzD5r6aw.js → pieDiagram-4H26LBE5-BIJOxvr9.js} +1 -1
  60. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-ieE6W8Lz.js → quadrantDiagram-W4KKPZXB-D61Svqs4.js} +1 -1
  61. package/dist-web/assets/{requirementDiagram-4Y6WPE33-B6Z6Nlwn.js → requirementDiagram-4Y6WPE33-CwVYBSDU.js} +1 -1
  62. package/dist-web/assets/{sankeyDiagram-5OEKKPKP-BAz2Fhdr.js → sankeyDiagram-5OEKKPKP-BRuiPIPy.js} +1 -1
  63. package/dist-web/assets/{sequenceDiagram-3UESZ5HK-Dce-js6I.js → sequenceDiagram-3UESZ5HK-WbXWfwZW.js} +1 -1
  64. package/dist-web/assets/{stateDiagram-AJRCARHV-DGx4tUMu.js → stateDiagram-AJRCARHV-BbCDSe1a.js} +1 -1
  65. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-COr1BkSm.js +1 -0
  66. package/dist-web/assets/{timeline-definition-PNZ67QCA-B8KWHkBS.js → timeline-definition-PNZ67QCA-DfeNCxUY.js} +1 -1
  67. package/dist-web/assets/{vennDiagram-CIIHVFJN-ByWUGcRD.js → vennDiagram-CIIHVFJN-C_gT6xzB.js} +1 -1
  68. package/dist-web/assets/{wardley-L42UT6IY-C1B0dt0L.js → wardley-L42UT6IY-EgSwcx7F.js} +1 -1
  69. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-BrCqwemc.js → wardleyDiagram-YWT4CUSO-ByKkgBTO.js} +1 -1
  70. package/dist-web/assets/{xychartDiagram-2RQKCTM6-Br_yjZmA.js → xychartDiagram-2RQKCTM6-QcBA0sLp.js} +1 -1
  71. package/dist-web/index.html +1 -1
  72. package/package.json +3 -3
  73. package/templates/strikethroo/gitignore +30 -0
  74. package/dist-web/assets/channel-CKed0YrQ.js +0 -1
  75. package/dist-web/assets/classDiagram-4FO5ZUOK-CD2fBLcy.js +0 -1
  76. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-CD2fBLcy.js +0 -1
  77. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-kMJLTVIN.js +0 -1
  78. package/templates/strikethroo/runtime/.gitignore +0 -2
package/README.md CHANGED
@@ -3,8 +3,8 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <strong>Spec-driven development that fits each codebase like a glove.</strong><br>
7
- Plain-Markdown hooks teach the agent your conventions, so every plan, task, and run inherits them. No API keys, no extra tools to run.
6
+ <strong>Spec-driven development optimized for time-to-merge, not time-to-first-draft.</strong><br>
7
+ You review the plan, where a correction costs a sentence &mdash; not the diff, where it costs a review cycle.
8
8
  </p>
9
9
 
10
10
  <p align="center">
@@ -15,6 +15,7 @@
15
15
  </p>
16
16
 
17
17
  <p align="center">
18
+ <a href="https://strikethroo.canpicasoft.com/why.html">Why Strikethroo</a> &nbsp;·&nbsp;
18
19
  <a href="https://strikethroo.canpicasoft.com/workflow.html">Workflow</a> &nbsp;·&nbsp;
19
20
  <a href="https://strikethroo.canpicasoft.com/customization.html">Customization</a> &nbsp;·&nbsp;
20
21
  <a href="https://strikethroo.canpicasoft.com/visualizations.html">Visualizations</a> &nbsp;·&nbsp;
@@ -23,50 +24,57 @@
23
24
 
24
25
  ## Why Strikethroo?
25
26
 
27
+ Most spec-driven tools optimize the input: better spec in, better code out, human catches the rest at the end. Strikethroo assumes the agent is an unreliable narrator of its own work -- including a second agent asked to review the first -- and that the scarce resource is your attention, not tokens.
28
+
26
29
  <table>
27
30
  <tr>
28
31
  <td width="50%" valign="top">
29
32
 
30
- <img src="docs/assets/icons/sliders-horizontal.svg" width="28" height="28" alt="" />
33
+ <img src="docs/assets/icons/focus.svg" width="28" height="28" alt="" />
31
34
 
32
- ### Bends to your conventions
35
+ ### You review the plan, not the diff
33
36
 
34
- Plain-Markdown hooks fire at nine points across the workflow; inject your test commands, standards, and domain rules so every plan, task, and run inherits them. No plugins, no code.
37
+ Correcting a plan costs a sentence. Correcting the same misunderstanding in a diff costs a review cycle, a rework cycle, and a re-review. An explicit approval gate puts your careful read where it is worth the most, and one question is asked at a time so it never gets skim-answered.
35
38
 
36
39
  </td>
37
40
  <td width="50%" valign="top">
38
41
 
39
- <img src="docs/assets/icons/focus.svg" width="28" height="28" alt="" />
42
+ <img src="docs/assets/icons/shield-check.svg" width="28" height="28" alt="" />
40
43
 
41
- ### Clean context per agent
44
+ ### Guarantees are compiled, not requested
42
45
 
43
- Every step runs with a fresh, focused context: the planner sees only your work order, the task generator only the approved plan, each execution sub-agent only its single task. No context bleed, no drift.
46
+ A rule in Markdown is a request; a rule in TypeScript is a guarantee. Hooks and templates are yours to edit. Termination bounds, safety floors, and fail-safe defaults are compiled -- `MAX_REVIEW_ROUNDS` can be tightened by config and raised by nothing.
44
47
 
45
48
  </td>
46
49
  </tr>
47
50
  <tr>
48
51
  <td width="50%" valign="top">
49
52
 
50
- <img src="docs/assets/icons/scissors.svg" width="28" height="28" alt="" />
53
+ <img src="docs/assets/icons/git-fork.svg" width="28" height="28" alt="" />
51
54
 
52
- ### No API keys
55
+ ### Nobody marks their own homework
53
56
 
54
- Runs inside the assistant you already use -- Claude Code, Codex, Cursor, OpenCode, or Copilot -- on the subscription you already pay for. Nothing to provision, host, or rotate.
57
+ The optional review gate runs on a *different* harness than the one that wrote the code -- the current harness is structurally excluded from the candidate set, not merely deprioritized. The reviewer detects and never fixes; remediation is dispatched separately.
55
58
 
56
59
  </td>
57
- <td>
60
+ <td width="50%" valign="top">
58
61
 
59
- <img src="docs/assets/icons/puzzle.svg" width="28" height="28" alt="" />
62
+ <img src="docs/assets/icons/sliders-horizontal.svg" width="28" height="28" alt="" />
60
63
 
61
- ### Harness-agnostic skills
64
+ ### Bends to your conventions
62
65
 
63
- The workflow ships as Agent Skills: one `SKILL.md` works on any harness supporting the format. Install once; the right skill auto-loads when you describe what you need.
66
+ Plain-Markdown hooks fire at eleven points across the workflow; inject your test commands, standards, and domain rules so every plan, task, and run inherits them. No plugins, no code.
64
67
 
65
68
  </td>
66
- <td width="50%" valign="top"></td>
67
69
  </tr>
68
70
  </table>
69
71
 
72
+ **Speed, measured honestly.** The industry clock starts at the prompt and stops when code appears. The clock that pays your salary stops when the code is **merged** -- and on that clock, generation is a rounding error next to the review rounds a fast-but-wrong draft costs you. Strikethroo is built against the second clock. That is not quality traded for speed; on that clock they are the same number.
73
+
74
+ Read the full thesis, with the file-by-file claims to verify it yourself: **[Why Strikethroo](https://strikethroo.canpicasoft.com/why.html)**.
75
+
76
+ <sub>Also true, and less interesting: no API keys (runs on the subscription you already pay for), harness-agnostic Agent Skills (one `SKILL.md` on any harness supporting the format), and clean per-agent context at every step.</sub>
77
+
70
78
  ## Adapts to every codebase
71
79
 
72
80
  Every codebase has its own conventions, and Strikethroo bends to them instead of imposing its own. Three plain-Markdown surfaces -- no plugins, no code:
@@ -75,7 +83,7 @@ Every codebase has its own conventions, and Strikethroo bends to them instead of
75
83
 
76
84
  ### <img src="docs/assets/icons/waypoints.svg" width="28" height="28" alt="" /> Hooks
77
85
 
78
- Fire at nine points across the workflow (before planning, after each phase, on errors, and more). Drop in your test commands, coding standards, and domain rules; every plan, task, and execution run inherits them.
86
+ Fire at eleven points across the workflow (before planning, after each phase, on errors, and more). Drop in your test commands, coding standards, and domain rules; every plan, task, and execution run inherits them.
79
87
 
80
88
  ### <img src="docs/assets/icons/file-text.svg" width="28" height="28" alt="" /> Templates
81
89
 
@@ -99,6 +107,10 @@ npx skills add e0ipso/strikethroo
99
107
 
100
108
  Requires Node.js 22+ and an assistant that supports the Agent Skills format.
101
109
 
110
+ ## Profiles: a tailored setup in one step
111
+
112
+ A strikethroo profile packages a complete workspace configuration -- hooks, templates, project context -- so `init --profile <folder | user/repo | git URL>` starts from a setup tuned for your stack instead of the shipped defaults, and `export profile` packages yours to share. See [Strikethroo profiles](https://strikethroo.canpicasoft.com/customization.html#strikethroo-profiles) in the Customization Guide.
113
+
102
114
  ## In your coding assistant
103
115
 
104
116
  ```mermaid
@@ -106,24 +118,23 @@ flowchart LR
106
118
  A[Work Order] --> B[Plan]
107
119
  B --> C{Review}
108
120
  C -->|Edit| B
109
- C -->|Approve| D[Tasks]
110
- D --> E{Verify}
111
- E --> G[Execute]
121
+ C -->|Approve| G["Execute<br/>(generates tasks)"]
112
122
  G --> H["Code Review<br/>(optional)"]
113
123
  H -->|Fix| G
114
124
  H -->|Pass| J[Done]
115
125
  ```
116
126
 
117
- Four steps, three delivered as Agent Skills that load when you describe what you need:
127
+ **Two commands.** Read the plan, approve it, run it:
128
+
129
+ | Step | Command | Output |
130
+ |-------------|---------------------------------|---------------------------------------------------------|
131
+ | **Plan** | `/st-create-plan <your prompt>` | `.ai/strikethroo/plans/64--auth/plan-64--auth.md` |
132
+ | **Execute** | `/st-execute-blueprint 64` | Task blueprint, then working code, one commit per phase |
133
+ | **Review** | Automatic (optional) | Findings validated against schema; bounded fixes |
118
134
 
119
- | Step | Skill | Output |
120
- |-------------|---------------------------------|---------------------------------------------------|
121
- | **Plan** | `/st-create-plan <your prompt>` | `.ai/strikethroo/plans/64--auth/plan-64--auth.md` |
122
- | **Tasks** | `/st-generate-tasks 64` | `.ai/strikethroo/plans/64--auth/tasks/*.md` |
123
- | **Execute** | `/st-execute-blueprint 64` | Working code, one commit per phase |
124
- | **Review** | Automatic (optional) | Findings validated against schema; bounded fixes |
135
+ `st-execute-blueprint` decomposes the plan into atomic tasks and builds the dependency-mapped blueprint itself when one does not exist yet. Run `/st-generate-tasks 64` on its own only when you want to inspect or hand-tune the blueprint before execution starts.
125
136
 
126
- Human review gates between steps catch scope creep before any code is written. Each step runs with clean context -- the planning agent sees only the work order, the task agent sees only the approved plan, and each execution sub-agent receives only its specific task. After execution, an optional automated review gate runs on a discovered second harness, critiques the cumulative diff, and drives bounded remediation if findings exceed configured thresholds.
137
+ Your review lands on the plan, before any code exists -- that is where a correction costs a sentence. Each step runs with clean context: the planning agent sees only the work order, and each execution sub-agent receives only its specific task. After execution, an optional automated review gate runs on a discovered second harness, critiques the cumulative diff, and drives bounded remediation if findings exceed configured thresholds.
127
138
 
128
139
  See the [Workflow Guide](https://strikethroo.canpicasoft.com/workflow.html) for the full step-by-step with advanced patterns. Once a plan exists, visualize its plans, tasks, and dependency graph in [Visualizations](https://strikethroo.canpicasoft.com/visualizations.html).
129
140
 
@@ -150,6 +161,7 @@ After blueprint execution, an optional automated code review gate runs when a se
150
161
 
151
162
  ## Documentation
152
163
 
164
+ - [Why Strikethroo](https://strikethroo.canpicasoft.com/why.html) -- The design thesis, the trade-offs stated plainly, and how to verify the claims
153
165
  - [Workflow Guide](https://strikethroo.canpicasoft.com/workflow.html) -- Step-by-step workflow with visual guides
154
166
  - [Customization Guide](https://strikethroo.canpicasoft.com/customization.html) -- Hooks, templates, project context, and code review configuration
155
167
  - [Reference](https://strikethroo.canpicasoft.com/reference.html) -- Glossary and CLI reference
package/dist/cli.js CHANGED
@@ -11,6 +11,7 @@ const commander_1 = require("commander");
11
11
  const index_1 = require("./index");
12
12
  const root_1 = require("./serve/root");
13
13
  const server_1 = require("./serve/server");
14
+ const export_profile_1 = require("./export-profile");
14
15
  const program = new commander_1.Command();
15
16
  program.name('strikethroo').version('0.1.0').description('AI-powered task management CLI tool');
16
17
  program
@@ -19,6 +20,7 @@ program
19
20
  .requiredOption('--harnesses <value>', 'Comma-separated list of harnesses to configure (claude,codex,cursor,gemini,copilot,opencode)')
20
21
  .option('--destination-directory <path>', 'Directory to create project structure in (default: current directory)')
21
22
  .option('--force', 'Force overwrite all files without prompting')
23
+ .option('--profile <value>', 'Strikethroo profile to import: local folder, <user>/<repo> GitHub shorthand, or full git URL')
22
24
  .action(async (options) => {
23
25
  try {
24
26
  // Execute the init command
@@ -36,6 +38,23 @@ program
36
38
  process.exit(1);
37
39
  }
38
40
  });
41
+ const exportCommand = program
42
+ .command('export')
43
+ .description('Export workspace artifacts for reuse elsewhere');
44
+ exportCommand
45
+ .command('profile')
46
+ .description('Package the workspace configuration as a strikethroo profile')
47
+ .requiredOption('--destination-directory <dir>', 'Directory to write the strikethroo profile package into (must be missing or empty)')
48
+ .action(async (options) => {
49
+ try {
50
+ const result = await (0, export_profile_1.exportProfile)({ destinationDirectory: options.destinationDirectory });
51
+ process.exit(result.success ? 0 : 1);
52
+ }
53
+ catch (error) {
54
+ console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
55
+ process.exit(1);
56
+ }
57
+ });
39
58
  program
40
59
  .command('serve')
41
60
  .description('Serve the workspace as a local web app (static SPA, JSON API, SSE change stream)')
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Export Profile Command
3
+ *
4
+ * Packages the current workspace's configuration surface as a strikethroo
5
+ * profile: copies `config/` (minus the CLI-owned `schemas/` subtree) into the
6
+ * destination and writes a `profile.yaml` manifest collected interactively,
7
+ * or supplied programmatically for non-interactive use.
8
+ *
9
+ * The produced package is validated with `validateProfilePackage` before
10
+ * success is reported, so an export can never emit a package that would fail
11
+ * to round-trip through `init --profile <dir>`.
12
+ */
13
+ import { CommandResult } from './types';
14
+ import { ProfileManifest } from './profiles';
15
+ /**
16
+ * Manifest fields collected from the user; `schema_version` is stamped by the
17
+ * export itself
18
+ */
19
+ export type ProfileManifestAnswers = Omit<ProfileManifest, 'schema_version'>;
20
+ /**
21
+ * Options for the export profile command
22
+ */
23
+ export interface ExportProfileOptions {
24
+ /**
25
+ * Directory to write the profile package into. Must be missing or empty.
26
+ */
27
+ destinationDirectory: string;
28
+ /**
29
+ * Pre-answered manifest fields for non-interactive use. When absent, the
30
+ * command prompts interactively for every field.
31
+ */
32
+ manifest?: ProfileManifestAnswers;
33
+ /**
34
+ * Directory to start workspace-root discovery from (default: process.cwd())
35
+ */
36
+ cwd?: string;
37
+ }
38
+ /**
39
+ * Export the current workspace's configuration as a strikethroo profile.
40
+ *
41
+ * Steps: resolve the workspace root by walking up from `cwd`, refuse a
42
+ * non-empty destination before any write, collect the manifest (prompting
43
+ * unless pre-answered), copy `config/` minus `schemas/`, write
44
+ * `profile.yaml`, and validate the produced package as a final self-check.
45
+ *
46
+ * @param options - Destination directory plus optional pre-answered manifest
47
+ * @returns Command result describing success or failure
48
+ */
49
+ export declare function exportProfile(options: ExportProfileOptions): Promise<CommandResult>;
50
+ //# sourceMappingURL=export-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-profile.d.ts","sourceRoot":"","sources":["../src/export-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,aAAa,EAAgB,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,eAAe,EAIhB,MAAM,YAAY,CAAC;AAYpB;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAWD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiEzF"}
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ /**
3
+ * Export Profile Command
4
+ *
5
+ * Packages the current workspace's configuration surface as a strikethroo
6
+ * profile: copies `config/` (minus the CLI-owned `schemas/` subtree) into the
7
+ * destination and writes a `profile.yaml` manifest collected interactively,
8
+ * or supplied programmatically for non-interactive use.
9
+ *
10
+ * The produced package is validated with `validateProfilePackage` before
11
+ * success is reported, so an export can never emit a package that would fail
12
+ * to round-trip through `init --profile <dir>`.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ var __importDefault = (this && this.__importDefault) || function (mod) {
48
+ return (mod && mod.__esModule) ? mod : { "default": mod };
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.exportProfile = exportProfile;
52
+ const fs = __importStar(require("fs-extra"));
53
+ const path = __importStar(require("path"));
54
+ const yaml = __importStar(require("js-yaml"));
55
+ const chalk_1 = __importDefault(require("chalk"));
56
+ const inquirer_1 = __importDefault(require("inquirer"));
57
+ const types_1 = require("./types");
58
+ const profiles_1 = require("./profiles");
59
+ const root_1 = require("./serve/root");
60
+ const TERM_WIDTH = 80;
61
+ const DIVIDER = '─'.repeat(TERM_WIDTH);
62
+ /**
63
+ * Kebab-case: lowercase alphanumeric segments separated by single hyphens.
64
+ * Mirrors the manifest contract enforced by `validateProfilePackage`.
65
+ */
66
+ const KEBAB_CASE_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
67
+ /**
68
+ * Format a section header with cyan styling
69
+ * @param title - Header title text
70
+ * @returns Styled header string
71
+ */
72
+ function formatSectionHeader(title) {
73
+ return `\n${chalk_1.default.cyan.bold(title)}\n${chalk_1.default.cyan(DIVIDER)}\n`;
74
+ }
75
+ /**
76
+ * Export the current workspace's configuration as a strikethroo profile.
77
+ *
78
+ * Steps: resolve the workspace root by walking up from `cwd`, refuse a
79
+ * non-empty destination before any write, collect the manifest (prompting
80
+ * unless pre-answered), copy `config/` minus `schemas/`, write
81
+ * `profile.yaml`, and validate the produced package as a final self-check.
82
+ *
83
+ * @param options - Destination directory plus optional pre-answered manifest
84
+ * @returns Command result describing success or failure
85
+ */
86
+ async function exportProfile(options) {
87
+ try {
88
+ const resolved = (0, root_1.resolveWorkspaceRoot)({ cwd: options.cwd });
89
+ if ((0, root_1.isResolveError)(resolved)) {
90
+ throw new types_1.ProfileError(`Cannot export a strikethroo profile: ${resolved.error}`);
91
+ }
92
+ const workspaceConfigDir = path.join(resolved.root, 'config');
93
+ if (!(await fs.pathExists(workspaceConfigDir))) {
94
+ throw new types_1.ProfileError(`Cannot export a strikethroo profile: workspace has no config/ directory ` +
95
+ `(expected ${workspaceConfigDir}). Re-run \`npx strikethroo init\` to restore it.`);
96
+ }
97
+ const destination = path.resolve(options.destinationDirectory);
98
+ await assertDestinationUsable(destination);
99
+ console.log(chalk_1.default.bold.white('\nStrikethroo Profile Export'));
100
+ console.log(chalk_1.default.gray(DIVIDER));
101
+ console.log(formatSectionHeader('Configuration'));
102
+ console.log(` ${chalk_1.default.cyan('●')} Workspace: ${resolved.root}`);
103
+ console.log(` ${chalk_1.default.cyan('●')} Destination: ${destination}`);
104
+ const answers = options.manifest ?? (await promptForManifest());
105
+ const manifest = buildManifest(answers);
106
+ console.log(formatSectionHeader('Export Progress'));
107
+ await fs.ensureDir(destination);
108
+ await copyConfigSurface(workspaceConfigDir, path.join(destination, 'config'));
109
+ console.log(` ${chalk_1.default.green('✓')} Copied config/ (schemas/ excluded — CLI-owned)`);
110
+ await fs.writeFile(path.join(destination, 'profile.yaml'), yaml.dump(manifest), 'utf-8');
111
+ console.log(` ${chalk_1.default.green('✓')} Wrote profile.yaml (schema v${manifest.schema_version})`);
112
+ // Final self-check: the exported package must satisfy the same contract
113
+ // `init --profile <dir>` validates against.
114
+ await (0, profiles_1.validateProfilePackage)(destination);
115
+ console.log(` ${chalk_1.default.green('✓')} Validated package against the profile contract`);
116
+ console.log(`\n${chalk_1.default.green('✓')} strikethroo profile '${manifest.name}' exported to ${destination}\n`);
117
+ console.log(chalk_1.default.gray(' Publish it by pushing the folder to a git host, or import it directly with\n' +
118
+ ` \`npx strikethroo init --harnesses <list> --profile ${destination}\`.\n`));
119
+ return {
120
+ success: true,
121
+ message: `strikethroo profile '${manifest.name}' exported to ${destination}`,
122
+ data: { destination, name: manifest.name },
123
+ };
124
+ }
125
+ catch (error) {
126
+ const message = error instanceof Error ? error.message : 'Profile export failed with unknown error';
127
+ console.error(chalk_1.default.red(`\n✗ Profile export failed: ${message}\n`));
128
+ return {
129
+ success: false,
130
+ message,
131
+ error: error instanceof Error ? error : new Error(String(error)),
132
+ };
133
+ }
134
+ }
135
+ /**
136
+ * Refuse a destination that already exists and is non-empty.
137
+ *
138
+ * Runs before any write so a refused export never mutates the destination.
139
+ *
140
+ * @param destination - Absolute destination path
141
+ */
142
+ async function assertDestinationUsable(destination) {
143
+ if (!(await fs.pathExists(destination))) {
144
+ return;
145
+ }
146
+ const stat = await fs.stat(destination);
147
+ if (!stat.isDirectory()) {
148
+ throw new types_1.ProfileError(`Refusing to overwrite existing file at destination: ${destination} ` +
149
+ `(--destination-directory must be a missing or empty directory)`);
150
+ }
151
+ const entries = await fs.readdir(destination);
152
+ if (entries.length > 0) {
153
+ throw new types_1.ProfileError(`Refusing to overwrite non-empty destination: ${destination} already contains ` +
154
+ `${entries.length} ${entries.length === 1 ? 'entry' : 'entries'}. ` +
155
+ `Choose a missing or empty directory for the exported strikethroo profile.`);
156
+ }
157
+ }
158
+ /**
159
+ * Copy the workspace `config/` tree into the package, excluding `schemas/`.
160
+ *
161
+ * The full surface is exported verbatim — not a diff against shipped
162
+ * defaults — so the package is self-describing.
163
+ *
164
+ * @param sourceConfigDir - Workspace `config/` directory
165
+ * @param destConfigDir - Package `config/` directory
166
+ */
167
+ async function copyConfigSurface(sourceConfigDir, destConfigDir) {
168
+ await fs.copy(sourceConfigDir, destConfigDir, {
169
+ filter: src => {
170
+ const rel = path.relative(sourceConfigDir, src);
171
+ return rel !== 'schemas' && !rel.startsWith(`schemas${path.sep}`);
172
+ },
173
+ });
174
+ }
175
+ /**
176
+ * Assemble the manifest, stamping the schema version and omitting empty
177
+ * optional fields so the emitted YAML stays minimal
178
+ *
179
+ * @param answers - Collected manifest fields
180
+ * @returns Complete manifest ready for serialization
181
+ */
182
+ function buildManifest(answers) {
183
+ const manifest = {
184
+ schema_version: profiles_1.PROFILE_MANIFEST_SCHEMA_VERSION,
185
+ name: answers.name,
186
+ description: answers.description,
187
+ };
188
+ if (answers.purpose && answers.purpose.trim().length > 0) {
189
+ manifest.purpose = answers.purpose;
190
+ }
191
+ if (answers.tags && answers.tags.length > 0) {
192
+ manifest.tags = answers.tags;
193
+ }
194
+ if (answers.requires && answers.requires.length > 0) {
195
+ manifest.requires = answers.requires;
196
+ }
197
+ if (answers.recommends && answers.recommends.length > 0) {
198
+ manifest.recommends = answers.recommends;
199
+ }
200
+ if (answers.author && answers.author.trim().length > 0) {
201
+ manifest.author = answers.author;
202
+ }
203
+ return manifest;
204
+ }
205
+ /**
206
+ * Interactively collect every manifest field
207
+ * @returns Collected manifest fields
208
+ */
209
+ async function promptForManifest() {
210
+ console.log(formatSectionHeader('Profile Manifest'));
211
+ const identity = await inquirer_1.default.prompt([
212
+ {
213
+ type: 'input',
214
+ name: 'name',
215
+ message: 'Profile name (kebab-case):',
216
+ validate: (value) => KEBAB_CASE_PATTERN.test(value.trim()) ||
217
+ 'Name must be kebab-case: lowercase letters, digits, and single hyphens (e.g. drupal-kenkeep)',
218
+ filter: (value) => value.trim(),
219
+ },
220
+ {
221
+ type: 'input',
222
+ name: 'description',
223
+ message: 'One-line description:',
224
+ validate: (value) => value.trim().length > 0 || 'Description is required',
225
+ filter: (value) => value.trim(),
226
+ },
227
+ {
228
+ type: 'input',
229
+ name: 'purpose',
230
+ message: 'Purpose (long-form, optional):',
231
+ },
232
+ {
233
+ type: 'input',
234
+ name: 'tags',
235
+ message: 'Tags (comma-separated, optional):',
236
+ },
237
+ {
238
+ type: 'input',
239
+ name: 'author',
240
+ message: 'Author (optional):',
241
+ },
242
+ ]);
243
+ const requires = await promptForRequirements('required');
244
+ const recommends = await promptForRequirements('recommended');
245
+ const answers = {
246
+ name: identity.name,
247
+ description: identity.description,
248
+ };
249
+ if (identity.purpose.trim().length > 0) {
250
+ answers.purpose = identity.purpose.trim();
251
+ }
252
+ const tags = identity.tags
253
+ .split(',')
254
+ .map(tag => tag.trim())
255
+ .filter(tag => tag.length > 0);
256
+ if (tags.length > 0) {
257
+ answers.tags = tags;
258
+ }
259
+ if (requires.length > 0) {
260
+ answers.requires = requires;
261
+ }
262
+ if (recommends.length > 0) {
263
+ answers.recommends = recommends;
264
+ }
265
+ if (identity.author.trim().length > 0) {
266
+ answers.author = identity.author.trim();
267
+ }
268
+ return answers;
269
+ }
270
+ /**
271
+ * Collect zero or more requirement entries via a confirm-then-fields loop
272
+ * @param label - 'required' or 'recommended', used in prompt copy
273
+ * @returns Collected requirement entries
274
+ */
275
+ async function promptForRequirements(label) {
276
+ const entries = [];
277
+ for (;;) {
278
+ const { add } = await inquirer_1.default.prompt([
279
+ {
280
+ type: 'confirm',
281
+ name: 'add',
282
+ message: entries.length === 0
283
+ ? `Add a ${label} skill/tool entry?`
284
+ : `Add another ${label} skill/tool entry?`,
285
+ default: false,
286
+ },
287
+ ]);
288
+ if (!add) {
289
+ return entries;
290
+ }
291
+ const entry = await inquirer_1.default.prompt([
292
+ {
293
+ type: 'list',
294
+ name: 'kind',
295
+ message: `Kind of ${label} entry:`,
296
+ choices: [
297
+ { name: 'skill', value: 'skill' },
298
+ { name: 'tool', value: 'tool' },
299
+ ],
300
+ },
301
+ {
302
+ type: 'input',
303
+ name: 'name',
304
+ message: 'Name:',
305
+ validate: (value) => value.trim().length > 0 || 'Name is required',
306
+ filter: (value) => value.trim(),
307
+ },
308
+ {
309
+ type: 'input',
310
+ name: 'install',
311
+ message: 'Installation hint (optional):',
312
+ },
313
+ ]);
314
+ const requirement = { kind: entry.kind, name: entry.name };
315
+ if (entry.install.trim().length > 0) {
316
+ requirement.install = entry.install.trim();
317
+ }
318
+ entries.push(requirement);
319
+ }
320
+ }
321
+ //# sourceMappingURL=export-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-profile.js","sourceRoot":"","sources":["../src/export-profile.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,10 @@
5
5
  * detected, installed, and updated. `init` iterates the registry instead of
6
6
  * branching over harnesses.
7
7
  *
8
- * Deliberately small: no profiles, no delivery-strategy abstraction, and no
9
- * per-tool config schema — just "one place to register a harness".
8
+ * Deliberately small: no delivery-strategy abstraction and no per-tool config
9
+ * schema — just "one place to register a harness". Strikethroo profiles
10
+ * (`src/profiles.ts`) operate on the workspace template tree and never touch
11
+ * this registry; it stays profile-agnostic.
10
12
  */
11
13
  import { Harness } from '../types';
12
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/harnesses/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,EAAE,EAAE,OAAO,CAAC;IACZ,iFAAiF;IACjF,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,oFAAoF;IACpF,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,+EAA+E;IAC/E,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChD;AAED,oEAAoE;AACpE,eAAO,MAAM,eAAe,wFAAqC,CAAC;AAElE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAEpE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/harnesses/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,EAAE,EAAE,OAAO,CAAC;IACZ,iFAAiF;IACjF,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,oFAAoF;IACpF,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,+EAA+E;IAC/E,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChD;AAED,oEAAoE;AACpE,eAAO,MAAM,eAAe,wFAAqC,CAAC;AAElE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAEpE"}
@@ -6,8 +6,10 @@
6
6
  * detected, installed, and updated. `init` iterates the registry instead of
7
7
  * branching over harnesses.
8
8
  *
9
- * Deliberately small: no profiles, no delivery-strategy abstraction, and no
10
- * per-tool config schema — just "one place to register a harness".
9
+ * Deliberately small: no delivery-strategy abstraction and no per-tool config
10
+ * schema — just "one place to register a harness". Strikethroo profiles
11
+ * (`src/profiles.ts`) operate on the workspace template tree and never touch
12
+ * this registry; it stays profile-agnostic.
11
13
  */
12
14
  Object.defineProperty(exports, "__esModule", { value: true });
13
15
  exports.HarnessRegistry = void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/harnesses/registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA4BH,wDAEC;AATD,oEAAoE;AACvD,QAAA,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;AAElE;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAuB;IAC5D,uBAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/harnesses/registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AA4BH,wDAEC;AATD,oEAAoE;AACvD,QAAA,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;AAElE;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAuB;IAC5D,uBAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}