loadout-ai 0.6.0 → 0.7.0

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 (103) hide show
  1. package/README.md +122 -19
  2. package/catalog/discovered.json +25557 -24308
  3. package/dist/src/cli.js +2 -2
  4. package/dist/src/commands/agents.js +6 -23
  5. package/dist/src/commands/catalog.js +130 -33
  6. package/dist/src/commands/health.js +6 -6
  7. package/dist/src/commands/inventory.js +19 -120
  8. package/dist/src/commands/lifecycle.js +13 -51
  9. package/dist/src/commands/mcp.js +10 -73
  10. package/dist/src/commands/setup.js +5 -5
  11. package/dist/src/commands/sharing.js +11 -108
  12. package/dist/src/commands/support.js +20 -9
  13. package/dist/src/core/{adapters.js → agents/adapters.js} +2 -2
  14. package/dist/src/core/{agent-inspection.js → agents/agent-inspection.js} +26 -6
  15. package/dist/src/core/{codex-mcp.js → agents/codex-mcp.js} +1 -1
  16. package/dist/src/core/{health-score-evidence.js → agents/health-score-evidence.js} +8 -8
  17. package/dist/src/core/{runtime-tools.js → agents/runtime-tools.js} +2 -2
  18. package/dist/src/core/{audit.js → catalog/audit.js} +4 -4
  19. package/dist/src/core/{catalog.js → catalog/catalog.js} +5 -5
  20. package/dist/src/core/{components.js → catalog/components.js} +2 -2
  21. package/dist/src/core/{conformance.js → catalog/conformance.js} +2 -2
  22. package/dist/src/core/{profiles.js → catalog/profiles.js} +2 -2
  23. package/dist/src/core/{provenance.js → catalog/provenance.js} +3 -3
  24. package/dist/src/core/{registry.js → catalog/registry.js} +1 -1
  25. package/dist/src/core/{skill-compare.js → catalog/skill-compare.js} +1 -1
  26. package/dist/src/core/{skill-inventory.js → catalog/skill-inventory.js} +3 -3
  27. package/dist/src/core/{skills.js → catalog/skills.js} +1 -1
  28. package/dist/src/core/{candidate-intelligence.js → discovery/candidate-intelligence.js} +6 -6
  29. package/dist/src/core/{discovery-connector.js → discovery/discovery-connector.js} +2 -2
  30. package/dist/src/core/{evaluate.js → discovery/evaluate.js} +2 -2
  31. package/dist/src/core/{mcp-registry-discovery.js → discovery/mcp-registry-discovery.js} +1 -1
  32. package/dist/src/core/{observations.js → discovery/observations.js} +3 -3
  33. package/dist/src/core/{review-queue.js → discovery/review-queue.js} +2 -2
  34. package/dist/src/core/{skills-sh-discovery.js → discovery/skills-sh-discovery.js} +1 -1
  35. package/dist/src/core/{adopt.js → install/adopt.js} +3 -3
  36. package/dist/src/core/{catalog-install.js → install/catalog-install.js} +11 -11
  37. package/dist/src/core/{file-lock.js → install/file-lock.js} +1 -1
  38. package/dist/src/core/{install.js → install/install.js} +5 -5
  39. package/dist/src/core/{package.js → install/package.js} +3 -3
  40. package/dist/src/core/{reconcile.js → install/reconcile.js} +5 -5
  41. package/dist/src/core/{remove.js → install/remove.js} +4 -4
  42. package/dist/src/core/{snapshot.js → install/snapshot.js} +1 -1
  43. package/dist/src/core/{source.js → install/source.js} +1 -1
  44. package/dist/src/core/{sync.js → install/sync.js} +9 -9
  45. package/dist/src/core/{transaction.js → install/transaction.js} +1 -1
  46. package/dist/src/core/{uninstall.js → install/uninstall.js} +4 -4
  47. package/dist/src/core/{update.js → install/update.js} +4 -4
  48. package/dist/src/core/{cli-guide.js → reporting/cli-guide.js} +29 -45
  49. package/dist/src/core/{doctor.js → reporting/doctor.js} +3 -6
  50. package/dist/src/core/{freshness-alerts.js → reporting/freshness-alerts.js} +5 -5
  51. package/dist/src/core/{health.js → reporting/health.js} +6 -6
  52. package/dist/src/core/{loadout-card.js → reporting/loadout-card.js} +1 -1
  53. package/dist/src/core/{readme-claims.js → reporting/readme-claims.js} +1 -1
  54. package/dist/src/core/{readme-facts.js → reporting/readme-facts.js} +2 -2
  55. package/dist/src/core/{share-report.js → reporting/share-report.js} +3 -3
  56. package/dist/src/core/{upgrade.js → reporting/upgrade.js} +7 -7
  57. package/dist/src/core/routing/first-party-skills.js +118 -0
  58. package/dist/src/core/{handoff.js → routing/handoff.js} +120 -3
  59. package/dist/src/core/{model-config.js → routing/model-config.js} +4 -4
  60. package/dist/src/core/{route.js → routing/route.js} +325 -34
  61. package/dist/src/core/{api.js → runtime/api.js} +4 -4
  62. package/dist/src/core/{canary.js → runtime/canary.js} +1 -1
  63. package/dist/src/core/{github.js → runtime/github.js} +1 -1
  64. package/dist/src/core/{mcp-recipes.js → runtime/mcp-recipes.js} +1 -1
  65. package/dist/src/core/{mcp.js → runtime/mcp.js} +2 -2
  66. package/dist/src/core/{scheduler.js → runtime/scheduler.js} +4 -4
  67. package/dist/src/core/{active-policy.js → workspace/active-policy.js} +2 -2
  68. package/dist/src/core/{active-set.js → workspace/active-set.js} +2 -2
  69. package/dist/src/core/{improve.js → workspace/improve.js} +3 -3
  70. package/dist/src/core/{manifest.js → workspace/manifest.js} +2 -2
  71. package/dist/src/core/{outcomes.js → workspace/outcomes.js} +3 -3
  72. package/dist/src/core/{portable.js → workspace/portable.js} +3 -3
  73. package/dist/src/core/{profile-state.js → workspace/profile-state.js} +1 -1
  74. package/dist/src/core/{recommend.js → workspace/recommend.js} +1 -1
  75. package/dist/src/core/{state.js → workspace/state.js} +3 -3
  76. package/docs/DISCOVERED.md +247 -246
  77. package/docs/evidence/readme-claims.json +22 -19
  78. package/package.json +2 -1
  79. package/skills/loadout-curator/SKILL.md +105 -0
  80. package/skills/loadout-router/SKILL.md +120 -0
  81. /package/dist/src/core/{agent-health-score.js → agents/agent-health-score.js} +0 -0
  82. /package/dist/src/core/{agent-versions.js → agents/agent-versions.js} +0 -0
  83. /package/dist/src/core/{conversion.js → agents/conversion.js} +0 -0
  84. /package/dist/src/core/{paths.js → agents/paths.js} +0 -0
  85. /package/dist/src/core/{runtime-tool-recipe.js → agents/runtime-tool-recipe.js} +0 -0
  86. /package/dist/src/core/{catalog-coverage.js → catalog/catalog-coverage.js} +0 -0
  87. /package/dist/src/core/{safety.js → catalog/safety.js} +0 -0
  88. /package/dist/src/core/{skill-security.js → catalog/skill-security.js} +0 -0
  89. /package/dist/src/core/{community.js → discovery/community.js} +0 -0
  90. /package/dist/src/core/{github-discovery.js → discovery/github-discovery.js} +0 -0
  91. /package/dist/src/core/{private-discovery.js → discovery/private-discovery.js} +0 -0
  92. /package/dist/src/core/{ranking.js → discovery/ranking.js} +0 -0
  93. /package/dist/src/core/{atomic-file.js → install/atomic-file.js} +0 -0
  94. /package/dist/src/core/{diff.js → install/diff.js} +0 -0
  95. /package/dist/src/core/{update-watch.js → install/update-watch.js} +0 -0
  96. /package/dist/src/core/{completion.js → reporting/completion.js} +0 -0
  97. /package/dist/src/core/{loadout-badge.js → reporting/loadout-badge.js} +0 -0
  98. /package/dist/src/core/{terminal.js → reporting/terminal.js} +0 -0
  99. /package/dist/src/core/{access.js → routing/access.js} +0 -0
  100. /package/dist/src/core/{credentials.js → routing/credentials.js} +0 -0
  101. /package/dist/src/core/{sandbox.js → runtime/sandbox.js} +0 -0
  102. /package/dist/src/core/{active-limit.js → workspace/active-limit.js} +0 -0
  103. /package/dist/src/core/{target-occupancy.js → workspace/target-occupancy.js} +0 -0
