@hybridlabor-api/aos 4.0.2 → 4.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/.claude/agents/database-reviewer.md +109 -0
- package/.claude/agents/go-build-resolver.md +112 -0
- package/.claude/agents/opensource-forker.md +216 -0
- package/.claude/agents/opensource-sanitizer.md +206 -0
- package/.claude/agents/security-reviewer.md +126 -0
- package/.claude/agents/silent-failure-hunter.md +68 -0
- package/CLAUDE.md +15 -0
- package/README.md +0 -13
- package/THIRD_PARTY_NOTICES.md +133 -0
- package/package.json +4 -2
- package/skills/basic/bdbmediastorm/SKILL.md +7 -1
- package/skills/basic/startcycle/SKILL.md +2 -0
- package/skills/bdbrainstorm/SKILL.md +1 -0
- package/skills/global_config/plan-canvas/SKILL.md +233 -0
- package/skills/global_config/plan-canvas/scripts/lib/loopback-guard.js +59 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/markdown.js +301 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/sdk.js +239 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/server.js +636 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/sessions.js +271 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/ui.js +630 -0
- package/skills/global_config/plan-canvas/scripts/plan-canvas.js +419 -0
- package/.agents/skills/firecrawl/SKILL.md +0 -149
- package/.agents/skills/firecrawl/rules/install.md +0 -82
- package/.agents/skills/firecrawl/rules/security.md +0 -26
- package/.agents/skills/firecrawl-agent/SKILL.md +0 -58
- package/.agents/skills/firecrawl-build/SKILL.md +0 -39
- package/.agents/skills/firecrawl-build-interact/SKILL.md +0 -68
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +0 -103
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +0 -39
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +0 -20
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +0 -17
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +0 -69
- package/.agents/skills/firecrawl-build-search/SKILL.md +0 -69
- package/.agents/skills/firecrawl-crawl/SKILL.md +0 -59
- package/.agents/skills/firecrawl-download/SKILL.md +0 -70
- package/.agents/skills/firecrawl-interact/SKILL.md +0 -84
- package/.agents/skills/firecrawl-map/SKILL.md +0 -51
- package/.agents/skills/firecrawl-scrape/SKILL.md +0 -69
- package/.agents/skills/firecrawl-search/SKILL.md +0 -60
- package/docs/sessions/AUDIT-HANDOVER-2026-08-28.md +0 -169
- package/docs/sessions/BDB_REMOTEOS_MCP_HANDOVER.md +0 -130
- package/docs/sessions/SESSION-HANDOVER-v3.13.md +0 -249
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +0 -10
- package/mcps/after-effects-mcp/build/index.js +0 -840
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +0 -153
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +0 -218
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +0 -71
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +0 -147
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +0 -114
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +0 -115
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +0 -192
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +0 -90
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +0 -50
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +0 -1773
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +0 -160
- package/mcps/bdb-remoteos-mcp/queue.db +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/__init__.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/incus_client.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/main.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/queue.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/schemas.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/server.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/webhook.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/__init__.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/mock_incus.cpython-312.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_mcp_server.cpython-312-pytest-9.1.1.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_security_redteam.cpython-312-pytest-9.1.1.pyc +0 -0
- package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_webhook.cpython-312-pytest-9.1.1.pyc +0 -0
- package/mcps/computer-use-mcp/dist/client.d.ts +0 -150
- package/mcps/computer-use-mcp/dist/client.js +0 -136
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +0 -16
- package/mcps/computer-use-mcp/dist/entrypoint.js +0 -26
- package/mcps/computer-use-mcp/dist/native.d.ts +0 -212
- package/mcps/computer-use-mcp/dist/native.js +0 -50
- package/mcps/computer-use-mcp/dist/server.d.ts +0 -32
- package/mcps/computer-use-mcp/dist/server.js +0 -342
- package/mcps/computer-use-mcp/dist/session.d.ts +0 -101
- package/mcps/computer-use-mcp/dist/session.js +0 -2372
- package/skills/bdbsaastraining/scripts/__pycache__/build_profile.cpython-314.pyc +0 -0
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// createSolidLayer.jsx
|
|
2
|
-
// Creates a new solid layer in the specified composition
|
|
3
|
-
|
|
4
|
-
function createSolidLayer(args) {
|
|
5
|
-
try {
|
|
6
|
-
// Extract parameters from args
|
|
7
|
-
var compName = args.compName || "";
|
|
8
|
-
var color = args.color || [1, 1, 1]; // Default to white
|
|
9
|
-
var name = args.name || "Solid Layer";
|
|
10
|
-
var position = args.position || [960, 540]; // Default to center
|
|
11
|
-
var size = args.size; // Width, Height (if null, will use comp size)
|
|
12
|
-
var startTime = args.startTime || 0;
|
|
13
|
-
var duration = args.duration || 5; // Default 5 seconds
|
|
14
|
-
var isAdjustment = args.isAdjustment || false; // Make it an adjustment layer?
|
|
15
|
-
|
|
16
|
-
// Find the composition by name
|
|
17
|
-
var comp = null;
|
|
18
|
-
for (var i = 1; i <= app.project.numItems; i++) {
|
|
19
|
-
var item = app.project.item(i);
|
|
20
|
-
if (item instanceof CompItem && item.name === compName) {
|
|
21
|
-
comp = item;
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// If no composition was found by name, use the active composition
|
|
27
|
-
if (!comp) {
|
|
28
|
-
if (app.project.activeItem instanceof CompItem) {
|
|
29
|
-
comp = app.project.activeItem;
|
|
30
|
-
} else {
|
|
31
|
-
throw new Error("No composition found with name '" + compName + "' and no active composition");
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// If size is not specified, use composition size
|
|
36
|
-
if (!size) {
|
|
37
|
-
size = [comp.width, comp.height];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Create a solid layer
|
|
41
|
-
var solidLayer;
|
|
42
|
-
|
|
43
|
-
if (isAdjustment) {
|
|
44
|
-
// Create an adjustment layer
|
|
45
|
-
solidLayer = comp.layers.addSolid([0, 0, 0], name, size[0], size[1], 1);
|
|
46
|
-
solidLayer.adjustmentLayer = true;
|
|
47
|
-
} else {
|
|
48
|
-
// Create a regular solid layer
|
|
49
|
-
solidLayer = comp.layers.addSolid(
|
|
50
|
-
color,
|
|
51
|
-
name,
|
|
52
|
-
size[0],
|
|
53
|
-
size[1],
|
|
54
|
-
1 // Pixel aspect ratio
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Set position
|
|
59
|
-
solidLayer.property("Position").setValue(position);
|
|
60
|
-
|
|
61
|
-
// Set timing
|
|
62
|
-
solidLayer.startTime = startTime;
|
|
63
|
-
if (duration > 0) {
|
|
64
|
-
solidLayer.outPoint = startTime + duration;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Return success with layer details
|
|
68
|
-
return JSON.stringify({
|
|
69
|
-
status: "success",
|
|
70
|
-
message: isAdjustment ? "Adjustment layer created successfully" : "Solid layer created successfully",
|
|
71
|
-
layer: {
|
|
72
|
-
name: solidLayer.name,
|
|
73
|
-
index: solidLayer.index,
|
|
74
|
-
type: isAdjustment ? "adjustment" : "solid",
|
|
75
|
-
inPoint: solidLayer.inPoint,
|
|
76
|
-
outPoint: solidLayer.outPoint,
|
|
77
|
-
position: solidLayer.property("Position").value,
|
|
78
|
-
isAdjustment: solidLayer.adjustmentLayer
|
|
79
|
-
}
|
|
80
|
-
}, null, 2);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
// Return error message
|
|
83
|
-
return JSON.stringify({
|
|
84
|
-
status: "error",
|
|
85
|
-
message: error.toString()
|
|
86
|
-
}, null, 2);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Read arguments from the file (passed by the Node.js script)
|
|
91
|
-
var argsFile = new File($.fileName.replace(/[^\\\/]*$/, '') + "../temp/args.json");
|
|
92
|
-
var args = {};
|
|
93
|
-
if (argsFile.exists) {
|
|
94
|
-
argsFile.open("r");
|
|
95
|
-
var content = argsFile.read();
|
|
96
|
-
argsFile.close();
|
|
97
|
-
if (content) {
|
|
98
|
-
try {
|
|
99
|
-
args = JSON.parse(content);
|
|
100
|
-
} catch (e) {
|
|
101
|
-
// Handle parsing error
|
|
102
|
-
$.write(JSON.stringify({
|
|
103
|
-
status: "error",
|
|
104
|
-
message: "Failed to parse arguments: " + e.toString()
|
|
105
|
-
}, null, 2));
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Run the function and write the result
|
|
111
|
-
var result = createSolidLayer(args);
|
|
112
|
-
|
|
113
|
-
// Write the result so it can be captured by the Node.js process
|
|
114
|
-
$.write(result);
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
// createTextLayer.jsx
|
|
2
|
-
// Creates a new text layer in the specified composition
|
|
3
|
-
|
|
4
|
-
function createTextLayer(args) {
|
|
5
|
-
try {
|
|
6
|
-
// Extract parameters from args
|
|
7
|
-
var compName = args.compName || "";
|
|
8
|
-
var text = args.text || "Text Layer";
|
|
9
|
-
var position = args.position || [960, 540]; // Default to center
|
|
10
|
-
var fontSize = args.fontSize || 72;
|
|
11
|
-
var color = args.color || [1, 1, 1]; // Default to white
|
|
12
|
-
var startTime = args.startTime || 0;
|
|
13
|
-
var duration = args.duration || 5; // Default 5 seconds
|
|
14
|
-
var fontFamily = args.fontFamily || "Arial";
|
|
15
|
-
var alignment = args.alignment || "center"; // "left", "center", "right"
|
|
16
|
-
|
|
17
|
-
// Find the composition by name
|
|
18
|
-
var comp = null;
|
|
19
|
-
for (var i = 1; i <= app.project.numItems; i++) {
|
|
20
|
-
var item = app.project.item(i);
|
|
21
|
-
if (item instanceof CompItem && item.name === compName) {
|
|
22
|
-
comp = item;
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// If no composition was found by name, use the active composition
|
|
28
|
-
if (!comp) {
|
|
29
|
-
if (app.project.activeItem instanceof CompItem) {
|
|
30
|
-
comp = app.project.activeItem;
|
|
31
|
-
} else {
|
|
32
|
-
throw new Error("No composition found with name '" + compName + "' and no active composition");
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Create the text layer
|
|
37
|
-
var textLayer = comp.layers.addText(text);
|
|
38
|
-
|
|
39
|
-
// Get text properties
|
|
40
|
-
var textProp = textLayer.property("ADBE Text Properties").property("ADBE Text Document");
|
|
41
|
-
var textDocument = textProp.value;
|
|
42
|
-
|
|
43
|
-
// Set font size and color
|
|
44
|
-
textDocument.fontSize = fontSize;
|
|
45
|
-
textDocument.fillColor = color;
|
|
46
|
-
textDocument.font = fontFamily;
|
|
47
|
-
|
|
48
|
-
// Set text alignment
|
|
49
|
-
if (alignment === "left") {
|
|
50
|
-
textDocument.justification = ParagraphJustification.LEFT_JUSTIFY;
|
|
51
|
-
} else if (alignment === "center") {
|
|
52
|
-
textDocument.justification = ParagraphJustification.CENTER_JUSTIFY;
|
|
53
|
-
} else if (alignment === "right") {
|
|
54
|
-
textDocument.justification = ParagraphJustification.RIGHT_JUSTIFY;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Update the text property
|
|
58
|
-
textProp.setValue(textDocument);
|
|
59
|
-
|
|
60
|
-
// Set position
|
|
61
|
-
textLayer.property("Position").setValue(position);
|
|
62
|
-
|
|
63
|
-
// Set timing
|
|
64
|
-
textLayer.startTime = startTime;
|
|
65
|
-
if (duration > 0) {
|
|
66
|
-
textLayer.outPoint = startTime + duration;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Return success with layer details
|
|
70
|
-
return JSON.stringify({
|
|
71
|
-
status: "success",
|
|
72
|
-
message: "Text layer created successfully",
|
|
73
|
-
layer: {
|
|
74
|
-
name: textLayer.name,
|
|
75
|
-
index: textLayer.index,
|
|
76
|
-
type: "text",
|
|
77
|
-
inPoint: textLayer.inPoint,
|
|
78
|
-
outPoint: textLayer.outPoint,
|
|
79
|
-
position: textLayer.property("Position").value
|
|
80
|
-
}
|
|
81
|
-
}, null, 2);
|
|
82
|
-
} catch (error) {
|
|
83
|
-
// Return error message
|
|
84
|
-
return JSON.stringify({
|
|
85
|
-
status: "error",
|
|
86
|
-
message: error.toString()
|
|
87
|
-
}, null, 2);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Read arguments from the file (passed by the Node.js script)
|
|
92
|
-
var argsFile = new File($.fileName.replace(/[^\\\/]*$/, '') + "../temp/args.json");
|
|
93
|
-
var args = {};
|
|
94
|
-
if (argsFile.exists) {
|
|
95
|
-
argsFile.open("r");
|
|
96
|
-
var content = argsFile.read();
|
|
97
|
-
argsFile.close();
|
|
98
|
-
if (content) {
|
|
99
|
-
try {
|
|
100
|
-
args = JSON.parse(content);
|
|
101
|
-
} catch (e) {
|
|
102
|
-
// Handle parsing error
|
|
103
|
-
$.write(JSON.stringify({
|
|
104
|
-
status: "error",
|
|
105
|
-
message: "Failed to parse arguments: " + e.toString()
|
|
106
|
-
}, null, 2));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Run the function and write the result
|
|
112
|
-
var result = createTextLayer(args);
|
|
113
|
-
|
|
114
|
-
// Write the result so it can be captured by the Node.js process
|
|
115
|
-
$.write(result);
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// getLayerInfo.jsx
|
|
2
|
-
// Get detailed information about layers in a composition
|
|
3
|
-
|
|
4
|
-
function getLayerInfo() {
|
|
5
|
-
var project = app.project;
|
|
6
|
-
var compName = undefined;
|
|
7
|
-
|
|
8
|
-
// Read arguments from the file (passed by the Node.js script)
|
|
9
|
-
var argsFile = new File($.fileName.replace(/[^\\\/]*$/, '') + "../temp/args.json");
|
|
10
|
-
var args = {};
|
|
11
|
-
if (argsFile.exists) {
|
|
12
|
-
argsFile.open("r");
|
|
13
|
-
var content = argsFile.read();
|
|
14
|
-
argsFile.close();
|
|
15
|
-
if (content) {
|
|
16
|
-
try {
|
|
17
|
-
args = JSON.parse(content);
|
|
18
|
-
compName = args.compositionName;
|
|
19
|
-
} catch (e) {
|
|
20
|
-
// Handle parsing error
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var result = {
|
|
26
|
-
compositions: []
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
// Find compositions and their layers
|
|
30
|
-
for (var i = 1; i <= project.numItems; i++) {
|
|
31
|
-
var item = project.item(i);
|
|
32
|
-
if (item instanceof CompItem && (!compName || item.name === compName)) {
|
|
33
|
-
var compData = {
|
|
34
|
-
name: item.name,
|
|
35
|
-
id: item.id,
|
|
36
|
-
duration: item.duration,
|
|
37
|
-
frameRate: item.frameRate,
|
|
38
|
-
width: item.width,
|
|
39
|
-
height: item.height,
|
|
40
|
-
layers: []
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// Process layers in the composition
|
|
44
|
-
for (var j = 1; j <= item.numLayers; j++) {
|
|
45
|
-
var layer = item.layer(j);
|
|
46
|
-
var layerData = {
|
|
47
|
-
name: layer.name,
|
|
48
|
-
index: layer.index,
|
|
49
|
-
enabled: layer.enabled,
|
|
50
|
-
locked: layer.locked,
|
|
51
|
-
solo: layer.solo,
|
|
52
|
-
shy: layer.shy,
|
|
53
|
-
type: determineLayerType(layer),
|
|
54
|
-
inPoint: layer.inPoint,
|
|
55
|
-
outPoint: layer.outPoint,
|
|
56
|
-
duration: layer.outPoint - layer.inPoint,
|
|
57
|
-
startTime: layer.startTime,
|
|
58
|
-
label: layer.label,
|
|
59
|
-
hasAudio: layer.hasAudio,
|
|
60
|
-
hasVideo: layer.hasVideo,
|
|
61
|
-
position: layer.position.value,
|
|
62
|
-
effects: getEffects(layer),
|
|
63
|
-
properties: getKeyProperties(layer)
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
compData.layers.push(layerData);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
result.compositions.push(compData);
|
|
70
|
-
|
|
71
|
-
if (compName) {
|
|
72
|
-
break; // If we found the specific comp, no need to continue
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return JSON.stringify(result, null, 2);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function determineLayerType(layer) {
|
|
81
|
-
if (!layer.source) {
|
|
82
|
-
return "Null";
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (layer.source instanceof CompItem) {
|
|
86
|
-
return "Composition";
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (layer.source instanceof FootageItem) {
|
|
90
|
-
if (layer.source.mainSource instanceof SolidSource) {
|
|
91
|
-
return "Solid";
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (layer.source.mainSource instanceof FileSource) {
|
|
95
|
-
if (layer.source.hasVideo) {
|
|
96
|
-
return "Video";
|
|
97
|
-
}
|
|
98
|
-
if (layer.source.hasAudio) {
|
|
99
|
-
return "Audio";
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Check file extension for image types
|
|
103
|
-
var fileName = layer.source.file.name.toLowerCase();
|
|
104
|
-
if (/\.(png|jpg|jpeg|gif|tiff|tif|bmp|psd|ai|eps)$/.test(fileName)) {
|
|
105
|
-
return "Image";
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (layer.source.mainSource instanceof PlaceholderSource) {
|
|
110
|
-
return "Placeholder";
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return "Footage";
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (layer.text) {
|
|
117
|
-
return "Text";
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (layer.name.indexOf("Light") === 0) {
|
|
121
|
-
return "Light";
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (layer.name.indexOf("Camera") === 0) {
|
|
125
|
-
return "Camera";
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return "Unknown";
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function getEffects(layer) {
|
|
132
|
-
var effects = [];
|
|
133
|
-
|
|
134
|
-
if (!layer.effect || layer.effect.numProperties === 0) {
|
|
135
|
-
return effects;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
for (var i = 1; i <= layer.effect.numProperties; i++) {
|
|
139
|
-
var effect = layer.effect(i);
|
|
140
|
-
effects.push({
|
|
141
|
-
name: effect.name,
|
|
142
|
-
matchName: effect.matchName,
|
|
143
|
-
enabled: effect.enabled
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return effects;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
function getKeyProperties(layer) {
|
|
151
|
-
var properties = [];
|
|
152
|
-
|
|
153
|
-
// Common properties to check
|
|
154
|
-
var propNames = [
|
|
155
|
-
"Opacity", "Position", "Scale", "Rotation",
|
|
156
|
-
"Anchor Point", "Transform", "Effects"
|
|
157
|
-
];
|
|
158
|
-
|
|
159
|
-
for (var i = 0; i < propNames.length; i++) {
|
|
160
|
-
try {
|
|
161
|
-
var propName = propNames[i];
|
|
162
|
-
var prop = layer.property(propName);
|
|
163
|
-
|
|
164
|
-
if (prop && prop.numKeys > 0) {
|
|
165
|
-
var keyframes = [];
|
|
166
|
-
|
|
167
|
-
for (var k = 1; k <= prop.numKeys; k++) {
|
|
168
|
-
keyframes.push({
|
|
169
|
-
time: prop.keyTime(k),
|
|
170
|
-
value: prop.keyValue(k)
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
properties.push({
|
|
175
|
-
name: propName,
|
|
176
|
-
numKeys: prop.numKeys,
|
|
177
|
-
keyframes: keyframes
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
} catch (e) {
|
|
181
|
-
// Skip properties that don't exist or can't be accessed
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return properties;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Run the function and write the result
|
|
189
|
-
var result = getLayerInfo();
|
|
190
|
-
|
|
191
|
-
// Write the result so it can be captured by the Node.js process
|
|
192
|
-
$.write(result);
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
// getProjectInfo.jsx
|
|
2
|
-
// Get information about the current After Effects project
|
|
3
|
-
|
|
4
|
-
function getProjectInfo() {
|
|
5
|
-
var project = app.project;
|
|
6
|
-
var result = {
|
|
7
|
-
projectName: project.file ? project.file.name : "Untitled Project",
|
|
8
|
-
path: project.file ? project.file.fsName : "",
|
|
9
|
-
numItems: project.numItems,
|
|
10
|
-
bitsPerChannel: project.bitsPerChannel,
|
|
11
|
-
timeMode: project.timeDisplayType === TimeDisplayType.FRAMES ? "Frames" : "Timecode",
|
|
12
|
-
items: []
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
// Count item types
|
|
16
|
-
var countByType = {
|
|
17
|
-
compositions: 0,
|
|
18
|
-
footage: 0,
|
|
19
|
-
folders: 0,
|
|
20
|
-
solids: 0
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// Get item information
|
|
24
|
-
for (var i = 1; i <= project.numItems; i++) {
|
|
25
|
-
var item = project.item(i);
|
|
26
|
-
var itemType = "";
|
|
27
|
-
|
|
28
|
-
if (item instanceof CompItem) {
|
|
29
|
-
itemType = "Composition";
|
|
30
|
-
countByType.compositions++;
|
|
31
|
-
} else if (item instanceof FolderItem) {
|
|
32
|
-
itemType = "Folder";
|
|
33
|
-
countByType.folders++;
|
|
34
|
-
} else if (item instanceof FootageItem) {
|
|
35
|
-
if (item.mainSource instanceof SolidSource) {
|
|
36
|
-
itemType = "Solid";
|
|
37
|
-
countByType.solids++;
|
|
38
|
-
} else {
|
|
39
|
-
itemType = "Footage";
|
|
40
|
-
countByType.footage++;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
result.items.push({
|
|
45
|
-
id: item.id,
|
|
46
|
-
name: item.name,
|
|
47
|
-
type: itemType
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
result.itemCounts = countByType;
|
|
52
|
-
|
|
53
|
-
// Include active composition metadata if available
|
|
54
|
-
if (app.project.activeItem instanceof CompItem) {
|
|
55
|
-
var ac = app.project.activeItem;
|
|
56
|
-
result.activeComp = {
|
|
57
|
-
id: ac.id,
|
|
58
|
-
name: ac.name,
|
|
59
|
-
width: ac.width,
|
|
60
|
-
height: ac.height,
|
|
61
|
-
duration: ac.duration,
|
|
62
|
-
frameRate: ac.frameRate,
|
|
63
|
-
numLayers: ac.numLayers
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return JSON.stringify(result, null, 2);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Read arguments from the file (passed by the Node.js script)
|
|
71
|
-
var argsFile = new File($.fileName.replace(/[^\\\/]*$/, '') + "../temp/args.json");
|
|
72
|
-
var args = {};
|
|
73
|
-
if (argsFile.exists) {
|
|
74
|
-
argsFile.open("r");
|
|
75
|
-
var content = argsFile.read();
|
|
76
|
-
argsFile.close();
|
|
77
|
-
if (content) {
|
|
78
|
-
try {
|
|
79
|
-
args = JSON.parse(content);
|
|
80
|
-
} catch (e) {
|
|
81
|
-
// Handle parsing error
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Run the function and write the result
|
|
87
|
-
var result = getProjectInfo();
|
|
88
|
-
|
|
89
|
-
// Write the result so it can be captured by the Node.js process
|
|
90
|
-
$.write(result);
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
// listCompositions.jsx
|
|
2
|
-
// Lists all compositions in the current project
|
|
3
|
-
|
|
4
|
-
function listCompositions() {
|
|
5
|
-
var project = app.project;
|
|
6
|
-
var result = {
|
|
7
|
-
projectName: project.file ? project.file.name : "Untitled Project",
|
|
8
|
-
compositions: []
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
for (var i = 1; i <= project.numItems; i++) {
|
|
12
|
-
var item = project.item(i);
|
|
13
|
-
if (item instanceof CompItem) {
|
|
14
|
-
result.compositions.push({
|
|
15
|
-
name: item.name,
|
|
16
|
-
id: item.id,
|
|
17
|
-
duration: item.duration,
|
|
18
|
-
frameDuration: item.frameDuration,
|
|
19
|
-
frameRate: item.frameRate,
|
|
20
|
-
width: item.width,
|
|
21
|
-
height: item.height,
|
|
22
|
-
numLayers: item.numLayers
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return JSON.stringify(result, null, 2);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Read arguments from the file (passed by the Node.js script)
|
|
31
|
-
var argsFile = new File($.fileName.replace(/[^\\\/]*$/, '') + "../temp/args.json");
|
|
32
|
-
var args = {};
|
|
33
|
-
if (argsFile.exists) {
|
|
34
|
-
argsFile.open("r");
|
|
35
|
-
var content = argsFile.read();
|
|
36
|
-
argsFile.close();
|
|
37
|
-
if (content) {
|
|
38
|
-
try {
|
|
39
|
-
args = JSON.parse(content);
|
|
40
|
-
} catch (e) {
|
|
41
|
-
// Handle parsing error
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Run the function and write the result
|
|
47
|
-
var result = listCompositions();
|
|
48
|
-
|
|
49
|
-
// Write the result so it can be captured by the Node.js process
|
|
50
|
-
$.write(result);
|