whywhy-mcp 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.
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +110 -0
- package/dist/cli.js.map +1 -0
- package/dist/decisions.d.ts +63 -0
- package/dist/decisions.js +174 -0
- package/dist/decisions.js.map +1 -0
- package/dist/git.d.ts +14 -0
- package/dist/git.js +121 -0
- package/dist/git.js.map +1 -0
- package/dist/guidance.d.ts +8 -0
- package/dist/guidance.js +43 -0
- package/dist/guidance.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +179 -0
- package/dist/index.js.map +1 -0
- package/dist/schema.d.ts +460 -0
- package/dist/schema.js +139 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +45 -0
- package/dist/store.js +181 -0
- package/dist/store.js.map +1 -0
- package/package.json +58 -0
package/dist/store.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ConfigSchema, DEFAULT_CONFIG, DecisionRecordSchema, IndexSchema, SCHEMA_VERSION, } from "./schema.js";
|
|
4
|
+
/**
|
|
5
|
+
* The on-disk decision store.
|
|
6
|
+
*
|
|
7
|
+
* Layout (relative to repo root):
|
|
8
|
+
* .whywhy/
|
|
9
|
+
* config.json
|
|
10
|
+
* index.json
|
|
11
|
+
* decisions/
|
|
12
|
+
* DR-0001.json
|
|
13
|
+
* ...
|
|
14
|
+
*
|
|
15
|
+
* Records are never deleted. The index is a derived, rolled-up view kept in
|
|
16
|
+
* sync on every write, but can be rebuilt from the decision files if needed.
|
|
17
|
+
*/
|
|
18
|
+
export class DecisionStore {
|
|
19
|
+
root;
|
|
20
|
+
storeDir;
|
|
21
|
+
decisionsDir;
|
|
22
|
+
indexPath;
|
|
23
|
+
configPath;
|
|
24
|
+
constructor(repoRoot, storePath = ".whywhy") {
|
|
25
|
+
this.root = repoRoot;
|
|
26
|
+
this.storeDir = path.resolve(repoRoot, storePath);
|
|
27
|
+
this.decisionsDir = path.join(this.storeDir, "decisions");
|
|
28
|
+
this.indexPath = path.join(this.storeDir, "index.json");
|
|
29
|
+
this.configPath = path.join(this.storeDir, "config.json");
|
|
30
|
+
}
|
|
31
|
+
async exists() {
|
|
32
|
+
try {
|
|
33
|
+
await fs.access(this.indexPath);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Create the store directories and seed config/index if missing. */
|
|
41
|
+
async init(config = {}) {
|
|
42
|
+
await fs.mkdir(this.decisionsDir, { recursive: true });
|
|
43
|
+
let cfg;
|
|
44
|
+
try {
|
|
45
|
+
cfg = await this.readConfig();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
cfg = ConfigSchema.parse({ ...DEFAULT_CONFIG, ...config });
|
|
49
|
+
await this.writeConfig(cfg);
|
|
50
|
+
}
|
|
51
|
+
if (!(await this.exists())) {
|
|
52
|
+
const emptyIndex = {
|
|
53
|
+
schema_version: SCHEMA_VERSION,
|
|
54
|
+
next_id: 1,
|
|
55
|
+
decisions: [],
|
|
56
|
+
};
|
|
57
|
+
await this.writeIndex(emptyIndex);
|
|
58
|
+
}
|
|
59
|
+
return cfg;
|
|
60
|
+
}
|
|
61
|
+
async readConfig() {
|
|
62
|
+
const raw = await fs.readFile(this.configPath, "utf8");
|
|
63
|
+
return ConfigSchema.parse(JSON.parse(raw));
|
|
64
|
+
}
|
|
65
|
+
async writeConfig(config) {
|
|
66
|
+
await fs.mkdir(this.storeDir, { recursive: true });
|
|
67
|
+
await writeJson(this.configPath, config);
|
|
68
|
+
}
|
|
69
|
+
async readIndex() {
|
|
70
|
+
const raw = await fs.readFile(this.indexPath, "utf8");
|
|
71
|
+
return IndexSchema.parse(JSON.parse(raw));
|
|
72
|
+
}
|
|
73
|
+
async writeIndex(index) {
|
|
74
|
+
await writeJson(this.indexPath, index);
|
|
75
|
+
}
|
|
76
|
+
recordPath(id) {
|
|
77
|
+
return path.join(this.decisionsDir, `${id}.json`);
|
|
78
|
+
}
|
|
79
|
+
async readRecord(id) {
|
|
80
|
+
const raw = await fs.readFile(this.recordPath(id), "utf8");
|
|
81
|
+
return DecisionRecordSchema.parse(JSON.parse(raw));
|
|
82
|
+
}
|
|
83
|
+
async tryReadRecord(id) {
|
|
84
|
+
try {
|
|
85
|
+
return await this.readRecord(id);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async writeRecord(record) {
|
|
92
|
+
DecisionRecordSchema.parse(record);
|
|
93
|
+
await fs.mkdir(this.decisionsDir, { recursive: true });
|
|
94
|
+
await writeJson(this.recordPath(record.id), record);
|
|
95
|
+
await this.upsertIndexEntry(record);
|
|
96
|
+
}
|
|
97
|
+
/** Reserve the next sequential ID, advancing the index counter. */
|
|
98
|
+
async allocateId() {
|
|
99
|
+
const index = await this.readIndex();
|
|
100
|
+
const id = `DR-${String(index.next_id).padStart(4, "0")}`;
|
|
101
|
+
index.next_id += 1;
|
|
102
|
+
await this.writeIndex(index);
|
|
103
|
+
return { id, index };
|
|
104
|
+
}
|
|
105
|
+
/** Insert or replace a record's index entry and persist the index. */
|
|
106
|
+
async upsertIndexEntry(record) {
|
|
107
|
+
const index = await this.readIndex();
|
|
108
|
+
const entry = {
|
|
109
|
+
id: record.id,
|
|
110
|
+
title: record.title,
|
|
111
|
+
category: record.category,
|
|
112
|
+
status: record.status,
|
|
113
|
+
tags: record.tags,
|
|
114
|
+
updated_at: record.updated_at,
|
|
115
|
+
};
|
|
116
|
+
const i = index.decisions.findIndex((d) => d.id === record.id);
|
|
117
|
+
if (i >= 0)
|
|
118
|
+
index.decisions[i] = entry;
|
|
119
|
+
else
|
|
120
|
+
index.decisions.push(entry);
|
|
121
|
+
await this.writeIndex(index);
|
|
122
|
+
}
|
|
123
|
+
async listEntries() {
|
|
124
|
+
const index = await this.readIndex();
|
|
125
|
+
return index.decisions;
|
|
126
|
+
}
|
|
127
|
+
async readAllRecords() {
|
|
128
|
+
const entries = await this.listEntries();
|
|
129
|
+
const records = [];
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const rec = await this.tryReadRecord(entry.id);
|
|
132
|
+
if (rec)
|
|
133
|
+
records.push(rec);
|
|
134
|
+
}
|
|
135
|
+
return records;
|
|
136
|
+
}
|
|
137
|
+
/** Rebuild index.json from the decision files on disk. */
|
|
138
|
+
async rebuildIndex() {
|
|
139
|
+
let files = [];
|
|
140
|
+
try {
|
|
141
|
+
files = await fs.readdir(this.decisionsDir);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
files = [];
|
|
145
|
+
}
|
|
146
|
+
const decisions = [];
|
|
147
|
+
let maxId = 0;
|
|
148
|
+
for (const file of files) {
|
|
149
|
+
if (!file.endsWith(".json"))
|
|
150
|
+
continue;
|
|
151
|
+
const id = file.replace(/\.json$/, "");
|
|
152
|
+
const rec = await this.tryReadRecord(id);
|
|
153
|
+
if (!rec)
|
|
154
|
+
continue;
|
|
155
|
+
decisions.push({
|
|
156
|
+
id: rec.id,
|
|
157
|
+
title: rec.title,
|
|
158
|
+
category: rec.category,
|
|
159
|
+
status: rec.status,
|
|
160
|
+
tags: rec.tags,
|
|
161
|
+
updated_at: rec.updated_at,
|
|
162
|
+
});
|
|
163
|
+
const n = Number(rec.id.replace("DR-", ""));
|
|
164
|
+
if (Number.isFinite(n))
|
|
165
|
+
maxId = Math.max(maxId, n);
|
|
166
|
+
}
|
|
167
|
+
decisions.sort((a, b) => a.id.localeCompare(b.id));
|
|
168
|
+
const index = {
|
|
169
|
+
schema_version: SCHEMA_VERSION,
|
|
170
|
+
next_id: maxId + 1,
|
|
171
|
+
decisions,
|
|
172
|
+
};
|
|
173
|
+
await this.writeIndex(index);
|
|
174
|
+
return index;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function writeJson(filePath, data) {
|
|
178
|
+
const json = JSON.stringify(data, null, 2) + "\n";
|
|
179
|
+
await fs.writeFile(filePath, json, "utf8");
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAEL,YAAY,EACZ,cAAc,EAGd,oBAAoB,EAEpB,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,UAAU,CAAS;IAE5B,YAAY,QAAgB,EAAE,SAAS,GAAG,SAAS;QACjD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,IAAI,CAAC,SAA0B,EAAE;QACrC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC3D,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAkB;gBAChC,cAAc,EAAE,cAAc;gBAC9B,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,EAAE;aACd,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAoB;QACnC,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAsB;QACtC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,UAAU;QACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,gBAAgB,CAAC,MAAsB;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,GAAe;YACxB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QACF,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;;YAClC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,GAAG;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,YAAY;QAChB,IAAI,KAAK,GAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,EAAE,CAAC;QACb,CAAC;QACD,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,KAAK,GAAkB;YAC3B,cAAc,EAAE,cAAc;YAC9B,OAAO,EAAE,KAAK,GAAG,CAAC;YAClB,SAAS;SACV,CAAC;QACF,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAa;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "whywhy-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Agent-agnostic MCP server that records WHY architectural, product, and development decisions are made during AI-assisted coding.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Micky Multani",
|
|
7
|
+
"homepage": "https://github.com/mickymultani/whywhy#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/mickymultani/whywhy.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/mickymultani/whywhy/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"bin": {
|
|
17
|
+
"whywhy-mcp": "dist/cli.js"
|
|
18
|
+
},
|
|
19
|
+
"main": "dist/index.js",
|
|
20
|
+
"types": "dist/index.d.ts",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc",
|
|
31
|
+
"dev": "tsx src/cli.ts",
|
|
32
|
+
"server": "tsx src/index.ts",
|
|
33
|
+
"start": "node dist/index.js",
|
|
34
|
+
"prepublishOnly": "npm run build",
|
|
35
|
+
"typecheck": "tsc --noEmit"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"mcp",
|
|
39
|
+
"model-context-protocol",
|
|
40
|
+
"claude",
|
|
41
|
+
"decision-records",
|
|
42
|
+
"adr",
|
|
43
|
+
"ai-coding"
|
|
44
|
+
],
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
50
|
+
"simple-git": "^3.27.0",
|
|
51
|
+
"zod": "^3.23.8"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/node": "^22.10.0",
|
|
55
|
+
"tsx": "^4.19.2",
|
|
56
|
+
"typescript": "^5.7.2"
|
|
57
|
+
}
|
|
58
|
+
}
|