@@ -21,7 +21,7 @@
21
21
  "status": "proven",
22
22
  "evidence": [
23
23
  "catalog/packages.json",
24
- "src/core/catalog-coverage.ts",
24
+ "src/core/catalog/catalog-coverage.ts",
25
25
  "tests/catalog-coverage.test.ts"
26
26
  ]
27
27
  },
@@ -31,7 +31,7 @@
31
31
  "summary": "Stable selection is defined by the checked-in policy and allowlist.",
32
32
  "evidenceClass": "policy-selected",
33
33
  "status": "proven",
34
- "evidence": ["src/core/profiles.ts", "tests/profiles.test.ts"]
34
+ "evidence": ["src/core/catalog/profiles.ts", "tests/profiles.test.ts"]
35
35
  },
36
36
  {
37
37
  "id": "selection.power",
@@ -39,7 +39,7 @@
39
39
  "summary": "Power selection is defined by the checked-in policy and allowlist.",
40
40
  "evidenceClass": "policy-selected",
41
41
  "status": "proven",
42
- "evidence": ["src/core/profiles.ts", "tests/profiles.test.ts"]
42
+ "evidence": ["src/core/catalog/profiles.ts", "tests/profiles.test.ts"]
43
43
  },
44
44
  {
45
45
  "id": "selection.maximum",
@@ -47,7 +47,10 @@
47
47
  "summary": "Maximum selection keeps optional components in Loadout's managed library rather than activating every component.",
48
48
  "evidenceClass": "integration-verified",
49
49
  "status": "bounded",
50
- "evidence": ["src/core/active-set.ts", "tests/active-set.test.ts"]
50
+ "evidence": [
51
+ "src/core/workspace/active-set.ts",
52
+ "tests/active-set.test.ts"
53
+ ]
51
54
  },
