musubix3 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 (97) hide show
  1. package/.github/plugin/marketplace.json +16 -0
  2. package/.github/skills/sdd-change/SKILL.md +78 -0
  3. package/.github/skills/sdd-design/SKILL.md +26 -0
  4. package/.github/skills/sdd-formal-codegraph/SKILL.md +53 -0
  5. package/.github/skills/sdd-implementation/SKILL.md +54 -0
  6. package/.github/skills/sdd-knowledge/SKILL.md +24 -0
  7. package/.github/skills/sdd-quality/SKILL.md +69 -0
  8. package/.github/skills/sdd-requirements/SKILL.md +42 -0
  9. package/.github/skills/sdd-traceability/SKILL.md +28 -0
  10. package/CHANGELOG.md +152 -0
  11. package/LICENSE +21 -0
  12. package/README-ja.md +573 -0
  13. package/README.md +639 -0
  14. package/assets/ADR-0001.md +15 -0
  15. package/assets/constitution.md +17 -0
  16. package/assets/design.md +13 -0
  17. package/assets/requirements.md +15 -0
  18. package/dist/packages/analysis/src/adapters.d.ts +12 -0
  19. package/dist/packages/analysis/src/adapters.js +167 -0
  20. package/dist/packages/analysis/src/adapters.js.map +1 -0
  21. package/dist/packages/analysis/src/attestation.d.ts +50 -0
  22. package/dist/packages/analysis/src/attestation.js +474 -0
  23. package/dist/packages/analysis/src/attestation.js.map +1 -0
  24. package/dist/packages/analysis/src/change.d.ts +53 -0
  25. package/dist/packages/analysis/src/change.js +337 -0
  26. package/dist/packages/analysis/src/change.js.map +1 -0
  27. package/dist/packages/analysis/src/config.d.ts +104 -0
  28. package/dist/packages/analysis/src/config.js +456 -0
  29. package/dist/packages/analysis/src/config.js.map +1 -0
  30. package/dist/packages/analysis/src/files.d.ts +13 -0
  31. package/dist/packages/analysis/src/files.js +103 -0
  32. package/dist/packages/analysis/src/files.js.map +1 -0
  33. package/dist/packages/analysis/src/formal.d.ts +82 -0
  34. package/dist/packages/analysis/src/formal.js +579 -0
  35. package/dist/packages/analysis/src/formal.js.map +1 -0
  36. package/dist/packages/analysis/src/gate.d.ts +56 -0
  37. package/dist/packages/analysis/src/gate.js +484 -0
  38. package/dist/packages/analysis/src/gate.js.map +1 -0
  39. package/dist/packages/analysis/src/graph.d.ts +52 -0
  40. package/dist/packages/analysis/src/graph.js +737 -0
  41. package/dist/packages/analysis/src/graph.js.map +1 -0
  42. package/dist/packages/analysis/src/index.d.ts +17 -0
  43. package/dist/packages/analysis/src/index.js +18 -0
  44. package/dist/packages/analysis/src/index.js.map +1 -0
  45. package/dist/packages/analysis/src/knowledge.d.ts +29 -0
  46. package/dist/packages/analysis/src/knowledge.js +95 -0
  47. package/dist/packages/analysis/src/knowledge.js.map +1 -0
  48. package/dist/packages/analysis/src/model-correspondence.d.ts +45 -0
  49. package/dist/packages/analysis/src/model-correspondence.js +310 -0
  50. package/dist/packages/analysis/src/model-correspondence.js.map +1 -0
  51. package/dist/packages/analysis/src/mutation.d.ts +54 -0
  52. package/dist/packages/analysis/src/mutation.js +299 -0
  53. package/dist/packages/analysis/src/mutation.js.map +1 -0
  54. package/dist/packages/analysis/src/order.d.ts +23 -0
  55. package/dist/packages/analysis/src/order.js +89 -0
  56. package/dist/packages/analysis/src/order.js.map +1 -0
  57. package/dist/packages/analysis/src/performance.d.ts +65 -0
  58. package/dist/packages/analysis/src/performance.js +319 -0
  59. package/dist/packages/analysis/src/performance.js.map +1 -0
  60. package/dist/packages/analysis/src/process.d.ts +14 -0
  61. package/dist/packages/analysis/src/process.js +79 -0
  62. package/dist/packages/analysis/src/process.js.map +1 -0
  63. package/dist/packages/analysis/src/tdd.d.ts +65 -0
  64. package/dist/packages/analysis/src/tdd.js +353 -0
  65. package/dist/packages/analysis/src/tdd.js.map +1 -0
  66. package/dist/packages/analysis/src/trace.d.ts +45 -0
  67. package/dist/packages/analysis/src/trace.js +242 -0
  68. package/dist/packages/analysis/src/trace.js.map +1 -0
  69. package/dist/packages/analysis/src/workflow.d.ts +59 -0
  70. package/dist/packages/analysis/src/workflow.js +405 -0
  71. package/dist/packages/analysis/src/workflow.js.map +1 -0
  72. package/dist/packages/cli/src/install.d.ts +15 -0
  73. package/dist/packages/cli/src/install.js +71 -0
  74. package/dist/packages/cli/src/install.js.map +1 -0
  75. package/dist/packages/cli/src/main.d.ts +3 -0
  76. package/dist/packages/cli/src/main.js +364 -0
  77. package/dist/packages/cli/src/main.js.map +1 -0
  78. package/dist/packages/domain/src/constitution.d.ts +3 -0
  79. package/dist/packages/domain/src/constitution.js +46 -0
  80. package/dist/packages/domain/src/constitution.js.map +1 -0
  81. package/dist/packages/domain/src/design.d.ts +8 -0
  82. package/dist/packages/domain/src/design.js +59 -0
  83. package/dist/packages/domain/src/design.js.map +1 -0
  84. package/dist/packages/domain/src/index.d.ts +5 -0
  85. package/dist/packages/domain/src/index.js +6 -0
  86. package/dist/packages/domain/src/index.js.map +1 -0
  87. package/dist/packages/domain/src/markdown.d.ts +16 -0
  88. package/dist/packages/domain/src/markdown.js +72 -0
  89. package/dist/packages/domain/src/markdown.js.map +1 -0
  90. package/dist/packages/domain/src/requirements.d.ts +3 -0
  91. package/dist/packages/domain/src/requirements.js +195 -0
  92. package/dist/packages/domain/src/requirements.js.map +1 -0
  93. package/dist/packages/domain/src/types.d.ts +100 -0
  94. package/dist/packages/domain/src/types.js +14 -0
  95. package/dist/packages/domain/src/types.js.map +1 -0
  96. package/package.json +59 -0
  97. package/plugin.json +9 -0
