@mnemonica/tactica 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/lib/analyzer.d.ts +4 -2
- package/lib/analyzer.js +21 -11
- package/lib/cli.js +9 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/types.d.ts +59 -7
- package/lib/types.js +1 -1
- package/lib/writer.d.ts +22 -6
- package/lib/writer.js +79 -12
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -141,10 +141,11 @@ Tactica writes everything under the `--output` directory (default `.tactica/`).
|
|
|
141
141
|
| `registry.ts` | default mode | `declare module 'mnemonica' { interface TypeRegistry { … } }` augmentation — powers `lookup<K>()`. |
|
|
142
142
|
| `index.ts` | default mode | Re-exports everything from `types.ts` and `registry.ts`. |
|
|
143
143
|
| `index.d.ts` | with `--module-augmentation` | Single global-augmentation file (legacy mode). |
|
|
144
|
-
| `definitions.json` | always | One entry per discovered type: `{ name, location, kind: 'define'\|'decorate', parent, strictChain, blockErrors }
|
|
144
|
+
| `definitions.json` | always | One entry per discovered type: `{ name, location, kind: 'define'\|'decorate', parent, strictChain, blockErrors }`, plus `fields` (the type's own fields in declaration order, `{ name, type, optional }`) and `args` (the constructor's parameters in declaration order, `{ name, type, optional?, kind? }` — a rest parameter carries `kind: 'rest'` and no `optional`). Consumed by `mnemographica`'s Go to Definition. |
|
|
145
145
|
| `usages.json` | always | One entry per type, value is an array of `{ location, kind, code, holderScopeId?, constructorText? }` records — where each type is instantiated, referenced, accessed, or looked up. `holderScopeId` points into `scopes.json` (the innermost scope holding the usage); `constructorText` (instantiations only) is the constructor expression text actually used. Consumed by `mnemographica`'s Find References. |
|
|
146
146
|
| `flow.json` | always | Native instance-flow patterns (property reads/writes, method calls, destructuring, returns, spreads, etc.) per type. |
|
|
147
147
|
| `instrumentation.json` | always | v2 envelope. `points`: framework lifecycle crossroads (interceptors, guards, pipes, filters, middleware) detected via **plugin-supplied vocabulary** — heritage declarations, decorator sites, provider-token registrations, `consumer.apply()` wiring. Syntactic only — no dive dependency; with no plugins loaded, `points` is `[]`. `creationGraph`: the inside-out walk from every instantiation site out to the starters — see "Creation graph" below. |
|
|
148
|
+
| `control.json` | always | The lethe cross-language rendering of the same data: `callers` is the instrumentation `creationGraph`, `points` the same instrumentation points. `instrumentation.json` stays unchanged for `mnemographica`. |
|
|
148
149
|
| `modules.json` | always | Module-scope graph: every module's `exportedBindings`/`importedBindings` (functions, classes, consts, types — not only mnemonica types), project-internal `dependencies`, `builtinSpecifiers` (Node builtins are skipped entirely — both `'path'` and `'node:path'` forms), `unresolvedSpecifiers`, circular-import `cycles`, and cross-module mnemonica-type `edges`. Resolution uses `ts.resolveModuleName` with the project's compilerOptions (tsconfig `paths`, extensionless imports, index files) — no type checker. Bindings resolved into `node_modules` are marked `external: true` and never enter `dependencies`. |
|
|
149
150
|
| `scopes.json` | always | Local-scope graph: function/method/arrow scopes only (no block scopes) plus one module scope per file; variables with `typePath` (mnemonica type when known), `isParameter`, `isMutable`, and `reassignments` — each reassignment of a mutable binding is a flow-termination point. `lookup()` initializers resolve through the same tier law as the analyzer (scope-chain receiver first, then the analyzer's source-relative/root law), so scopes metadata never disagrees with the hard-fail verdicts. |
|
|
150
151
|
| `eds.json` | when EDS enabled | Execution-flow patterns (`wrap`, `current`, `getFlow`, `attachHooks` lifecycle wiring). Consumed by tools that visualize execution chains. |
|
|
@@ -776,11 +777,12 @@ class TypesWriter {
|
|
|
776
777
|
writeGlobalAugmentation(generated: GeneratedTypes): string; // → outputDir/index.d.ts
|
|
777
778
|
writeTo(filename: string, content: string): string; // → outputDir/<filename>
|
|
778
779
|
|
|
779
|
-
writeDefinitionsFile(map: Map<string, DefinitionInfo
|
|
780
|
+
writeDefinitionsFile(map: Map<string, DefinitionInfo>, graph?: TypeGraph): string; // → outputDir/definitions.json (graph adds fields/args)
|
|
780
781
|
writeUsagesFile (map: Map<string, UsageInfo[]>): string; // → outputDir/usages.json
|
|
781
782
|
writeEDSFile (map: Map<string, EDSInfo[]>): string; // → outputDir/eds.json
|
|
782
783
|
writeFlowFile (map: Map<string, FlowInfo[]>): string; // → outputDir/flow.json
|
|
783
784
|
writeInstrumentationFile(points: InstrumentationPoint[], creationGraph?: CreationGraph): string; // → outputDir/instrumentation.json
|
|
785
|
+
writeControlFile (points: InstrumentationPoint[], callers: CreationGraph): string; // → outputDir/control.json
|
|
784
786
|
writeModulesFile (graph: ModuleGraph): string; // → outputDir/modules.json
|
|
785
787
|
writeScopesFile (analysis: ScopeAnalysis): string; // → outputDir/scopes.json
|
|
786
788
|
|
|
@@ -792,7 +794,7 @@ class TypesWriter {
|
|
|
792
794
|
|
|
793
795
|
### Types
|
|
794
796
|
|
|
795
|
-
`TacticaConfig`, `TypeNode`, `TypeGraph`, `PropertyInfo`, `ConstructorParamInfo`, `AnalyzeResult`, `AnalyzeError`, `GeneratedTypes`, `DefinitionInfo`, `UsageInfo`, `UsagesJson`, `DefinitionsJson`, `EDSInfo`, `EDSJson`, `EDSKind`, `FlowInfo`, `FlowJson`, `FlowKind`, `InstrumentationKind`, `InstrumentationScope`, `InstrumentationPoint`, `InstrumentationJson`, `ModuleBindingKind`, `ModuleImportKind`, `ModuleBinding`, `ModuleInfo`, `CrossModuleUsage`, `ModuleGraph`, `ModulesJson`, `ScopeKind`, `ScopeInfo`, `ScopeVariable`, `ScopeAnalysis`, `ScopesJson`, `CreationGraphNode`, `CreationGraphEdge`, `CreationAnchor`, `CreationGraph`, `TacticaPlugin`, `InstrumentationVocabulary` — all exported from `@mnemonica/tactica`. See [`src/types.ts`](src/types.ts) for the full schema. The `mergeTacticaPlugins(plugins)` helper merges plugin vocabulary the same way the analyzer does.
|
|
797
|
+
`TacticaConfig`, `TypeNode`, `TypeGraph`, `PropertyInfo`, `ConstructorParamInfo`, `AnalyzeResult`, `AnalyzeError`, `GeneratedTypes`, `DefinitionInfo`, `DefinitionField`, `DefinitionArg`, `UsageInfo`, `UsagesJson`, `DefinitionsJson`, `EDSInfo`, `EDSJson`, `EDSKind`, `FlowInfo`, `FlowJson`, `FlowKind`, `InstrumentationKind`, `InstrumentationScope`, `InstrumentationPoint`, `InstrumentationJson`, `ControlJson`, `ModuleBindingKind`, `ModuleImportKind`, `ModuleBinding`, `ModuleInfo`, `CrossModuleUsage`, `ModuleGraph`, `ModulesJson`, `ScopeKind`, `ScopeInfo`, `ScopeVariable`, `ScopeAnalysis`, `ScopesJson`, `CreationGraphNode`, `CreationGraphEdge`, `CreationAnchor`, `CreationGraph`, `TacticaPlugin`, `InstrumentationVocabulary` — all exported from `@mnemonica/tactica`. See [`src/types.ts`](src/types.ts) for the full schema. The `mergeTacticaPlugins(plugins)` helper merges plugin vocabulary the same way the analyzer does.
|
|
796
798
|
|
|
797
799
|
## EDS (Execution Data Storage) Tracking
|
|
798
800
|
|
|
@@ -931,7 +933,7 @@ Deliberate approximations (name-based, no type checker): namespace imports count
|
|
|
931
933
|
1. **Parse** — load `tsconfig.json`, build a `ts.Program`, walk each source file's AST.
|
|
932
934
|
2. **Detect** — find `define()` and `@decorate()` calls, plus `lookup` lookups, `new` expressions, and EDS / flow patterns.
|
|
933
935
|
3. **Graph** — build a Trie of types in `TypeGraphImpl`, with parent links via the chain of `.define()` calls and `@decorate(Parent)` references.
|
|
934
|
-
4. **Generate** — emit `types.ts`, `registry.ts`, `index.ts` (default mode) or `index.d.ts` (legacy mode), plus `definitions.json`, `usages.json` (with `holderScopeId`), `flow.json`, `instrumentation.json`, `modules.json`, `scopes.json`, `hierarchy.json`/`hierarchy.txt`, `collections.json`, and optionally `eds.json`.
|
|
936
|
+
4. **Generate** — emit `types.ts`, `registry.ts`, `index.ts` (default mode) or `index.d.ts` (legacy mode), plus `definitions.json`, `usages.json` (with `holderScopeId`), `flow.json`, `instrumentation.json`, `control.json`, `modules.json`, `scopes.json`, `hierarchy.json`/`hierarchy.txt`, `collections.json`, and optionally `eds.json`.
|
|
935
937
|
5. **Write** — files land in the output directory (default `.tactica/`).
|
|
936
938
|
|
|
937
939
|
```
|
package/lib/analyzer.d.ts
CHANGED
|
@@ -77,8 +77,10 @@ export declare class MnemonicaAnalyzer {
|
|
|
77
77
|
* The collections.json manifest: one entry per minted collection, in
|
|
78
78
|
* minting order, preceded by the default-collection entry whenever
|
|
79
79
|
* default-collection types exist. The default entry has no id/location
|
|
80
|
-
* (there is no call site — unprefixed fullPaths are its identity)
|
|
81
|
-
*
|
|
80
|
+
* (there is no call site — unprefixed fullPaths are its identity).
|
|
81
|
+
* Format 1.2: the registry interface is NOT emitted (it is a
|
|
82
|
+
* TypeScript-only concern — the in-memory registryInterfaceName that
|
|
83
|
+
* types.ts/registry.ts are generated from stays on the TypeNode).
|
|
82
84
|
*/
|
|
83
85
|
getCollectionsManifest(): CollectionManifestEntry[];
|
|
84
86
|
/**
|