52
55
  {
53
56
  "id": "agents.support",
@@ -56,7 +59,7 @@
56
59
  "evidenceClass": "integration-verified",
57
60
  "status": "bounded",
58
61
  "evidence": [
59
- "src/core/adapters.ts",
62
+ "src/core/agents/adapters.ts",
60
63
  "tests/adapters.test.ts",
61
64
  "tests/adapter-conformance.test.ts"
62
65
  ]
@@ -79,7 +82,7 @@
79
82
  "evidenceClass": "integration-verified",
80
83
  "status": "proven",
81
84
  "evidence": [
82
- "src/core/install.ts",
85
+ "src/core/install/install.ts",
83
86
  "tests/transaction.test.ts",
84
87
  "tests/install.test.ts"
85
88
  ]
@@ -90,7 +93,7 @@
90
93
  "summary": "Update workflows present a bounded local plan before an explicit apply step.",
91
94
  "evidenceClass": "integration-verified",
92
95
  "status": "proven",
93
- "evidence": ["src/core/update.ts", "tests/update.test.ts"]
96
+ "evidence": ["src/core/install/update.ts", "tests/update.test.ts"]
94
97
  },
95
98
  {
96
99
  "id": "updates.saved-profile",
@@ -99,8 +102,8 @@
99
102
  "evidenceClass": "integration-verified",
100
103
  "status": "proven",
101
104
  "evidence": [
102
- "src/core/profile-state.ts",
103
- "src/core/update.ts",
105
+ "src/core/workspace/profile-state.ts",
106
+ "src/core/install/update.ts",
104
107
  "tests/profile-state.test.ts",
105
108
  "tests/update.test.ts"
106
109
  ]
@@ -111,7 +114,7 @@
111
114
  "summary": "Managed installation treats recursively empty leftover skill directories as unoccupied while retaining collision protection for files and symlinks.",
112
115
  "evidenceClass": "integration-verified",
113
116
  "status": "proven",
114
- "evidence": ["src/core/install.ts", "tests/install.test.ts"]
117
+ "evidence": ["src/core/install/install.ts", "tests/install.test.ts"]
115
118
  },
