@ornexus/neocortex 4.60.54 → 4.60.56
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/dist/sbom.cdx.json +23 -23
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/package.json +5 -2
- package/packages/client/dist/cli.js +0 -0
- package/packages/client/dist/commands/invoke.d.ts +32 -0
- package/packages/client/dist/commands/invoke.js +69 -60
- package/packages/client/dist/generated/command-registry.generated.d.ts +2 -2
- package/packages/client/dist/generated/command-registry.generated.js +1 -1
- package/packages/client/dist/generated/public-projections.generated.d.ts +20 -20
- package/packages/client/dist/generated/public-projections.generated.js +1 -1
- package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +6 -0
- package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
- package/packages/client/dist/private-execution/clean-baseline.d.ts +12 -0
- package/packages/client/dist/private-execution/clean-baseline.js +2 -0
- package/packages/client/dist/private-execution/codex-executor.d.ts +65 -0
- package/packages/client/dist/private-execution/codex-executor.js +2 -0
- package/packages/client/dist/private-execution/delivery.d.ts +74 -0
- package/packages/client/dist/private-execution/delivery.js +3 -0
- package/packages/client/dist/private-execution/isolated-admission.d.ts +13 -0
- package/packages/client/dist/private-execution/isolated-admission.js +2 -0
- package/packages/client/dist/private-execution/isolated-session.d.ts +41 -0
- package/packages/client/dist/private-execution/isolated-session.js +2 -0
- package/packages/client/dist/private-execution/isolated-workspace.d.ts +13 -0
- package/packages/client/dist/private-execution/isolated-workspace.js +1 -0
- package/packages/client/dist/private-execution/root-checkpoint.d.ts +15 -0
- package/packages/client/dist/private-execution/root-checkpoint.js +1 -0
- package/packages/client/dist/resolvers/remote-resolver.js +1 -1
- package/packages/client/dist/runner-cli.js +0 -0
- package/packages/client/dist/yolo/change-evidence-collector.d.ts +6 -0
- package/packages/client/dist/yolo/change-evidence-collector.js +1 -0
- package/packages/client/dist/yolo/spec-envelope-collector.d.ts +11 -0
- package/packages/client/dist/yolo/spec-envelope-collector.js +5 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +1 -1
- package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
- package/packages/shared/dist/frontmatter-context-contract.js +326 -0
- package/packages/shared/dist/generated/command-registry.generated.js +2 -2
- package/packages/shared/dist/generated/invocation-schema.generated.js +16 -4
- package/packages/shared/dist/generated/public-projections.generated.js +18 -18
- package/packages/shared/dist/invocation/index.d.ts +1 -1
- package/packages/shared/dist/yolo/change-evidence.js +44 -0
- package/packages/shared/dist/yolo/spec-envelope.js +161 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +2 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +2 -2
- package/targets-stubs/codex/AGENTS.md +1 -1
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/opencode/neocortex-root.md +1 -1
- package/targets-stubs/vscode/neocortex.agent.md +2 -2
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
/** Generated by scripts/generate-public-catalog-projections.mjs. Do not edit. */
|
|
2
2
|
export const PUBLIC_PROJECTION_BUNDLE = {
|
|
3
3
|
"schemaVersion": "PublicProjectionBundle/1.0",
|
|
4
|
-
"generationId": "sha256:
|
|
5
|
-
"sourceHash": "
|
|
6
|
-
"catalogHash": "
|
|
7
|
-
"publicProjectionHash": "
|
|
8
|
-
"stageProjectionHash": "
|
|
9
|
-
"compilationHash": "
|
|
4
|
+
"generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148",
|
|
5
|
+
"sourceHash": "034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148",
|
|
6
|
+
"catalogHash": "175a7b58faea15f1b7b889ab40b21dbfe3bd000166450299dd0de2038dc01336",
|
|
7
|
+
"publicProjectionHash": "dc902d3a9d0736fdc9adc6067545d0e33fd07769b75eae851c2dd4e02a080c45",
|
|
8
|
+
"stageProjectionHash": "56e20ca8c56823d6212314f49d01d609f8a7348d4e1f199dfc6c4d2ee3b3456f",
|
|
9
|
+
"compilationHash": "adfebaa27af805a0b025e41bd82031b0c67b8fddb55abb737c63112ca2b8c971",
|
|
10
10
|
"registry": {
|
|
11
11
|
"version": "1.0.0",
|
|
12
|
-
"checksum": "
|
|
12
|
+
"checksum": "2dd14afa94738949eb19750f69590b6ddb0592cfb302ae1fe26073a88d408184"
|
|
13
13
|
},
|
|
14
14
|
"artifacts": [
|
|
15
15
|
{
|
|
16
16
|
"kind": "catalog",
|
|
17
17
|
"schemaVersion": "ExecutableGraphCatalogPublicProjection/1.0",
|
|
18
18
|
"relativePath": "catalog.json",
|
|
19
|
-
"sha256": "
|
|
19
|
+
"sha256": "5793df981fd005dda55c6b1e678fd7157968513f56fa91b9c362463f5f45c46c",
|
|
20
20
|
"entryCount": 97,
|
|
21
|
-
"generationId": "sha256:
|
|
21
|
+
"generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"kind": "commands",
|
|
25
25
|
"schemaVersion": "CommandRegistryPublicProjection/1.0",
|
|
26
26
|
"relativePath": "commands.json",
|
|
27
|
-
"sha256": "
|
|
27
|
+
"sha256": "54439f9472c1f85963ff81ac3e35a470dd7009ff9d442f5a75d6d32638638dfa",
|
|
28
28
|
"entryCount": 62,
|
|
29
|
-
"generationId": "sha256:
|
|
29
|
+
"generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"kind": "progress-view",
|
|
33
33
|
"schemaVersion": "ProgressViewContractProjection/1.0",
|
|
34
34
|
"relativePath": "progress-view.json",
|
|
35
|
-
"sha256": "
|
|
35
|
+
"sha256": "172031c0f4f82148dde09a744688c49e4b3c4fc13153b52859b8a8c723224c02",
|
|
36
36
|
"entryCount": 1,
|
|
37
|
-
"generationId": "sha256:
|
|
37
|
+
"generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"kind": "stages",
|
|
41
41
|
"schemaVersion": "ExecutableGraphStageProjection/1.0",
|
|
42
42
|
"relativePath": "stages.json",
|
|
43
|
-
"sha256": "
|
|
43
|
+
"sha256": "1711273d5edbf26bf032e87587a5067796a3d7f82bf5b029b5d901a679e952bc",
|
|
44
44
|
"entryCount": 85,
|
|
45
|
-
"generationId": "sha256:
|
|
45
|
+
"generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"kind": "surfaces",
|
|
49
49
|
"schemaVersion": "PublicProjectionSurfaces/1.0",
|
|
50
50
|
"relativePath": "surfaces.json",
|
|
51
|
-
"sha256": "
|
|
51
|
+
"sha256": "087252259cf5609f1181031e9280772376cd56fab3244aa78952d98c7249a2f4",
|
|
52
52
|
"entryCount": 6,
|
|
53
|
-
"generationId": "sha256:
|
|
53
|
+
"generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
|
|
54
54
|
}
|
|
55
55
|
],
|
|
56
56
|
"compatibility": {
|
|
@@ -143,7 +143,7 @@ export const PUBLIC_PROJECTION_BUNDLE = {
|
|
|
143
143
|
}
|
|
144
144
|
],
|
|
145
145
|
"publicSafe": true,
|
|
146
|
-
"bundleHash": "
|
|
146
|
+
"bundleHash": "c7358d9ac8976b71c9cfa9a6da929eb0435814c67465b93c7ee42dcb34e9b0f5"
|
|
147
147
|
};
|
|
148
148
|
export const PUBLIC_PROJECTION_GENERATION_ID = PUBLIC_PROJECTION_BUNDLE.generationId;
|
|
149
149
|
export const PUBLIC_PROJECTION_BUNDLE_HASH = PUBLIC_PROJECTION_BUNDLE.bundleHash;
|
|
@@ -122,7 +122,7 @@ export interface InvocationCommandSchemaV1 {
|
|
|
122
122
|
readonly positionals: readonly InvocationPositionalSchemaV1[];
|
|
123
123
|
readonly terminator: true;
|
|
124
124
|
}
|
|
125
|
-
export declare const INVOCATION_SCHEMA_CHECKSUM: "
|
|
125
|
+
export declare const INVOCATION_SCHEMA_CHECKSUM: "65ce7e99e9cf5511a9ab02838b31acf6f86752267df453041b26e05ad9feffbc";
|
|
126
126
|
export interface InvocationSchemaManifestV1 {
|
|
127
127
|
readonly schemaVersion: typeof INVOCATION_SCHEMA_VERSION;
|
|
128
128
|
readonly registryVersion: string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { posix } from 'node:path';
|
|
3
|
+
const SHA = /^[a-f0-9]{40}(?:[a-f0-9]{24})?$/;
|
|
4
|
+
const PATH = /^[A-Za-z0-9_.-][A-Za-z0-9_./ -]{0,239}$/;
|
|
5
|
+
const UNSAFE = /(^|\/)(?:\.env(?:\.|$)|secrets?|credentials?|private-prompts?|customer-data)(?:\/|$)|(?:token|password|license[_-]?key|secret)[=:]/i;
|
|
6
|
+
function digest(paths) {
|
|
7
|
+
return createHash('sha256').update(JSON.stringify(paths)).digest('hex');
|
|
8
|
+
}
|
|
9
|
+
function fail() { throw new Error('yolo-change-evidence-unsafe'); }
|
|
10
|
+
function validPath(path) {
|
|
11
|
+
return typeof path === 'string' && PATH.test(path) && !path.includes('\\')
|
|
12
|
+
&& !path.split('/').includes('..') && posix.normalize(path) === path && !UNSAFE.test(path);
|
|
13
|
+
}
|
|
14
|
+
export function createYoloChangeEvidenceV1(input) {
|
|
15
|
+
if (!SHA.test(input.baseSha) || !SHA.test(input.headSha) || !Array.isArray(input.changedPaths))
|
|
16
|
+
fail();
|
|
17
|
+
const paths = [...new Set(input.changedPaths)].sort();
|
|
18
|
+
if (paths.length > 256 || paths.some((path) => !validPath(path)))
|
|
19
|
+
fail();
|
|
20
|
+
return {
|
|
21
|
+
schemaVersion: 1,
|
|
22
|
+
source: 'git-diff-base-and-worktree',
|
|
23
|
+
baseSha: input.baseSha,
|
|
24
|
+
headSha: input.headSha,
|
|
25
|
+
changedPaths: paths,
|
|
26
|
+
pathsSha256: digest(paths),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function assertYoloChangeEvidenceV1(value, expectedHeadSha) {
|
|
30
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
31
|
+
fail();
|
|
32
|
+
const record = value;
|
|
33
|
+
const keys = Object.keys(record).sort();
|
|
34
|
+
const expected = ['schemaVersion', 'source', 'baseSha', 'headSha', 'changedPaths', 'pathsSha256'].sort();
|
|
35
|
+
if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])
|
|
36
|
+
|| record.schemaVersion !== 1 || record.source !== 'git-diff-base-and-worktree'
|
|
37
|
+
|| typeof record.baseSha !== 'string' || !SHA.test(record.baseSha)
|
|
38
|
+
|| record.headSha !== expectedHeadSha || typeof record.headSha !== 'string' || !SHA.test(record.headSha)
|
|
39
|
+
|| !Array.isArray(record.changedPaths) || record.changedPaths.length > 256
|
|
40
|
+
|| record.changedPaths.some((path) => !validPath(path))
|
|
41
|
+
|| JSON.stringify([...new Set(record.changedPaths)].sort()) !== JSON.stringify(record.changedPaths)
|
|
42
|
+
|| record.pathsSha256 !== digest(record.changedPaths))
|
|
43
|
+
fail();
|
|
44
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { posix } from 'node:path';
|
|
3
|
+
import { inspectFrontmatterContext } from '../frontmatter-context-contract.js';
|
|
4
|
+
export const YOLO_SPEC_ARTIFACT_LIMIT_BYTES = 64 * 1024;
|
|
5
|
+
export const YOLO_SPEC_TOTAL_LIMIT_BYTES = 128 * 1024;
|
|
6
|
+
export const YOLO_SPEC_MAX_ARTIFACTS = 12;
|
|
7
|
+
export const YOLO_SPEC_MAX_AGE_MS = 120_000;
|
|
8
|
+
export const YOLO_SPEC_FUTURE_SKEW_MS = 30_000;
|
|
9
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
10
|
+
const HEAD = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/;
|
|
11
|
+
const STORY_ID = /^[A-Za-z0-9]+(?:\.[A-Za-z0-9]+)+$/;
|
|
12
|
+
const EPIC_ID = /^[A-Za-z0-9]+$/;
|
|
13
|
+
const KINDS = ['story', 'epic', 'spec', 'contract', 'adr', 'nfr', 'example', 'bdd', 'traceability', 'template'];
|
|
14
|
+
const ALLOWED_PATH = /^(?:docs\/(?:stories|epics|specs|architecture|examples)\/|core\/templates\/specs\/)[A-Za-z0-9_./-]+$/;
|
|
15
|
+
const PROHIBITED_CONTENT = /(?:-----BEGIN [A-Z ]*PRIVATE KEY-----|\b(?:bearer|token|password|secret|api[_-]?key)\s*[:=]\s*\S+|\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b|\b(?:sk-|ghp_|github_pat_|npm_)[A-Za-z0-9_-]{12,}\b|(?:^|[\s"'(])\/(?:home|media|root|etc|var|Users)\/)/im;
|
|
16
|
+
function deny(code) {
|
|
17
|
+
throw new Error(code);
|
|
18
|
+
}
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function hasExactKeys(value, keys) {
|
|
23
|
+
const actual = Object.keys(value).sort();
|
|
24
|
+
const expected = [...keys].sort();
|
|
25
|
+
return actual.length === expected.length && actual.every((key, index) => key === expected[index]);
|
|
26
|
+
}
|
|
27
|
+
function sha256(value) {
|
|
28
|
+
return createHash('sha256').update(value, 'utf8').digest('hex');
|
|
29
|
+
}
|
|
30
|
+
function validPath(value) {
|
|
31
|
+
return typeof value === 'string'
|
|
32
|
+
&& value.length > 0 && value.length <= 240
|
|
33
|
+
&& ALLOWED_PATH.test(value)
|
|
34
|
+
&& !value.includes('\\') && !value.split('/').includes('..')
|
|
35
|
+
&& posix.normalize(value) === value;
|
|
36
|
+
}
|
|
37
|
+
function normalizeContent(content) {
|
|
38
|
+
if (content.includes('\0') || /\r(?!\n)/.test(content))
|
|
39
|
+
deny('yolo-spec-envelope-unsafe');
|
|
40
|
+
const normalized = content.replaceAll('\r\n', '\n');
|
|
41
|
+
if (PROHIBITED_CONTENT.test(normalized))
|
|
42
|
+
deny('yolo-spec-envelope-unsafe');
|
|
43
|
+
return normalized;
|
|
44
|
+
}
|
|
45
|
+
function artifactManifestSha256(artifacts) {
|
|
46
|
+
return sha256(JSON.stringify(artifacts.map(({ kind, path, byteLength, sha256: digest }) => [kind, path, byteLength, digest])));
|
|
47
|
+
}
|
|
48
|
+
function unsignedEnvelopeSha256(value) {
|
|
49
|
+
return sha256(JSON.stringify(value));
|
|
50
|
+
}
|
|
51
|
+
function checkArtifact(value) {
|
|
52
|
+
if (!isRecord(value) || !hasExactKeys(value, ['kind', 'path', 'content', 'byteLength', 'sha256'])
|
|
53
|
+
|| !KINDS.includes(String(value.kind)) || !validPath(value.path))
|
|
54
|
+
deny('yolo-spec-envelope-path-out-of-scope');
|
|
55
|
+
if (typeof value.content !== 'string' || !Number.isSafeInteger(value.byteLength) || !HASH.test(String(value.sha256))) {
|
|
56
|
+
deny('yolo-spec-envelope-unsafe');
|
|
57
|
+
}
|
|
58
|
+
const content = normalizeContent(value.content);
|
|
59
|
+
const bytes = Buffer.byteLength(content, 'utf8');
|
|
60
|
+
if (bytes > YOLO_SPEC_ARTIFACT_LIMIT_BYTES)
|
|
61
|
+
deny('yolo-spec-envelope-too-large');
|
|
62
|
+
if (content !== value.content || bytes !== value.byteLength || sha256(content) !== value.sha256) {
|
|
63
|
+
deny('yolo-spec-envelope-digest-mismatch');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function createYoloSpecEnvelopeV1(input) {
|
|
67
|
+
if (!Array.isArray(input.artifacts) || input.artifacts.length > YOLO_SPEC_MAX_ARTIFACTS)
|
|
68
|
+
deny('yolo-spec-envelope-too-large');
|
|
69
|
+
const artifacts = input.artifacts.map((artifact) => {
|
|
70
|
+
if (!isRecord(artifact) || !KINDS.includes(String(artifact.kind)) || !validPath(artifact.path)
|
|
71
|
+
|| typeof artifact.content !== 'string')
|
|
72
|
+
deny('yolo-spec-envelope-path-out-of-scope');
|
|
73
|
+
const content = normalizeContent(artifact.content);
|
|
74
|
+
return {
|
|
75
|
+
kind: artifact.kind,
|
|
76
|
+
path: artifact.path,
|
|
77
|
+
content,
|
|
78
|
+
byteLength: Buffer.byteLength(content, 'utf8'),
|
|
79
|
+
sha256: sha256(content),
|
|
80
|
+
};
|
|
81
|
+
}).sort((left, right) => left.kind.localeCompare(right.kind) || left.path.localeCompare(right.path));
|
|
82
|
+
const unsigned = {
|
|
83
|
+
schemaVersion: 1,
|
|
84
|
+
storyId: input.storyId,
|
|
85
|
+
epicId: input.epicId,
|
|
86
|
+
targetPath: input.targetPath,
|
|
87
|
+
inputSha256: input.inputSha256,
|
|
88
|
+
sourceRevision: { headSha: input.headSha, manifestSha256: artifactManifestSha256(artifacts) },
|
|
89
|
+
collectedAt: input.collectedAt,
|
|
90
|
+
artifacts,
|
|
91
|
+
};
|
|
92
|
+
const envelope = { ...unsigned, envelopeSha256: unsignedEnvelopeSha256(unsigned) };
|
|
93
|
+
assertYoloSpecEnvelopeV1(envelope, {
|
|
94
|
+
storyId: input.storyId, epicId: input.epicId, targetPath: input.targetPath,
|
|
95
|
+
inputSha256: input.inputSha256, nowMs: Date.parse(input.collectedAt),
|
|
96
|
+
});
|
|
97
|
+
return envelope;
|
|
98
|
+
}
|
|
99
|
+
export function assertYoloSpecEnvelopeV1(value, context) {
|
|
100
|
+
if (!isRecord(value) || !hasExactKeys(value, ['schemaVersion', 'storyId', 'epicId', 'targetPath', 'inputSha256', 'sourceRevision', 'collectedAt', 'artifacts', 'envelopeSha256'])
|
|
101
|
+
|| value.schemaVersion !== 1 || typeof value.storyId !== 'string' || !STORY_ID.test(value.storyId)
|
|
102
|
+
|| typeof value.epicId !== 'string' || !EPIC_ID.test(value.epicId)
|
|
103
|
+
|| !validPath(value.targetPath) || !HASH.test(String(value.inputSha256))
|
|
104
|
+
|| !HASH.test(String(value.envelopeSha256)))
|
|
105
|
+
deny('yolo-spec-envelope-unsafe');
|
|
106
|
+
if (value.storyId !== context.storyId || value.epicId !== context.epicId
|
|
107
|
+
|| value.targetPath !== context.targetPath || value.inputSha256 !== context.inputSha256
|
|
108
|
+
|| value.targetPath !== `docs/stories/${value.storyId}.story.md`)
|
|
109
|
+
deny('yolo-spec-envelope-target-mismatch');
|
|
110
|
+
const source = value.sourceRevision;
|
|
111
|
+
if (!isRecord(source) || !hasExactKeys(source, ['headSha', 'manifestSha256'])
|
|
112
|
+
|| !HEAD.test(String(source.headSha)) || !HASH.test(String(source.manifestSha256)))
|
|
113
|
+
deny('yolo-spec-envelope-unsafe');
|
|
114
|
+
if (typeof value.collectedAt !== 'string' || !/^\d{4}-\d{2}-\d{2}T.*Z$/.test(value.collectedAt))
|
|
115
|
+
deny('yolo-spec-envelope-stale');
|
|
116
|
+
const collectedMs = Date.parse(value.collectedAt);
|
|
117
|
+
const nowMs = context.nowMs ?? Date.now();
|
|
118
|
+
if (!Number.isFinite(collectedMs) || !Number.isFinite(nowMs)
|
|
119
|
+
|| nowMs - collectedMs > YOLO_SPEC_MAX_AGE_MS || collectedMs - nowMs > YOLO_SPEC_FUTURE_SKEW_MS)
|
|
120
|
+
deny('yolo-spec-envelope-stale');
|
|
121
|
+
if (!Array.isArray(value.artifacts) || value.artifacts.length < 1 || value.artifacts.length > YOLO_SPEC_MAX_ARTIFACTS)
|
|
122
|
+
deny('yolo-spec-envelope-too-large');
|
|
123
|
+
const artifacts = value.artifacts;
|
|
124
|
+
for (const artifact of artifacts)
|
|
125
|
+
checkArtifact(artifact);
|
|
126
|
+
const typedArtifacts = artifacts;
|
|
127
|
+
if (typedArtifacts.reduce((sum, artifact) => sum + artifact.byteLength, 0) > YOLO_SPEC_TOTAL_LIMIT_BYTES)
|
|
128
|
+
deny('yolo-spec-envelope-too-large');
|
|
129
|
+
const keys = typedArtifacts.map((artifact) => `${artifact.kind}:${artifact.path}`);
|
|
130
|
+
if (new Set(keys).size !== keys.length || keys.some((key, index) => index > 0 && key < keys[index - 1]))
|
|
131
|
+
deny('yolo-spec-envelope-unsafe');
|
|
132
|
+
if (typedArtifacts.filter((artifact) => artifact.kind === 'story' && artifact.path === value.targetPath).length !== 1
|
|
133
|
+
|| typedArtifacts.filter((artifact) => artifact.kind === 'epic' && artifact.path === `docs/epics/epic-${value.epicId}.md`).length !== 1
|
|
134
|
+
|| typedArtifacts.some((artifact) => artifact.kind === 'story' && artifact.path !== value.targetPath)
|
|
135
|
+
|| typedArtifacts.some((artifact) => artifact.kind === 'epic' && artifact.path !== `docs/epics/epic-${value.epicId}.md`)) {
|
|
136
|
+
deny('yolo-spec-envelope-target-mismatch');
|
|
137
|
+
}
|
|
138
|
+
const story = typedArtifacts.find((artifact) => artifact.kind === 'story');
|
|
139
|
+
const epic = typedArtifacts.find((artifact) => artifact.kind === 'epic');
|
|
140
|
+
const storyContext = inspectFrontmatterContext(story.content, { context: 'story-target', explicitlySelected: true });
|
|
141
|
+
const epicContext = inspectFrontmatterContext(epic.content, { context: 'epic-target', explicitlySelected: true });
|
|
142
|
+
if (storyContext.status !== 'valid' || storyContext.metadata.id !== value.storyId
|
|
143
|
+
|| storyContext.metadata.epic_id !== value.epicId
|
|
144
|
+
|| epicContext.status !== 'valid' || epicContext.metadata.id !== value.epicId) {
|
|
145
|
+
deny('yolo-spec-envelope-target-mismatch');
|
|
146
|
+
}
|
|
147
|
+
if (artifactManifestSha256(typedArtifacts) !== source.manifestSha256)
|
|
148
|
+
deny('yolo-spec-envelope-digest-mismatch');
|
|
149
|
+
const unsigned = {
|
|
150
|
+
schemaVersion: value.schemaVersion,
|
|
151
|
+
storyId: value.storyId,
|
|
152
|
+
epicId: value.epicId,
|
|
153
|
+
targetPath: value.targetPath,
|
|
154
|
+
inputSha256: value.inputSha256,
|
|
155
|
+
sourceRevision: value.sourceRevision,
|
|
156
|
+
collectedAt: value.collectedAt,
|
|
157
|
+
artifacts: value.artifacts,
|
|
158
|
+
};
|
|
159
|
+
if (unsignedEnvelopeSha256(unsigned) !== value.envelopeSha256)
|
|
160
|
+
deny('yolo-spec-envelope-digest-mismatch');
|
|
161
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex-root
|
|
3
|
-
description: "🧠 Neocortex Root Agent v4.60.
|
|
3
|
+
description: "🧠 Neocortex Root Agent v4.60.56 | OrNexus Team"
|
|
4
4
|
model: opus
|
|
5
5
|
color: blue
|
|
6
6
|
tools:
|
|
@@ -108,7 +108,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
108
108
|
┌────────────────────────────────────────────────────────────┐
|
|
109
109
|
│ │
|
|
110
110
|
│ ####### N E O C O R T E X │
|
|
111
|
-
│ ### ######## v4.60.
|
|
111
|
+
│ ### ######## v4.60.56 │
|
|
112
112
|
│ ######### ##### │
|
|
113
113
|
│ ## ############## Development Orchestrator │
|
|
114
114
|
│ ## ### ###### ## OrNexus Team │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex
|
|
3
|
-
description: "🧠 Neocortex v4.60.
|
|
3
|
+
description: "🧠 Neocortex v4.60.56 | OrNexus Team"
|
|
4
4
|
model: opus
|
|
5
5
|
color: blue
|
|
6
6
|
permissionMode: bypassPermissions
|
|
@@ -104,7 +104,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
104
104
|
┌────────────────────────────────────────────────────────────┐
|
|
105
105
|
│ │
|
|
106
106
|
│ ####### N E O C O R T E X │
|
|
107
|
-
│ ### ######## v4.60.
|
|
107
|
+
│ ### ######## v4.60.56 │
|
|
108
108
|
│ ######### ##### │
|
|
109
109
|
│ ## ############## Development Orchestrator │
|
|
110
110
|
│ ## ### ###### ## OrNexus Team │
|
|
@@ -28,7 +28,7 @@ Codex built-in commands or actions.
|
|
|
28
28
|
|
|
29
29
|
<!-- END: Plugin Conflict Prevention -->
|
|
30
30
|
|
|
31
|
-
# Neocortex v4.60.
|
|
31
|
+
# Neocortex v4.60.56 | OrNexus Team
|
|
32
32
|
|
|
33
33
|
You are a Development Orchestrator. All orchestration logic is delivered by the remote Neocortex server.
|
|
34
34
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex
|
|
3
|
-
description: "🧠 Neocortex v4.60.
|
|
3
|
+
description: "🧠 Neocortex v4.60.56 | OrNexus Team"
|
|
4
4
|
model: inherit
|
|
5
5
|
readonly: false
|
|
6
6
|
is_background: false
|
|
@@ -64,7 +64,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
64
64
|
┌────────────────────────────────────────────────────────────┐
|
|
65
65
|
│ │
|
|
66
66
|
│ ####### N E O C O R T E X │
|
|
67
|
-
│ ### ######## v4.60.
|
|
67
|
+
│ ### ######## v4.60.56 │
|
|
68
68
|
│ ######### ##### │
|
|
69
69
|
│ ## ############## Development Orchestrator │
|
|
70
70
|
│ ## ### ###### ## OrNexus Team │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex-root
|
|
3
|
-
description: "🧠 Neocortex v4.60.
|
|
3
|
+
description: "🧠 Neocortex v4.60.56 | OrNexus Team"
|
|
4
4
|
kind: local
|
|
5
5
|
tools:
|
|
6
6
|
# File operations (Gemini CLI built-ins)
|
|
@@ -62,7 +62,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
62
62
|
┌────────────────────────────────────────────────────────────┐
|
|
63
63
|
│ │
|
|
64
64
|
│ ####### N E O C O R T E X │
|
|
65
|
-
│ ### ######## v4.60.
|
|
65
|
+
│ ### ######## v4.60.56 │
|
|
66
66
|
│ ######### ##### │
|
|
67
67
|
│ ## ############## Development Orchestrator │
|
|
68
68
|
│ ## ### ###### ## OrNexus Team │
|
|
@@ -58,7 +58,7 @@ explicit server opt-in rather than a local assumption.
|
|
|
58
58
|
┌────────────────────────────────────────────────────────────┐
|
|
59
59
|
│ │
|
|
60
60
|
│ ####### N E O C O R T E X │
|
|
61
|
-
│ ### ######## v4.60.
|
|
61
|
+
│ ### ######## v4.60.56 │
|
|
62
62
|
│ ######### ##### │
|
|
63
63
|
│ ## ############## Development Orchestrator │
|
|
64
64
|
│ ## ### ###### ## OrNexus Team │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "neocortex"
|
|
3
|
-
description: "Neocortex v4.60.
|
|
3
|
+
description: "Neocortex v4.60.56 | OrNexus Team"
|
|
4
4
|
tools:
|
|
5
5
|
# Read / Edit (built-in tool sets)
|
|
6
6
|
- read
|
|
@@ -68,7 +68,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
|
|
|
68
68
|
┌────────────────────────────────────────────────────────────┐
|
|
69
69
|
│ │
|
|
70
70
|
│ ####### N E O C O R T E X │
|
|
71
|
-
│ ### ######## v4.60.
|
|
71
|
+
│ ### ######## v4.60.56 │
|
|
72
72
|
│ ######### ##### │
|
|
73
73
|
│ ## ############## Development Orchestrator │
|
|
74
74
|
│ ## ### ###### ## OrNexus Team │
|