gswd 1.0.0 → 1.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/bin/gswd-tools.cjs +228 -0
- package/bin/install.js +8 -0
- package/commands/gswd/imagine.md +7 -1
- package/commands/gswd/start.md +507 -32
- package/dist/lib/audit.d.ts +205 -0
- package/dist/lib/audit.js +805 -0
- package/dist/lib/bootstrap.d.ts +103 -0
- package/dist/lib/bootstrap.js +563 -0
- package/dist/lib/compile.d.ts +239 -0
- package/dist/lib/compile.js +1152 -0
- package/dist/lib/config.d.ts +49 -0
- package/dist/lib/config.js +150 -0
- package/dist/lib/imagine-agents.d.ts +54 -0
- package/dist/lib/imagine-agents.js +185 -0
- package/dist/lib/imagine-gate.d.ts +47 -0
- package/dist/lib/imagine-gate.js +131 -0
- package/dist/lib/imagine-input.d.ts +46 -0
- package/dist/lib/imagine-input.js +233 -0
- package/dist/lib/imagine-synthesis.d.ts +90 -0
- package/dist/lib/imagine-synthesis.js +453 -0
- package/dist/lib/imagine.d.ts +56 -0
- package/dist/lib/imagine.js +413 -0
- package/dist/lib/intake.d.ts +27 -0
- package/dist/lib/intake.js +82 -0
- package/dist/lib/parse.d.ts +59 -0
- package/dist/lib/parse.js +171 -0
- package/dist/lib/render.d.ts +309 -0
- package/dist/lib/render.js +624 -0
- package/dist/lib/specify-agents.d.ts +120 -0
- package/dist/lib/specify-agents.js +269 -0
- package/dist/lib/specify-journeys.d.ts +124 -0
- package/dist/lib/specify-journeys.js +279 -0
- package/dist/lib/specify-nfr.d.ts +45 -0
- package/dist/lib/specify-nfr.js +159 -0
- package/dist/lib/specify-roles.d.ts +46 -0
- package/dist/lib/specify-roles.js +88 -0
- package/dist/lib/specify.d.ts +70 -0
- package/dist/lib/specify.js +676 -0
- package/dist/lib/state.d.ts +140 -0
- package/dist/lib/state.js +340 -0
- package/dist/tests/audit.test.d.ts +4 -0
- package/dist/tests/audit.test.js +1579 -0
- package/dist/tests/bootstrap.test.d.ts +5 -0
- package/dist/tests/bootstrap.test.js +611 -0
- package/dist/tests/compile.test.d.ts +4 -0
- package/dist/tests/compile.test.js +862 -0
- package/dist/tests/config.test.d.ts +4 -0
- package/dist/tests/config.test.js +191 -0
- package/dist/tests/imagine-agents.test.d.ts +6 -0
- package/dist/tests/imagine-agents.test.js +179 -0
- package/dist/tests/imagine-gate.test.d.ts +6 -0
- package/dist/tests/imagine-gate.test.js +264 -0
- package/dist/tests/imagine-input.test.d.ts +6 -0
- package/dist/tests/imagine-input.test.js +283 -0
- package/dist/tests/imagine-synthesis.test.d.ts +7 -0
- package/dist/tests/imagine-synthesis.test.js +380 -0
- package/dist/tests/imagine.test.d.ts +8 -0
- package/dist/tests/imagine.test.js +406 -0
- package/dist/tests/parse.test.d.ts +4 -0
- package/dist/tests/parse.test.js +285 -0
- package/dist/tests/render.test.d.ts +4 -0
- package/dist/tests/render.test.js +236 -0
- package/dist/tests/specify-agents.test.d.ts +4 -0
- package/dist/tests/specify-agents.test.js +352 -0
- package/dist/tests/specify-journeys.test.d.ts +5 -0
- package/dist/tests/specify-journeys.test.js +440 -0
- package/dist/tests/specify-nfr.test.d.ts +4 -0
- package/dist/tests/specify-nfr.test.js +205 -0
- package/dist/tests/specify-roles.test.d.ts +4 -0
- package/dist/tests/specify-roles.test.js +136 -0
- package/dist/tests/specify.test.d.ts +9 -0
- package/dist/tests/specify.test.js +544 -0
- package/dist/tests/state.test.d.ts +4 -0
- package/dist/tests/state.test.js +316 -0
- package/lib/bootstrap.ts +37 -11
- package/lib/compile.ts +426 -4
- package/lib/imagine-agents.ts +53 -7
- package/lib/imagine-synthesis.ts +170 -6
- package/lib/imagine.ts +59 -5
- package/lib/intake.ts +60 -0
- package/lib/parse.ts +2 -1
- package/lib/render.ts +566 -5
- package/lib/specify-agents.ts +25 -3
- package/lib/state.ts +115 -0
- package/package.json +4 -2
- package/templates/gswd/DECISIONS.template.md +3 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Specify Roles module tests — Default config, auto mode, formatting
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const node_test_1 = require("node:test");
|
|
40
|
+
const assert = __importStar(require("node:assert"));
|
|
41
|
+
const specify_roles_js_1 = require("../lib/specify-roles.js");
|
|
42
|
+
// ─── defaultRolesConfig ─────────────────────────────────────────────────────
|
|
43
|
+
(0, node_test_1.describe)('defaultRolesConfig', () => {
|
|
44
|
+
(0, node_test_1.it)('returns single admin role', () => {
|
|
45
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
46
|
+
assert.strictEqual(config.roles.length, 1);
|
|
47
|
+
assert.strictEqual(config.roles[0].name, 'admin');
|
|
48
|
+
});
|
|
49
|
+
(0, node_test_1.it)('permission model is simple', () => {
|
|
50
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
51
|
+
assert.strictEqual(config.permissionModel, 'simple');
|
|
52
|
+
});
|
|
53
|
+
(0, node_test_1.it)('admin has standard permissions', () => {
|
|
54
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
55
|
+
const admin = config.roles[0];
|
|
56
|
+
assert.ok(admin.permissions.includes('create'));
|
|
57
|
+
assert.ok(admin.permissions.includes('read'));
|
|
58
|
+
assert.ok(admin.permissions.includes('update'));
|
|
59
|
+
assert.ok(admin.permissions.includes('delete'));
|
|
60
|
+
assert.ok(admin.permissions.includes('manage_settings'));
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.it)('has non-empty notes', () => {
|
|
63
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
64
|
+
assert.ok(config.notes.length > 0);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
// ─── collectRoles ───────────────────────────────────────────────────────────
|
|
68
|
+
(0, node_test_1.describe)('collectRoles', () => {
|
|
69
|
+
(0, node_test_1.it)('auto=true returns default config without interaction', async () => {
|
|
70
|
+
const config = await (0, specify_roles_js_1.collectRoles)({ auto: true });
|
|
71
|
+
assert.strictEqual(config.roles.length, 1);
|
|
72
|
+
assert.strictEqual(config.roles[0].name, 'admin');
|
|
73
|
+
assert.strictEqual(config.permissionModel, 'simple');
|
|
74
|
+
});
|
|
75
|
+
(0, node_test_1.it)('auto=true default has single admin role with permissions', async () => {
|
|
76
|
+
const config = await (0, specify_roles_js_1.collectRoles)({ auto: true });
|
|
77
|
+
const admin = config.roles[0];
|
|
78
|
+
assert.ok(admin.permissions.length >= 5);
|
|
79
|
+
assert.ok(admin.description.length > 0);
|
|
80
|
+
});
|
|
81
|
+
(0, node_test_1.it)('auto=false returns default with deferred note', async () => {
|
|
82
|
+
const config = await (0, specify_roles_js_1.collectRoles)({ auto: false });
|
|
83
|
+
assert.strictEqual(config.roles.length, 1);
|
|
84
|
+
assert.ok(config.notes.toLowerCase().includes('deferred'));
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
// ─── formatRolesForSpec ─────────────────────────────────────────────────────
|
|
88
|
+
(0, node_test_1.describe)('formatRolesForSpec', () => {
|
|
89
|
+
(0, node_test_1.it)('produces markdown table with role names', () => {
|
|
90
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
91
|
+
const output = (0, specify_roles_js_1.formatRolesForSpec)(config);
|
|
92
|
+
assert.ok(output.includes('| admin |'));
|
|
93
|
+
assert.ok(output.includes('| Role |'));
|
|
94
|
+
});
|
|
95
|
+
(0, node_test_1.it)('includes permission model description', () => {
|
|
96
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
97
|
+
const output = (0, specify_roles_js_1.formatRolesForSpec)(config);
|
|
98
|
+
assert.ok(output.includes('Permission Model'));
|
|
99
|
+
assert.ok(output.includes('Simple'));
|
|
100
|
+
});
|
|
101
|
+
(0, node_test_1.it)('single role produces valid markdown table', () => {
|
|
102
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
103
|
+
const output = (0, specify_roles_js_1.formatRolesForSpec)(config);
|
|
104
|
+
// Should have header row, separator row, and data row
|
|
105
|
+
const lines = output.split('\n').filter((l) => l.includes('|'));
|
|
106
|
+
assert.ok(lines.length >= 3); // header, separator, at least 1 data row
|
|
107
|
+
});
|
|
108
|
+
(0, node_test_1.it)('multiple roles produce multi-row table', () => {
|
|
109
|
+
const config = {
|
|
110
|
+
roles: [
|
|
111
|
+
{ name: 'admin', description: 'Full access', permissions: ['create', 'read', 'update', 'delete'] },
|
|
112
|
+
{ name: 'viewer', description: 'Read-only', permissions: ['read'] },
|
|
113
|
+
],
|
|
114
|
+
permissionModel: 'rbac',
|
|
115
|
+
notes: 'Multi-role setup',
|
|
116
|
+
};
|
|
117
|
+
const output = (0, specify_roles_js_1.formatRolesForSpec)(config);
|
|
118
|
+
assert.ok(output.includes('| admin |'));
|
|
119
|
+
assert.ok(output.includes('| viewer |'));
|
|
120
|
+
assert.ok(output.includes('RBAC'));
|
|
121
|
+
});
|
|
122
|
+
(0, node_test_1.it)('includes notes as blockquote', () => {
|
|
123
|
+
const config = (0, specify_roles_js_1.defaultRolesConfig)();
|
|
124
|
+
const output = (0, specify_roles_js_1.formatRolesForSpec)(config);
|
|
125
|
+
assert.ok(output.includes('> '));
|
|
126
|
+
});
|
|
127
|
+
(0, node_test_1.it)('abac permission model shows correct label', () => {
|
|
128
|
+
const config = {
|
|
129
|
+
roles: [{ name: 'user', description: 'Dynamic', permissions: ['contextual'] }],
|
|
130
|
+
permissionModel: 'abac',
|
|
131
|
+
notes: '',
|
|
132
|
+
};
|
|
133
|
+
const output = (0, specify_roles_js_1.formatRolesForSpec)(config);
|
|
134
|
+
assert.ok(output.includes('ABAC'));
|
|
135
|
+
});
|
|
136
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for GSWD Specify Workflow Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Integration-level tests using skipAgents mode and temp directories.
|
|
5
|
+
* Covers: full workflow, artifact generation, auto mode, ID validation,
|
|
6
|
+
* state management, error handling.
|
|
7
|
+
* Minimum 15 test cases per Plan 03-05.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|