116
119
  {
117
120
  "id": "rollback.snapshot",
@@ -120,7 +123,7 @@
120
123
  "evidenceClass": "integration-verified",
121
124
  "status": "proven",
122
125
  "evidence": [
123
- "src/core/snapshot.ts",
126
+ "src/core/install/snapshot.ts",
124
127
  "tests/snapshot.test.ts",
125
128
  "tests/transaction.test.ts"
126
129
  ]
@@ -131,7 +134,7 @@
131
134
  "summary": "Recommendations expose bounded repository and local evidence rather than universal quality claims.",
132
135
  "evidenceClass": "unit-verified",
133
136
  "status": "bounded",
134
- "evidence": ["src/core/recommend.ts", "tests/recommend.test.ts"]
137
+ "evidence": ["src/core/workspace/recommend.ts", "tests/recommend.test.ts"]
135
138
  },
136
139
  {
137
140
  "id": "trust.stages",
@@ -140,7 +143,7 @@
140
143
  "evidenceClass": "structural",
141
144
  "status": "proven",
142
145
  "evidence": [
143
- "src/core/profiles.ts",
146
+ "src/core/catalog/profiles.ts",
144
147
  "tests/profiles.test.ts",
145
148
  "docs/CATALOG_POLICY.md"
146
149
  ]
@@ -152,7 +155,7 @@
152
155
  "evidenceClass": "integration-verified",
153
156
  "status": "proven",
154
157
  "evidence": [
155
- "src/core/github-discovery.ts",
158
+ "src/core/discovery/github-discovery.ts",
156
159
  "tests/daily-discovery.test.ts",
157
160
  "tests/review-queue.test.ts"
158
161
  ]
@@ -177,7 +180,7 @@
177
180
  "status": "proven",
178
181
  "evidence": [
179
182
  "src/cli.ts",
180
- "src/core/mcp-recipes.ts",
183
+ "src/core/runtime/mcp-recipes.ts",
181
184
  "tests/cli-help.test.ts",
182
185
  "tests/mcp-recipes.test.ts"
183
186
  ]
@@ -188,7 +191,7 @@
188
191
  "summary": "MCP configuration uses explicit plans and keeps credentials outside persisted shared manifests.",
189
192
  "evidenceClass": "integration-verified",
190
193
  "status": "proven",
191
- "evidence": ["src/core/mcp.ts", "tests/mcp-config.test.ts"]
194
+ "evidence": ["src/core/runtime/mcp.ts", "tests/mcp-config.test.ts"]
192
195
  },