@@ -0,0 +1,13 @@
1
+ ---
2
+ schemaVersion: 1
3
+ feature: example
4
+ ---
5
+ # Design / 設計
6
+
7
+ ## DES-EXAMPLE-001: Readiness component / 準備状況コンポーネント
8
+ Responsibilities: Aggregate explicit readiness evidence without inventing success.
9
+ Interfaces: reportReadiness() returns pass, fail, or skipped evidence.
10
+ Constraints: Missing required evidence cannot count as success.
11
+ Requirements: REQ-EXAMPLE-001
12
+ ADRs: ADR-0001
13
+ Depends-On: none
@@ -0,0 +1,15 @@
1
+ ---
2
+ schemaVersion: 1
3
+ feature: example
4
+ ---
5
+ # Requirements / 要求
6
+
7
+ Replace this starter with your feature using Copilot's native planning and editing.
8
+ この例を Copilot の計画・編集機能で実際の要求に置き換えてください。
9
+
10
+ ## REQ-EXAMPLE-001: Report readiness / 準備状況を表示
11
+ Priority: must
12
+ Type: functional
13
+ Pattern: ubiquitous
14
+ Statement: The system shall report its readiness.
15
+ Acceptance: A test checks the reported readiness against the configured checks.
@@ -0,0 +1,12 @@
1
+ import type { CommandConfig } from './config.js';
2
+ import type { MusubixTestReport } from './tdd.js';
3
+ export type TestAdapter = NonNullable<CommandConfig['adapter']>;
4
+ export interface AdapterInvocation {
5
+ args: string[];
6
+ reportPath: string;
7
+ source: 'file' | 'directory' | 'stdout';
8
+ }
9
+ export declare function adapterInvocation(adapter: TestAdapter, commandName: string, testId?: string, testPath?: string): AdapterInvocation;
10
+ export declare function clearAdapterOutput(invocation: AdapterInvocation, absolutePath: string): Promise<void>;
11
+ export declare function readAdapterOutput(invocation: AdapterInvocation, absolutePath: string, stdout: string): Promise<string | null>;
12
+ export declare function normalizeAdapterReport(adapter: TestAdapter, text: string, targetTestId?: string): MusubixTestReport;
@@ -0,0 +1,167 @@
1
+ import { dirname } from 'node:path';
2
+ import { mkdir, readdir, readFile, rm, unlink, writeFile } from 'node:fs/promises';
3
+ import { exists } from './files.js';
4
+ function reportPath(commandName, testId, adapter) {
5
+ const suffix = adapter === 'junit' ? '' : '.json';
6
+ return testId
7
+ ? `.musubix/evidence/native/${commandName}/${testId}${suffix}`
8
+ : `.musubix/evidence/native/${commandName}/aggregate${suffix}`;
9
+ }
10
+ function identifier(testId) {
11
+ return testId.toLowerCase().replaceAll('-', '_');
12
+ }
13
+ export function adapterInvocation(adapter, commandName, testId, testPath) {
14
+ const path = reportPath(commandName, testId, adapter);
15
+ if (adapter === 'vitest') {
16
+ return {
17
+ args: [...testPath ? [testPath] : [], ...testId ? ['-t', testId] : [], '--reporter=json', `--outputFile=${path}`],
18
+ reportPath: path,
19
+ source: 'file',
20
+ };
21
+ }
22
+ if (adapter === 'jest') {
23
+ return {
24
+ args: [...testPath ? ['--runTestsByPath', testPath] : [], ...testId ? ['-t', testId] : [], '--json', `--outputFile=${path}`],
25
+ reportPath: path,
26
+ source: 'file',
27
+ };
28
+ }
29
+ if (adapter === 'pytest') {
30
+ return {
31
+ args: [...testPath ? [testPath] : [], ...testId ? ['-k', identifier(testId)] : [], '--json-report', `--json-report-file=${path}`],
32
+ reportPath: path,
33
+ source: 'file',
34
+ };
35
+ }
36
+ if (adapter === 'go-test') {
37
+ const packagePath = testPath ? `./${dirname(testPath)}`.replace(/\/\.$/, '') : './...';
38
+ return { args: ['test', '-json', packagePath, ...testId ? ['-run', `/${testId}`] : []], reportPath: path, source: 'stdout' };
39
+ }
40
+ if (adapter === 'cargo') {
41
+ return { args: ['test', ...testId ? [identifier(testId)] : [], '--', '--format', 'pretty'], reportPath: path, source: 'stdout' };
42
+ }
43
+ return {
44
+ args: [
45
+ '--scan-class-path',
46
+ ...testId ? [`--include-tag=${testId}`, '--fail-if-no-tests'] : [],
47
+ `--reports-dir=${path}`,
48
+ ],
49
+ reportPath: path,
50
+ source: 'directory',
51
+ };
52
+ }
53
+ export async function clearAdapterOutput(invocation, absolutePath) {
54
+ if (await exists(absolutePath)) {
55
+ if (invocation.source === 'directory')
56
+ await rm(absolutePath, { recursive: true });
57
+ else
58
+ await unlink(absolutePath);
59
+ }
60
+ await mkdir(invocation.source === 'directory' ? absolutePath : dirname(absolutePath), { recursive: true });
61
+ }
62
+ export async function readAdapterOutput(invocation, absolutePath, stdout) {
63
+ if (invocation.source === 'stdout') {
64
+ if (stdout) {
65
+ await mkdir(dirname(absolutePath), { recursive: true });
66
+ await writeFile(absolutePath, stdout);
67
+ return stdout;
68
+ }
69
+ return await exists(absolutePath) ? readFile(absolutePath, 'utf8') : null;
70
+ }
71
+ if (!await exists(absolutePath))
72
+ return null;
73
+ if (invocation.source === 'file')
74
+ return readFile(absolutePath, 'utf8');
75
+ const entries = (await readdir(absolutePath, { withFileTypes: true }))
76
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.xml'))
77
+ .sort((a, b) => a.name.localeCompare(b.name));
78
+ if (!entries.length)
79
+ return null;
80
+ return (await Promise.all(entries.map((entry) => readFile(`${absolutePath}/${entry.name}`, 'utf8')))).join('\n');
81
+ }
82
+ function idOf(value) {
83
+ if (typeof value !== 'string')
84
+ return null;
85
+ const match = /(?:^|[^A-Za-z0-9])(TEST[-_](?!TEST[-_])[A-Z0-9_-]*\d{3,})\b/i.exec(value);
86
+ return match?.[1]?.toUpperCase().replaceAll('_', '-') ?? null;
87
+ }
88
+ function status(value) {
89
+ const normalized = String(value).toLowerCase();
90
+ if (['pass', 'passed', 'success', 'ok'].includes(normalized))
91
+ return 'passed';
92
+ if (['skip', 'skipped', 'pending', 'todo', 'ignored'].includes(normalized))
93
+ return 'skipped';
94
+ if (['error', 'errored'].includes(normalized))
95
+ return 'error';
96
+ return 'failed';
97
+ }
98
+ function unique(tests) {
99
+ const byId = new Map();
100
+ for (const test of tests) {
101
+ const previous = byId.get(test.id);
102
+ if (!previous || previous.status === 'skipped' || test.status === 'error' || test.status === 'failed')
103
+ byId.set(test.id, test);
104
+ }
105
+ return { schemaVersion: 1, tests: [...byId.values()].sort((a, b) => a.id.localeCompare(b.id)) };
106
+ }
107
+ export function normalizeAdapterReport(adapter, text, targetTestId) {
108
+ const tests = [];
109
+ if (adapter === 'vitest' || adapter === 'jest') {
110
+ const value = JSON.parse(text);
111
+ const suites = Array.isArray(value.testResults) ? value.testResults : [];
112
+ for (const suite of suites) {
113
+ const assertions = Array.isArray(suite.assertionResults) ? suite.assertionResults : [];
114
+ for (const assertion of assertions) {
115
+ const id = idOf(assertion.fullName) ?? idOf(assertion.title);
116
+ if (id)
117
+ tests.push({ id, status: status(assertion.status) });
118
+ }
119
+ }
120
+ }
121
+ else if (adapter === 'pytest') {
122
+ const value = JSON.parse(text);
123
+ for (const test of (Array.isArray(value.tests) ? value.tests : [])) {
124
+ const id = idOf(test.nodeid) ?? idOf(test.name);
125
+ if (id)
126
+ tests.push({ id, status: status(test.outcome) });
127
+ }
128
+ }
129
+ else if (adapter === 'go-test') {
130
+ for (const line of text.split(/\r?\n/)) {
131
+ if (!line.trim())
132
+ continue;
133
+ const event = JSON.parse(line);
134
+ if (!['pass', 'fail', 'skip'].includes(String(event.Action)) || typeof event.Test !== 'string')
135
+ continue;
136
+ const id = idOf(event.Test);
137
+ if (id)
138
+ tests.push({ id, status: status(event.Action) });
139
+ }
140
+ }
141
+ else if (adapter === 'cargo') {
142
+ for (const line of text.split(/\r?\n/)) {
143
+ const match = /^\s*test\s+(.+?)\s+\.\.\.\s+(ok|FAILED|ignored)\s*$/.exec(line);
144
+ const id = idOf(match?.[1]);
145
+ if (id)
146
+ tests.push({ id, status: status(match?.[2]) });
147
+ }
148
+ }
149
+ else {
150
+ for (const match of text.matchAll(/<testcase\b([^>]*)>([\s\S]*?)<\/testcase>|<testcase\b([^>]*)\/>/g)) {
151
+ const attributes = match[1] ?? match[3] ?? '';
152
+ const id = idOf(/\b(?:name|classname)="([^"]*)"/.exec(attributes)?.[1]);
153
+ if (!id)
154
+ continue;
155
+ const body = match[2] ?? '';
156
+ tests.push({ id, status: /<(?:error)\b/.test(body) ? 'error' : /<failure\b/.test(body) ? 'failed' : /<skipped\b/.test(body) ? 'skipped' : 'passed' });
157
+ }
158
+ }
159
+ const normalized = unique(tests);
160
+ const selected = targetTestId
161
+ ? { ...normalized, tests: normalized.tests.filter((test) => test.id === targetTestId) }
162
+ : normalized;
163
+ if (!selected.tests.length)
164
+ throw new Error(`No annotated TEST-* identities were found in the ${adapter} report.`);
165
+ return selected;
166
+ }
167
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../../packages/analysis/src/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type Diagnostic } from '../../domain/src/index.js';
2
+ import type { AttestationConfig } from './config.js';
3
+ import { type Runner } from './process.js';
4
+ export interface EvidenceAttestation {
5
+ schemaVersion: 1;
6
+ repository: string;
7
+ commitSha: string;
8
+ ci: {
9
+ provider: 'github' | 'azure-pipelines' | 'generic';
10
+ runId: string;
11
+ };
12
+ evidenceHeads: Record<string, string>;
13
+ issuedAt: string;
14
+ keyId: string;
15
+ githubOidc?: {
16
+ token: string;
17
+ publicKey?: string;
18
+ };
19
+ signature: string;
20
+ }
21
+ export interface UnsignedAttestation extends Omit<EvidenceAttestation, 'signature'> {
22
+ }
23
+ export type AttestationFetch = (url: string, init?: RequestInit) => Promise<{
24
+ ok: boolean;
25
+ status: number;
26
+ json(): Promise<unknown>;
27
+ }>;
28
+ export interface AttestationVerificationOptions {
29
+ fetch?: AttestationFetch;
30
+ now?: () => Date;
31
+ }
32
+ export type AttestationTrust = 'none' | 'static-trusted-key' | 'github-oidc-ephemeral-key' | 'github-oidc-trusted-key';
33
+ export interface AttestationVerification {
34
+ present: boolean;
35
+ valid: boolean;
36
+ status: 'off' | 'unsigned-local' | 'missing' | 'verified' | 'invalid';
37
+ trust: AttestationTrust;
38
+ diagnostics: Diagnostic[];
39
+ }
40
+ export declare function collectEvidenceHeads(root: string): Promise<Record<string, string>>;
41
+ export declare function createUnsignedAttestation(root: string, input: {
42
+ provider: EvidenceAttestation['ci']['provider'];
43
+ runId: string;
44
+ keyId: string;
45
+ issuedAt?: string;
46
+ githubOidc?: UnsignedAttestation['githubOidc'];
47
+ }, runner?: Runner): Promise<UnsignedAttestation>;
48
+ export declare function githubOidcAudience(audience: string, keyBinding: 'public-key' | 'key-id', keyId: string, publicKey?: string): string;
49
+ export declare function verifyEvidenceAttestation(root: string, config: AttestationConfig, runner?: Runner, environment?: NodeJS.ProcessEnv, options?: AttestationVerificationOptions): Promise<AttestationVerification>;
50
+ export declare function attestationSigningPayload(value: UnsignedAttestation): string;