esp-modkit 0.1.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 (85) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +35 -0
  3. data/LICENSE +21 -0
  4. data/README.md +117 -0
  5. data/docs/architecture.md +125 -0
  6. data/docs/authoring-guide.md +206 -0
  7. data/docs/getting-started.md +183 -0
  8. data/docs/reference/api/active-project.md +22 -0
  9. data/docs/reference/api/agent.md +24 -0
  10. data/docs/reference/api/docs-generator.md +20 -0
  11. data/docs/reference/api/http-server.md +46 -0
  12. data/docs/reference/api/index.md +38 -0
  13. data/docs/reference/api/introspection.md +17 -0
  14. data/docs/reference/api/mcp-installer.md +26 -0
  15. data/docs/reference/api/mcp-server.md +27 -0
  16. data/docs/reference/api/mw-builder.md +14 -0
  17. data/docs/reference/api/mw-data-files.md +20 -0
  18. data/docs/reference/api/mw-dialogue-dsl.md +58 -0
  19. data/docs/reference/api/mw-i18n.md +20 -0
  20. data/docs/reference/api/mw-linter.md +18 -0
  21. data/docs/reference/api/mw-loader.md +26 -0
  22. data/docs/reference/api/mw-openmw-config.md +15 -0
  23. data/docs/reference/api/mw-operations.md +24 -0
  24. data/docs/reference/api/mw-preflight.md +17 -0
  25. data/docs/reference/api/mw-reference-index.md +21 -0
  26. data/docs/reference/api/mw-scaffolder.md +13 -0
  27. data/docs/reference/api/mw-script-blob.md +31 -0
  28. data/docs/reference/api/mw-script-extractor.md +17 -0
  29. data/docs/reference/api/operations.md +25 -0
  30. data/docs/reference/api/plugins.md +24 -0
  31. data/docs/reference/api/preferences.md +13 -0
  32. data/docs/reference/api/project-marker.md +23 -0
  33. data/docs/reference/api/providers.md +22 -0
  34. data/docs/reference/api/recents.md +17 -0
  35. data/docs/reference/api/ui.md +21 -0
  36. data/docs/reference/api/vcs.md +17 -0
  37. data/docs/reference/api/watcher.md +11 -0
  38. data/docs/reference/commands.md +271 -0
  39. data/docs/walkthrough.md +193 -0
  40. data/exe/esp +10 -0
  41. data/lib/esp/active_project.rb +71 -0
  42. data/lib/esp/agent.rb +104 -0
  43. data/lib/esp/cli/docs.rb +44 -0
  44. data/lib/esp/cli/i18n.rb +67 -0
  45. data/lib/esp/cli/mcp.rb +52 -0
  46. data/lib/esp/cli/plugins.rb +42 -0
  47. data/lib/esp/cli/refs.rb +137 -0
  48. data/lib/esp/cli/support.rb +87 -0
  49. data/lib/esp/cli.rb +317 -0
  50. data/lib/esp/docs_generator.rb +148 -0
  51. data/lib/esp/http_server.rb +232 -0
  52. data/lib/esp/introspection.rb +151 -0
  53. data/lib/esp/mcp_installer.rb +122 -0
  54. data/lib/esp/mcp_server.rb +465 -0
  55. data/lib/esp/mw/builder.rb +71 -0
  56. data/lib/esp/mw/data_files.rb +67 -0
  57. data/lib/esp/mw/dialogue_dsl.rb +209 -0
  58. data/lib/esp/mw/i18n.rb +113 -0
  59. data/lib/esp/mw/linter.rb +103 -0
  60. data/lib/esp/mw/loader.rb +130 -0
  61. data/lib/esp/mw/openmw_config.rb +138 -0
  62. data/lib/esp/mw/operations.rb +374 -0
  63. data/lib/esp/mw/preflight.rb +161 -0
  64. data/lib/esp/mw/reference_index.rb +182 -0
  65. data/lib/esp/mw/scaffolder.rb +197 -0
  66. data/lib/esp/mw/script_blob.rb +87 -0
  67. data/lib/esp/mw/script_extractor.rb +85 -0
  68. data/lib/esp/mw/tes3conv.rb +38 -0
  69. data/lib/esp/operations.rb +285 -0
  70. data/lib/esp/plugins.rb +75 -0
  71. data/lib/esp/preferences.rb +63 -0
  72. data/lib/esp/project_marker.rb +99 -0
  73. data/lib/esp/providers/anthropic.rb +74 -0
  74. data/lib/esp/providers/ollama.rb +102 -0
  75. data/lib/esp/providers/openai.rb +91 -0
  76. data/lib/esp/providers.rb +76 -0
  77. data/lib/esp/recents.rb +74 -0
  78. data/lib/esp/ui.rb +144 -0
  79. data/lib/esp/vcs.rb +112 -0
  80. data/lib/esp/version.rb +11 -0
  81. data/lib/esp/watcher.rb +55 -0
  82. data/lib/esp.rb +85 -0
  83. data/locales/en.yml +164 -0
  84. data/locales/fr.yml +10 -0
  85. metadata +241 -0
