@synctek/forgeos 2.0.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 +386 -0
- package/dist/cli/commands/analyze.d.ts +14 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +94 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/build.d.ts +11 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +86 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/changeset.d.ts +13 -0
- package/dist/cli/commands/changeset.d.ts.map +1 -0
- package/dist/cli/commands/changeset.js +174 -0
- package/dist/cli/commands/changeset.js.map +1 -0
- package/dist/cli/commands/evidence.d.ts +12 -0
- package/dist/cli/commands/evidence.d.ts.map +1 -0
- package/dist/cli/commands/evidence.js +94 -0
- package/dist/cli/commands/evidence.js.map +1 -0
- package/dist/cli/commands/federation.d.ts +13 -0
- package/dist/cli/commands/federation.d.ts.map +1 -0
- package/dist/cli/commands/federation.js +127 -0
- package/dist/cli/commands/federation.js.map +1 -0
- package/dist/cli/commands/gate.d.ts +15 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +178 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/initiative.d.ts +13 -0
- package/dist/cli/commands/initiative.d.ts.map +1 -0
- package/dist/cli/commands/initiative.js +130 -0
- package/dist/cli/commands/initiative.js.map +1 -0
- package/dist/cli/commands/mind.d.ts +16 -0
- package/dist/cli/commands/mind.d.ts.map +1 -0
- package/dist/cli/commands/mind.js +139 -0
- package/dist/cli/commands/mind.js.map +1 -0
- package/dist/cli/commands/outcome.d.ts +12 -0
- package/dist/cli/commands/outcome.d.ts.map +1 -0
- package/dist/cli/commands/outcome.js +85 -0
- package/dist/cli/commands/outcome.js.map +1 -0
- package/dist/cli/commands/project.d.ts +13 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +128 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/review.d.ts +15 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +167 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/score.d.ts +17 -0
- package/dist/cli/commands/score.d.ts.map +1 -0
- package/dist/cli/commands/score.js +168 -0
- package/dist/cli/commands/score.js.map +1 -0
- package/dist/cli/commands/session.d.ts +13 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +133 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/trust.d.ts +16 -0
- package/dist/cli/commands/trust.d.ts.map +1 -0
- package/dist/cli/commands/trust.js +261 -0
- package/dist/cli/commands/trust.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +48 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +139 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +146 -0
- package/dist/client.js.map +1 -0
- package/dist/handlers.d.ts +11 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +424 -0
- package/dist/handlers.js.map +1 -0
- package/dist/http-server.d.ts +25 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +246 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers.d.ts +11 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/handlers.js +553 -0
- package/dist/mcp/handlers.js.map +1 -0
- package/dist/mcp/http-server.d.ts +25 -0
- package/dist/mcp/http-server.d.ts.map +1 -0
- package/dist/mcp/http-server.js +246 -0
- package/dist/mcp/http-server.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +40 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +944 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +531 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/shared/client.d.ts +59 -0
- package/dist/shared/client.d.ts.map +1 -0
- package/dist/shared/client.js +171 -0
- package/dist/shared/client.js.map +1 -0
- package/dist/shared/errors.d.ts +25 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +44 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/types.d.ts +111 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +10 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/tools.d.ts +944 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +513 -0
- package/dist/tools.js.map +1 -0
- package/dist/trust/chain.d.ts +86 -0
- package/dist/trust/chain.d.ts.map +1 -0
- package/dist/trust/chain.js +176 -0
- package/dist/trust/chain.js.map +1 -0
- package/dist/trust/git-binding.d.ts +61 -0
- package/dist/trust/git-binding.d.ts.map +1 -0
- package/dist/trust/git-binding.js +133 -0
- package/dist/trust/git-binding.js.map +1 -0
- package/dist/trust/index.d.ts +20 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +17 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/ledger.d.ts +144 -0
- package/dist/trust/ledger.d.ts.map +1 -0
- package/dist/trust/ledger.js +351 -0
- package/dist/trust/ledger.js.map +1 -0
- package/dist/trust/signing.d.ts +134 -0
- package/dist/trust/signing.d.ts.map +1 -0
- package/dist/trust/signing.js +249 -0
- package/dist/trust/signing.js.map +1 -0
- package/dist/trust/transmission.d.ts +129 -0
- package/dist/trust/transmission.d.ts.map +1 -0
- package/dist/trust/transmission.js +390 -0
- package/dist/trust/transmission.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge review` — Review operations.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge review request --project <pid> --changeset <cid> --role <role>
|
|
6
|
+
* forge review submit --project <pid> --changeset <cid> --review <rid>
|
|
7
|
+
* --status <status> --notes <notes>
|
|
8
|
+
* forge review list --project <pid> --changeset <cid>
|
|
9
|
+
* forge review approve --project <pid> --changeset <cid> --review <rid>
|
|
10
|
+
* forge review block --project <pid> --changeset <cid> --review <rid> --reason <reason>
|
|
11
|
+
*/
|
|
12
|
+
import { formatTable, formatJSON, formatSuccess, formatError, green, yellow, red, } from "../output.js";
|
|
13
|
+
function reviewStatusColor(status) {
|
|
14
|
+
const s = status.toLowerCase();
|
|
15
|
+
if (s === "approved")
|
|
16
|
+
return green(status);
|
|
17
|
+
if (s === "pending")
|
|
18
|
+
return yellow(status);
|
|
19
|
+
if (s === "blocked")
|
|
20
|
+
return red(status);
|
|
21
|
+
return status;
|
|
22
|
+
}
|
|
23
|
+
export function registerReviewCommands(parent, client) {
|
|
24
|
+
const review = parent
|
|
25
|
+
.command("review")
|
|
26
|
+
.description("Manage changeset reviews");
|
|
27
|
+
// -------------------------------------------------------------------------
|
|
28
|
+
// review request
|
|
29
|
+
// -------------------------------------------------------------------------
|
|
30
|
+
review
|
|
31
|
+
.command("request")
|
|
32
|
+
.description("Request a review for a changeset")
|
|
33
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
34
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
35
|
+
.requiredOption("--role <role>", "Review role: architect | qa_test | security | performance | reliability")
|
|
36
|
+
.option("--json", "Output raw JSON")
|
|
37
|
+
.action(async (opts) => {
|
|
38
|
+
try {
|
|
39
|
+
const data = (await client.post(`/api/projects/${opts.project}/changesets/${opts.changeset}/reviews`, { role: opts.role }));
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
console.log(formatJSON(data));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
console.log(formatSuccess(`Review requested: ${data.id}`));
|
|
45
|
+
console.log(formatTable(["Field", "Value"], [
|
|
46
|
+
["ID", data.id],
|
|
47
|
+
["Role", data.role],
|
|
48
|
+
["Status", data.status],
|
|
49
|
+
]));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.error(formatError(err));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// -------------------------------------------------------------------------
|
|
57
|
+
// review submit
|
|
58
|
+
// -------------------------------------------------------------------------
|
|
59
|
+
review
|
|
60
|
+
.command("submit")
|
|
61
|
+
.description("Submit a review verdict")
|
|
62
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
63
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
64
|
+
.requiredOption("--review <rid>", "Review ID")
|
|
65
|
+
.requiredOption("--status <status>", "Verdict: approved | blocked | pending")
|
|
66
|
+
.requiredOption("--notes <notes>", "Review summary notes")
|
|
67
|
+
.option("--json", "Output raw JSON")
|
|
68
|
+
.action(async (opts) => {
|
|
69
|
+
try {
|
|
70
|
+
const data = (await client.patch(`/api/projects/${opts.project}/changesets/${opts.changeset}/reviews/${opts.review}`, { status: opts.status, notes: opts.notes }));
|
|
71
|
+
if (opts.json) {
|
|
72
|
+
console.log(formatJSON(data));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
console.log(formatSuccess(`Review ${opts.review} updated: ${opts.status}`));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error(formatError(err));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
// review list
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
review
|
|
86
|
+
.command("list")
|
|
87
|
+
.description("List reviews for a changeset")
|
|
88
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
89
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
90
|
+
.option("--json", "Output raw JSON")
|
|
91
|
+
.action(async (opts) => {
|
|
92
|
+
try {
|
|
93
|
+
const data = await client.get(`/api/projects/${opts.project}/changesets/${opts.changeset}/reviews`);
|
|
94
|
+
if (opts.json) {
|
|
95
|
+
console.log(formatJSON(data));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const items = Array.isArray(data)
|
|
99
|
+
? data
|
|
100
|
+
: (data.reviews ?? []);
|
|
101
|
+
if (items.length === 0) {
|
|
102
|
+
console.log("No reviews found for this changeset.");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
console.log(formatTable(["ID", "Role", "Status", "Findings"], items.map((r) => [
|
|
106
|
+
r.id,
|
|
107
|
+
r.role,
|
|
108
|
+
reviewStatusColor(r.status),
|
|
109
|
+
String(r.findings?.length ?? 0),
|
|
110
|
+
])));
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
console.error(formatError(err));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// -------------------------------------------------------------------------
|
|
118
|
+
// review approve
|
|
119
|
+
// -------------------------------------------------------------------------
|
|
120
|
+
review
|
|
121
|
+
.command("approve")
|
|
122
|
+
.description("Approve a review")
|
|
123
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
124
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
125
|
+
.requiredOption("--review <rid>", "Review ID")
|
|
126
|
+
.option("--json", "Output raw JSON")
|
|
127
|
+
.action(async (opts) => {
|
|
128
|
+
try {
|
|
129
|
+
const data = await client.post(`/api/projects/${opts.project}/changesets/${opts.changeset}/reviews/${opts.review}/approve`);
|
|
130
|
+
if (opts.json) {
|
|
131
|
+
console.log(formatJSON(data));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
console.log(formatSuccess(`Review ${opts.review} approved.`));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
console.error(formatError(err));
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
// -------------------------------------------------------------------------
|
|
142
|
+
// review block
|
|
143
|
+
// -------------------------------------------------------------------------
|
|
144
|
+
review
|
|
145
|
+
.command("block")
|
|
146
|
+
.description("Block a review with a reason")
|
|
147
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
148
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
149
|
+
.requiredOption("--review <rid>", "Review ID")
|
|
150
|
+
.requiredOption("--reason <reason>", "Reason for blocking")
|
|
151
|
+
.option("--json", "Output raw JSON")
|
|
152
|
+
.action(async (opts) => {
|
|
153
|
+
try {
|
|
154
|
+
const data = await client.post(`/api/projects/${opts.project}/changesets/${opts.changeset}/reviews/${opts.review}/block`, { reason: opts.reason });
|
|
155
|
+
if (opts.json) {
|
|
156
|
+
console.log(formatJSON(data));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
console.log(formatSuccess(`Review ${opts.review} blocked.`));
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.error(formatError(err));
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge score` — Local trust score computation.
|
|
3
|
+
*
|
|
4
|
+
* Reads the local trust ledger and computes a 4-dimension quality score:
|
|
5
|
+
* - quality — ratio of high-confidence entries
|
|
6
|
+
* - velocity — entries per day over ledger lifetime
|
|
7
|
+
* - consistency — regularity of commit intervals (low stddev = high score)
|
|
8
|
+
* - collaboration — ratio of entries with source_tree_hash (git-bound)
|
|
9
|
+
*
|
|
10
|
+
* All computation is LOCAL — no engine HTTP calls.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* forge score [path]
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from "commander";
|
|
16
|
+
export declare function registerScoreCommands(parent: Command, _client: unknown): void;
|
|
17
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0HpC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,GACf,IAAI,CA6EN"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge score` — Local trust score computation.
|
|
3
|
+
*
|
|
4
|
+
* Reads the local trust ledger and computes a 4-dimension quality score:
|
|
5
|
+
* - quality — ratio of high-confidence entries
|
|
6
|
+
* - velocity — entries per day over ledger lifetime
|
|
7
|
+
* - consistency — regularity of commit intervals (low stddev = high score)
|
|
8
|
+
* - collaboration — ratio of entries with source_tree_hash (git-bound)
|
|
9
|
+
*
|
|
10
|
+
* All computation is LOCAL — no engine HTTP calls.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* forge score [path]
|
|
14
|
+
*/
|
|
15
|
+
import { resolve } from "path";
|
|
16
|
+
import { TrustLedger } from "../../trust/ledger.js";
|
|
17
|
+
import { formatTable, formatJSON, formatSuccess, formatWarning, formatError, green, yellow, red, } from "../output.js";
|
|
18
|
+
function scoreColor(n) {
|
|
19
|
+
const pct = Math.round(n * 100);
|
|
20
|
+
const label = `${pct}%`;
|
|
21
|
+
if (n >= 0.75)
|
|
22
|
+
return green(label);
|
|
23
|
+
if (n >= 0.5)
|
|
24
|
+
return yellow(label);
|
|
25
|
+
return red(label);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Compute standard deviation of an array of numbers.
|
|
29
|
+
* Returns 0 for empty or single-element arrays.
|
|
30
|
+
*/
|
|
31
|
+
function stddev(values) {
|
|
32
|
+
if (values.length <= 1)
|
|
33
|
+
return 0;
|
|
34
|
+
const mean = values.reduce((a, b) => a + b, 0) / values.length;
|
|
35
|
+
const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;
|
|
36
|
+
return Math.sqrt(variance);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compute all 4 trust score dimensions from ledger entries.
|
|
40
|
+
*/
|
|
41
|
+
function computeScore(entries, chainValid) {
|
|
42
|
+
const count = entries.length;
|
|
43
|
+
if (count === 0) {
|
|
44
|
+
return {
|
|
45
|
+
quality: 0,
|
|
46
|
+
velocity: 0,
|
|
47
|
+
consistency: 0,
|
|
48
|
+
collaboration: 0,
|
|
49
|
+
overall: 0,
|
|
50
|
+
entry_count: 0,
|
|
51
|
+
chain_valid: chainValid,
|
|
52
|
+
computed_at: new Date().toISOString(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// 1. Quality — ratio of entries whose payload has quality_score >= 70 OR
|
|
56
|
+
// high confidence (confidence >= 0.8) if it's an observation entry.
|
|
57
|
+
// Fallback: count entries without explicit failure markers.
|
|
58
|
+
const qualityCount = entries.filter((e) => {
|
|
59
|
+
const p = e.payload;
|
|
60
|
+
if (typeof p.quality_score === "number")
|
|
61
|
+
return p.quality_score >= 70;
|
|
62
|
+
if (typeof p.confidence === "number")
|
|
63
|
+
return p.confidence >= 0.8;
|
|
64
|
+
// Assume passing if no quality indicator
|
|
65
|
+
return true;
|
|
66
|
+
}).length;
|
|
67
|
+
const quality = qualityCount / count;
|
|
68
|
+
// 2. Velocity — entries per day over the ledger's active lifetime.
|
|
69
|
+
// Normalised to [0, 1] with a target of 3 entries/day = 1.0.
|
|
70
|
+
const TARGET_ENTRIES_PER_DAY = 3;
|
|
71
|
+
const firstTs = new Date(entries[0].timestamp).getTime();
|
|
72
|
+
const lastTs = new Date(entries[count - 1].timestamp).getTime();
|
|
73
|
+
const spanDays = Math.max((lastTs - firstTs) / 86_400_000, 1);
|
|
74
|
+
const rawVelocity = count / spanDays;
|
|
75
|
+
const velocity = Math.min(rawVelocity / TARGET_ENTRIES_PER_DAY, 1.0);
|
|
76
|
+
// 3. Consistency — inverse of normalised interval standard deviation.
|
|
77
|
+
// Perfect regularity (equal intervals) = 1.0.
|
|
78
|
+
let consistency = 1.0;
|
|
79
|
+
if (count > 2) {
|
|
80
|
+
const timestamps = entries.map((e) => new Date(e.timestamp).getTime());
|
|
81
|
+
const intervals = [];
|
|
82
|
+
for (let i = 1; i < timestamps.length; i++) {
|
|
83
|
+
intervals.push(timestamps[i] - timestamps[i - 1]);
|
|
84
|
+
}
|
|
85
|
+
const meanInterval = intervals.reduce((a, b) => a + b, 0) / intervals.length;
|
|
86
|
+
const sd = stddev(intervals);
|
|
87
|
+
// Coefficient of variation; 0 = perfectly regular
|
|
88
|
+
const cv = meanInterval > 0 ? sd / meanInterval : 0;
|
|
89
|
+
consistency = Math.max(0, 1 - Math.min(cv, 1));
|
|
90
|
+
}
|
|
91
|
+
// 4. Collaboration — ratio of entries that have a git binding (source_tree_hash)
|
|
92
|
+
const gitBoundCount = entries.filter((e) => e.source_tree_hash !== null && e.source_tree_hash !== undefined).length;
|
|
93
|
+
const collaboration = gitBoundCount / count;
|
|
94
|
+
const overall = (quality + velocity + consistency + collaboration) / 4;
|
|
95
|
+
return {
|
|
96
|
+
quality,
|
|
97
|
+
velocity,
|
|
98
|
+
consistency,
|
|
99
|
+
collaboration,
|
|
100
|
+
overall,
|
|
101
|
+
entry_count: count,
|
|
102
|
+
chain_valid: chainValid,
|
|
103
|
+
computed_at: new Date().toISOString(),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export function registerScoreCommands(parent, _client // not used — all score commands are local
|
|
107
|
+
) {
|
|
108
|
+
parent
|
|
109
|
+
.command("score [path]")
|
|
110
|
+
.description("Compute a 4-dimension trust score from the local ledger (local only)")
|
|
111
|
+
.option("--json", "Output raw JSON")
|
|
112
|
+
.action(async (pathArg, opts) => {
|
|
113
|
+
try {
|
|
114
|
+
const projectPath = resolve(pathArg ?? process.cwd());
|
|
115
|
+
const ledger = new TrustLedger(projectPath);
|
|
116
|
+
const verifyResult = ledger.verifyChain();
|
|
117
|
+
const entries = ledger.readEntries();
|
|
118
|
+
const score = computeScore(entries, verifyResult.valid);
|
|
119
|
+
if (opts.json) {
|
|
120
|
+
console.log(formatJSON(score));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (entries.length === 0) {
|
|
124
|
+
console.log(formatWarning("No ledger entries found. Run `forge trust init` then `forge analyze` to start tracking."));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log(formatTable(["Dimension", "Score", "Description"], [
|
|
128
|
+
[
|
|
129
|
+
"Quality",
|
|
130
|
+
scoreColor(score.quality),
|
|
131
|
+
"Ratio of high-quality / high-confidence entries",
|
|
132
|
+
],
|
|
133
|
+
[
|
|
134
|
+
"Velocity",
|
|
135
|
+
scoreColor(score.velocity),
|
|
136
|
+
"Entries per day vs 3/day target",
|
|
137
|
+
],
|
|
138
|
+
[
|
|
139
|
+
"Consistency",
|
|
140
|
+
scoreColor(score.consistency),
|
|
141
|
+
"Regularity of commit intervals",
|
|
142
|
+
],
|
|
143
|
+
[
|
|
144
|
+
"Collaboration",
|
|
145
|
+
scoreColor(score.collaboration),
|
|
146
|
+
"Ratio of git-bound entries",
|
|
147
|
+
],
|
|
148
|
+
["──────────", "──────", "──────────────────────────────────────"],
|
|
149
|
+
[
|
|
150
|
+
"Overall",
|
|
151
|
+
scoreColor(score.overall),
|
|
152
|
+
`${score.entry_count} entries · chain ${score.chain_valid ? "valid" : "BROKEN"}`,
|
|
153
|
+
],
|
|
154
|
+
]));
|
|
155
|
+
if (!verifyResult.valid) {
|
|
156
|
+
console.log(formatWarning(`Chain integrity broken at seq ${verifyResult.first_break_at}. Run \`forge trust verify\` for details.`));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.log(formatSuccess(`Score computed from ${score.entry_count} ledger entries.`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
console.error(formatError(err));
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../../../src/cli/commands/score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge session` — Session management commands.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge session start --project <pid>
|
|
6
|
+
* forge session end --project <pid> <session_id>
|
|
7
|
+
* forge session status --project <pid> <session_id>
|
|
8
|
+
* forge session task --project <pid> <session_id> --description <desc>
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from "commander";
|
|
11
|
+
import { ForgeOSClient } from "../../shared/client.js";
|
|
12
|
+
export declare function registerSessionCommands(parent: Command, client: ForgeOSClient): void;
|
|
13
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAmBvD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,aAAa,GACpB,IAAI,CAmJN"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge session` — Session management commands.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge session start --project <pid>
|
|
6
|
+
* forge session end --project <pid> <session_id>
|
|
7
|
+
* forge session status --project <pid> <session_id>
|
|
8
|
+
* forge session task --project <pid> <session_id> --description <desc>
|
|
9
|
+
*/
|
|
10
|
+
import { formatTable, formatJSON, formatSuccess, formatError, green, yellow, } from "../output.js";
|
|
11
|
+
function sessionStatusColor(status) {
|
|
12
|
+
const s = status.toLowerCase();
|
|
13
|
+
if (s === "active")
|
|
14
|
+
return green(status);
|
|
15
|
+
if (s === "ended" || s === "closed")
|
|
16
|
+
return yellow(status);
|
|
17
|
+
return status;
|
|
18
|
+
}
|
|
19
|
+
export function registerSessionCommands(parent, client) {
|
|
20
|
+
const session = parent
|
|
21
|
+
.command("session")
|
|
22
|
+
.description("Manage development sessions");
|
|
23
|
+
// -------------------------------------------------------------------------
|
|
24
|
+
// session start
|
|
25
|
+
// -------------------------------------------------------------------------
|
|
26
|
+
session
|
|
27
|
+
.command("start")
|
|
28
|
+
.description("Start a new session for a project")
|
|
29
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
30
|
+
.option("--developer-id <did>", "Developer identifier", "local")
|
|
31
|
+
.option("--json", "Output raw JSON")
|
|
32
|
+
.action(async (opts) => {
|
|
33
|
+
try {
|
|
34
|
+
const body = {
|
|
35
|
+
developer_id: opts.developerId,
|
|
36
|
+
};
|
|
37
|
+
const data = (await client.post(`/api/projects/${opts.project}/sessions`, body));
|
|
38
|
+
if (opts.json) {
|
|
39
|
+
console.log(formatJSON(data));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log(formatSuccess(`Session started: ${data.id}`));
|
|
43
|
+
console.log(formatTable(["Field", "Value"], [
|
|
44
|
+
["ID", data.id],
|
|
45
|
+
["Project", data.project_id],
|
|
46
|
+
["Status", sessionStatusColor(data.status)],
|
|
47
|
+
["Started At", data.started_at],
|
|
48
|
+
]));
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.error(formatError(err));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// -------------------------------------------------------------------------
|
|
56
|
+
// session end <session_id>
|
|
57
|
+
// -------------------------------------------------------------------------
|
|
58
|
+
session
|
|
59
|
+
.command("end <session_id>")
|
|
60
|
+
.description("End an active session")
|
|
61
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
62
|
+
.option("--json", "Output raw JSON")
|
|
63
|
+
.action(async (sessionId, opts) => {
|
|
64
|
+
try {
|
|
65
|
+
const data = (await client.patch(`/api/projects/${opts.project}/sessions/${sessionId}`, { status: "ended" }));
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
console.log(formatJSON(data));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(formatSuccess(`Session ${sessionId} ended.`));
|
|
71
|
+
if (data.ended_at) {
|
|
72
|
+
console.log(` Ended at: ${data.ended_at}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error(formatError(err));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// -------------------------------------------------------------------------
|
|
81
|
+
// session status <session_id>
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
session
|
|
84
|
+
.command("status <session_id>")
|
|
85
|
+
.description("Show session status")
|
|
86
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
87
|
+
.option("--json", "Output raw JSON")
|
|
88
|
+
.action(async (sessionId, opts) => {
|
|
89
|
+
try {
|
|
90
|
+
const data = (await client.get(`/api/projects/${opts.project}/sessions/${sessionId}`));
|
|
91
|
+
if (opts.json) {
|
|
92
|
+
console.log(formatJSON(data));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
console.log(formatTable(["Field", "Value"], [
|
|
96
|
+
["ID", data.id],
|
|
97
|
+
["Project", data.project_id],
|
|
98
|
+
["Status", sessionStatusColor(data.status)],
|
|
99
|
+
["Started At", data.started_at],
|
|
100
|
+
["Ended At", data.ended_at ?? "—"],
|
|
101
|
+
]));
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
console.error(formatError(err));
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// -------------------------------------------------------------------------
|
|
109
|
+
// session task <session_id>
|
|
110
|
+
// -------------------------------------------------------------------------
|
|
111
|
+
session
|
|
112
|
+
.command("task <session_id>")
|
|
113
|
+
.description("Add a task to an active session")
|
|
114
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
115
|
+
.requiredOption("--description <desc>", "Task description")
|
|
116
|
+
.option("--json", "Output raw JSON")
|
|
117
|
+
.action(async (sessionId, opts) => {
|
|
118
|
+
try {
|
|
119
|
+
const data = await client.post(`/api/projects/${opts.project}/sessions/${sessionId}/tasks`, { description: opts.description });
|
|
120
|
+
if (opts.json) {
|
|
121
|
+
console.log(formatJSON(data));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
console.log(formatSuccess("Task added to session."));
|
|
125
|
+
console.log(formatJSON(data));
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.error(formatError(err));
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge trust` — Local trust ledger commands.
|
|
3
|
+
*
|
|
4
|
+
* These commands operate ENTIRELY locally — no engine HTTP calls.
|
|
5
|
+
* They use the src/trust/ modules directly.
|
|
6
|
+
*
|
|
7
|
+
* Subcommands:
|
|
8
|
+
* forge trust init [path] — generate keypair + create ledger dirs
|
|
9
|
+
* forge trust verify [path] — verify chain integrity
|
|
10
|
+
* forge trust stats [path] — show chain statistics
|
|
11
|
+
* forge trust share [path] [--endpoint <url>] — transmit shareable metadata
|
|
12
|
+
* forge trust config [path] — show key configuration
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from "commander";
|
|
15
|
+
export declare function registerTrustCommands(parent: Command, _client: unknown): void;
|
|
16
|
+
//# sourceMappingURL=trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/trust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CpC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,GACf,IAAI,CAyRN"}
|