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.
- package/README.md +40 -28
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -1
- package/dist/export-profile.d.ts +50 -0
- package/dist/export-profile.d.ts.map +1 -0
- package/dist/export-profile.js +321 -0
- package/dist/export-profile.js.map +1 -0
- package/dist/harnesses/registry.d.ts +4 -2
- package/dist/harnesses/registry.d.ts.map +1 -1
- package/dist/harnesses/registry.js +4 -2
- package/dist/harnesses/registry.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -6
- package/dist/index.js.map +1 -1
- package/dist/profiles.d.ts +163 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +561 -0
- package/dist/profiles.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -1
- package/dist/types.js.map +1 -1
- package/dist-web/assets/{arc-DXuQKY5O.js → arc-BdcMr5jd.js} +1 -1
- package/dist-web/assets/{architectureDiagram-3BPJPVTR-DaQd1Ie5.js → architectureDiagram-3BPJPVTR-BnAmTcHT.js} +1 -1
- package/dist-web/assets/{blockDiagram-GPEHLZMM-BTAxxxkx.js → blockDiagram-GPEHLZMM-BNFpMb7h.js} +1 -1
- package/dist-web/assets/{c4Diagram-AAUBKEIU-DHuDwl7F.js → c4Diagram-AAUBKEIU-a3uHdFFh.js} +1 -1
- package/dist-web/assets/channel-B1AegTsJ.js +1 -0
- package/dist-web/assets/{chunk-2J33WTMH-BD4uHGPG.js → chunk-2J33WTMH-Cb1rS3F_.js} +1 -1
- package/dist-web/assets/{chunk-4BX2VUAB-BqVSB0Q4.js → chunk-4BX2VUAB-Cbu2WwHh.js} +1 -1
- package/dist-web/assets/{chunk-55IACEB6-F-aB1oSz.js → chunk-55IACEB6-Btz8J4o3.js} +1 -1
- package/dist-web/assets/{chunk-727SXJPM-iIr2R3ax.js → chunk-727SXJPM-CFkPMGt0.js} +1 -1
- package/dist-web/assets/{chunk-AQP2D5EJ-UpIWfDiq.js → chunk-AQP2D5EJ-CVN80l_c.js} +1 -1
- package/dist-web/assets/{chunk-FMBD7UC4-DeG5uTRD.js → chunk-FMBD7UC4-Biqwowhe.js} +1 -1
- package/dist-web/assets/{chunk-ND2GUHAM-Tkl5amOh.js → chunk-ND2GUHAM-BzX9Ayzo.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-B3Af5I7v.js → chunk-QZHKN3VN-AhpyT6S6.js} +1 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-DQTkBdho.js +1 -0
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-DQTkBdho.js +1 -0
- package/dist-web/assets/{cose-bilkent-S5V4N54A-uuts3r-t.js → cose-bilkent-S5V4N54A-DFpifCy9.js} +1 -1
- package/dist-web/assets/{dagre-BM42HDAG-CHrjnY3X.js → dagre-BM42HDAG-CVsCTu6Q.js} +1 -1
- package/dist-web/assets/{diagram-2AECGRRQ-BjEnf2q8.js → diagram-2AECGRRQ-DxRAae6i.js} +1 -1
- package/dist-web/assets/{diagram-5GNKFQAL-BzvzvRAO.js → diagram-5GNKFQAL-uRxpU1aY.js} +1 -1
- package/dist-web/assets/{diagram-KO2AKTUF-DNx6lZaA.js → diagram-KO2AKTUF-yZmBTogp.js} +1 -1
- package/dist-web/assets/{diagram-LMA3HP47-BQUKKiM4.js → diagram-LMA3HP47-D5sBDJEs.js} +1 -1
- package/dist-web/assets/{diagram-OG6HWLK6-MgImJXDh.js → diagram-OG6HWLK6-CUrC2NsY.js} +1 -1
- package/dist-web/assets/{erDiagram-TEJ5UH35-D79fXG1m.js → erDiagram-TEJ5UH35-BPtVvm3D.js} +1 -1
- package/dist-web/assets/{flowDiagram-I6XJVG4X-DQDtqM9F.js → flowDiagram-I6XJVG4X-CTxAlXW_.js} +1 -1
- package/dist-web/assets/{ganttDiagram-6RSMTGT7-rbAdz41p.js → ganttDiagram-6RSMTGT7-CKZqAdrb.js} +1 -1
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-C-ppoVQN.js → gitGraphDiagram-PVQCEYII-D_QUE2Yk.js} +1 -1
- package/dist-web/assets/{index-BpEA2dcR.js → index-BJHwJIE-.js} +1 -1
- package/dist-web/assets/{index-COfqZ5qw.js → index-C5QmAus-.js} +4 -4
- package/dist-web/assets/{index-D8Y-LZu5.js → index-CIPbYh7V.js} +1 -1
- package/dist-web/assets/{infoDiagram-5YYISTIA-DVx4rmpa.js → infoDiagram-5YYISTIA-DstwtY3_.js} +1 -1
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-Bwo2Fe41.js → ishikawaDiagram-YF4QCWOH-DzWA_Z4E.js} +1 -1
- package/dist-web/assets/{journeyDiagram-JHISSGLW-Cpk1cbVU.js → journeyDiagram-JHISSGLW-Broa94s1.js} +1 -1
- package/dist-web/assets/{kanban-definition-UN3LZRKU-DT5hIyrL.js → kanban-definition-UN3LZRKU-iCGebECw.js} +1 -1
- package/dist-web/assets/{linear-BHILOJgo.js → linear-BbhEQio-.js} +1 -1
- package/dist-web/assets/{mermaid.core-BYlMWjDD.js → mermaid.core-Dktix7jr.js} +4 -4
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-CjhPuIMr.js → mindmap-definition-RKZ34NQL-Dlt7B8sZ.js} +1 -1
- package/dist-web/assets/{pieDiagram-4H26LBE5-BzD5r6aw.js → pieDiagram-4H26LBE5-BIJOxvr9.js} +1 -1
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-ieE6W8Lz.js → quadrantDiagram-W4KKPZXB-D61Svqs4.js} +1 -1
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-B6Z6Nlwn.js → requirementDiagram-4Y6WPE33-CwVYBSDU.js} +1 -1
- package/dist-web/assets/{sankeyDiagram-5OEKKPKP-BAz2Fhdr.js → sankeyDiagram-5OEKKPKP-BRuiPIPy.js} +1 -1
- package/dist-web/assets/{sequenceDiagram-3UESZ5HK-Dce-js6I.js → sequenceDiagram-3UESZ5HK-WbXWfwZW.js} +1 -1
- package/dist-web/assets/{stateDiagram-AJRCARHV-DGx4tUMu.js → stateDiagram-AJRCARHV-BbCDSe1a.js} +1 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-COr1BkSm.js +1 -0
- package/dist-web/assets/{timeline-definition-PNZ67QCA-B8KWHkBS.js → timeline-definition-PNZ67QCA-DfeNCxUY.js} +1 -1
- package/dist-web/assets/{vennDiagram-CIIHVFJN-ByWUGcRD.js → vennDiagram-CIIHVFJN-C_gT6xzB.js} +1 -1
- package/dist-web/assets/{wardley-L42UT6IY-C1B0dt0L.js → wardley-L42UT6IY-EgSwcx7F.js} +1 -1
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-BrCqwemc.js → wardleyDiagram-YWT4CUSO-ByKkgBTO.js} +1 -1
- package/dist-web/assets/{xychartDiagram-2RQKCTM6-Br_yjZmA.js → xychartDiagram-2RQKCTM6-QcBA0sLp.js} +1 -1
- package/dist-web/index.html +1 -1
- package/package.json +3 -3
- package/templates/strikethroo/gitignore +30 -0
- package/dist-web/assets/channel-CKed0YrQ.js +0 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-CD2fBLcy.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-CD2fBLcy.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-kMJLTVIN.js +0 -1
- 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
|
|
7
|
-
|
|
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 — 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> ·
|
|
18
19
|
<a href="https://strikethroo.canpicasoft.com/workflow.html">Workflow</a> ·
|
|
19
20
|
<a href="https://strikethroo.canpicasoft.com/customization.html">Customization</a> ·
|
|
20
21
|
<a href="https://strikethroo.canpicasoft.com/visualizations.html">Visualizations</a> ·
|
|
@@ -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/
|
|
33
|
+
<img src="docs/assets/icons/focus.svg" width="28" height="28" alt="" />
|
|
31
34
|
|
|
32
|
-
###
|
|
35
|
+
### You review the plan, not the diff
|
|
33
36
|
|
|
34
|
-
|
|
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/
|
|
42
|
+
<img src="docs/assets/icons/shield-check.svg" width="28" height="28" alt="" />
|
|
40
43
|
|
|
41
|
-
###
|
|
44
|
+
### Guarantees are compiled, not requested
|
|
42
45
|
|
|
43
|
-
|
|
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/
|
|
53
|
+
<img src="docs/assets/icons/git-fork.svg" width="28" height="28" alt="" />
|
|
51
54
|
|
|
52
|
-
###
|
|
55
|
+
### Nobody marks their own homework
|
|
53
56
|
|
|
54
|
-
|
|
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/
|
|
62
|
+
<img src="docs/assets/icons/sliders-horizontal.svg" width="28" height="28" alt="" />
|
|
60
63
|
|
|
61
|
-
###
|
|
64
|
+
### Bends to your conventions
|
|
62
65
|
|
|
63
|
-
|
|
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
|
|
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|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":";;AACA;;;;;GAKG;;AAEH,yCAAoC;AACpC,mCAA+B;AAE/B,uCAAoE;AACpE,2CAA+D;
|
|
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
|
|
9
|
-
*
|
|
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
|
|
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
|
|
10
|
-
*
|
|
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
|
|
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"}
|