data/lib/esp.rb ADDED
@@ -0,0 +1,85 @@
1
+ module Esp
2
+ ROOT = File.expand_path('..', __dir__)
3
+ end
4
+
5
+ # Single load manifest for the toolchain. Components no longer require each
6
+ # other; they're loaded here once, in dependency order (a file that
7
+ # references another Esp constant at load time — e.g. Operations::ERROR_CODES
8
+ # naming Loader/Tes3conv errors — must come after it). Add new files here.
9
+ #
10
+ # Layout (step 22.5): top-level `lib/esp/` is the engine-agnostic shell;
11
+ # `lib/esp/mw/` is the Morrowind plugin. Future plugins (Oblivion, …) get
12
+ # their own subdirectory and parallel load section below.
13
+
14
+ require_relative 'esp/version'
15
+ require_relative 'esp/ui'
16
+
17
+ # Engine-agnostic core (shell). Order: leaf modules first, then anything
18
+ # that names them in constants/registry at load time.
19
+ require_relative 'esp/introspection'
20
+ require_relative 'esp/docs_generator'
21
+ require_relative 'esp/vcs'
22
+ require_relative 'esp/active_project'
23
+ require_relative 'esp/recents'
24
+ require_relative 'esp/preferences'
25
+ require_relative 'esp/project_marker'
26
+
27
+ # Game-plugin seam. Registry loaded before plugin modules self-register
28
+ # (in the plugin section below) and before Operations.dispatch reads it.
29
+ # Empty at this point; populated when each plugin's Operations file requires
30
+ # back into it.
31
+ require_relative 'esp/plugins'
32
+
33
+ # LLM provider seam (agnostic — providers are language-model backends, not
34
+ # game-specific). Registry loaded before the self-registering providers,
35
+ # both before Operations/Agent which reference Esp::Providers.
36
+ require_relative 'esp/providers'
37
+ require_relative 'esp/providers/anthropic'
38
+ require_relative 'esp/providers/openai'
39
+ require_relative 'esp/providers/ollama'
40
+
41
+ # Engine-agnostic Operations façade (shell ops: open_project, providers,
42
+ # preferences, recents, diff/approve/reject, ollama_models, version/health).
43
+ require_relative 'esp/operations'
44
+
45
+ # Engine-agnostic agent loop. Composed before the frontends but after the
46
+ # Operations façade it dispatches into.
47
+ require_relative 'esp/agent'
48
+
49
+ # —————————————————————————————————————————————————————————————————————————
50
+ # Plugin: Morrowind (TES3). Loaded under Esp::Mw::*; depends on shell above.
51
+ # —————————————————————————————————————————————————————————————————————————
52
+
53
+ # Mw plugin core / leaf modules.
54
+ require_relative 'esp/mw/script_blob'
55
+ require_relative 'esp/mw/openmw_config'
56
+ require_relative 'esp/mw/i18n'
57
+ require_relative 'esp/mw/tes3conv'
58
+ require_relative 'esp/mw/data_files'
59
+ require_relative 'esp/mw/dialogue_dsl'
60
+ require_relative 'esp/mw/reference_index'
61
+ require_relative 'esp/mw/preflight'
62
+ require_relative 'esp/mw/loader'
63
+
64
+ # Mw plugin service layer.
65
+ require_relative 'esp/mw/scaffolder'
66
+ require_relative 'esp/mw/script_extractor'
67
+ require_relative 'esp/mw/builder'
68
+ require_relative 'esp/mw/linter'
69
+ require_relative 'esp/mw/operations'
70
+ require_relative 'esp/watcher' # uses Esp::Mw::Builder
71
+
72
+ # Frontends — last, because they compose ROUTES/TOOLS from both shell ops
73
+ # (Esp::Operations) and plugin ops (Esp::Mw::Operations).
74
+ require_relative 'esp/http_server'
75
+ require_relative 'esp/mcp_server'
76
+ require_relative 'esp/mcp_installer'
77
+
78
+ # CLI: the Support mixin and every subcommand before the root that mounts them.
79
+ require_relative 'esp/cli/support'
80
+ require_relative 'esp/cli/docs'
81
+ require_relative 'esp/cli/refs'
82
+ require_relative 'esp/cli/i18n'
83
+ require_relative 'esp/cli/plugins'
84
+ require_relative 'esp/cli/mcp'
85
+ require_relative 'esp/cli'
data/locales/en.yml ADDED
@@ -0,0 +1,164 @@
1
+ # Tool-UI strings for mw itself (not mod content — that's mods/<Mod>/i18n/).
2
+ # Dot-pathed keys, %{named} interpolation. en is the default + fallback;
3
+ # add locales/<lang>.yml to translate. See lib/mw/ui.rb.
4
+ cli:
5
+ no_project_context: "warning: no project context (no --root, ESP_PROJECT_ROOT, or .esp/project.json found by walking up) — using toolchain repo at %{root}. Run `esp init` to make this directory a project."
6
+ init:
7
+ created: "initialised esp project at %{path} (game: %{game})"
8
+ next: "next: `esp new MyMod` to scaffold a mod, then `esp build MyMod`"
9
+ already_initialised: ".esp/project.json already present at %{path} — pass --force to overwrite"
10
+ setup:
11
+ diff_driver: "Configured git diff driver 'tes3' for .esp/.esm/.omwaddon"
12
+ hooks_path: "Configured core.hooksPath -> .githooks (pre-commit runs rubocop + tests)"
13
+ new:
14
+ created: "created: %{path}"
15
+ next: "next: esp build %{mod}"
16
+ unpack:
17
+ done: "unpack: %{plugin} -> %{output}"
18
+ build:
19
+ usage: "usage: esp build <MOD> | --all"
20
+ done: "build: %{mod} -> %{output}"
21
+ install:
22
+ # The build_first / no_cfg validation moved into Esp::Mw::Operations
23
+ # at step 23.5 slice 1; CLI install dispatches through the op and gets
24
+ # those messages from errors.operations.* instead. Kept here only:
25
+ added: "added: %{line}"
26
+ present: "already present: %{line}"
27
+ copied: "copied to: %{path}"
28
+ done: "Done. Launch OpenMW and verify load order in the launcher."
29
+ lint:
30
+ ok: "ok"
31
+ summary: "%{errors} error(s), %{warnings} warning(s)"
32
+ serve:
33
+ listening: "esp serve listening on http://localhost:%{port}"
34
+ routes: "routes: GET /version /commands /refs/find POST /build /lint /scaffold /extract-scripts"
35
+ extract_scripts:
36
+ extracted: "extracted: scripts/%{id}.mwscript"
37
+ skipped: "skipped (already external): %{id}"
38
+ done: "done: %{extracted} extracted, %{skipped} skipped"
39
+ doctor:
40
+ header: "esp doctor — checking install prerequisites"
41
+ ruby_ok: "ruby %{version} (>= %{required} required)"
42
+ ruby_old: "ruby %{version} is below the required %{required} — upgrade Ruby"
43
+ esp: "esp-modkit %{version}"
44
+ tes3conv_found: "tes3conv: found at %{path}"
45
+ tes3conv_missing: "tes3conv: NOT found — install a release from https://github.com/Greatness7/tes3conv/releases, `cargo install --git https://github.com/Greatness7/tes3conv`, or via the esp Homebrew tap"
46
+ refs_present: "references index: present at %{path}"
47
+ refs_missing: "references index: not built — run `esp refs unpack && esp refs index` (lint/refs need it; build does not)"
48
+ ok: "all prerequisites satisfied"
49
+ problems: "%{count} blocking issue(s) above — esp build will not work until resolved"
50
+
51
+ # Errors raised in the library layer (and the shared no_index message).
52
+ errors:
53
+ no_index: "no index at %{db} — run `esp refs unpack && esp refs index` first"
54
+ reference_index:
55
+ no_sources: "no *.esm.json under %{dir} — run `esp refs unpack` first"
56
+ operations:
57
+ missing_field: "missing '%{field}' field"
58
+ missing_object: "missing '%{field}' object"
59
+ plugin_not_found: "plugin not found: %{plugin}"
60
+ build_first: "build first: %{esp} missing"
61
+ no_cfg: "openmw.cfg not found at %{path}"
62
+ record_needs_type: "record needs a 'type'"
63
+ record_needs_id: "non-Header records need an 'id' to upsert by"
64
+ json_only: "record_write supports only .json sources (%{file} is %{ext}); edit the source program directly"
65
+ paths_required: "'paths' must be a non-empty array of file paths"
66
+ not_a_directory: "not a directory: %{path}"
67
+ project_exists: "a project already exists at %{path}"
68
+ no_data_files: "Morrowind Data Files directory not found at %{path} (pass --copy-to PATH explicitly, or set $MORROWIND_DATA)"
69
+ providers:
70
+ unknown: "unknown provider: %{id}"
71
+ plugins:
72
+ unknown_game: "unknown game plugin: %{game} (known: %{known})"
73
+ loader:
74
+ no_source: "no source for mod %{mod} (expected one of: %{exts})"
75
+ multiple_sources: "multiple sources for mod %{mod}: %{names}"
76
+ not_found: "source not found: %{path}"
77
+ not_array: "%{path}: expected an Array of record hashes, got %{klass}"
78
+ unsupported_ext: "unsupported source extension: %{ext} (%{path})"
79
+ invalid_json: "%{file}: invalid JSON: %{message}"
80
+ subprocess_failed: "%{file} exited %{code}: %{stderr}"
81
+ subprocess_bad_json: "%{file} stdout was not valid JSON: %{message}"
82
+ interpreter_missing: "interpreter %{interpreter} not found on PATH (required for %{file})"
83
+ tes3conv:
84
+ not_found: "%{bin} not found on PATH (download a release from https://github.com/Greatness7/tes3conv/releases or `cargo install --git https://github.com/Greatness7/tes3conv`)"
85
+ failed: "tes3conv failed (no diagnostic on stderr)"
86
+ flags_hint: "hint: every record needs \"flags\": \"\" — tes3conv requires it even when empty"
87
+ scaffolder:
88
+ already_exists: "mod folder already exists: mods/%{mod} (pass --force to overwrite)"
89
+ bad_name: "mod name %{mod} must start with a letter/digit and contain only letters, digits, _ or -"
90
+ bad_format: "unknown format %{format} (one of: %{formats})"
91
+ preflight:
92
+ text_source_missing: "text_source path not found: %{path}"
93
+ non_ascii: "%{label}: non-ASCII character %{char} (U+%{hex}) at line %{line}, col %{col}"
94
+ var_too_long: "%{label}: variable name %{name} is %{length} chars; MWScript truncates around %{limit}-23, keep <= %{limit}"
95
+ master_ref_needs_mast_index: "%{cell}: reference %{id} is a master-record reference but missing `mast_index` (set 0 for plugin-local refs, or the master's index — 1 for the first listed master)"
96
+ script_extractor:
97
+ json_only: "extract-scripts only supports .json sources (got %{file})"
98
+ missing_id: "Script record missing id"
99
+ unsafe_id: "Script id %{id} contains characters unsafe for a filename"
100
+ no_text: "Script %{id} has no text to extract"
101
+ mcp_installer:
102
+ unknown_client: "unknown client: %{client} (known: %{clients})"
103
+ not_json_object: "%{path} is not a JSON object"
104
+ invalid_json: "%{path} contains invalid JSON: %{message}"
105
+ http:
106
+ invalid_body: "invalid JSON body: %{message}"
107
+ dialogue:
108
+ needs_block: "dialogue { ... } requires a block"
109
+ needs_topics: "dialogue spec needs a 'topics' array"
110
+ speaker_needs_block: "speaker requires a block"
111
+ bad_topic_type: "topic must be one of %{types}"
112
+ topic_needs_block: "topic requires a block"
113
+ nested_topics: "nested topics are not allowed"
114
+ info_outside_topic: "info must be inside a topic block"
115
+ topic_needs_name: "each topic needs a 'name'"
116
+ bad_sex: "sex must be one of %{values}"
117
+ result_script_source: "result_script_source is not supported yet; pass result_script with inline text"
118
+
119
+ refs:
120
+ unpack:
121
+ done: "unpack: %{name}.esm -> %{output}"
122
+ skip: "skip: %{source} (%{reason})"
123
+ index:
124
+ indexing: "indexing %{dir}/*.esm.json -> %{db}"
125
+ indexed: "indexed %{count} records"
126
+ find:
127
+ usage: "usage: esp refs find QUERY | --type TYPE | --like PATTERN"
128
+ no_matches: "no matches"
129
+ total_one: "1 match"
130
+ total: "%{total} matches"
131
+ truncated: "showing %{shown} of %{total} — narrow with --type or raise --limit"
132
+
133
+ i18n:
134
+ none: "no non-default-locale catalogues found"
135
+ locale: "%{locale}:"
136
+ missing: " missing: %{key}"
137
+ orphan: " orphan: %{key}"
138
+ ok: " ok"
139
+ audit:
140
+ clean: "locale catalogues clean"
141
+ undefined: "undefined keys (referenced by t() but not in en):"
142
+ unused: "unused keys (in en, never referenced):"
143
+ orphans: "%{locale}: orphan keys (not in en):"
144
+ missing: "%{locale}: %{count} missing translation(s) (fall back to en)"
145
+ item: " %{key}"
146
+
147
+ docs:
148
+ wrote: "wrote: %{path}"
149
+
150
+ plugins:
151
+ list:
152
+ config: "openmw.cfg: %{path}"
153
+ missing: "openmw.cfg not found at %{path}"
154
+ none: "no plugins found in the configured data directories"
155
+ active: "%{order} %{name}"
156
+ inactive: "-- %{name}"
157
+
158
+ mcp:
159
+ serve:
160
+ listening: "esp mcp serve: speaking MCP over stdio (Ctrl-D / EOF to stop)"
161
+ install:
162
+ result: "%{action} server '%{name}' in %{label}"
163
+ config: " config: %{path}"
164
+ restart: " restart Claude Desktop to pick up the change"
data/locales/fr.yml ADDED
@@ -0,0 +1,10 @@
1
+ # Partial French catalogue — proves the locale path end to end. Anything not
2
+ # translated here falls back to en (see lib/esp/ui.rb). Translate more keys to
3
+ # extend coverage; en.yml is the canonical key set.
4
+ cli:
5
+ build:
6
+ done: "compilation : %{mod} -> %{output}"
7
+ lint:
8
+ ok: "aucun problème"
9
+ errors:
10
+ no_index: "pas d'index à %{db} — lancez `esp refs unpack && esp refs index` d'abord"
metadata ADDED
@@ -0,0 +1,241 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: esp-modkit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Corey Ellis
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2026-05-31 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: anthropic
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: base64
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: listen
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.9'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.9'
54
+ - !ruby/object:Gem::Dependency
55
+ name: openai
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.64'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.64'
68
+ - !ruby/object:Gem::Dependency
69
+ name: sqlite3
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.1'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.1'
82
+ - !ruby/object:Gem::Dependency
83
+ name: thor
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.3'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.3'
96
+ - !ruby/object:Gem::Dependency
97
+ name: webrick
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.8'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.8'
110
+ - !ruby/object:Gem::Dependency
111
+ name: zstd-ruby
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.5'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.5'
124
+ description: A Ruby toolchain that compiles Morrowind plugins from source. Author
125
+ records in JSON, Ruby, Python, JavaScript, or TypeScript; esp builds them to an
126
+ .esp via tes3conv, manages scripts, translations, and dialogue, and lints against
127
+ vanilla game data. One pipeline drives the CLI, an HTTP API, an MCP server, and
128
+ an AI agent.
129
+ executables:
130
+ - esp
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - CHANGELOG.md
135
+ - LICENSE
136
+ - README.md
137
+ - docs/architecture.md
138
+ - docs/authoring-guide.md
139
+ - docs/getting-started.md
140
+ - docs/reference/api/active-project.md
141
+ - docs/reference/api/agent.md
142
+ - docs/reference/api/docs-generator.md
143
+ - docs/reference/api/http-server.md
144
+ - docs/reference/api/index.md
145
+ - docs/reference/api/introspection.md
146
+ - docs/reference/api/mcp-installer.md
147
+ - docs/reference/api/mcp-server.md
148
+ - docs/reference/api/mw-builder.md
149
+ - docs/reference/api/mw-data-files.md
150
+ - docs/reference/api/mw-dialogue-dsl.md
151
+ - docs/reference/api/mw-i18n.md
152
+ - docs/reference/api/mw-linter.md
153
+ - docs/reference/api/mw-loader.md
154
+ - docs/reference/api/mw-openmw-config.md
155
+ - docs/reference/api/mw-operations.md
156
+ - docs/reference/api/mw-preflight.md
157
+ - docs/reference/api/mw-reference-index.md
158
+ - docs/reference/api/mw-scaffolder.md
159
+ - docs/reference/api/mw-script-blob.md
160
+ - docs/reference/api/mw-script-extractor.md
161
+ - docs/reference/api/operations.md
162
+ - docs/reference/api/plugins.md
163
+ - docs/reference/api/preferences.md
164
+ - docs/reference/api/project-marker.md
165
+ - docs/reference/api/providers.md
166
+ - docs/reference/api/recents.md
167
+ - docs/reference/api/ui.md
168
+ - docs/reference/api/vcs.md
169
+ - docs/reference/api/watcher.md
170
+ - docs/reference/commands.md
171
+ - docs/walkthrough.md
172
+ - exe/esp
173
+ - lib/esp.rb
174
+ - lib/esp/active_project.rb
175
+ - lib/esp/agent.rb
176
+ - lib/esp/cli.rb
177
+ - lib/esp/cli/docs.rb
178
+ - lib/esp/cli/i18n.rb
179
+ - lib/esp/cli/mcp.rb
180
+ - lib/esp/cli/plugins.rb
181
+ - lib/esp/cli/refs.rb
182
+ - lib/esp/cli/support.rb
183
+ - lib/esp/docs_generator.rb
184
+ - lib/esp/http_server.rb
185
+ - lib/esp/introspection.rb
186
+ - lib/esp/mcp_installer.rb
187
+ - lib/esp/mcp_server.rb
188
+ - lib/esp/mw/builder.rb
189
+ - lib/esp/mw/data_files.rb
190
+ - lib/esp/mw/dialogue_dsl.rb
191
+ - lib/esp/mw/i18n.rb
192
+ - lib/esp/mw/linter.rb
193
+ - lib/esp/mw/loader.rb
194
+ - lib/esp/mw/openmw_config.rb
195
+ - lib/esp/mw/operations.rb
196
+ - lib/esp/mw/preflight.rb
197
+ - lib/esp/mw/reference_index.rb
198
+ - lib/esp/mw/scaffolder.rb
199
+ - lib/esp/mw/script_blob.rb
200
+ - lib/esp/mw/script_extractor.rb
201
+ - lib/esp/mw/tes3conv.rb
202
+ - lib/esp/operations.rb
203
+ - lib/esp/plugins.rb
204
+ - lib/esp/preferences.rb
205
+ - lib/esp/project_marker.rb
206
+ - lib/esp/providers.rb
207
+ - lib/esp/providers/anthropic.rb
208
+ - lib/esp/providers/ollama.rb
209
+ - lib/esp/providers/openai.rb
210
+ - lib/esp/recents.rb
211
+ - lib/esp/ui.rb
212
+ - lib/esp/vcs.rb
213
+ - lib/esp/version.rb
214
+ - lib/esp/watcher.rb
215
+ - locales/en.yml
216
+ - locales/fr.yml
217
+ homepage: https://github.com/ninjacazaam/esp-modkit
218
+ licenses:
219
+ - MIT
220
+ metadata:
221
+ source_code_uri: https://github.com/ninjacazaam/esp-modkit
222
+ changelog_uri: https://github.com/ninjacazaam/esp-modkit/blob/main/CHANGELOG.md
223
+ rubygems_mfa_required: 'true'
224
+ rdoc_options: []
225
+ require_paths:
226
+ - lib
227
+ required_ruby_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '3.3'
232
+ required_rubygems_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ requirements: []
238
+ rubygems_version: 3.6.6
239
+ specification_version: 4
240
+ summary: Author Morrowind plugins as source code.
241
+ test_files: []