193
196
  {
194
197
  "id": "manifests.portability",
@@ -197,7 +200,7 @@
197
200
  "evidenceClass": "structural",
198
201
  "status": "proven",
199
202
  "evidence": [
200
- "src/core/manifest.ts",
203
+ "src/core/workspace/manifest.ts",
201
204
  "src/shared/schemas.ts",
202
205
  "tests/manifest.test.ts"
203
206
  ]
@@ -209,8 +212,8 @@
209
212
  "evidenceClass": "integration-verified",
210
213
  "status": "bounded",
211
214
  "evidence": [
212
- "src/core/uninstall.ts",
213
- "src/core/remove.ts",
215
+ "src/core/install/uninstall.ts",
216
+ "src/core/install/remove.ts",
214
217
  "tests/uninstall.test.ts"
215
218
  ]
216
219
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loadout-ai",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Universal upgrade manager for AI coding agents",
@@ -11,6 +11,7 @@
11
11
  "files": [
12
12
  "dist/src",
13
13
  "catalog",
14
+ "skills",
14
15
  "docs",
15
16
  "README.md",
16
17
  "CHANGELOG.md",
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: loadout-curator
3
+ description: Decide which agent skills, MCP servers, and tools should be active for the current repository, and keep that set current. Use when the user asks what skills they should install, why an agent is missing context about their stack, whether their setup is up to date, or when starting work in an unfamiliar codebase.
4
+ ---
5
+
6
+ # Loadout Curator
7
+
8
+ Match the active skill set to the repository in front of you. Too few skills and
9
+ the agent lacks context; too many and every prompt carries weight it does not
10
+ need.
11
+
12
+ This skill wraps the `loadout` CLI so the catalog, provenance, and safety
13
+ findings stay current rather than being copied into this file.
14
+
15
+ ## Prerequisite
16
+
17
+ ```bash
18
+ loadout --version
19
+ ```
20
+
21
+ If that fails, tell the user to install it (`npm install --global loadout-ai`)
22
+ and stop; do not guess at catalog contents.
23
+
24
+ ## Starting work in a repository
25
+
26
+ Read what the codebase actually is before suggesting anything:
27
+
28
+ ```bash
29
+ loadout recommend --project .
30
+ ```
31
+
32
+ This prints detected signals (languages, frameworks, test runners) and
33
+ rule-based suggestions with a confidence label. The signals are the useful part
34
+ — they tell you what the repository is without you reading every file.
35
+
36
+ Report the detected stack first, then the suggestions worth acting on. Skip
37
+ low-confidence suggestions unless the user asks for the full list.
38
+
39
+ `recommend` reads the project and the catalog. It does not prove quality, and it
40
+ says so; repeat that framing rather than presenting suggestions as verified.
41
+
42
+ ## Proposing an active set
43
+
44
+ ```bash
45
+ loadout optimize --project .
46
+ ```
47
+
48
+ This proposes which already-downloaded library skills should be active here.
49
+ Use it when the user has a Maximum-mode library, or after `recommend` shows the
50
+ project needs something different from what is on.
51
+
52
+ Present the proposal as a diff in plain words — what turns on, what turns off,
53
+ and why — before the user approves. Both commands are read-only until `--yes`.
54
+
55
+ ## Installing something new
56
+
57
+ ```bash
58
+ loadout setup --mode custom --package <id> # preview
59
+ loadout setup --mode custom --package <id> --yes # apply
60
+ ```
61
+
62
+ Never run the `--yes` form on your own initiative. Show the preview, summarize
63
+ what it adds and to which agents, and let the user approve. Loadout snapshots
64
+ before writing, and `loadout rollback` undoes the last apply — say so, because
65
+ it lowers the cost of trying something.
66
+
67
+ If the preview reports safety findings (scripts, network domains, instruction
68
+ overrides), read them out specifically. Do not summarize a finding as "minor."
69
+
70
+ ## Checking whether the setup is current
71
+
72
+ ```bash
73
+ loadout status # health grade and what is managed
74
+ loadout health # safer updates and local drift
75
+ loadout alerts # archived, stale, or changed upstream sources
76
+ ```
77
+
78
+ Run these when the user asks whether their setup is up to date, or when an agent
79
+ behaves oddly and stale or drifted skills could explain it.
80
+
81
+ `alerts` reporting an archived upstream is worth raising unprompted — an
82
+ archived source will not receive fixes.
83
+
84
+ ## Inspecting before trusting
85
+
86
+ For a source not yet in the catalog:
87
+
88
+ ```bash
89
+ loadout inspect --repository <owner/name>
90
+ ```
91
+
92
+ This clones at an immutable commit and classifies what it finds. Use it when the
93
+ user asks about a repository you cannot otherwise vouch for. Report what it
94
+ actually contains rather than what its README claims.
95
+
96
+ ## Judgment this skill does not replace
97
+
98
+ - A large active set is not automatically wrong; a monorepo touching several
99
+ stacks legitimately needs more than a single-purpose service.
100
+ - Detected signals describe dependencies, not intent. A repository with a test
101
+ runner installed but no tests still needs testing skills.
102
+ - The catalog is a review queue with provenance, not a quality ranking. High
103
+ star counts are evidence of popularity only.
104
+ - Never enable an MCP server that needs credentials without walking the user
105
+ through what it will access first.
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: loadout-router
3
+ description: Choose the right model tier and agent for a coding task, and hand work off between Claude Code and Codex. Use when the user asks which model to use, mentions running low on usage or quota, wants to save tokens or cost, asks whether to switch to Opus/Sonnet/Haiku or a GPT tier, or wants to delegate a task to another agent.
4
+ ---
5
+
6
+ # Loadout Router
7
+
8
+ Route each coding task to the cheapest model that still does it well, and hand
9
+ work between agents when a different one is better suited.
10
+
11
+ This skill wraps the `loadout` CLI, so the model catalog and pricing stay
12
+ current with the installed version rather than going stale in this file.
13
+
14
+ ## Prerequisite
15
+
16
+ Check once per session:
17
+
18
+ ```bash
19
+ loadout --version
20
+ ```
21
+
22
+ If that fails, tell the user to install it (`npm install --global loadout-ai`)
23
+ and answer from general knowledge instead of guessing at specifics.
24
+
25
+ ## Choosing a model
26
+
27
+ Run the router with the task described in plain words:
28
+
29
+ ```bash
30
+ loadout route <task description>
31
+ ```
32
+
33
+ It classifies the task into one of six phases — plan, implement, review, test,
34
+ debug, document — and prints the recommended tier, the models in that tier with
35
+ current prices, which of the user's installed agents can run them, and a cheaper
36
+ fallback with its tradeoff.
37
+
38
+ Report the recommendation and the reason. Name the actual model, not just the
39
+ tier. If the output lists a `Conserve:` alternative, mention it only when the
40
+ user cares about cost or quota, otherwise it is noise.
41
+
42
+ When the user is explicit about the phase, skip classification:
43
+
44
+ ```bash
45
+ loadout route --phase review
46
+ ```
47
+
48
+ ## When the user is low on usage
49
+
50
+ If the user mentions running out, being rate limited, conserving quota, or
51
+ stretching a plan, add `--conserve`:
52
+
53
+ ```bash
54
+ loadout route --conserve <task description>
55
+ ```
56
+
57
+ This drops each phase one tier and prints the tradeoff you are accepting. Say
58
+ what is being given up — "shallower architectural reasoning, so review the plan
59
+ more carefully" — rather than presenting it as a free win.
60
+
61
+ Neither Claude Code nor Codex exposes remaining quota programmatically, so never
62
+ claim to know how much the user has left. `--conserve` is a user-driven choice,
63
+ not a measurement.
64
+
65
+ ## Comparing models and cost
66
+
67
+ ```bash
68
+ loadout route --models
69
+ loadout route --models --provider anthropic
70
+ loadout route --models --tier fast
71
+ loadout route --cost
72
+ ```
73
+
74
+ Use these when the user asks what is available or what something costs. Prices
75
+ are per-million-token list rates; actual spend depends on prompt size, so give
76
+ ratios ("roughly 4x cheaper") rather than predicting a dollar total.
77
+
78
+ ## Handing work to another agent
79
+
80
+ When a different agent suits the task better — or the user asks to delegate —
81
+ use the handoff log. Check it is set up:
82
+
83
+ ```bash
84
+ loadout handoff status
85
+ ```
86
+
87
+ If uninitialized, run `loadout handoff init` first. Then send the task:
88
+
89
+ ```bash
90
+ loadout handoff send codex "write unit tests for the auth module" --context "see src/auth.ts"
91
+ ```
92
+
93
+ Put anything the receiving agent needs into `--context`: file paths, the
94
+ decision you already made, what you deliberately left out. The other agent has
95
+ none of this conversation.
96
+
97
+ Sending a task is a real side effect on a shared file. Confirm with the user
98
+ before sending unless they asked for the handoff themselves.
99
+
100
+ ## Reading your own inbox
101
+
102
+ At the start of a session, and after finishing a task, check whether another
103
+ agent left you work:
104
+
105
+ ```bash
106
+ loadout handoff inbox claude-code
107
+ ```
108
+
109
+ If it lists tasks, work them in order and run the `loadout handoff done <id>`
110
+ command it prints for each one. If it reports none, continue as normal and do
111
+ not mention it.
112
+
113
+ ## Judgment this skill does not replace
114
+
115
+ - A "simple" task in an unfamiliar or high-risk area still deserves a stronger
116
+ model. The classifier reads keywords, not stakes.
117
+ - Security-sensitive, migration, and data-loss paths are worth frontier tier
118
+ regardless of what phase they classify as.
119
+ - If the user has already chosen a model, do not argue unless the choice is
120
+ clearly wrong for the work.
File without changes
File without changes
File without changes
File without changes